mirror of
https://github.com/shadowsocks/ShadowsocksX-NG.git
synced 2026-11-08 11:14:51 +00:00
Remove lossy default-action writes that can replace china-proxy with gfwlist. Preserve legacy preference reads and derive the default action from the selected preset. Update tests to use explicit presets and verify identity, legacy compatibility, and no-op reselection.
80 lines
3.4 KiB
Swift
80 lines
3.4 KiB
Swift
import Foundation
|
|
import Testing
|
|
|
|
@testable import ShadowsocksX_NG2
|
|
|
|
struct ProxyControlPreferencesTests {
|
|
@Test func freshPreferencesUseFactoryIntentWithoutChangingExistingPreferences() throws {
|
|
let suite = "proxy-control-defaults-\(UUID().uuidString)"
|
|
let defaults = try #require(UserDefaults(suiteName: suite))
|
|
defer { defaults.removePersistentDomain(forName: suite) }
|
|
defaults.set(true, forKey: "silentLaunch")
|
|
defaults.set("http://example.com/probe", forKey: "connectivityTestURL")
|
|
|
|
let settings = ProxyRuntimeSettings(
|
|
listen: ProxyListeningConfiguration(),
|
|
preferences: ProxyControlPreferences(defaults: defaults))
|
|
|
|
#expect(settings.preferredMode == .rule)
|
|
#expect(settings.rulePreset == .gfwlist)
|
|
#expect(settings.ruleDefaultAction == .directWhenUnmatched)
|
|
#expect(!settings.agentEnabled)
|
|
#expect(!settings.systemProxyEnabled)
|
|
#expect(settings.proxyExceptions.isEmpty)
|
|
#expect(defaults.bool(forKey: "silentLaunch"))
|
|
#expect(defaults.string(forKey: "connectivityTestURL") == "http://example.com/probe")
|
|
}
|
|
|
|
@Test func rebuildingSnapshotRestoresIndependentPreferencesAndCurrentListeningConfiguration()
|
|
throws
|
|
{
|
|
let suite = "proxy-control-roundtrip-\(UUID().uuidString)"
|
|
let defaults = try #require(UserDefaults(suiteName: suite))
|
|
defer { defaults.removePersistentDomain(forName: suite) }
|
|
let preferences = ProxyControlPreferences(defaults: defaults)
|
|
preferences.preferredMode = .direct
|
|
preferences.rulePreset = .chinaProxy
|
|
preferences.agentEnabled = true
|
|
preferences.systemProxyEnabled = true
|
|
preferences.proxyExceptions = "example.com, localhost"
|
|
var listen = ProxyListeningConfiguration()
|
|
listen.socksPort = 23001
|
|
listen.httpPort = 23002
|
|
|
|
let reopened = ProxyControlPreferences(defaults: try #require(UserDefaults(suiteName: suite)))
|
|
let settings = ProxyRuntimeSettings(listen: listen, preferences: reopened)
|
|
|
|
#expect(settings.preferredMode == .direct)
|
|
#expect(settings.rulePreset == .chinaProxy)
|
|
#expect(settings.ruleDefaultAction == .directWhenUnmatched)
|
|
#expect(settings.agentEnabled)
|
|
#expect(settings.systemProxyEnabled)
|
|
#expect(settings.proxyExceptionList == ["example.com", "localhost"])
|
|
#expect(settings.listen.socksPort == 23001)
|
|
#expect(settings.listen.httpPort == 23002)
|
|
}
|
|
|
|
@Test(arguments: RuleDefaultAction.allCases)
|
|
func legacyDefaultActionIsReadUntilAnExplicitPresetIsSaved(_ action: RuleDefaultAction) throws {
|
|
let suite = "proxy-control-legacy-\(UUID().uuidString)"
|
|
let defaults = try #require(UserDefaults(suiteName: suite))
|
|
defer { defaults.removePersistentDomain(forName: suite) }
|
|
defaults.set(action.rawValue, forKey: "proxyControl.ruleDefaultAction")
|
|
let preferences = ProxyControlPreferences(defaults: defaults)
|
|
let expected: RulePreset = action == .proxyWhenUnmatched ? .chinaDirect : .gfwlist
|
|
#expect(preferences.rulePreset == expected)
|
|
#expect(defaults.object(forKey: "proxyControl.rulePreset") == nil)
|
|
|
|
for preset in RulePreset.allCases {
|
|
preferences.rulePreset = preset
|
|
let reopened = ProxyControlPreferences(defaults: defaults)
|
|
let settings = ProxyRuntimeSettings(
|
|
listen: ProxyListeningConfiguration(), preferences: reopened)
|
|
#expect(settings.rulePreset == preset)
|
|
#expect(settings.ruleDefaultAction == preset.defaultAction)
|
|
#expect(defaults.string(forKey: "proxyControl.ruleDefaultAction") == action.rawValue)
|
|
}
|
|
}
|
|
|
|
}
|