Exemple #1
0
        public async Task TestMainImplAsync()
        {
            using var cts = new CancellationTokenSource();
            var specialFoldersAnyOs = new SnapOsSpecialFoldersUnitTest(_snapFilesystem, _baseFixturePackaging.WorkingDirectory);

            SetupSnapOsMock(specialFoldersAnyOs);

            var snapInstallerIoEnvironment = new SnapInstallerIoEnvironment
            {
                WorkingDirectory        = specialFoldersAnyOs.WorkingDirectory,
                ThisExeWorkingDirectory = specialFoldersAnyOs.WorkingDirectory,
                SpecialFolders          = specialFoldersAnyOs
            };

            var(exitCode, installerType) = await Program.MainImplAsync(new[] { "--headless" }, LogLevel.Info, cts, _snapOsMock.Object, x =>
            {
                x.Register <ISnapInstallerIoEnvironment>(_ => snapInstallerIoEnvironment);
                return((ISnapInstallerEnvironment)x.GetInstance(typeof(ISnapInstallerEnvironment)));
            });

            Assert.Equal(1, exitCode);
            Assert.Equal(SnapInstallerType.None, installerType);
        }
Exemple #2
0
        public async Task TestInstall_Offline_Using_Local_PackageSource()
        {
            await using var specialFoldersAnyOs = new SnapOsSpecialFoldersUnitTest(_snapFilesystem, _baseFixturePackaging.WorkingDirectory);
            await using var packagesDirectory   = new DisposableDirectory(specialFoldersAnyOs.WorkingDirectory, _snapFilesystem);
            using var cts = new CancellationTokenSource();

            SetupSnapOsMock(specialFoldersAnyOs);

            var snapInstallerIoEnvironment = new SnapInstallerIoEnvironment
            {
                WorkingDirectory        = specialFoldersAnyOs.WorkingDirectory,
                ThisExeWorkingDirectory = specialFoldersAnyOs.WorkingDirectory,
                SpecialFolders          = specialFoldersAnyOs,
            };

            var snapAppsReleases = new SnapAppsReleases();
            var genesisSnapApp   = _baseFixturePackaging.BuildSnapApp(localPackageSourceDirectory: packagesDirectory);

            Assert.True(genesisSnapApp.Channels.Count >= 2);

            using var genesisSnapReleaseBuilder = _baseFixturePackaging.WithSnapReleaseBuilder(packagesDirectory, snapAppsReleases, genesisSnapApp, _snapReleaseBuilderContext);
            var mainAssemblyDefinition = _baseFixturePackaging.BuildSnapExecutable(genesisSnapApp);

            genesisSnapReleaseBuilder
            .AddNuspecItem(mainAssemblyDefinition)
            .AddSnapDll();

            using var genesisPackageContext = await _baseFixturePackaging.BuildPackageAsync(genesisSnapReleaseBuilder, cts.Token);

            var releasesFilename   = _snapFilesystem.PathCombine(snapInstallerIoEnvironment.ThisExeWorkingDirectory, genesisPackageContext.FullPackageSnapApp.BuildNugetReleasesFilename());
            var snapAppDllFilename = _snapFilesystem.PathCombine(snapInstallerIoEnvironment.ThisExeWorkingDirectory, SnapConstants.SnapAppDllFilename);
            var setupNupkgFilename = _snapFilesystem.PathCombine(snapInstallerIoEnvironment.ThisExeWorkingDirectory, SnapConstants.SetupNupkgFilename);

            await using var releasePackageMemoryStream = _snapPack.BuildReleasesPackage(genesisSnapApp, snapAppsReleases);

            await _snapFilesystem.FileWriteAsync(genesisPackageContext.FullPackageMemoryStream, setupNupkgFilename, cts.Token);

            await _snapFilesystem.FileWriteAsync(releasePackageMemoryStream, releasesFilename, cts.Token);

            using var snapAppDllAssemblyDefinition = _snapAppWriter.BuildSnapAppAssembly(genesisSnapApp);
            snapAppDllAssemblyDefinition.Write(snapAppDllFilename);

            var(exitCode, installerType) = await Program.MainImplAsync(new[] { "--headless" }, LogLevel.Info, cts, _snapOsMock.Object, x =>
            {
                x.Register <ISnapInstallerIoEnvironment>(_ => snapInstallerIoEnvironment);
                return((ISnapInstallerEnvironment)x.GetInstance(typeof(ISnapInstallerEnvironment)));
            });

            Assert.Equal(0, exitCode);
            Assert.Equal(SnapInstallerType.Offline, installerType);

            var appInstallDirectory = _snapInstaller.GetApplicationDirectory(
                _snapFilesystem.PathCombine(specialFoldersAnyOs.LocalApplicationData, genesisSnapApp.Id), genesisSnapApp.Version);

            var files = _snapFilesystem.DirectoryGetAllFiles(appInstallDirectory).OrderBy(x => x, new OrdinalIgnoreCaseComparer()).ToList();

            Assert.Equal(3, files.Count);
            if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
            {
                Assert.EndsWith($"{genesisSnapApp.Id}.exe", files[0]);
            }
            else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
            {
                Assert.EndsWith(genesisSnapApp.Id, files[0]);
            }
            else
            {
                throw new PlatformNotSupportedException();
            }
            Assert.EndsWith(SnapConstants.SnapAppDllFilename, files[1]);
            Assert.EndsWith(SnapConstants.SnapDllFilename, files[2]);
        }
Exemple #3
0
        static SnapInstallerEnvironment BuildEnvironment(ISnapOs snapOs, CancellationTokenSource globalCts, LogLevel logLevel, ILog logger)
        {
            var container = new ServiceContainer();

            var thisExeWorkingDirectory = snapOs.Filesystem.PathGetDirectoryName(typeof(Program).Assembly.Location);
            var workingDirectory        = Environment.CurrentDirectory;

            container.Register(c => snapOs);
            container.Register(c => snapOs.SpecialFolders);

            container.Register(c => snapOs.Filesystem);
            container.Register <ISnapHttpClient>(c => new SnapHttpClient(new HttpClient()));
            container.Register <ISnapEmbeddedResources>(c => new SnapEmbeddedResources());
            container.Register <ISnapInstallerEmbeddedResources>(c => new SnapInstallerEmbeddedResources());
            container.Register <INuGetPackageSources>(c =>
                                                      new NuGetMachineWidePackageSources(
                                                          c.GetInstance <ISnapFilesystem>(),
                                                          workingDirectory
                                                          )
                                                      );
            container.Register <ISnapCryptoProvider>(c => new SnapCryptoProvider());
            container.Register <ISnapAppReader>(c => new SnapAppReader());
            container.Register <ISnapAppWriter>(c => new SnapAppWriter());
            container.Register <ISnapPack>(c => new SnapPack(
                                               c.GetInstance <ISnapFilesystem>(),
                                               c.GetInstance <ISnapAppReader>(),
                                               c.GetInstance <ISnapAppWriter>(),
                                               c.GetInstance <ISnapCryptoProvider>(),
                                               c.GetInstance <ISnapEmbeddedResources>()));
            container.Register <ISnapExtractor>(c => new SnapExtractor(
                                                    c.GetInstance <ISnapFilesystem>(),
                                                    c.GetInstance <ISnapPack>(),
                                                    c.GetInstance <ISnapEmbeddedResources>()));
            container.Register <ISnapInstaller>(c => new SnapInstaller(
                                                    c.GetInstance <ISnapExtractor>(),
                                                    c.GetInstance <ISnapPack>(),
                                                    c.GetInstance <ISnapOs>(),
                                                    c.GetInstance <ISnapEmbeddedResources>(),
                                                    c.GetInstance <ISnapAppWriter>()
                                                    ));
            container.Register <ISnapNugetLogger>(c => new NugetLogger(logger));
            container.Register <INugetService>(c => new NugetService(
                                                   c.GetInstance <ISnapFilesystem>(),
                                                   c.GetInstance <ISnapNugetLogger>())
                                               );
            container.Register <ISnapPackageManager>(c => new SnapPackageManager(
                                                         c.GetInstance <ISnapFilesystem>(),
                                                         c.GetInstance <ISnapOsSpecialFolders>(),
                                                         c.GetInstance <INugetService>(),
                                                         c.GetInstance <ISnapHttpClient>(),
                                                         c.GetInstance <ISnapCryptoProvider>(),
                                                         c.GetInstance <ISnapExtractor>(),
                                                         c.GetInstance <ISnapAppReader>(),
                                                         c.GetInstance <ISnapPack>()));

            var ioEnvironment = new SnapInstallerIoEnvironment
            {
                WorkingDirectory        = workingDirectory,
                ThisExeWorkingDirectory = thisExeWorkingDirectory,
                SpecialFolders          = container.GetInstance <ISnapOsSpecialFolders>()
            };

            var environment = new SnapInstallerEnvironment(logLevel, globalCts, ApplicationName)
            {
                Container = container,
                Io        = ioEnvironment
            };

            container.Register <ISnapInstallerEnvironment>(_ => environment);
            container.Register(_ => environment.Io);

            return(environment);
        }