From 2bf8a2d45c7c7d1b94a55acd26e2f72140b77dd5 Mon Sep 17 00:00:00 2001 From: Qiu Yuzhou Date: Sun, 25 Oct 2026 12:47:52 +0800 Subject: [PATCH] test(rules): align fixtures with preset ownership Select presets explicitly so document stores, runtime preparation, and browsing assertions use the intended rule sources. --- .../ProxyRuntimeControllerModeTests.swift | 3 ++- .../Tests/Rules/BuiltinRuleCatalogTests.swift | 3 ++- .../Custom/CustomRuleControllerTests.swift | 4 +++- .../CustomRuleDeletionControllerTests.swift | 7 ++++-- .../CustomRuleEditingControllerTests.swift | 4 +++- .../Rules/RuleEnablementControllerTests.swift | 24 ++++++++++++------- .../Rules/RuleEnablementWorkflowTests.swift | 2 ++ .../Tests/Rules/RulesWorkflowTests.swift | 3 +++ 8 files changed, 36 insertions(+), 14 deletions(-) diff --git a/ShadowsocksX-NG2/Tests/ProxyRuntime/ProxyRuntimeControllerModeTests.swift b/ShadowsocksX-NG2/Tests/ProxyRuntime/ProxyRuntimeControllerModeTests.swift index f160c3a0..30ae668d 100644 --- a/ShadowsocksX-NG2/Tests/ProxyRuntime/ProxyRuntimeControllerModeTests.swift +++ b/ShadowsocksX-NG2/Tests/ProxyRuntime/ProxyRuntimeControllerModeTests.swift @@ -84,7 +84,8 @@ extension ProxyRuntimeControllerModeTests { let controller = makeController( probe: ProxyRuntimeFixture.FakeProbe.reachable(), settings: ProxyRuntimeSettings( - listen: ActivationFixture.listen, preferredMode: .global, agentEnabled: true), + listen: ActivationFixture.listen, preferredMode: .global, + rulePreset: .chinaDirect, agentEnabled: true), proxyMode: .global, ruleSnapshots: loader) try await controller.activate(seeded.server) diff --git a/ShadowsocksX-NG2/Tests/Rules/BuiltinRuleCatalogTests.swift b/ShadowsocksX-NG2/Tests/Rules/BuiltinRuleCatalogTests.swift index c5b8b12d..42463ae0 100644 --- a/ShadowsocksX-NG2/Tests/Rules/BuiltinRuleCatalogTests.swift +++ b/ShadowsocksX-NG2/Tests/Rules/BuiltinRuleCatalogTests.swift @@ -43,7 +43,8 @@ final class BuiltinRuleCatalogTests: XCTestCase { _ = try await snapshots.load(.chinaIPv4) XCTFail("The first runtime source request should fail") } catch {} - let workflow = RulesWorkflow(loadCustom: { [] }, builtinSnapshots: snapshots) + let workflow = RulesWorkflow( + preset: .chinaDirect, loadCustom: { [] }, builtinSnapshots: snapshots) await workflow.refresh() XCTAssertFalse(workflow.snapshot.isComplete) XCTAssertEqual(loader.count(.chinaIPv4), 1) diff --git a/ShadowsocksX-NG2/Tests/Rules/Custom/CustomRuleControllerTests.swift b/ShadowsocksX-NG2/Tests/Rules/Custom/CustomRuleControllerTests.swift index be14584a..2f3f31d5 100644 --- a/ShadowsocksX-NG2/Tests/Rules/Custom/CustomRuleControllerTests.swift +++ b/ShadowsocksX-NG2/Tests/Rules/Custom/CustomRuleControllerTests.swift @@ -34,7 +34,8 @@ extension ProxyRuntimeControllerTests { probe: probe, listeningStore: InMemoryProxyListeningStore(), settings: settings - ?? ProxyRuntimeSettings(listen: ActivationFixture.listen, agentEnabled: true), + ?? ProxyRuntimeSettings( + listen: ActivationFixture.listen, rulePreset: .chinaDirect, agentEnabled: true), proxyMode: proxyMode, launchHealthTimeoutSeconds: launchHealthTimeoutSeconds, launchHealthRetryDelay: launchHealthRetryDelay, @@ -200,6 +201,7 @@ final class CustomRuleControllerTests: ProxyRuntimeControllerTests { let settings = ProxyRuntimeSettings( listen: ActivationFixture.listen, preferredMode: .global, + rulePreset: .chinaDirect, agentEnabled: true) let controller = makeControllerWithCustomRules( store: store, settings: settings, proxyMode: .global) diff --git a/ShadowsocksX-NG2/Tests/Rules/Custom/CustomRuleDeletionControllerTests.swift b/ShadowsocksX-NG2/Tests/Rules/Custom/CustomRuleDeletionControllerTests.swift index dcc9ffcb..76e78219 100644 --- a/ShadowsocksX-NG2/Tests/Rules/Custom/CustomRuleDeletionControllerTests.swift +++ b/ShadowsocksX-NG2/Tests/Rules/Custom/CustomRuleDeletionControllerTests.swift @@ -27,7 +27,8 @@ final class CustomRuleDeletionControllerTests: ProxyRuntimeControllerTests { try store.saveDocument(original) let controller = makeDeletionController( store: store, - settings: ProxyRuntimeSettings(listen: ActivationFixture.listen, agentEnabled: false)) + settings: ProxyRuntimeSettings( + listen: ActivationFixture.listen, rulePreset: .chinaDirect, agentEnabled: false)) let workflow = deletionWorkflow(controller) await workflow.refresh() workflow.select(Set(workflow.snapshot.rows.map(\.id))) @@ -160,7 +161,8 @@ final class CustomRuleDeletionControllerTests: ProxyRuntimeControllerTests { try store.saveDocument(original) let controller = makeDeletionController( store: store, - settings: ProxyRuntimeSettings(listen: ActivationFixture.listen, agentEnabled: false)) + settings: ProxyRuntimeSettings( + listen: ActivationFixture.listen, rulePreset: .chinaDirect, agentEnabled: false)) let workflow = deletionWorkflow(controller) await workflow.refresh() workflow.select(Set(workflow.snapshot.rows.map(\.id))) @@ -191,6 +193,7 @@ final class CustomRuleDeletionControllerTests: ProxyRuntimeControllerTests { private func deletionWorkflow(_ controller: ProxyRuntimeController) -> RulesWorkflow { RulesWorkflow( + preset: controller.rulePreset, loadDocument: { try controller.ruleDocuments.load() }, commitDocument: { await controller.commitRuleDocument($0) }, builtinSnapshots: controller.ruleSnapshots) diff --git a/ShadowsocksX-NG2/Tests/Rules/Custom/CustomRuleEditingControllerTests.swift b/ShadowsocksX-NG2/Tests/Rules/Custom/CustomRuleEditingControllerTests.swift index e4063f33..109e30c6 100644 --- a/ShadowsocksX-NG2/Tests/Rules/Custom/CustomRuleEditingControllerTests.swift +++ b/ShadowsocksX-NG2/Tests/Rules/Custom/CustomRuleEditingControllerTests.swift @@ -13,7 +13,8 @@ final class CustomRuleEditingControllerTests: ProxyRuntimeControllerTests { let (store, _) = try makeCustomRuleStore() let controller = makeControllerWithCustomRules( store: store, - settings: ProxyRuntimeSettings(listen: ActivationFixture.listen, agentEnabled: false)) + settings: ProxyRuntimeSettings( + listen: ActivationFixture.listen, rulePreset: .chinaDirect, agentEnabled: false)) let workflow = editingWorkflow(controller) await workflow.refresh() var draft = try XCTUnwrap(workflow.makeCustomRuleDraft()) @@ -103,6 +104,7 @@ final class CustomRuleEditingControllerTests: ProxyRuntimeControllerTests { private func editingWorkflow(_ controller: ProxyRuntimeController) -> RulesWorkflow { RulesWorkflow( + preset: controller.rulePreset, loadDocument: { try controller.ruleDocuments.load() }, commitDocument: { await controller.commitRuleDocument($0) }, builtinSnapshots: controller.ruleSnapshots) diff --git a/ShadowsocksX-NG2/Tests/Rules/RuleEnablementControllerTests.swift b/ShadowsocksX-NG2/Tests/Rules/RuleEnablementControllerTests.swift index 6223bf9c..20eacda9 100644 --- a/ShadowsocksX-NG2/Tests/Rules/RuleEnablementControllerTests.swift +++ b/ShadowsocksX-NG2/Tests/Rules/RuleEnablementControllerTests.swift @@ -38,7 +38,8 @@ final class RuleEnablementControllerTests: ProxyRuntimeControllerTests { let controller = makeRuleEnablementController( store: store, settings: ProxyRuntimeSettings( - listen: ActivationFixture.listen, preferredMode: .rule, agentEnabled: true), + listen: ActivationFixture.listen, preferredMode: .rule, + rulePreset: .chinaDirect, agentEnabled: true), proxyMode: .rule, ruleApplicationDelay: { try await applicationGate.wait() }) try await controller.activate(seeded.server) let before = agent.registerCount @@ -75,7 +76,8 @@ final class RuleEnablementControllerTests: ProxyRuntimeControllerTests { let controller = makeRuleEnablementController( store: store, settings: ProxyRuntimeSettings( - listen: ActivationFixture.listen, preferredMode: .rule, agentEnabled: true), + listen: ActivationFixture.listen, preferredMode: .rule, + rulePreset: .chinaDirect, agentEnabled: true), proxyMode: .rule, launchHealthTimeoutSeconds: 0.3, launchHealthRetryDelay: { try await healthGate.wait() }) try await controller.activate(seeded.server) @@ -123,7 +125,8 @@ final class RuleEnablementControllerTests: ProxyRuntimeControllerTests { let controller = makeRuleEnablementController( store: store, settings: ProxyRuntimeSettings( - listen: ActivationFixture.listen, preferredMode: .global, agentEnabled: true), + listen: ActivationFixture.listen, preferredMode: .global, + rulePreset: .chinaDirect, agentEnabled: true), proxyMode: .global, ruleSnapshots: BuiltinRuleSnapshots(loader: { await loader.load($0) })) try await controller.activate(seeded.server) let runtimeStore = RuntimeFileStore(fileURL: runtime.contract) @@ -163,7 +166,8 @@ final class RuleEnablementControllerTests: ProxyRuntimeControllerTests { let controller = makeRuleEnablementController( store: store, settings: ProxyRuntimeSettings( - listen: ActivationFixture.listen, preferredMode: .global, agentEnabled: true), + listen: ActivationFixture.listen, preferredMode: .global, + rulePreset: .chinaDirect, agentEnabled: true), proxyMode: .global, ruleSnapshots: BuiltinRuleSnapshots(loader: { await loader.load($0) })) try await controller.activate(seeded.server) let modeSwitch = Task { await controller.setProxyMode(.rule) } @@ -189,7 +193,8 @@ final class RuleEnablementControllerTests: ProxyRuntimeControllerTests { defer { loader.resume() } let snapshots = BuiltinRuleSnapshots(loader: { await loader.load($0) }) let settings = ProxyRuntimeSettings( - listen: ActivationFixture.listen, preferredMode: .global, agentEnabled: true) + listen: ActivationFixture.listen, preferredMode: .global, + rulePreset: .chinaDirect, agentEnabled: true) let controller = makeRuleEnablementController( store: store, settings: settings, proxyMode: .global, ruleSnapshots: snapshots) try await controller.activate(seeded.server) @@ -236,7 +241,8 @@ final class RuleEnablementControllerTests: ProxyRuntimeControllerTests { let controller = makeRuleEnablementController( store: store, settings: ProxyRuntimeSettings( - listen: ActivationFixture.listen, preferredMode: .global, agentEnabled: true), + listen: ActivationFixture.listen, preferredMode: .global, + rulePreset: .chinaDirect, agentEnabled: true), proxyMode: .global, ruleSnapshots: BuiltinRuleSnapshots(loader: { await loader.load($0) })) try await controller.activate(seeded.server) let old = Task { await controller.setProxyMode(.rule) } @@ -363,7 +369,8 @@ extension RuleEnablementControllerTests { let (store, _) = try makeCustomRuleStore() let controller = makeRuleEnablementController( store: store, - settings: ProxyRuntimeSettings(listen: ActivationFixture.listen, agentEnabled: false)) + settings: ProxyRuntimeSettings( + listen: ActivationFixture.listen, rulePreset: .chinaDirect, agentEnabled: false)) let identity = ProxyRule(action: .proxy, match: try RuleMatch(domainExact: "saved.example")) let outcome = await controller.updateRuleDocument( CustomRuleDocument(rules: [], disabledIdentities: [identity])) @@ -375,7 +382,8 @@ extension RuleEnablementControllerTests { try broken.write(to: store.fileURL) let newSession = makeRuleEnablementController( store: store, - settings: ProxyRuntimeSettings(listen: ActivationFixture.listen, agentEnabled: false)) + settings: ProxyRuntimeSettings( + listen: ActivationFixture.listen, rulePreset: .chinaDirect, agentEnabled: false)) let rejected = await newSession.updateRuleDocument(CustomRuleDocument(rules: [])) XCTAssertEqual(rejected, .persistenceFailed) XCTAssertEqual(try Data(contentsOf: store.fileURL), broken) diff --git a/ShadowsocksX-NG2/Tests/Rules/RuleEnablementWorkflowTests.swift b/ShadowsocksX-NG2/Tests/Rules/RuleEnablementWorkflowTests.swift index 6cc3ca34..709ef800 100644 --- a/ShadowsocksX-NG2/Tests/Rules/RuleEnablementWorkflowTests.swift +++ b/ShadowsocksX-NG2/Tests/Rules/RuleEnablementWorkflowTests.swift @@ -59,6 +59,7 @@ final class RuleEnablementWorkflowTests: XCTestCase { let started = expectation(description: "analysis paused") let gate = RulesAnalysisGate(started: started) let workflow = RulesWorkflow( + preset: .chinaDirect, loadDocument: { try session.load() }, commitDocument: { document in do { @@ -107,6 +108,7 @@ final class RuleEnablementWorkflowTests: XCTestCase { let reads = RulesReadCounts() let rule = CustomRule(action: .proxy, match: try RuleMatch(domainExact: "saved.example")) let workflow = RulesWorkflow( + preset: .chinaDirect, loadDocument: { reads.recordDocument() return CustomRuleDocument(rules: [rule]) diff --git a/ShadowsocksX-NG2/Tests/Rules/RulesWorkflowTests.swift b/ShadowsocksX-NG2/Tests/Rules/RulesWorkflowTests.swift index 57e2c768..fbee6dfd 100644 --- a/ShadowsocksX-NG2/Tests/Rules/RulesWorkflowTests.swift +++ b/ShadowsocksX-NG2/Tests/Rules/RulesWorkflowTests.swift @@ -82,6 +82,7 @@ final class RulesWorkflowTests: XCTestCase { attribution: "author"), rules: [ProxyRule(action: .direct, match: match)]) let workflow = RulesWorkflow( + preset: .chinaDirect, loadCustom: { [custom] }, builtinSnapshots: BuiltinRuleSnapshots(loader: { source in source == .geolocationCN ? snapshot : rulesFixture(source) @@ -148,6 +149,7 @@ final class RulesWorkflowTests: XCTestCase { func testCorruptUserDocumentAndMissingBuiltinStayDistinctFromEmptySearch() async throws { let workflow = RulesWorkflow( + preset: .chinaDirect, loadCustom: { throw CustomRuleStoreError.corrupt(detail: "fixture") }, builtinSnapshots: BuiltinRuleSnapshots(loader: { source in if source == .chinaIPv4 { throw RuleSnapshotError.missing } @@ -169,6 +171,7 @@ final class RulesWorkflowTests: XCTestCase { func testPackagedCollectionLoadsMetadataShippedRulesAndFixedSemanticPolicy() async throws { let bundle = AppArtifact.bundle let workflow = RulesWorkflow( + preset: .chinaDirect, loadCustom: { [] }, builtinSnapshots: BuiltinRuleSnapshots(bundle: bundle)) await workflow.refresh()