1// Copyright 2020 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#import "ios/chrome/common/credential_provider/archivable_credential.h"
6
7#import "base/test/ios/wait_util.h"
8#include "testing/gtest_mac.h"
9#include "testing/platform_test.h"
10
11#if !defined(__has_feature) || !__has_feature(objc_arc)
12#error "This file requires ARC support."
13#endif
14
15namespace {
16
17using ArchivableCredentialTest = PlatformTest;
18
19ArchivableCredential* TestCredential() {
20  return [[ArchivableCredential alloc] initWithFavicon:@"favicon"
21                                    keychainIdentifier:@"keychainIdentifier"
22                                                  rank:5
23                                      recordIdentifier:@"recordIdentifier"
24                                     serviceIdentifier:@"serviceIdentifier"
25                                           serviceName:@"serviceName"
26                                                  user:@"user"
27                                  validationIdentifier:@"validationIdentifier"];
28}
29
30// Tests that an ArchivableCredential can be created.
31TEST_F(ArchivableCredentialTest, create) {
32  ArchivableCredential* credential =
33      [[ArchivableCredential alloc] initWithFavicon:@"favicon"
34                                 keychainIdentifier:@"keychainIdentifier"
35                                               rank:5
36                                   recordIdentifier:@"recordIdentifier"
37                                  serviceIdentifier:@"serviceIdentifier"
38                                        serviceName:@"serviceName"
39                                               user:@"user"
40                               validationIdentifier:@"validationIdentifier"];
41  EXPECT_TRUE(credential);
42}
43
44// Tests that an ArchivableCredential can be converted to NSData.
45TEST_F(ArchivableCredentialTest, createData) {
46  ArchivableCredential* credential = TestCredential();
47  EXPECT_TRUE(credential);
48  NSError* error = nil;
49  NSData* data = [NSKeyedArchiver archivedDataWithRootObject:credential
50                                       requiringSecureCoding:YES
51                                                       error:&error];
52  EXPECT_TRUE(data);
53  EXPECT_FALSE(error);
54}
55
56// Tests that an ArchivableCredential can be retrieved from NSData.
57TEST_F(ArchivableCredentialTest, retrieveData) {
58  ArchivableCredential* credential = TestCredential();
59  NSError* error = nil;
60  NSData* data = [NSKeyedArchiver archivedDataWithRootObject:credential
61                                       requiringSecureCoding:YES
62                                                       error:&error];
63  EXPECT_TRUE(data);
64  EXPECT_FALSE(error);
65
66  ArchivableCredential* unarchivedCredential =
67      [NSKeyedUnarchiver unarchivedObjectOfClass:[ArchivableCredential class]
68                                        fromData:data
69                                           error:&error];
70  EXPECT_TRUE(unarchivedCredential);
71  EXPECT_TRUE(
72      [unarchivedCredential isKindOfClass:[ArchivableCredential class]]);
73
74  EXPECT_NSEQ(credential.favicon, unarchivedCredential.favicon);
75  EXPECT_NSEQ(credential.keychainIdentifier,
76              unarchivedCredential.keychainIdentifier);
77  EXPECT_EQ(credential.rank, unarchivedCredential.rank);
78  EXPECT_NSEQ(credential.recordIdentifier,
79              unarchivedCredential.recordIdentifier);
80  EXPECT_NSEQ(credential.serviceIdentifier,
81              unarchivedCredential.serviceIdentifier);
82  EXPECT_NSEQ(credential.serviceName, unarchivedCredential.serviceName);
83  EXPECT_NSEQ(credential.user, unarchivedCredential.user);
84  EXPECT_NSEQ(credential.validationIdentifier,
85              unarchivedCredential.validationIdentifier);
86}
87
88// Tests ArchivableCredential equality.
89TEST_F(ArchivableCredentialTest, equality) {
90  ArchivableCredential* credential = TestCredential();
91  ArchivableCredential* credentialIdentical = TestCredential();
92  EXPECT_NSEQ(credential, credentialIdentical);
93  EXPECT_EQ(credential.hash, credentialIdentical.hash);
94
95  ArchivableCredential* credentialSameIdentifier = [[ArchivableCredential alloc]
96           initWithFavicon:@"other_favicon"
97        keychainIdentifier:@"other_keychainIdentifier"
98                      rank:credential.rank + 10
99          recordIdentifier:@"recordIdentifier"
100         serviceIdentifier:@"other_serviceIdentifier"
101               serviceName:@"other_serviceName"
102                      user:@"other_user"
103      validationIdentifier:@"other_validationIdentifier"];
104  EXPECT_NSNE(credential, credentialSameIdentifier);
105
106  ArchivableCredential* credentialDiferentIdentifier =
107      [[ArchivableCredential alloc] initWithFavicon:@"favicon"
108                                 keychainIdentifier:@"keychainIdentifier"
109                                               rank:credential.rank
110                                   recordIdentifier:@"other_recordIdentifier"
111                                  serviceIdentifier:@"serviceIdentifier"
112                                        serviceName:@"serviceName"
113                                               user:@"user"
114                               validationIdentifier:@"validationIdentifier"];
115  EXPECT_NSNE(credential, credentialDiferentIdentifier);
116
117  EXPECT_NSNE(credential, nil);
118}
119}
120