feat(startup): 支持等待 ContextLoader 启动
Publish UPM package / publish (push) Successful in 2s

This commit is contained in:
2026-08-28 03:44:10 +08:00
parent 52bda43e3c
commit 57512d9a31
7 changed files with 165 additions and 15 deletions
+61
View File
@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Cysharp.Threading.Tasks;
using NUnit.Framework;
using ShrinkApp;
@@ -39,6 +40,8 @@ namespace ShrinkContext.AppAdapter.Tests
[TearDown]
public void TearDown()
{
ResetBootstrapperState();
SetSharedSettings(null);
if (_settings != null)
Object.DestroyImmediate(_settings);
}
@@ -68,6 +71,33 @@ namespace ShrinkContext.AppAdapter.Tests
CollectionAssert.AreEquivalent(new[] { "app.a", "app.b" }, probe.Value!.ModuleIds);
}
[Test]
public void WaitUntilStartedAsync_AllConcurrentWaitersCompleteTogether()
{
PrepareBootstrapperWaitState();
var first = ShrinkAppLoaderBootstrapper.WaitUntilStartedAsync();
var second = ShrinkAppLoaderBootstrapper.WaitUntilStartedAsync();
CompleteBootstrapperStartup(null);
TestAwait.Run(UniTask.WhenAll(first, second));
Assert.IsNull(ShrinkAppLoaderBootstrapper.StartError);
}
[Test]
public void WaitUntilStartedAsync_PropagatesObservableStartupError()
{
PrepareBootstrapperWaitState();
var expected = new InvalidOperationException("test startup failure");
CompleteBootstrapperStartup(expected);
var actual = Assert.Throws<InvalidOperationException>(() =>
TestAwait.Run(ShrinkAppLoaderBootstrapper.WaitUntilStartedAsync()));
Assert.AreSame(expected, actual);
Assert.AreSame(expected, ShrinkAppLoaderBootstrapper.StartError);
}
[Test]
public void SetModuleDisabled_RetiresModuleAndDependents_EnableReloadsWithoutRestart()
{
@@ -210,5 +240,36 @@ namespace ShrinkContext.AppAdapter.Tests
public string Value { get; }
}
private void PrepareBootstrapperWaitState()
{
ResetBootstrapperState();
_settings.hostingMode = ShrinkAppHostingMode.ContextLoader;
SetSharedSettings(_settings);
}
private static void CompleteBootstrapperStartup(Exception? error)
{
var method = typeof(ShrinkAppLoaderBootstrapper).GetMethod(
"CompleteStartup", BindingFlags.NonPublic | BindingFlags.Static);
Assert.IsNotNull(method);
method!.Invoke(null, new object?[] { error });
}
private static void ResetBootstrapperState()
{
var method = typeof(ShrinkAppLoaderBootstrapper).GetMethod(
"ResetStaticState", BindingFlags.NonPublic | BindingFlags.Static);
Assert.IsNotNull(method);
method!.Invoke(null, null);
}
private static void SetSharedSettings(ShrinkAppSettings? settings)
{
var property = typeof(ShrinkAppSettings).GetProperty(
nameof(ShrinkAppSettings.Instance), BindingFlags.Public | BindingFlags.Static);
Assert.IsNotNull(property);
property!.SetValue(null, settings);
}
}
}