Skip to content

Commit ecf5356

Browse files
Added UserAgentKeyMaterial tests
1 parent 6f7bc23 commit ecf5356

File tree

1 file changed

+173
-0
lines changed

1 file changed

+173
-0
lines changed
Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
//
2+
// SubscriberTests.swift
3+
// swift-webpush
4+
//
5+
// Created by Dimitri Bouniol on 2024-12-21.
6+
// Copyright © 2024 Mochi Development, Inc. All rights reserved.
7+
//
8+
9+
import Crypto
10+
import Foundation
11+
import Testing
12+
@testable import WebPush
13+
import WebPushTesting
14+
15+
@Suite struct SubscriberTests {
16+
@Suite struct UserAgentKeyMaterialTests {
17+
@Suite struct Initialization {
18+
@Test func actualKeys() {
19+
let privateKey = P256.KeyAgreement.PrivateKey()
20+
let keyMaterial = UserAgentKeyMaterial(
21+
publicKey: privateKey.publicKey,
22+
authenticationSecret: Data()
23+
)
24+
#expect(keyMaterial == UserAgentKeyMaterial(
25+
publicKey: privateKey.publicKey,
26+
authenticationSecret: Data()
27+
))
28+
}
29+
30+
@Test func strings() throws {
31+
let privateKey = UserAgentKeyMaterial.mockedKeyMaterialPrivateKey
32+
let keyMaterial = try UserAgentKeyMaterial(
33+
publicKey: "BMXVxJELqTqIqMka5N8ujvW6RXI9zo_xr5BQ6XGDkrsukNVPyKRMEEfzvQGeUdeZaWAaAs2pzyv1aoHEXYMtj1M",
34+
authenticationSecret: "IzODAQZN6BbGvmm7vWQJXg"
35+
)
36+
37+
#expect(keyMaterial == UserAgentKeyMaterial(
38+
publicKey: privateKey.publicKey,
39+
authenticationSecret: keyMaterial.authenticationSecret
40+
))
41+
42+
#expect(throws: UserAgentKeyMaterialError.invalidAuthenticationSecret(underlyingError: Base64URLDecodingError())) {
43+
try UserAgentKeyMaterial(
44+
publicKey: "BMXVxJELqTqIqMka5N8ujvW6RXI9zo_xr5BQ6XGDkrsukNVPyKRMEEfzvQGeUdeZaWAaAs2pzyv1aoHEXYMtj1M",
45+
authenticationSecret: "()"
46+
)
47+
}
48+
49+
#expect(throws: UserAgentKeyMaterialError.invalidPublicKey(underlyingError: Base64URLDecodingError())) {
50+
try UserAgentKeyMaterial(
51+
publicKey: "()",
52+
authenticationSecret: "IzODAQZN6BbGvmm7vWQJXg"
53+
)
54+
}
55+
56+
#expect(throws: UserAgentKeyMaterialError.invalidPublicKey(underlyingError: Base64URLDecodingError())) {
57+
try UserAgentKeyMaterial(
58+
publicKey: "()",
59+
authenticationSecret: "()"
60+
)
61+
}
62+
63+
#expect(throws: UserAgentKeyMaterialError.invalidPublicKey(underlyingError: CryptoKitError.incorrectParameterSize)) {
64+
try UserAgentKeyMaterial(
65+
publicKey: "BMXVxJELqTqIqMka5N8ujvW6RXI9zo_xr5BQ6XGDkrsukNVPyKRMEEfzvQGeUdeZaWAaAs2pzyv1aoHEXYM",
66+
authenticationSecret: "()"
67+
)
68+
}
69+
}
70+
71+
@Test func hashes() throws {
72+
let keyMaterial1 = try UserAgentKeyMaterial(
73+
publicKey: "BPgjN_Qet3SrCclnXNri-jEHu31CsdeZmNH9xkNskR58jBpxcqXJFspAPBeahlvNqUVXvorTn9RKcXag_esAmG0",
74+
authenticationSecret: "IzODAQZN6BbGvmm7vWQJXg"
75+
)
76+
let keyMaterial2 = try UserAgentKeyMaterial(
77+
publicKey: "BMXVxJELqTqIqMka5N8ujvW6RXI9zo_xr5BQ6XGDkrsukNVPyKRMEEfzvQGeUdeZaWAaAs2pzyv1aoHEXYMtj1M",
78+
authenticationSecret: "IzODAQZN6BbGvmm7vWQJXg"
79+
)
80+
var set: Set = [keyMaterial1, keyMaterial2]
81+
#expect(set.count == 2)
82+
set.insert(try UserAgentKeyMaterial(
83+
publicKey: "BPgjN_Qet3SrCclnXNri-jEHu31CsdeZmNH9xkNskR58jBpxcqXJFspAPBeahlvNqUVXvorTn9RKcXag_esAmG0",
84+
authenticationSecret: "IzODAQZN6BbGvmm7vWQJXg"
85+
))
86+
#expect(set.count == 2)
87+
set.insert(try UserAgentKeyMaterial(
88+
publicKey: "BPgjN_Qet3SrCclnXNri-jEHu31CsdeZmNH9xkNskR58jBpxcqXJFspAPBeahlvNqUVXvorTn9RKcXag_esAmG0",
89+
authenticationSecret: "AzODAQZN6BbGvmm7vWQJXg" // first character: A
90+
))
91+
#expect(set.count == 3)
92+
}
93+
}
94+
95+
@Suite struct Coding {
96+
@Test func encodes() async throws {
97+
let encoder = JSONEncoder()
98+
encoder.outputFormatting = [.prettyPrinted, .sortedKeys, .withoutEscapingSlashes]
99+
let result = String(
100+
decoding: try encoder.encode(UserAgentKeyMaterial(
101+
publicKey: "BMXVxJELqTqIqMka5N8ujvW6RXI9zo_xr5BQ6XGDkrsukNVPyKRMEEfzvQGeUdeZaWAaAs2pzyv1aoHEXYMtj1M",
102+
authenticationSecret: "IzODAQZN6BbGvmm7vWQJXg"
103+
)),
104+
as: UTF8.self
105+
)
106+
107+
#expect(result == """
108+
{
109+
"auth" : "IzODAQZN6BbGvmm7vWQJXg",
110+
"p256dh" : "BMXVxJELqTqIqMka5N8ujvW6RXI9zo_xr5BQ6XGDkrsukNVPyKRMEEfzvQGeUdeZaWAaAs2pzyv1aoHEXYMtj1M"
111+
}
112+
""")
113+
}
114+
115+
@Test func decodes() async throws {
116+
#expect(
117+
try JSONDecoder().decode(UserAgentKeyMaterial.self, from: Data("""
118+
{
119+
"auth" : "IzODAQZN6BbGvmm7vWQJXg",
120+
"p256dh" : "BMXVxJELqTqIqMka5N8ujvW6RXI9zo_xr5BQ6XGDkrsukNVPyKRMEEfzvQGeUdeZaWAaAs2pzyv1aoHEXYMtj1M"
121+
}
122+
""".utf8
123+
)) ==
124+
UserAgentKeyMaterial(
125+
publicKey: "BMXVxJELqTqIqMka5N8ujvW6RXI9zo_xr5BQ6XGDkrsukNVPyKRMEEfzvQGeUdeZaWAaAs2pzyv1aoHEXYMtj1M",
126+
authenticationSecret: "IzODAQZN6BbGvmm7vWQJXg"
127+
)
128+
)
129+
130+
#expect(throws: UserAgentKeyMaterialError.invalidAuthenticationSecret(underlyingError: Base64URLDecodingError())) {
131+
try JSONDecoder().decode(UserAgentKeyMaterial.self, from: Data("""
132+
{
133+
"auth" : "()",
134+
"p256dh" : "BMXVxJELqTqIqMka5N8ujvW6RXI9zo_xr5BQ6XGDkrsukNVPyKRMEEfzvQGeUdeZaWAaAs2pzyv1aoHEXYMtj1M"
135+
}
136+
""".utf8
137+
))
138+
}
139+
140+
#expect(throws: UserAgentKeyMaterialError.invalidPublicKey(underlyingError: Base64URLDecodingError())) {
141+
try JSONDecoder().decode(UserAgentKeyMaterial.self, from: Data("""
142+
{
143+
"auth" : "IzODAQZN6BbGvmm7vWQJXg",
144+
"p256dh" : "()"
145+
}
146+
""".utf8
147+
))
148+
}
149+
150+
#expect(throws: UserAgentKeyMaterialError.invalidPublicKey(underlyingError: Base64URLDecodingError())) {
151+
try JSONDecoder().decode(UserAgentKeyMaterial.self, from: Data("""
152+
{
153+
"auth" : "()",
154+
"p256dh" : "()"
155+
}
156+
""".utf8
157+
))
158+
}
159+
160+
/// `UserAgentKeyMaterialError.invalidPublicKey(underlyingError: CryptoKitError.incorrectParameterSize)` on macOS, `UserAgentKeyMaterialError.invalidPublicKey(underlyingError: CryptoKitError.underlyingCoreCryptoError(error: 251658360))` on Linux
161+
#expect(throws: UserAgentKeyMaterialError.self) {
162+
try JSONDecoder().decode(UserAgentKeyMaterial.self, from: Data("""
163+
{
164+
"auth" : "IzODAQZN6BbGvmm7vWQJXg",
165+
"p256dh" : "BMXVxJELqTqIqMka5N8ujvW6RXI9zo_xr5BQ6XGDkrsukNVPyKRMEEfzvQGeUdeZaWAaAs2pzyv1aoHEXYMtj1A"
166+
}
167+
""".utf8
168+
))
169+
}
170+
}
171+
}
172+
}
173+
}

0 commit comments

Comments
 (0)