test: 为 Agent 系统代理测试复用小规则夹具

This commit is contained in:
Qiu Yuzhou
2026-10-04 00:30:43 +08:00
parent 7fb736f53e
commit b7a2a6a524
4 changed files with 42 additions and 33 deletions
@@ -74,7 +74,7 @@ final class ProxyControlWorkflowIntegrationTests: XCTestCase {
settingsStore: settingsStore ?? InMemoryProxySettingsStore(),
appBundle: AppArtifact.bundle,
// Keep real ACL compilation; corpus coverage belongs to the packaged-rule tests.
ruleSnapshots: BuiltinRuleSnapshots(loader: Self.controlFlowRuleSnapshot),
ruleSnapshots: BuiltinRuleSnapshots(loader: ProxyRuntimeFixture.controlFlowRuleSnapshot),
settingsRestore: RestoredProxySettings(
settings: settings ?? ProxySettings(listen: ActivationFixture.listen),
unreadableError: nil),
@@ -306,34 +306,3 @@ final class ProxyControlWorkflowIntegrationTests: XCTestCase {
}
}
extension ProxyControlWorkflowIntegrationTests {
fileprivate nonisolated static func controlFlowRuleSnapshot(_ source: RulesSource) throws
-> RuleSnapshot
{
switch source {
case .geolocationCN:
return rulesFixture(
source,
rules: [
ProxyRule(action: .direct, match: .domainExact("direct.example")),
ProxyRule(action: .direct, match: .domainSuffix("internal.example")),
])
case .chinaIPv4:
return rulesFixture(
source,
rules: [
ProxyRule(action: .direct, match: .ipv4CIDR("1.0.0.0/24"))
])
case .gfwlist:
return rulesFixture(
source,
rules: [
ProxyRule(action: .proxy, match: .domainSuffix("proxy.example")),
ProxyRule(action: .direct, match: .domainExact("safe.proxy.example")),
])
case .custom, .fixed:
throw RuleSnapshotError.missing
}
}
}
@@ -6,6 +6,10 @@ import XCTest
/// Agent 开关与系统代理开关的拆分语义(issue #60):与既有开关用例同文件
/// 追加(Xcode 测试扫描限制),扩展持有独立用例组。
final class ProxyRuntimeAgentAndSystemProxyTests: ProxyRuntimeControllerTests {
override func makeDefaultRuleSnapshots() -> BuiltinRuleSnapshots {
BuiltinRuleSnapshots(loader: ProxyRuntimeFixture.controlFlowRuleSnapshot)
}
func testEnableWithoutActiveTargetDeploysEmptyServerListening() async throws {
_ = try makeSeededCatalog()
let controller = makeController(
@@ -102,6 +102,11 @@ class ProxyRuntimeControllerTests: XCTestCase {
return (catalog, server)
}
/// Subclasses can choose small rule inputs without changing packaged-data suites.
func makeDefaultRuleSnapshots() -> BuiltinRuleSnapshots {
BuiltinRuleSnapshots(bundle: AppArtifact.bundle)
}
func makeController(
probe: EndpointProbing,
agentStatus: LaunchAgentStatus = .notRegistered,
@@ -153,7 +158,7 @@ class ProxyRuntimeControllerTests: XCTestCase {
customRuleStore: customRuleStore
?? CustomRuleStore(fileURL: runtime.directory.appendingPathComponent("custom-rules.json")),
appBundle: AppArtifact.bundle,
ruleSnapshots: ruleSnapshots,
ruleSnapshots: ruleSnapshots ?? makeDefaultRuleSnapshots(),
settingsRestore: restored,
agent: agent,
probe: probe,
@@ -333,3 +333,34 @@ final class InMemoryProxySettingsStore: ProxySettingsStoring {
saved = settings
}
}
extension ProxyRuntimeFixture {
static func controlFlowRuleSnapshot(_ source: RulesSource) throws
-> RuleSnapshot
{
switch source {
case .geolocationCN:
return rulesFixture(
source,
rules: [
ProxyRule(action: .direct, match: .domainExact("direct.example")),
ProxyRule(action: .direct, match: .domainSuffix("internal.example")),
])
case .chinaIPv4:
return rulesFixture(
source,
rules: [
ProxyRule(action: .direct, match: .ipv4CIDR("1.0.0.0/24"))
])
case .gfwlist:
return rulesFixture(
source,
rules: [
ProxyRule(action: .proxy, match: .domainSuffix("proxy.example")),
ProxyRule(action: .direct, match: .domainExact("safe.proxy.example")),
])
case .custom, .fixed:
throw RuleSnapshotError.missing
}
}
}