aboutsummaryrefslogtreecommitdiffhomepage
path: root/Example/Auth/Tests/FIRAuthUserDefaultsStorageTests.m
blob: 07493d5d8efa8c5475b5e2a840be599d02b34f67 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/*
 * Copyright 2017 Google
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#import <XCTest/XCTest.h>

#import "FIRAuthUserDefaultsStorage.h"

#if FIRAUTH_USER_DEFAULTS_STORAGE_AVAILABLE

NS_ASSUME_NONNULL_BEGIN

/** @var kKey
    @brief The key used in tests.
 */
static NSString *const kKey = @"ACCOUNT";

/** @var kService
    @brief The keychain service used in tests.
 */
static NSString *const kService = @"SERVICE";

/** @var kOtherService
    @brief Another keychain service used in tests.
 */
static NSString *const kOtherService = @"OTHER_SERVICE";

/** @var kData
    @brief A piece of keychain data used in tests.
 */
static NSString *const kData = @"DATA";

/** @var kOtherData
    @brief Another piece of keychain data used in tests.
 */
static NSString *const kOtherData = @"OTHER_DATA";

/** @fn dataFromString
    @brief Converts a NSString to NSData.
    @param string The NSString to be converted from.
    @return The NSData being the conversion result.
 */
static NSData *dataFromString(NSString *string) {
  return [string dataUsingEncoding:NSUTF8StringEncoding];
}

/** @fn fakeError
    @brief Creates a fake error object.
    @return a non-nil NSError instance.
 */
static NSError *fakeError() {
  return [NSError errorWithDomain:@"ERROR" code:-1 userInfo:nil];
}

/** @class FIRAuthUserDefaultsStorageTests
    @brief Tests for @c FIRAuthUserDefaultsStorage .
 */
@interface FIRAuthUserDefaultsStorageTests : XCTestCase
@end

@implementation FIRAuthUserDefaultsStorageTests {
  /** @var _storage
      @brief The @c FIRAuthUserDefaultsStorage object under test.
   */
  FIRAuthUserDefaultsStorage *_storage;
}

- (void)setUp {
  [super setUp];
  _storage = [[FIRAuthUserDefaultsStorage alloc] initWithService:kService];
  [_storage clear];
}

/** @fn testReadNonexisting
    @brief Tests reading non-existing storage item.
 */
- (void)testReadNonExisting {
  NSError *error = fakeError();
  XCTAssertNil([_storage dataForKey:kKey error:&error]);
  XCTAssertNil(error);
}

/** @fn testWriteRead
    @brief Tests writing and reading a storage item.
 */
- (void)testWriteRead {
  XCTAssertTrue([_storage setData:dataFromString(kData) forKey:kKey error:NULL]);
  NSError *error = fakeError();
  XCTAssertEqualObjects([_storage dataForKey:kKey error:&error], dataFromString(kData));
  XCTAssertNil(error);
}

/** @fn testOverwrite
    @brief Tests overwriting a storage item.
 */
- (void)testOverwrite {
  XCTAssertTrue([_storage setData:dataFromString(kData) forKey:kKey error:NULL]);
  XCTAssertTrue([_storage setData:dataFromString(kOtherData) forKey:kKey error:NULL]);
  NSError *error = fakeError();
  XCTAssertEqualObjects([_storage dataForKey:kKey error:&error], dataFromString(kOtherData));
  XCTAssertNil(error);
}

/** @fn testRemove
    @brief Tests removing a storage item.
 */
- (void)testRemove {
  XCTAssertTrue([_storage setData:dataFromString(kData) forKey:kKey error:NULL]);
  XCTAssertTrue([_storage removeDataForKey:kKey error:NULL]);
  NSError *error = fakeError();
  XCTAssertNil([_storage dataForKey:kKey error:&error]);
  XCTAssertNil(error);
}

/** @fn testServices
    @brief Tests storage items belonging to different services doesn't affect each other.
 */
- (void)testServices {
  XCTAssertTrue([_storage setData:dataFromString(kData) forKey:kKey error:NULL]);
  _storage = [[FIRAuthUserDefaultsStorage alloc] initWithService:kOtherService];
  NSError *error = fakeError();
  XCTAssertNil([_storage dataForKey:kKey error:&error]);
  XCTAssertNil(error);
}

/** @fn testStandardUserDefaults
    @brief Tests standard user defaults are not affected by FIRAuthUserDefaultsStorage operations,
 */
- (void)testStandardUserDefaults {
  NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
  NSUInteger count =
      [userDefaults persistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]].count;
  XCTAssertTrue([_storage setData:dataFromString(kData) forKey:kKey error:NULL]);
  XCTAssertNil([userDefaults dataForKey:kKey]);
  XCTAssertEqual([userDefaults persistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]]
                 .count, count);
}

@end

NS_ASSUME_NONNULL_END

#endif  // FIRAUTH_USER_DEFAULTS_STORAGE_AVAILABLE