@@ -27,6 +27,7 @@ private let lastGatewayDefaultsKeys = [
2727 " gateway.last.tls " ,
2828 " gateway.last.stableID " ,
2929]
30+ private let lastGatewayKeychainEntry = KeychainEntry ( service: gatewayService, account: " lastConnection " )
3031
3132private func snapshotDefaults( _ keys: [ String ] ) -> [ String : Any ? ] {
3233 let defaults = UserDefaults . standard
@@ -84,9 +85,13 @@ private func withBootstrapSnapshots(_ body: () -> Void) {
8485 body ( )
8586}
8687
87- private func withLastGatewayDefaultsSnapshot( _ body: ( ) -> Void ) {
88- let snapshot = snapshotDefaults ( lastGatewayDefaultsKeys)
89- defer { restoreDefaults ( snapshot) }
88+ private func withLastGatewaySnapshot( _ body: ( ) -> Void ) {
89+ let defaultsSnapshot = snapshotDefaults ( lastGatewayDefaultsKeys)
90+ let keychainSnapshot = snapshotKeychain ( [ lastGatewayKeychainEntry] )
91+ defer {
92+ restoreDefaults ( defaultsSnapshot)
93+ restoreKeychain ( keychainSnapshot)
94+ }
9095 body ( )
9196}
9297
@@ -135,7 +140,7 @@ private func withLastGatewayDefaultsSnapshot(_ body: () -> Void) {
135140 }
136141
137142 @Test func lastGateway_manualRoundTrip( ) {
138- withLastGatewayDefaultsSnapshot {
143+ withLastGatewaySnapshot {
139144 GatewaySettingsStore . saveLastGatewayConnectionManual (
140145 host: " example.com " ,
141146 port: 443 ,
@@ -147,28 +152,24 @@ private func withLastGatewayDefaultsSnapshot(_ body: () -> Void) {
147152 }
148153 }
149154
150- @Test func lastGateway_discoveredDoesNotPersistResolvedHostPort( ) {
151- withLastGatewayDefaultsSnapshot {
152- // Simulate a prior manual record that included host/port.
153- applyDefaults ( [
154- " gateway.last.host " : " 10.0.0.99 " ,
155- " gateway.last.port " : 18789 ,
156- " gateway.last.tls " : true ,
157- " gateway.last.stableID " : " manual|10.0.0.99|18789 " ,
158- " gateway.last.kind " : " manual " ,
159- ] )
155+ @Test func lastGateway_discoveredOverwritesManual( ) {
156+ withLastGatewaySnapshot {
157+ GatewaySettingsStore . saveLastGatewayConnectionManual (
158+ host: " 10.0.0.99 " ,
159+ port: 18789 ,
160+ useTLS: true ,
161+ stableID: " manual|10.0.0.99|18789 " )
160162
161163 GatewaySettingsStore . saveLastGatewayConnectionDiscovered ( stableID: " gw|abc " , useTLS: true )
162164
163- let defaults = UserDefaults . standard
164- #expect( defaults. object ( forKey: " gateway.last.host " ) == nil )
165- #expect( defaults. object ( forKey: " gateway.last.port " ) == nil )
166165 #expect( GatewaySettingsStore . loadLastGatewayConnection ( ) == . discovered( stableID: " gw|abc " , useTLS: true ) )
167166 }
168167 }
169168
170- @Test func lastGateway_backCompat_manualLoadsWhenKindMissing( ) {
171- withLastGatewayDefaultsSnapshot {
169+ @Test func lastGateway_migratesFromUserDefaults( ) {
170+ withLastGatewaySnapshot {
171+ // Clear Keychain entry and plant legacy UserDefaults values.
172+ applyKeychain ( [ lastGatewayKeychainEntry: nil ] )
172173 applyDefaults ( [
173174 " gateway.last.kind " : nil ,
174175 " gateway.last.host " : " example.org " ,
@@ -179,6 +180,11 @@ private func withLastGatewayDefaultsSnapshot(_ body: () -> Void) {
179180
180181 let loaded = GatewaySettingsStore . loadLastGatewayConnection ( )
181182 #expect( loaded == . manual( host: " example.org " , port: 18789 , useTLS: false , stableID: " manual|example.org|18789 " ) )
183+
184+ // Legacy keys should be cleaned up after migration.
185+ let defaults = UserDefaults . standard
186+ #expect( defaults. object ( forKey: " gateway.last.stableID " ) == nil )
187+ #expect( defaults. object ( forKey: " gateway.last.host " ) == nil )
182188 }
183189 }
184190
0 commit comments