public async Task CopyNupkgFileToAsync_ReturnsFalseIfExceptionHandled()
        {
            var destinationFilePath = "a";
            var connection          = new Mock <IConnection>(MockBehavior.Strict);

            connection.Setup(x => x.SendRequestAndReceiveResponseAsync <CopyNupkgFileRequest, CopyNupkgFileResponse>(
                                 It.Is <MessageMethod>(m => m == MessageMethod.CopyNupkgFile),
                                 It.Is <CopyNupkgFileRequest>(c => c.PackageId == _packageIdentity.Id &&
                                                              c.PackageVersion == _packageIdentity.Version.ToNormalizedString() &&
                                                              c.PackageSourceRepository == _packageSourceRepository &&
                                                              c.DestinationFilePath == destinationFilePath),
                                 It.IsAny <CancellationToken>()))
            .ThrowsAsync(new Exception("simulated failure"));

            using (var test = PluginPackageDownloaderTest.Create())
            {
                test.Plugin.SetupGet(x => x.Connection)
                .Returns(connection.Object);

                test.Downloader.SetExceptionHandler(exception => Task.FromResult(true));

                var wasCopied = await test.Downloader.CopyNupkgFileToAsync(
                    destinationFilePath,
                    CancellationToken.None);

                Assert.False(wasCopied);
            }
        }
        public async Task GetPackageHashAsync_ReturnsPackageHashForSuccess()
        {
            var hashAlgorithm = "a";
            var response      = new GetPackageHashResponse(MessageResponseCode.Success, hash: "b");
            var connection    = new Mock <IConnection>(MockBehavior.Strict);

            connection.Setup(x => x.SendRequestAndReceiveResponseAsync <GetPackageHashRequest, GetPackageHashResponse>(
                                 It.Is <MessageMethod>(m => m == MessageMethod.GetPackageHash),
                                 It.Is <GetPackageHashRequest>(c => c.PackageId == _packageIdentity.Id &&
                                                               c.PackageVersion == _packageIdentity.Version.ToNormalizedString() &&
                                                               c.PackageSourceRepository == _packageSourceRepository &&
                                                               c.HashAlgorithm == hashAlgorithm),
                                 It.IsAny <CancellationToken>()))
            .ReturnsAsync(response);

            using (var test = PluginPackageDownloaderTest.Create())
            {
                test.Plugin.SetupGet(x => x.Connection)
                .Returns(connection.Object);

                var packageHash = await test.Downloader.GetPackageHashAsync(
                    hashAlgorithm,
                    CancellationToken.None);

                Assert.Equal(response.Hash, packageHash);
            }
        }
        public async Task CopyNupkgFileToAsync_ReturnsFalseIfPackageDownloadMarkerFileCreated()
        {
            using (var testDirectory = TestDirectory.Create())
            {
                var destinationFilePath = Path.Combine(testDirectory.Path, _packageIdentity.Id);
                var connection          = new Mock <IConnection>(MockBehavior.Strict);

                connection.Setup(x => x.SendRequestAndReceiveResponseAsync <CopyNupkgFileRequest, CopyNupkgFileResponse>(
                                     It.Is <MessageMethod>(m => m == MessageMethod.CopyNupkgFile),
                                     It.Is <CopyNupkgFileRequest>(c => c.PackageId == _packageIdentity.Id &&
                                                                  c.PackageVersion == _packageIdentity.Version.ToNormalizedString() &&
                                                                  c.PackageSourceRepository == _packageSourceRepository &&
                                                                  c.DestinationFilePath == destinationFilePath),
                                     It.IsAny <CancellationToken>()))
                .ReturnsAsync(new CopyNupkgFileResponse(MessageResponseCode.NotFound));

                using (var test = PluginPackageDownloaderTest.Create())
                {
                    test.Plugin.SetupGet(x => x.Connection)
                    .Returns(connection.Object);

                    var wasCopied = await test.Downloader.CopyNupkgFileToAsync(
                        destinationFilePath,
                        CancellationToken.None);

                    var markerFilePath = Path.Combine(testDirectory.Path, $"{_packageIdentity.Id}.packagedownload.marker");

                    Assert.False(wasCopied);
                    Assert.True(File.Exists(markerFilePath));
                }
            }
        }
 public void Constructor_InitializesProperties()
 {
     using (var test = PluginPackageDownloaderTest.Create())
     {
         Assert.Same(test.PackageReader, test.Downloader.ContentReader);
         Assert.Same(test.PackageReader, test.Downloader.CoreReader);
     }
 }
 public async Task GetPackageHashAsync_ThrowsIfCancelled()
 {
     using (var test = PluginPackageDownloaderTest.Create())
     {
         await Assert.ThrowsAsync <OperationCanceledException>(
             () => test.Downloader.GetPackageHashAsync(
                 hashAlgorithm: "SHA512",
                 cancellationToken: new CancellationToken(canceled: true)));
     }
 }
        public async Task GetPackageHashAsync_ThrowsForNullOrEmptyDestinationFilePath(string hashAlgorithm)
        {
            using (var test = PluginPackageDownloaderTest.Create())
            {
                var exception = await Assert.ThrowsAsync <ArgumentException>(
                    () => test.Downloader.GetPackageHashAsync(hashAlgorithm, CancellationToken.None));

                Assert.Equal("hashAlgorithm", exception.ParamName);
            }
        }
 public async Task CopyNupkgFileToAsync_ThrowsIfCancelled()
 {
     using (var test = PluginPackageDownloaderTest.Create())
     {
         await Assert.ThrowsAsync <OperationCanceledException>(
             () => test.Downloader.CopyNupkgFileToAsync(
                 destinationFilePath: "a",
                 cancellationToken: new CancellationToken(canceled: true)));
     }
 }
        public async Task CopyNupkgFileToAsync_ThrowsForNullOrEmptyDestinationFilePath(string destinationFilePath)
        {
            using (var test = PluginPackageDownloaderTest.Create())
            {
                var exception = await Assert.ThrowsAsync <ArgumentException>(
                    () => test.Downloader.CopyNupkgFileToAsync(destinationFilePath, CancellationToken.None));

                Assert.Equal("destinationFilePath", exception.ParamName);
            }
        }
        public void Dispose_IsIdempotent()
        {
            using (var test = PluginPackageDownloaderTest.Create())
            {
                test.Downloader.Dispose();
                test.Downloader.Dispose();

                test.Plugin.Verify(x => x.Dispose(), Times.Exactly(2));
            }
        }
        public void SetExceptionHandler_ThrowsForNullHandler()
        {
            using (var test = PluginPackageDownloaderTest.Create())
            {
                var exception = Assert.Throws <ArgumentNullException>(
                    () => test.Downloader.SetExceptionHandler(handleExceptionAsync: null));

                Assert.Equal("handleExceptionAsync", exception.ParamName);
            }
        }
        public void CoreReader_ThrowsIfDisposed()
        {
            using (var test = PluginPackageDownloaderTest.Create())
            {
                test.Downloader.Dispose();

                var exception = Assert.Throws <ObjectDisposedException>(() => test.Downloader.CoreReader);

                Assert.Equal(nameof(PluginPackageDownloader), exception.ObjectName);
            }
        }
        public void Dispose_DisposesDisposables()
        {
            using (var test = PluginPackageDownloaderTest.Create())
            {
                test.Downloader.Dispose();

                // PluginPackageDownloader.Dispose() calls both IPlugin.Dispose() and
                // PluginPackageReader.Dispose().  The latter call IPlugin.Dispose()
                // on its own IPlugin instance.
                test.Plugin.Verify(x => x.Dispose(), Times.Exactly(2));
            }
        }
        public async Task GetPackageHashAsync_ThrowsIfDisposed()
        {
            using (var test = PluginPackageDownloaderTest.Create())
            {
                test.Downloader.Dispose();

                var exception = await Assert.ThrowsAsync <ObjectDisposedException>(
                    () => test.Downloader.GetPackageHashAsync(
                        hashAlgorithm: "a",
                        cancellationToken: CancellationToken.None));

                Assert.Equal(nameof(PluginPackageDownloader), exception.ObjectName);
            }
        }
        public async Task CopyNupkgFileToAsync_ThrowsIfDisposed()
        {
            using (var test = PluginPackageDownloaderTest.Create())
            {
                test.Downloader.Dispose();

                var exception = await Assert.ThrowsAsync <ObjectDisposedException>(
                    () => test.Downloader.CopyNupkgFileToAsync(
                        destinationFilePath: "a",
                        cancellationToken: CancellationToken.None));

                Assert.Equal(nameof(PluginPackageDownloader), exception.ObjectName);
            }
        }