13
13
// limitations under the License.
14
14
15
15
@testable import FirebaseAuth
16
+ import FirebaseCoreInternal
16
17
import Foundation
17
18
import XCTest
18
19
19
- /** @class AuthKeychainStorage
20
- @brief The utility class to update the real keychain
21
- */
20
+ /// The utility class to update the real keychain
22
21
@available ( iOS 13 , tvOS 13 , macOS 10 . 15 , macCatalyst 13 , watchOS 7 , * )
23
- class FakeAuthKeychainStorage : AuthKeychainStorage {
22
+ final class FakeAuthKeychainStorage : AuthKeychainStorage {
24
23
// Fake Keychain. It's a dictionary, keyed by service name, for each key-value store dictionary
25
- private var fakeKeychain : [ String : [ String : Any ] ] = [ : ]
24
+ private let fakeKeychain = FIRAllocatedUnfairLock < [ String : [ String : Any ] ] > ( initialState : [ : ] )
26
25
27
- private var fakeLegacyKeychain : [ String : Any ] = [ : ]
26
+ private let fakeLegacyKeychain = FIRAllocatedUnfairLock < [ String : Any ] > ( initialState : [ : ] )
28
27
29
28
func get( query: [ String : Any ] , result: inout AnyObject ? ) -> OSStatus {
30
29
if let service = queryService ( query) {
31
- guard let value = fakeKeychain [ service] ? [ queryKey ( query) ] else {
30
+ guard let value = fakeKeychain. value ( ) [ service] ? [ queryKey ( query) ] else {
32
31
return errSecItemNotFound
33
32
}
34
33
let returnArrayofDictionary = [ [ kSecValueData as String : value] ]
35
34
result = returnArrayofDictionary as AnyObject
36
35
return noErr
37
36
} else {
38
- guard let value = fakeLegacyKeychain [ queryKey ( query) ] else {
37
+ guard let value = fakeLegacyKeychain. value ( ) [ queryKey ( query) ] else {
39
38
return errSecItemNotFound
40
39
}
41
40
let returnArrayofDictionary = [ [ kSecValueData as String : value] ]
@@ -46,9 +45,9 @@ class FakeAuthKeychainStorage: AuthKeychainStorage {
46
45
47
46
func add( query: [ String : Any ] ) -> OSStatus {
48
47
if let service = queryService ( query) {
49
- fakeKeychain [ service] ? [ queryKey ( query) ] = query [ kSecValueData as String ]
48
+ fakeKeychain. withLock { $0 [ service] ? [ queryKey ( query) ] = query [ kSecValueData as String ] }
50
49
} else {
51
- fakeLegacyKeychain [ queryKey ( query) ] = query [ kSecValueData as String ]
50
+ fakeLegacyKeychain. withLock { $0 [ queryKey ( query) ] = query [ kSecValueData as String ] }
52
51
}
53
52
return noErr
54
53
}
@@ -59,9 +58,9 @@ class FakeAuthKeychainStorage: AuthKeychainStorage {
59
58
60
59
@discardableResult func delete( query: [ String : Any ] ) -> OSStatus {
61
60
if let service = queryService ( query) {
62
- fakeKeychain [ service] ? [ queryKey ( query) ] = nil
61
+ fakeKeychain. withLock { $0 [ service] ? [ queryKey ( query) ] = nil }
63
62
} else {
64
- fakeLegacyKeychain [ queryKey ( query) ] = nil
63
+ fakeLegacyKeychain. withLock { $0 [ queryKey ( query) ] = nil }
65
64
}
66
65
return noErr
67
66
}
@@ -79,8 +78,10 @@ class FakeAuthKeychainStorage: AuthKeychainStorage {
79
78
guard let service = query [ kSecAttrService as String ] as? String else {
80
79
return nil
81
80
}
82
- if fakeKeychain [ service] == nil {
83
- fakeKeychain [ service] = [ : ]
81
+ fakeKeychain. withLock { fakeKeychain in
82
+ if fakeKeychain [ service] == nil {
83
+ fakeKeychain [ service] = [ : ]
84
+ }
84
85
}
85
86
return service
86
87
}
0 commit comments