public async Task TestRestoreAsync_Checksums_Genesis() { var snapAppsReleases = new SnapAppsReleases(); var genesisSnapApp = _baseFixturePackaging.BuildSnapApp(); var snapAppChannel = genesisSnapApp.GetDefaultChannelOrThrow(); using var rootDirectory = new DisposableDirectory(_baseFixturePackaging.WorkingDirectory, _snapFilesystem); using var restoreDirectory = new DisposableDirectory(_baseFixturePackaging.WorkingDirectory, _snapFilesystem); using var nugetPackageSourcesDirectory = _snapFilesystem.WithDisposableTempDirectory(_baseFixturePackaging.WorkingDirectory); using var genesisReleaseBuilder = _baseFixturePackaging.WithSnapReleaseBuilder(rootDirectory, snapAppsReleases, genesisSnapApp, _releaseBuilderContext); var packagesDirectory = _snapFilesystem.PathCombine(restoreDirectory.WorkingDirectory, "packages"); _snapFilesystem.DirectoryCreate(packagesDirectory); var nugetPackageSources = genesisSnapApp.BuildNugetSources(nugetPackageSourcesDirectory.WorkingDirectory); var packageSource = nugetPackageSources.Items.Single(); genesisReleaseBuilder .AddNuspecItem(_baseFixturePackaging.BuildSnapExecutable(genesisSnapApp)) .AddSnapDll(); using var genesisPackageContext = await _baseFixturePackaging.BuildPackageAsync(genesisReleaseBuilder); var snapAppChannelReleases = snapAppsReleases.GetReleases(genesisSnapApp, snapAppChannel); var progressSourceMock = new Mock <ISnapPackageManagerProgressSource>(); progressSourceMock.Setup(x => x.RaiseChecksumProgress( It.IsAny <int>(), It.IsAny <long>(), It.IsAny <long>(), It.IsAny <long>())); var genesisPackageAbsolutePath = _snapFilesystem.PathCombine(packagesDirectory, genesisPackageContext.FullPackageSnapRelease.Filename); await _snapFilesystem.FileCopyAsync(genesisPackageContext.FullPackageAbsolutePath, genesisPackageAbsolutePath, default); var restoreSummary = await _snapPackageManager.RestoreAsync(packagesDirectory, snapAppChannelReleases, packageSource, SnapPackageManagerRestoreType.Default, progressSourceMock.Object); progressSourceMock.Verify(x => x.RaiseChecksumProgress( It.Is <int>(v => v == 0), It.Is <long>(v => v == 0), It.Is <long>(v => v == 0), It.Is <long>(v => v == 1)), Times.Once); progressSourceMock.Verify(x => x.RaiseChecksumProgress( It.Is <int>(v => v == 100), It.Is <long>(v => v == 1), It.Is <long>(v => v == 1), It.Is <long>(v => v == 1)), Times.Once); Assert.Equal(SnapPackageManagerRestoreType.Default, restoreSummary.RestoreType); Assert.Single(restoreSummary.ChecksumSummary); Assert.True(restoreSummary.ChecksumSummary[0].Ok); Assert.Equal(genesisPackageContext.FullPackageSnapRelease.Filename, restoreSummary.ChecksumSummary[0].SnapRelease.Filename); Assert.Empty(restoreSummary.DownloadSummary); Assert.Empty(restoreSummary.ReassembleSummary); Assert.True(restoreSummary.Success); using var packageArchiveReader = new PackageArchiveReader(genesisPackageAbsolutePath); Assert.Equal(genesisPackageContext.FullPackageSnapRelease.BuildPackageIdentity(), packageArchiveReader.GetIdentity()); Assert.Equal(genesisPackageContext.FullPackageSnapRelease.FullSha256Checksum, _snapCryptoProvider.Sha256(genesisPackageContext.FullPackageSnapRelease, packageArchiveReader, _snapPack)); }
internal void AssertChecksums([NotNull] SnapApp snapApp, [NotNull] SnapRelease snapRelease, [NotNull] List <string> extractedFiles) { if (snapApp == null) { throw new ArgumentNullException(nameof(snapApp)); } if (snapRelease == null) { throw new ArgumentNullException(nameof(snapRelease)); } if (extractedFiles == null) { throw new ArgumentNullException(nameof(extractedFiles)); } var nupkgAbsoluteFilename = SnapFilesystem.PathCombine(SnapAppPackagesDirectory, snapRelease.Filename); Assert.True(SnapFilesystem.FileExists(nupkgAbsoluteFilename)); using var packageArchiveReader = new PackageArchiveReader(nupkgAbsoluteFilename); Assert.Equal(snapApp.ReleaseNotes, snapRelease.ReleaseNotes); foreach (var releaseChecksum in snapRelease.Files) { var(_, _, checksumFileAbsolutePath) = NormalizePath(snapRelease, releaseChecksum.NuspecTargetPath); Assert.NotNull(checksumFileAbsolutePath); if (snapRelease.IsDelta) { var deletedChecksum = snapRelease.Deleted.SingleOrDefault(x => x == releaseChecksum.NuspecTargetPath); if (deletedChecksum != null) { Assert.False(SnapFilesystem.FileExists(checksumFileAbsolutePath)); continue; } var unmodifiedChecksum = snapRelease.Unmodified.SingleOrDefault(x => x == releaseChecksum.NuspecTargetPath); if (unmodifiedChecksum != null) { Assert.False(SnapFilesystem.FileExists(checksumFileAbsolutePath)); continue; } } Assert.True(SnapFilesystem.FileExists(checksumFileAbsolutePath)); using var fileStream = SnapFilesystem.FileRead(checksumFileAbsolutePath); var diskSha256Checksum = SnapCryptoProvider.Sha256(fileStream); var diskFilesize = SnapFilesystem.FileStat(checksumFileAbsolutePath).Length; SnapReleaseChecksum targetChecksum; bool useFullChecksum; if (snapRelease.IsFull) { targetChecksum = releaseChecksum; useFullChecksum = true; goto checksum; } if (SnapPack.NeverGenerateBsDiffsTheseAssemblies.Any(x => x == releaseChecksum.NuspecTargetPath)) { targetChecksum = releaseChecksum; useFullChecksum = true; goto checksum; } targetChecksum = snapRelease.New.SingleOrDefault(x => x.NuspecTargetPath == releaseChecksum.NuspecTargetPath); if (targetChecksum != null) { useFullChecksum = true; } else { targetChecksum = snapRelease.Modified.SingleOrDefault(x => x.NuspecTargetPath == releaseChecksum.NuspecTargetPath); useFullChecksum = false; } checksum: Assert.NotNull(targetChecksum); var expectedChecksum = useFullChecksum ? targetChecksum.FullSha256Checksum : targetChecksum.DeltaSha256Checksum; var expectedFilesize = useFullChecksum ? targetChecksum.FullFilesize : targetChecksum.DeltaFilesize; Assert.NotNull(expectedChecksum); if (expectedChecksum == SnapConstants.Sha256EmptyFileChecksum) { Assert.Equal(0, expectedFilesize); } else { Assert.True(expectedFilesize > 0); } Assert.Equal(expectedChecksum, diskSha256Checksum); Assert.Equal(expectedFilesize, diskFilesize); } var snapReleaseChecksum = SnapCryptoProvider.Sha256(snapRelease, packageArchiveReader, SnapPack); var snapReleaseFilesize = SnapFilesystem.FileStat(nupkgAbsoluteFilename)?.Length; var expectedReleaseChecksum = snapRelease.IsFull ? snapRelease.FullSha256Checksum : snapRelease.DeltaSha256Checksum; var expectedReleaseFilesize = snapRelease.IsFull ? snapRelease.FullFilesize : snapRelease.DeltaFilesize; Assert.Equal(expectedReleaseChecksum, snapReleaseChecksum); Assert.Equal(expectedReleaseFilesize, snapReleaseFilesize); }