public void DoNotUnloadDependencyTwiceOfSameBundle_DoNotUnloadDependencyBundle() { // B has dependency to A // C has dependency to A // D has dependency to B so it has to A // Unload B and his dependency TWICE // A should not be unload because it is a dependency of C // B should not be unload because it a dependency of D var bundleA = new MockBundle(Substitute.For <IBundle>(), "A"); var bundleB = CreateBundleWithDependencyOn("B", bundleA); LoadBundleWithDependencyInstantly(bundleB); // Create dependency bundle to keep A alive var bundleC = CreateBundleWithDependencyOn("C", bundleA); LoadBundleWithDependencyInstantly(bundleC); // Create dependency bundle to keep B alive (if not releaseRef will return false because B won't be loaded) var bundleD = CreateBundleWithDependencyOn("D", bundleB); LoadBundleWithDependencyInstantly(bundleD); UnloadBundleWithDependency(bundleB); bundleB.Bundle.Received(0).Unload(); // D is dependent on it bundleA.Bundle.Received(0).Unload(); // C is dependent on it // Unload bundle twice (should not decrease dependency ref and keep it loaded) UnloadBundleWithDependency(bundleB); bundleB.Bundle.Received(0).Unload(); // D is dependent on it bundleA.Bundle.Received(0).Unload(); // C is dependent on it }
private void UnloadDependency(MockBundle bundle) { foreach (var dependency in bundle.Dependencies) { _fixture.UnloadDependency(dependency.Name, bundle.Name); } }
private void LoadBundleWithDependencyInstantly(MockBundle mockBundle, Options options = null) { SetUpInnerLoaderReturns(Observable.Return(mockBundle.Bundle)); _fixture.Load(mockBundle.Name, options ?? new Options()) .Do(x => (x as IDisposable)?.Dispose()) .Wait(); LoadBundleDependencyInstantly(mockBundle, options); }
private bool UnloadBundleWithDependency(MockBundle bundle) { if (!_fixture.Unload(bundle.Name)) { return(false); } UnloadDependency(bundle); return(true); }
private void LoadBundleDependencyInstantly(MockBundle mockBundle, Options options = null) { foreach (var dependency in mockBundle.Dependencies) { SetUpInnerLoaderReturns(Observable.Return(dependency.Bundle)); _fixture.LoadDependency(dependency.Name, options ?? new Options(), mockBundle.Name) .Do(x => (x as IDisposable)?.Dispose()) .Wait(); } }
public void SetUp() { _innerLoader = Substitute.For <ILoader>(); var platformProvider = Substitute.For <IPlatformProvider>(); platformProvider.GetPlatformName() .Returns(PlatformName); _fixture = new BundleCacheLoader(_innerLoader, platformProvider, BaseUri); _mockBundle = new MockBundle(Substitute.For <IBundle>(), BundleName); }
public void UnloadBundleOnlyIfNoMoreDependency_UnloadBundle() { // B has dependency to A // C has dependency to A // D has dependency to B so it has to A // Unload B and his dependency TWICE // A should not be unload because it is a dependency of C // B should not be unload because it a dependency of D // Will get load only from dependency var bundleA = new MockBundle(Substitute.For <IBundle>(), "A"); var bundleB = CreateBundleWithDependencyOn("B", bundleA); LoadBundleWithDependencyInstantly(bundleB); // Create dependency bundle to keep A alive var bundleC = CreateBundleWithDependencyOn("C", bundleA); LoadBundleWithDependencyInstantly(bundleC); // Create dependency bundle to keep B alive (if not releaseRef will return false because B won't be loaded) // bundleD is also dependent on A because of bundleB var bundleD = CreateBundleWithDependencyOn("D", bundleB, bundleA); LoadBundleWithDependencyInstantly(bundleD); UnloadBundleWithDependency(bundleB); bundleB.Bundle.Received(0).Unload(); // D is dependent on B bundleA.Bundle.Received(0).Unload(); // B is dependent on A UnloadBundleWithDependency(bundleC); bundleC.Bundle.Received(1).Unload(); // No more dependency bundleA.Bundle.Received(0).Unload(); // D is dependent on B that is dependent on A UnloadBundleWithDependency(bundleD); bundleD.Bundle.Received(1).Unload(); // No more dependency bundleB.Bundle.Received(1).Unload(); // No more dependency bundleA.Bundle.Received(1).Unload(); // No more dependency }
private IObservable <IBundle> LoadBundleDependency(MockBundle bundle) => _fixture.LoadDependency(bundle.Name, new Options(), bundle.Name);
private IObservable <IBundle> LoadBundle(MockBundle bundle) => _fixture.Load(bundle.Name, new Options());