Skip to content

Commit 1fff2c6

Browse files
committed
improve test code
actually handle force unwrap fix crashes
1 parent e968d2f commit 1fff2c6

File tree

1 file changed

+169
-61
lines changed

1 file changed

+169
-61
lines changed

Tests/web3swiftTests/localTests/KeystoresTests.swift

Lines changed: 169 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -73,126 +73,225 @@ class KeystoresTests: LocalTestCase {
7373
func testHMAC() throws {
7474
let seed = Data.fromHex("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b")!
7575
let data = Data.fromHex("4869205468657265")!
76-
let hmac = try! HMAC.init(key: seed.bytes, variant: HMAC.Variant.sha2(.sha512)).authenticate(data.bytes)
76+
guard let hmac = try? HMAC.init(key: seed.bytes, variant: HMAC.Variant.sha2(.sha512)).authenticate(data.bytes) else {
77+
XCTFail()
78+
return
79+
}
7780
XCTAssert(Data(hmac).toHexString() == "87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b30545e17cdedaa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f1702e696c203a126854")
7881
}
7982

8083
func testV3keystoreExportPrivateKey() throws {
81-
let keystore = try! EthereumKeystoreV3(password: "")
84+
guard let keystore = try? EthereumKeystoreV3(password: "") else {
85+
XCTFail()
86+
return
87+
}
8288
XCTAssertNotNil(keystore)
83-
let account = keystore!.addresses![0]
89+
let account = keystore.addresses![0]
8490
print(account)
85-
let data = try! keystore!.serialize()
86-
print(try! JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions(rawValue: 0)))
87-
let key = try! keystore!.UNSAFE_getPrivateKeyData(password: "", account: account)
91+
guard let data = try? keystore.serialize() else {
92+
XCTFail()
93+
return
94+
}
95+
print(try? JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions(rawValue: 0)))
96+
guard let key = try? keystore.UNSAFE_getPrivateKeyData(password: "", account: account) else {
97+
XCTFail()
98+
return
99+
}
88100
XCTAssertNotNil(key)
89101
}
90102

91103
func testV3keystoreSerialization() throws {
92-
let keystore = try! EthereumKeystoreV3(password: "")
104+
guard let keystore = try? EthereumKeystoreV3(password: "") else {
105+
XCTFail()
106+
return
107+
}
93108
XCTAssertNotNil(keystore)
94-
let account = keystore!.addresses![0]
95-
let data = try! keystore!.serialize()
96-
let key = try! keystore!.UNSAFE_getPrivateKeyData(password: "", account: account)
109+
let account = keystore.addresses![0]
110+
guard let data = try? keystore.serialize() else {
111+
XCTFail()
112+
return
113+
}
114+
guard let key = try? keystore.UNSAFE_getPrivateKeyData(password: "", account: account) else {
115+
XCTFail()
116+
return
117+
}
97118
XCTAssertNotNil(key)
98119

99-
let restored = EthereumKeystoreV3(data!)
120+
let restored = EthereumKeystoreV3(data)
100121
XCTAssertNotNil(restored)
101-
XCTAssertEqual(keystore!.addresses!.first!, restored!.addresses!.first!)
102-
let restoredKey = try! restored!.UNSAFE_getPrivateKeyData(password: "", account: account)
122+
XCTAssertEqual(keystore.addresses!.first!, restored!.addresses!.first!)
123+
guard let restoredKey = try? restored!.UNSAFE_getPrivateKeyData(password: "", account: account) else {
124+
XCTFail()
125+
return
126+
}
103127
XCTAssertNotNil(restoredKey)
104128
XCTAssertEqual(key, restoredKey)
105129
}
106130

107131
func testNewBIP32keystore() throws {
108-
let mnemonic = try! BIP39.generateMnemonics(bitsOfEntropy: 256)!
109-
let keystore = try! BIP32Keystore(mnemonics: mnemonic, password: "", mnemonicsPassword: "")
132+
guard let mnemonic = BIP39.generateMnemonics(bitsOfEntropy: 256) else {
133+
XCTFail()
134+
return
135+
}
136+
let keystore = try? BIP32Keystore(mnemonics: mnemonic, password: "", mnemonicsPassword: "")
110137
XCTAssert(keystore != nil)
111138
}
112139

113140
func testSameAddressesFromTheSameMnemonics() throws {
114-
let mnemonic = try! BIP39.generateMnemonics(bitsOfEntropy: 256)!
115-
let keystore1 = try! BIP32Keystore(mnemonics: mnemonic, password: "", mnemonicsPassword: "")
116-
let keystore2 = try! BIP32Keystore(mnemonics: mnemonic, password: "", mnemonicsPassword: "")
117-
XCTAssert(keystore1?.addresses?.first == keystore2?.addresses?.first)
141+
guard let mnemonic = BIP39.generateMnemonics(bitsOfEntropy: 256) else {
142+
XCTFail()
143+
return
144+
}
145+
guard let keystore1 = try? BIP32Keystore(mnemonics: mnemonic, password: "", mnemonicsPassword: "") else {
146+
XCTFail()
147+
return
148+
}
149+
guard let keystore2 = try? BIP32Keystore(mnemonics: mnemonic, password: "", mnemonicsPassword: "") else {
150+
XCTFail()
151+
return
152+
}
153+
XCTAssert(keystore1.addresses?.first == keystore2.addresses?.first)
118154
}
119155

120156
func testBIP32keystoreExportPrivateKey() throws {
121157
let mnemonic = "normal dune pole key case cradle unfold require tornado mercy hospital buyer"
122-
let keystore = try! BIP32Keystore(mnemonics: mnemonic, password: "", mnemonicsPassword: "")
158+
guard let keystore = try? BIP32Keystore(mnemonics: mnemonic, password: "", mnemonicsPassword: "") else {
159+
XCTFail()
160+
return
161+
}
123162
XCTAssertNotNil(keystore)
124-
let account = keystore!.addresses![0]
125-
let key = try! keystore!.UNSAFE_getPrivateKeyData(password: "", account: account)
163+
let account = keystore.addresses![0]
164+
guard let key = try? keystore.UNSAFE_getPrivateKeyData(password: "", account: account) else {
165+
XCTFail()
166+
return
167+
}
126168
XCTAssertNotNil(key)
127169
}
128170

129171
func testBIP32keystoreMatching() throws {
130-
let keystore = try! BIP32Keystore(mnemonics: mnemonic, password: "", mnemonicsPassword: "banana")
172+
guard let keystore = try? BIP32Keystore(mnemonics: mnemonic, password: "", mnemonicsPassword: "banana") else {
173+
XCTFail()
174+
return
175+
}
131176
XCTAssertNotNil(keystore)
132-
let account = keystore!.addresses![0]
133-
let key = try! keystore!.UNSAFE_getPrivateKeyData(password: "", account: account)
177+
let account = keystore.addresses![0]
178+
guard let key = try? keystore.UNSAFE_getPrivateKeyData(password: "", account: account) else {
179+
XCTFail()
180+
return
181+
}
134182
let pubKey = Utilities.privateToPublic(key, compressed: true)
135183
XCTAssert(pubKey?.toHexString() == "027160bd3a4d938cac609ff3a11fe9233de7b76c22a80d2b575e202cbf26631659")
136184
}
137185

138186
func testBIP32keystoreMatchingRootNode() throws {
139-
let keystore = try! BIP32Keystore(mnemonics: mnemonic, password: "", mnemonicsPassword: "banana")
187+
guard let keystore = try? BIP32Keystore(mnemonics: mnemonic, password: "", mnemonicsPassword: "banana") else {
188+
XCTFail()
189+
return
190+
}
140191
XCTAssertNotNil(keystore)
141-
let rootNode = try! keystore!.serializeRootNodeToString(password: "")
192+
guard let rootNode = try? keystore.serializeRootNodeToString(password: "") else {
193+
XCTFail()
194+
return
195+
}
142196
XCTAssert(rootNode == "xprvA2KM71v838kPwE8Lfr12m9DL939TZmPStMnhoFcZkr1nBwDXSG7c3pjYbMM9SaqcofK154zNSCp7W7b4boEVstZu1J3pniLQJJq7uvodfCV")
143197
}
144198

145199
func testBIP32keystoreCustomPathMatching() throws {
146-
let keystore = try! BIP32Keystore(mnemonics: mnemonic, password: "", mnemonicsPassword: "banana", prefixPath: "m/44'/60'/0'/0")
200+
guard let keystore = try? BIP32Keystore(mnemonics: mnemonic, password: "", mnemonicsPassword: "banana", prefixPath: "m/44'/60'/0'/0") else {
201+
XCTFail()
202+
return
203+
}
147204
XCTAssertNotNil(keystore)
148-
let account = keystore!.addresses![0]
149-
let key = try! keystore!.UNSAFE_getPrivateKeyData(password: "", account: account)
205+
let account = keystore.addresses![0]
206+
guard let key = try? keystore.UNSAFE_getPrivateKeyData(password: "", account: account) else {
207+
XCTFail()
208+
return
209+
}
150210
let pubKey = Utilities.privateToPublic(key, compressed: true)
151211
XCTAssert(pubKey?.toHexString() == "027160bd3a4d938cac609ff3a11fe9233de7b76c22a80d2b575e202cbf26631659")
152212
}
153213

154214
func testByBIP32keystoreCreateChildAccount() throws {
155215
let mnemonic = "normal dune pole key case cradle unfold require tornado mercy hospital buyer"
156-
let keystore = try! BIP32Keystore(mnemonics: mnemonic, password: "", mnemonicsPassword: "")
216+
guard let keystore = try? BIP32Keystore(mnemonics: mnemonic, password: "", mnemonicsPassword: "") else {
217+
XCTFail()
218+
return
219+
}
157220
XCTAssertNotNil(keystore)
158-
XCTAssertEqual(keystore!.addresses?.count, 1)
159-
try! keystore?.createNewChildAccount(password: "")
160-
XCTAssertEqual(keystore?.addresses?.count, 2)
161-
let account = keystore!.addresses![0]
162-
let key = try! keystore!.UNSAFE_getPrivateKeyData(password: "", account: account)
221+
XCTAssertEqual(keystore.addresses?.count, 1)
222+
try? keystore.createNewChildAccount(password: "")
223+
XCTAssertEqual(keystore.addresses?.count, 2)
224+
let account = keystore.addresses![0]
225+
guard let key = try? keystore.UNSAFE_getPrivateKeyData(password: "", account: account) else {
226+
XCTFail()
227+
return
228+
}
163229
XCTAssertNotNil(key)
164230
}
165231

166232
func testByBIP32keystoreCreateCustomChildAccount() throws {
167233
let mnemonic = "normal dune pole key case cradle unfold require tornado mercy hospital buyer"
168-
let keystore = try! BIP32Keystore(mnemonics: mnemonic, password: "", mnemonicsPassword: "")
234+
guard let keystore = try? BIP32Keystore(mnemonics: mnemonic, password: "", mnemonicsPassword: "") else {
235+
XCTFail()
236+
return
237+
}
169238
XCTAssertNotNil(keystore)
170-
XCTAssertEqual(keystore!.addresses?.count, 1)
171-
try! keystore?.createNewCustomChildAccount(password: "", path: "/42/1")
172-
XCTAssertEqual(keystore?.addresses?.count, 2)
173-
let account = keystore!.addresses![1]
174-
let key = try! keystore!.UNSAFE_getPrivateKeyData(password: "", account: account)
239+
XCTAssertEqual(keystore.addresses?.count, 1)
240+
try? keystore.createNewCustomChildAccount(password: "", path: "/42/1")
241+
XCTAssertEqual(keystore.addresses?.count, 2)
242+
guard keystore.addresses?.count ?? 0 > 1 else {
243+
XCTFail()
244+
return
245+
}
246+
guard let account = keystore.addresses?[1] else {
247+
XCTFail()
248+
return
249+
}
250+
guard let key = try? keystore.UNSAFE_getPrivateKeyData(password: "", account: account) else {
251+
XCTFail()
252+
return
253+
}
175254
XCTAssertNotNil(key)
176-
print(keystore!.addressStorage.paths)
255+
print(keystore.addressStorage.paths)
177256
}
178257

179258
func testByBIP32keystoreSaveAndDeriva() throws {
180259
let mnemonic = "normal dune pole key case cradle unfold require tornado mercy hospital buyer"
181-
let keystore = try! BIP32Keystore(mnemonics: mnemonic, password: "", mnemonicsPassword: "", prefixPath: "m/44'/60'/0'")
260+
guard let keystore = try? BIP32Keystore(mnemonics: mnemonic, password: "", mnemonicsPassword: "", prefixPath: "m/44'/60'/0'") else {
261+
XCTFail()
262+
return
263+
}
182264
XCTAssertNotNil(keystore)
183-
XCTAssertEqual(keystore!.addresses?.count, 1)
184-
try! keystore?.createNewCustomChildAccount(password: "", path: "/0/1")
185-
XCTAssertEqual(keystore?.addresses?.count, 2)
186-
let data = try! keystore?.serialize()
187-
let recreatedStore = BIP32Keystore.init(data!)
188-
XCTAssert(keystore?.addresses?.count == recreatedStore?.addresses?.count)
189-
XCTAssert(keystore?.rootPrefix == recreatedStore?.rootPrefix)
190-
print(keystore!.addresses![0].address)
191-
print(keystore!.addresses![1].address)
192-
print(recreatedStore!.addresses![0].address)
265+
XCTAssertEqual(keystore.addresses?.count, 1)
266+
try? keystore.createNewCustomChildAccount(password: "", path: "/0/1")
267+
XCTAssertEqual(keystore.addresses?.count, 2)
268+
guard let data = try? keystore.serialize() else {
269+
XCTFail()
270+
return
271+
}
272+
let recreatedStore = BIP32Keystore.init(data)
273+
XCTAssert(keystore.addresses?.count == recreatedStore?.addresses?.count)
274+
XCTAssert(keystore.rootPrefix == recreatedStore?.rootPrefix)
275+
guard let firstAddress = keystore.addresses?.first else {
276+
XCTFail()
277+
return
278+
}
279+
guard let recreatedFirstAddress = recreatedStore?.addresses?.first else {
280+
XCTFail()
281+
return
282+
}
283+
print(firstAddress.address)
284+
print(recreatedFirstAddress.address)
285+
XCTAssert(firstAddress == recreatedFirstAddress)
286+
287+
guard keystore.addresses?.count ?? 0 > 1 && recreatedStore?.addresses?.count ?? 0 > 1 else {
288+
XCTFail()
289+
return
290+
}
291+
292+
print(keystore.addresses![1].address)
193293
print(recreatedStore!.addresses![1].address)
194-
XCTAssert(keystore?.addresses![0] == recreatedStore?.addresses![0])
195-
XCTAssert(keystore?.addresses![1] == recreatedStore?.addresses![1])
294+
XCTAssert(keystore.addresses![1] == recreatedStore?.addresses![1])
196295
}
197296

198297
// FIXME: Failed on async with 10_000 iterations
@@ -207,7 +306,10 @@ class KeystoresTests: LocalTestCase {
207306

208307
func testRIPEMD() throws {
209308
let data = "message digest".data(using: .ascii)
210-
let hash = try! RIPEMD160.hash(message: data!)
309+
guard let hash = try? RIPEMD160.hash(message: data!) else {
310+
XCTFail()
311+
return
312+
}
211313
XCTAssert(hash.toHexString() == "5d0689ef49d2fae572b881b123a85ffa21595f36")
212314
}
213315

@@ -269,15 +371,21 @@ class KeystoresTests: LocalTestCase {
269371
func testKeystoreDerivationTime() throws {
270372
let privateKey = Data.randomBytes(length: 32)!
271373
measure {
272-
let ks = try! EthereumKeystoreV3(privateKey: privateKey, password: "TEST")!
374+
guard let ks = try? EthereumKeystoreV3(privateKey: privateKey, password: "TEST") else {
375+
XCTFail()
376+
return
377+
}
273378
let account = ks.addresses!.first!
274-
_ = try! ks.UNSAFE_getPrivateKeyData(password: "TEST", account: account)
379+
_ = try? ks.UNSAFE_getPrivateKeyData(password: "TEST", account: account)
275380
}
276381
}
277382

278383
func testSingleScryptDerivation() throws {
279-
let privateKey = Data.randomBytes(length: 32)!
280-
_ = try! EthereumKeystoreV3(privateKey: privateKey, password: "TEST")!
384+
guard let privateKey = Data.randomBytes(length: 32) else {
385+
XCTFail()
386+
return
387+
}
388+
_ = try? EthereumKeystoreV3(privateKey: privateKey, password: "TEST")
281389
}
282390

283391
}

0 commit comments

Comments
 (0)