public async Task GetDownloadResourceResultAsync_MultipleSources_IncludesTaskStatusInException()
        {
            using (var test = new PackageDownloaderTest())
            {
                var resourceProvider = new Mock <INuGetResourceProvider>();
                var resource         = new Mock <DownloadResource>();

                resourceProvider.SetupGet(x => x.Name)
                .Returns(nameof(DownloadResource) + "Provider");
                resourceProvider.SetupGet(x => x.ResourceType)
                .Returns(typeof(DownloadResource));
                resourceProvider.Setup(x => x.TryCreate(
                                           It.IsNotNull <SourceRepository>(),
                                           It.IsAny <CancellationToken>()))
                .Throws(new OperationCanceledException());

                var sourceRepositories = new[]
                {
                    new SourceRepository(test.SourceRepository.PackageSource, new[] { resourceProvider.Object })
                };

                var exception = await Assert.ThrowsAsync <FatalProtocolException>(
                    () => PackageDownloader.GetDownloadResourceResultAsync(
                        sourceRepositories,
                        test.PackageIdentity,
                        test.Context,
                        globalPackagesFolder: "",
                        logger: NullLogger.Instance,
                        token: CancellationToken.None));

                Assert.Contains(": Canceled", exception.Message);
            }
        }
        public async Task GetDownloadResourceResultAsync_Source_ThrowsIfCancelled()
        {
            using (var test = new PackageDownloaderTest())
            {
                var resourceProvider = new Mock <INuGetResourceProvider>();

                resourceProvider.SetupGet(x => x.Name)
                .Returns(nameof(DownloadResource) + "Provider");
                resourceProvider.SetupGet(x => x.ResourceType)
                .Returns(typeof(DownloadResource));

                resourceProvider.Setup(x => x.TryCreate(
                                           It.IsNotNull <SourceRepository>(),
                                           It.IsAny <CancellationToken>()))
                .ReturnsAsync(new Tuple <bool, INuGetResource>(true, Mock.Of <DownloadResource>()));

                var sourceRepository = new SourceRepository(
                    test.SourceRepository.PackageSource,
                    new[] { resourceProvider.Object });

                await Assert.ThrowsAsync <OperationCanceledException>(
                    () => PackageDownloader.GetDownloadResourceResultAsync(
                        sourceRepository,
                        test.PackageIdentity,
                        test.Context,
                        globalPackagesFolder: "",
                        logger: NullLogger.Instance,
                        token: new CancellationToken(canceled: true)));
            }
        }
 public async Task GetDownloadResourceResultAsync_Sources_ThrowsIfCancelled()
 {
     using (var test = new PackageDownloaderTest())
     {
         await Assert.ThrowsAsync <OperationCanceledException>(
             () => PackageDownloader.GetDownloadResourceResultAsync(
                 Enumerable.Empty <SourceRepository>(),
                 test.PackageIdentity,
                 test.Context,
                 globalPackagesFolder: "",
                 logger: NullLogger.Instance,
                 token: new CancellationToken(canceled: true)));
     }
 }
 public async Task GetDownloadResourceResultAsync_Source_ThrowsIfNoDownloadResource()
 {
     using (var test = new PackageDownloaderTest())
     {
         await Assert.ThrowsAsync <InvalidOperationException>(
             () => PackageDownloader.GetDownloadResourceResultAsync(
                 test.SourceRepository,
                 test.PackageIdentity,
                 test.Context,
                 globalPackagesFolder: "",
                 logger: NullLogger.Instance,
                 token: CancellationToken.None));
     }
 }
        public async Task GetDownloadResourceResultAsync_Sources_ThrowsForNullLogger()
        {
            using (var test = new PackageDownloaderTest())
            {
                var exception = await Assert.ThrowsAsync <ArgumentNullException>(
                    () => PackageDownloader.GetDownloadResourceResultAsync(
                        Enumerable.Empty <SourceRepository>(),
                        test.PackageIdentity,
                        test.Context,
                        globalPackagesFolder: "",
                        logger: null,
                        token: CancellationToken.None));

                Assert.Equal("logger", exception.ParamName);
            }
        }
        public async Task GetDownloadResourceResultAsync_Sources_ThrowsForNullSources()
        {
            using (var test = new PackageDownloaderTest())
            {
                var exception = await Assert.ThrowsAsync <ArgumentNullException>(
                    () => PackageDownloader.GetDownloadResourceResultAsync(
                        sources: null,
                        packageIdentity: test.PackageIdentity,
                        downloadContext: test.Context,
                        globalPackagesFolder: "",
                        logger: NullLogger.Instance,
                        token: CancellationToken.None));

                Assert.Equal("sources", exception.ParamName);
            }
        }
        public async Task GetDownloadResourceResultAsync_SupportsDownloadResultWithoutPackageStream()
        {
            using (var test = new PackageDownloaderTest())
                using (var stream = new MemoryStream())
                    using (var zipArchive = new ZipArchive(stream, ZipArchiveMode.Create))
                        using (var packageReader = new PackageArchiveReader(zipArchive))
                        {
                            var resourceProvider = new Mock <INuGetResourceProvider>();
                            var resource         = new Mock <DownloadResource>();
                            var expectedResult   = new DownloadResourceResult(
                                packageReader,
                                test.SourceRepository.PackageSource.Source);

                            resource.Setup(x => x.GetDownloadResourceResultAsync(
                                               It.IsNotNull <PackageIdentity>(),
                                               It.IsNotNull <PackageDownloadContext>(),
                                               It.IsAny <string>(),
                                               It.IsNotNull <ILogger>(),
                                               It.IsAny <CancellationToken>()))
                            .ReturnsAsync(expectedResult);

                            resourceProvider.SetupGet(x => x.Name)
                            .Returns(nameof(DownloadResource) + "Provider");
                            resourceProvider.SetupGet(x => x.ResourceType)
                            .Returns(typeof(DownloadResource));
                            resourceProvider.Setup(x => x.TryCreate(
                                                       It.IsNotNull <SourceRepository>(),
                                                       It.IsAny <CancellationToken>()))
                            .ReturnsAsync(new Tuple <bool, INuGetResource>(true, resource.Object));

                            var sourceRepository = new SourceRepository(
                                test.SourceRepository.PackageSource,
                                new[] { resourceProvider.Object });

                            var actualResult = await PackageDownloader.GetDownloadResourceResultAsync(
                                sourceRepository,
                                test.PackageIdentity,
                                test.Context,
                                globalPackagesFolder : "",
                                logger : NullLogger.Instance,
                                token : CancellationToken.None);

                            Assert.Equal(DownloadResourceResultStatus.AvailableWithoutStream, actualResult.Status);
                            Assert.Same(expectedResult, actualResult);
                        }
        }