feat(cordis): 完成阶段5访问介导与诊断
This commit is contained in:
@@ -24,6 +24,9 @@ namespace ShrinkContext.Tests
|
||||
_catalog.Register("provider", () => new ConfigProviderComponent("provider", "svc"));
|
||||
_catalog.Register("provider.alt", () => new ConfigProviderComponent("provider.alt", "svc"));
|
||||
_catalog.Register("consumer", () => new ConsumerComponent("consumer", "svc"));
|
||||
_catalog.Register("failing", () => new FailingComponent("failing", "svc"));
|
||||
_catalog.Register("policy.provider", () => new PolicyProviderComponent("policy.service"));
|
||||
_catalog.Register("policy.consumer", () => new PolicyConsumerComponent("policy.service"));
|
||||
_loader = new ShrinkContextLoader(_runtime, _catalog);
|
||||
}
|
||||
|
||||
@@ -223,5 +226,87 @@ namespace ShrinkContext.Tests
|
||||
Assert.AreEqual("from-r2", ((ConsumerComponent)consumerFiber.Component).LastSeen,
|
||||
"消费者按自身隔离域解析到 r2 的绑定");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IsolatedProviderReplacement_DoesNotReloadOtherRealmConsumer()
|
||||
{
|
||||
var isolateR1 = new Dictionary<string, string> { ["svc"] = "r1" };
|
||||
var isolateR2 = new Dictionary<string, string> { ["svc"] = "r2" };
|
||||
TestAwait.Run(_loader.ApplyAsync(new List<ShrinkLoaderEntry>
|
||||
{
|
||||
new("p1", "provider", "r1-v1", isolate: isolateR1),
|
||||
new("p2", "provider", "r2-v1", isolate: isolateR2),
|
||||
new("c2", "consumer", isolate: isolateR2),
|
||||
}));
|
||||
Assert.IsTrue(_loader.TryGetFiber("c2", out var consumerFiber));
|
||||
var consumer = (ConsumerComponent)consumerFiber.Component;
|
||||
Assert.AreEqual(1, consumer.LoadCount);
|
||||
|
||||
TestAwait.Run(_loader.ApplyAsync(new List<ShrinkLoaderEntry>
|
||||
{
|
||||
new("p1", "provider", "r1-v2", isolate: isolateR1),
|
||||
new("p2", "provider", "r2-v1", isolate: isolateR2),
|
||||
new("c2", "consumer", isolate: isolateR2),
|
||||
}));
|
||||
|
||||
Assert.AreEqual(1, consumer.LoadCount,
|
||||
"r1 提供者替换不得触发只解析 r2 的消费者重载");
|
||||
Assert.AreEqual("r2-v1", consumer.LastSeen);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void InterceptUpdate_ChangesAccessWithoutReloadingFiber()
|
||||
{
|
||||
var suffixA = new Dictionary<string, IReadOnlyDictionary<string, object?>>
|
||||
{
|
||||
["policy.service"] = new Dictionary<string, object?> { ["suffix"] = "-a" }
|
||||
};
|
||||
var suffixB = new Dictionary<string, IReadOnlyDictionary<string, object?>>
|
||||
{
|
||||
["policy.service"] = new Dictionary<string, object?> { ["suffix"] = "-b" }
|
||||
};
|
||||
|
||||
TestAwait.Run(_loader.ApplyAsync(new List<ShrinkLoaderEntry>
|
||||
{
|
||||
new("policy-provider", "policy.provider", "base"),
|
||||
new("policy-consumer", "policy.consumer", intercept: suffixA),
|
||||
}));
|
||||
Assert.IsTrue(_loader.TryGetFiber("policy-consumer", out var firstFiber));
|
||||
var consumer = (PolicyConsumerComponent)firstFiber.Component;
|
||||
Assert.AreEqual("base-a", consumer.Read());
|
||||
Assert.AreEqual(1, consumer.ApplyCount);
|
||||
|
||||
TestAwait.Run(_loader.ApplyAsync(new List<ShrinkLoaderEntry>
|
||||
{
|
||||
new("policy-provider", "policy.provider", "base"),
|
||||
new("policy-consumer", "policy.consumer", intercept: suffixB),
|
||||
}));
|
||||
|
||||
Assert.IsTrue(_loader.TryGetFiber("policy-consumer", out var sameFiber));
|
||||
Assert.AreSame(firstFiber, sameFiber);
|
||||
Assert.AreEqual(1, consumer.ApplyCount, "intercept 元数据变化不应触发 reload");
|
||||
Assert.AreEqual("base-b", consumer.Read(), "访问时应读取更新后的 metadata");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void FailedReplacement_RestoresPreviousLoaderCompositionAndReportsTransaction()
|
||||
{
|
||||
TestAwait.Run(_loader.ApplyAsync(new List<ShrinkLoaderEntry>
|
||||
{
|
||||
new("provider-entry", "provider", "stable")
|
||||
}));
|
||||
|
||||
Assert.Throws<ShrinkLoaderException>(() => TestAwait.Run(_loader.ApplyAsync(
|
||||
new List<ShrinkLoaderEntry> { new("provider-entry", "failing") })));
|
||||
|
||||
Assert.IsTrue(_loader.TryGetFiber("provider-entry", out var restored));
|
||||
Assert.AreEqual(ShrinkFiberState.Active, restored.State);
|
||||
Assert.AreEqual("stable", restored.Config);
|
||||
Assert.IsNotNull(_loader.LastTransaction);
|
||||
Assert.AreEqual(ShrinkLoaderTransactionPhase.Failed, _loader.LastTransaction!.Phase);
|
||||
Assert.IsTrue(_loader.LastTransaction.RestoreAttempted);
|
||||
Assert.IsTrue(_loader.LastTransaction.PreviousCompositionRestored);
|
||||
StringAssert.Contains("failed during apply", _loader.LastTransaction.ErrorMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user