mirror of
https://github.com/shadowsocks/ShadowsocksX-NG.git
synced 2026-11-08 10:44:50 +00:00
* feat: add GUI-scoped subscription automatic updates * fix: drain newly due subscription updates during a batch * style: use segmented subscription update pickers
69 lines
2.6 KiB
Swift
69 lines
2.6 KiB
Swift
import Foundation
|
|
import Testing
|
|
|
|
@testable import ShadowsocksX_NG2
|
|
|
|
struct SubscriptionAutoUpdateParserTests {
|
|
@Test(arguments: SubscriptionUpdateMode.allCases, [false, true])
|
|
func acceptsOnlyCompletePolicies(mode: SubscriptionUpdateMode, allowsOverride: Bool) throws {
|
|
let snapshot = try parse(
|
|
#"{"schema_version":1,"auto_update":{"mode":"\#(mode.rawValue)","allow_user_override":\#(allowsOverride)}}"#
|
|
)
|
|
#expect(
|
|
snapshot.autoUpdatePolicy == .valid(.init(mode: mode, allowUserOverride: allowsOverride)))
|
|
}
|
|
|
|
@Test(arguments: [
|
|
#"{}"#, #"null"#, #"false"#, #"[]"#,
|
|
#"{"mode":"daily"}"#, #"{"allow_user_override":true}"#,
|
|
#"{"mode":"hourly","allow_user_override":true}"#,
|
|
#"{"mode":1,"allow_user_override":true}"#,
|
|
#"{"mode":"daily","allow_user_override":1}"#,
|
|
#"{"mode":"daily","allow_user_override":"true"}"#,
|
|
])
|
|
func malformedPoliciesDoNotRejectServers(policy: String) throws {
|
|
let snapshot = try parse(#"{"schema_version":1,"auto_update":\#(policy)}"#)
|
|
#expect(snapshot.autoUpdatePolicy == .invalid)
|
|
#expect(snapshot.root.children.count == 1)
|
|
}
|
|
|
|
@Test func invalidTreeAndPolicyAreIndependent() throws {
|
|
let validPolicy = try parse(
|
|
#"{"schema_version":1,"groups":false,"auto_update":{"mode":"weekly","allow_user_override":false}}"#
|
|
)
|
|
#expect(validPolicy.autoUpdatePolicy == .valid(.init(mode: .weekly, allowUserOverride: false)))
|
|
#expect(validPolicy.root.children.count == 1)
|
|
let validTree = try parse(
|
|
#"""
|
|
{"schema_version":1,
|
|
"root_group_id":"root",
|
|
"groups":[{"id":"root",
|
|
"name":"Provider tree",
|
|
"children":[]}],
|
|
"auto_update":{}}
|
|
"""#
|
|
)
|
|
#expect(validTree.root.name == "Provider tree")
|
|
#expect(validTree.autoUpdatePolicy == .invalid)
|
|
}
|
|
|
|
@Test func unsupportedVersionDoesNotAdoptPolicyAndMissingPolicyWithdraws() throws {
|
|
#expect(
|
|
try parse(#"{"schema_version":2,"auto_update":{"mode":"daily","allow_user_override":false}}"#)
|
|
.autoUpdatePolicy == .invalid)
|
|
#expect(try parse(#"{"schema_version":1}"#).autoUpdatePolicy == .absent)
|
|
let absent = try SubscriptionDocumentParser.parse(
|
|
Data(#"{"version":1,"servers":[]}"#.utf8), subscriptionID: .fresh())
|
|
#expect(absent.autoUpdatePolicy == .absent)
|
|
}
|
|
|
|
private func parse(_ namespace: String) throws -> SubscriptionSnapshot {
|
|
let data = Data(
|
|
"""
|
|
{"version":1,"servers":[{"server":"example.com","server_port":8388,
|
|
"method":"aes-256-gcm","password":"password"}],"x_shadowsocksx_ng":\(namespace)}
|
|
""".utf8)
|
|
return try SubscriptionDocumentParser.parse(data, subscriptionID: .fresh())
|
|
}
|
|
}
|