/// <summary> /// Builds a new fusion package into <paramref name="fusion"/> with all the required package versions. /// </summary> /// <param name="fusionConfig">Configuration of the fusion that needs to be builded.</param> /// <param name="fusion">Fusion that needs to be builded.</param> /// <param name="packageVersions">Versions of the packages that needs to be included in the fusion.</param> /// <inheritdoc /> public void Build(FusePackConfig fusionConfig, IFusion fusion, IEnumerable <PackageVersion> packageVersions) { EnsureArg.IsNotNull(fusionConfig, nameof(fusionConfig)); EnsureArg.IsNotNull(fusion, nameof(fusion)); EnsureArg.IsNotNull(packageVersions, nameof(packageVersions)); IEnumerable <IPackage> packages = null; try { packages = packageVersions .Select(_ => packService.LoadPackage(_)) .Stale(); var finalEntries = GetFinalEntries(fusionConfig, packages); foreach (var entry in finalEntries) { SaveEntryOnFusion(fusion, entry, fusionConfig); logService.Debug($"Entry: '{entry.Name}' added to fusion: '{fusionConfig.Id}'."); } } finally { if (packages != null) { foreach (var package in packages) { (package as IDisposable)?.Dispose(); } } } }
public void BeforeAddEntry(FusePackConfig config, IPackageEntry entry) { var processEntry = entry as FusionProcessEntry; var processConfigEntry = entry as FusionProcessConfigEntry; var metaEntry = entry as FusionMetaEntry; if (processEntry != null) { processEntry.Name = config.Id; } if (processConfigEntry != null) { processConfigEntry.Name = $"{config.Id}.config"; } if (metaEntry != null) { metaEntry.SetInfo(FusionMetaEntry.ExecutableInfoKey, config.Id); metaEntry.SetInfo(ZappVariables.StartupAssemblyNameFusionInfoKey, "SuperExitingApp1"); metaEntry.SetInfo(ZappVariables.TeardownAssemblyNameFusionInfoKey, "SuperExitingApp1"); metaEntry.SetInfo(ZappVariables.TeardownTypeNameFusionInfoKey, "SuperExitingClass1"); metaEntry.SetInfo(ZappVariables.TeardownMethodNameFusionInfoKey, "Teardown"); } }
private void SaveEntryOnFusion( IFusion fusion, IPackageEntry entry, FusePackConfig fusionConfig) { foreach (var filter in fusionFilters) { filter.BeforeAddEntry(fusionConfig, entry); } fusion.AddEntry(entry); }
private IEnumerable <IPackageEntry> GetFinalEntries(FusePackConfig fusionConfig, IEnumerable <IPackage> packages) { var basicEntries = GetBasicEntries(fusionConfig); var packageEntries = packages .SelectMany(_ => _.GetEntries()) .Where(_ => entryFilter.IsMatch(_.Name)); var finalEntries = basicEntries .Concat(packageEntries); return(finalEntries .GroupBy(_ => _.Name, StringComparer.OrdinalIgnoreCase) .Select(_ => _.FirstOrDefault())); }
private IEnumerable <IPackageEntry> GetBasicEntries(FusePackConfig fusionConfig) { var dependencyEntries = dependencyFiles .Select(_ => new LazyPackageEntry(_.Name, new LazyStream(() => _.OpenRead()))); var interceptorEntries = fusionInterceptors .Select(_ => _.GetEntries(fusionConfig)) .Where(_ => _ != null) .SelectMany(_ => _); var frameworkEntries = frameworkPackageEntryFactory .CreateNew() .Cast <IPackageEntry>(); return(dependencyEntries .Concat(frameworkEntries) .Concat(interceptorEntries)); }
/// <summary> /// Extracts the stream /// </summary> /// <param name="config">Configuration of the fusion.</param> /// <param name="contentStream">Stream of the fusion.</param> /// <exception cref="ArgumentNullException">Throw when either <paramref name="config"/> or <paramref name="contentStream"/> is not set.</exception> /// <inheritdoc /> public void Extract(FusePackConfig config, Stream contentStream) { EnsureArg.IsNotNull(config, nameof(config)); EnsureArg.IsNotNull(contentStream, nameof(contentStream)); fusionMaid.CleanAll(config.Id); var fusionLocation = fusionCatalogue .CreateLocation(config.Id); Directory.CreateDirectory(fusionLocation); using (var archive = new ZipArchive(contentStream)) { archive.ExtractToDirectory(fusionLocation); logService.Info($"Fusion: '{config.Id}' has been extracted to disk."); } }
public void Extract_WhenCalled_ExtractsFilesToDirectory() { var cfg = new FusePackConfig { Id = "test" }; var fuseDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "test"); var contentStream = AssetsHelper.Read("test.zip"); kernel.GetMock <IFusionCatalogue>() .Setup(_ => _.CreateLocation(cfg.Id)) .Returns(() => fuseDir); var sut = GetSystemUnderTest(); try { sut.Extract(cfg, contentStream); var dirInfo = new DirectoryInfo(fuseDir); Assert.That(dirInfo.GetFiles(), Is.Not.Empty); kernel.GetMock <ILog>() .Verify(_ => _.Info(It.IsAny <string>()), Times.Once); kernel.GetMock <IFusionMaid>() .Verify(_ => _.CleanAll(cfg.Id), Times.Once); } finally { if (Directory.Exists(fuseDir)) { Directory.Delete(fuseDir, true); } } }