Exemple #1
0
        public async Task LocalPackageSearchResource_RelativePathIsRejectedAsync()
        {
            using (var root = TestDirectory.Create())
            {
                // Arrange
                var testLogger    = new TestLogger();
                var source        = Path.Combine("..", "packages");
                var localResource = new FindLocalPackagesResourceV2(source);
                var resource      = new LocalPackageSearchResource(localResource);

                var filter = new SearchFilter(includePrerelease: true);

                // Act & Assert
                var actual = await Assert.ThrowsAsync <InvalidOperationException>(
                    () => resource.SearchAsync(
                        "mypackage",
                        filter,
                        skip: 0,
                        take: 30,
                        log: testLogger,
                        token: CancellationToken.None));

                Assert.Equal(
                    $"The path '{source}' for the selected source could not be resolved.",
                    actual.Message);
            }
        }
Exemple #2
0
        public async Task LocalPackageSearch_SearchAsync_SlowLocalRepository_WithCancellationToken_ThrowsAsync()
        {
            using var pathContext = new SimpleTestPathContext();

            // Arrange
            using CancellationTokenSource cts = new();
            var slowLocalRepository = new DelayedFindLocalPackagesResourceV2(pathContext.PackageSource, 2000);

            // Act
            Task delayTask = Task.Delay(TimeSpan.FromMilliseconds(200), cts.Token);
            LocalPackageSearchResource slowResource = new LocalPackageSearchResource(slowLocalRepository);
            Task searchTask = slowResource.SearchAsync(searchTerm: "", filters: null, skip: 0, take: 1, log: NullLogger.Instance, token: cts.Token);

            // Assert
            // To simulate real world scenario I added delayed cancellation logic check in DelayedFindLocalPackagesResourceV2 localRepository.
            // We're expecting delay Task finish before search Task since 2000 > 200.
            Task completed = await Task.WhenAny(searchTask, delayTask);

            if (completed != delayTask)
            {
                // Search task completed before shorter delay Task which is unexpected.
                throw new TimeoutException();
            }
            // Trigger cancellation after 200 milsec.
            cts.Cancel();
            // During execution of long search task cancellation is triggered from localRepository.
            await Assert.ThrowsAsync <OperationCanceledException>(
                async() => await searchTask);
        }
        public async Task LocalPackageSearchResource_MatchOnPartialId()
        {
            using (var root = TestFileSystemUtility.CreateRandomTestFolder())
            {
                // Arrange
                var testLogger = new TestLogger();

                var nuspec = XDocument.Parse($@"<?xml version=""1.0"" encoding=""utf-8""?>
                        <package>
                        <metadata>
                            <id>myPackage</id>
                            <version>1.0.0-alpha.1.2+5</version>
                            <description>package description</description>
                            <tags>a b c</tags>
                        </metadata>
                        </package>");

                var packageA = new SimpleTestPackageContext()
                {
                    Id      = "myPackage",
                    Version = "1.0.0-alpha.1.2+5",
                    Nuspec  = nuspec
                };

                var packageContexts = new SimpleTestPackageContext[]
                {
                    packageA
                };

                SimpleTestPackageUtility.CreatePackages(root, packageContexts);

                var localResource = new FindLocalPackagesResourceV2(root);
                var resource      = new LocalPackageSearchResource(localResource);

                var filter = new SearchFilter()
                {
                    IncludePrerelease = true
                };

                // Act
                var packages = (await resource.SearchAsync(
                                    "ypac",
                                    filter,
                                    skip: 0,
                                    take: 30,
                                    log: testLogger,
                                    token: CancellationToken.None))
                               .OrderBy(p => p.Identity.Id)
                               .ToList();

                var package = packages.First();

                // Assert
                Assert.Equal(1, packages.Count);
                Assert.Equal("myPackage", package.Identity.Id);
                Assert.Equal("1.0.0-alpha.1.2+5", package.Identity.Version.ToFullString());
            }
        }
Exemple #4
0
        public async Task LocalPackageSearch_SearchAsync_WithCancellationToken_ThrowsAsync()
        {
            using (var root = TestDirectory.Create())
            {
                var localResource = new FindLocalPackagesResourceV2(root);
                LocalPackageSearchResource resource = new LocalPackageSearchResource(localResource);

                await Assert.ThrowsAsync <OperationCanceledException>(
                    async() => await resource.SearchAsync("", null, 0, 1, NullLogger.Instance, new CancellationToken(canceled: true)));
            }
        }
Exemple #5
0
        public async Task LocalPackageSearchResource_SearchStableNoMatchAsync()
        {
            using (var root = TestDirectory.Create())
            {
                // Arrange
                var testLogger = new TestLogger();

                var nuspec = XDocument.Parse($@"<?xml version=""1.0"" encoding=""utf-8""?>
                        <package>
                        <metadata>
                            <id>myPackage</id>
                            <version>1.0.0-alpha.1.2+5</version>
                            <description>package description</description>
                            <tags>a b c</tags>
                        </metadata>
                        </package>");

                var packageA = new SimpleTestPackageContext()
                {
                    Id      = "myPackage",
                    Version = "1.0.0-alpha.1.2+5",
                    Nuspec  = nuspec
                };

                var packageContexts = new SimpleTestPackageContext[]
                {
                    packageA
                };

                await SimpleTestPackageUtility.CreatePackagesAsync(root, packageContexts);

                var localResource = new FindLocalPackagesResourceV2(root);
                var resource      = new LocalPackageSearchResource(localResource);

                var filter = new SearchFilter(includePrerelease: false);

                // Act
                var packages = (await resource.SearchAsync(
                                    "ypac",
                                    filter,
                                    skip: 0,
                                    take: 30,
                                    log: testLogger,
                                    token: CancellationToken.None))
                               .OrderBy(p => p.Identity.Id)
                               .ToList();

                // Assert
                Assert.Equal(0, packages.Count);
            }
        }
Exemple #6
0
        public async Task LocalPackageSearchResource_SearchNoFilter_AllversionsMatch(bool includePrerelease, string[] expected)
        {
            using (var pathContext = new SimpleTestPathContext())
            {
                // Arrange
                string workingPath    = pathContext.WorkingDirectory;
                var    testLogger     = new TestLogger();
                string repositoryPath = Path.Combine(workingPath, "mypackages");
                string packageId      = "myPackage";
                var    packageA1      = new SimpleTestPackageContext(packageId, "1.0.0");
                var    packageA2      = new SimpleTestPackageContext(packageId, "1.1.0");
                var    packageA3      = new SimpleTestPackageContext(packageId, "2.0.0-alpha.1.2+5");

                var packageContexts = new SimpleTestPackageContext[]
                {
                    packageA1,
                    packageA2,
                    packageA3
                };

                await SimpleTestPackageUtility.CreatePackagesAsync(workingPath, packageContexts);

                var localResource = new FindLocalPackagesResourceV2(workingPath);
                var resource      = new LocalPackageSearchResource(localResource);

                // Mimic setup for AllVersions request
                var filter = new SearchFilter(includePrerelease: includePrerelease, filter: null)
                {
                    OrderBy = SearchOrderBy.Id
                };

                // Act
                var matchingPackages = (await resource.SearchAsync(
                                            packageId,
                                            filter,
                                            skip: 0,
                                            take: 30,
                                            log: testLogger,
                                            token: CancellationToken.None))
                                       .OrderBy(p => p.Identity)
                                       .ToList();

                // Assert
                Assert.Equal(true, matchingPackages.All(p => p.Identity.Id == packageId));
                Assert.Equal(expected, matchingPackages.Select(p => p.Identity.Version.ToFullString()).ToArray());
                Assert.Equal(0, testLogger.Warnings);
                Assert.Equal(0, testLogger.Errors);
            }
        }
Exemple #7
0
        public async Task LocalPackageSearchResource_SearchWithFilter_OnlyLatestVersionMatch(SearchFilterType searchFilter, bool includePrerelease, string expectedVersion)
        {
            using (var pathContext = new SimpleTestPathContext())
            {
                // Arrange
                string workingPath    = pathContext.WorkingDirectory;
                var    testLogger     = new TestLogger();
                string repositoryPath = Path.Combine(workingPath, "mypackages");
                string packageId      = "myPackage";
                var    packageA       = new SimpleTestPackageContext(packageId, "2.0.0-alpha.1.2+5");
                var    packageA2      = new SimpleTestPackageContext(packageId, "1.0.0");

                var packageContexts = new SimpleTestPackageContext[]
                {
                    packageA,
                    packageA2
                };

                await SimpleTestPackageUtility.CreatePackagesAsync(repositoryPath, packageContexts);

                FindLocalPackagesResourceV2 localResource = new FindLocalPackagesResourceV2(repositoryPath);
                LocalPackageSearchResource  resource      = new LocalPackageSearchResource(localResource);

                var filter = new SearchFilter(includePrerelease: includePrerelease, filter: searchFilter);

                // Act
                var matchingPackages = (await resource.SearchAsync(
                                            packageId,
                                            filter,
                                            skip: 0,
                                            take: 30,
                                            log: testLogger,
                                            token: CancellationToken.None))
                                       .OrderBy(p => p.Identity)
                                       .ToList();

                var matchPackage = matchingPackages.First();

                // Assert
                Assert.Equal(1, matchingPackages.Count);
                Assert.Equal(packageId, matchPackage.Identity.Id);
                Assert.Equal(expectedVersion, matchPackage.Identity.Version.ToFullString());
                Assert.Equal(0, testLogger.Warnings);
                Assert.Equal(0, testLogger.Errors);
            }
        }
Exemple #8
0
        public async Task LocalPackageSearchResource_FileSourceAsync()
        {
            using (var root = TestDirectory.Create())
            {
                // Arrange
                var testLogger = new TestLogger();

                var nuspec = XDocument.Parse($@"<?xml version=""1.0"" encoding=""utf-8""?>
                        <package>
                        <metadata>
                            <id>myPackage</id>
                            <version>1.0.0-alpha.1.2+5</version>
                            <description>package description</description>
                            <tags>a b c</tags>
                        </metadata>
                        </package>");

                var packageA = new SimpleTestPackageContext()
                {
                    Id      = "myPackage",
                    Version = "1.0.0-alpha.1.2+5",
                    Nuspec  = nuspec
                };

                var nuspec2 = XDocument.Parse($@"<?xml version=""1.0"" encoding=""utf-8""?>
                        <package>
                        <metadata>
                            <id>myOtherPackage</id>
                            <version>1.0.0-alpha.1.3+5</version>
                            <description>package description</description>
                            <tags>a b c</tags>
                        </metadata>
                        </package>");

                var packageA2 = new SimpleTestPackageContext()
                {
                    Id      = "myOtherPackage",
                    Version = "1.0.0-alpha.1.3+5",
                    Nuspec  = nuspec2
                };

                var packageContexts = new SimpleTestPackageContext[]
                {
                    packageA,
                    packageA2
                };

                var fileUrl = "file://" + root.Path.Replace(@"\", @"/");

                await SimpleTestPackageUtility.CreatePackagesAsync(root, packageContexts);

                var localResource = new FindLocalPackagesResourceV2(fileUrl);
                var resource      = new LocalPackageSearchResource(localResource);

                var filter = new SearchFilter(includePrerelease: true);

                // Act
                var packages = (await resource.SearchAsync(
                                    "mypackage",
                                    filter,
                                    skip: 0,
                                    take: 30,
                                    log: testLogger,
                                    token: CancellationToken.None))
                               .OrderBy(p => p.Identity.Id)
                               .ToList();

                var package = packages.First();

                // Assert
                Assert.Equal(1, packages.Count);
                Assert.Equal("myPackage", package.Identity.Id);
                Assert.Equal("1.0.0-alpha.1.2+5", package.Identity.Version.ToFullString());
            }
        }
Exemple #9
0
        public IEnumerable <PSResourceInfo> SearchFromRepository(
            string repositoryName,
            Uri repositoryUrl)
        {
            PackageSearchResource   resourceSearch;
            PackageMetadataResource resourceMetadata;
            SearchFilter            filter;
            SourceCacheContext      context;

            // file based Uri scheme
            if (repositoryUrl.Scheme == Uri.UriSchemeFile)
            {
                FindLocalPackagesResourceV2 localResource = new FindLocalPackagesResourceV2(repositoryUrl.ToString());
                resourceSearch   = new LocalPackageSearchResource(localResource);
                resourceMetadata = new LocalPackageMetadataResource(localResource);
                filter           = new SearchFilter(_prerelease);
                context          = new SourceCacheContext();

                foreach (PSResourceInfo pkg in SearchAcrossNamesInRepository(
                             repositoryName: repositoryName,
                             pkgSearchResource: resourceSearch,
                             pkgMetadataResource: resourceMetadata,
                             searchFilter: filter,
                             sourceContext: context))
                {
                    yield return(pkg);
                }
                yield break;
            }

            // check if ADOFeed- for which searching for Name with wildcard has a different logic flow
            if (repositoryUrl.ToString().Contains("pkgs.visualstudio.com"))
            {
                _isADOFeedRepository = true;
            }

            // HTTP, HTTPS, FTP Uri schemes (only other Uri schemes allowed by RepositorySettings.Read() API)
            PackageSource source = new PackageSource(repositoryUrl.ToString());

            if (_credential != null)
            {
                string password = new NetworkCredential(string.Empty, _credential.Password).Password;
                source.Credentials = PackageSourceCredential.FromUserInput(repositoryUrl.ToString(), _credential.UserName, password, true, null);
                _cmdletPassedIn.WriteVerbose("credential successfully set for repository: " + repositoryName);
            }

            // GetCoreV3() API is able to handle V2 and V3 repository endpoints
            var provider = FactoryExtensionsV3.GetCoreV3(NuGet.Protocol.Core.Types.Repository.Provider);
            SourceRepository repository = new SourceRepository(source, provider);

            resourceSearch   = null;
            resourceMetadata = null;

            try
            {
                resourceSearch   = repository.GetResourceAsync <PackageSearchResource>().GetAwaiter().GetResult();
                resourceMetadata = repository.GetResourceAsync <PackageMetadataResource>().GetAwaiter().GetResult();
            }
            catch (Exception e) {
                Utils.WriteVerboseOnCmdlet(_cmdletPassedIn, "Error retrieving resource from repository: " + e.Message);
            }

            if (resourceSearch == null || resourceMetadata == null)
            {
                yield break;
            }

            filter  = new SearchFilter(_prerelease);
            context = new SourceCacheContext();

            foreach (PSResourceInfo pkg in SearchAcrossNamesInRepository(
                         repositoryName: repositoryName,
                         pkgSearchResource: resourceSearch,
                         pkgMetadataResource: resourceMetadata,
                         searchFilter: filter,
                         sourceContext: context))
            {
                yield return(pkg);
            }
        }
Exemple #10
0
        private IEnumerable <PSResourceInfo> SearchFromRepository(
            string repositoryName,
            Uri repositoryUri,
            PSCredentialInfo repositoryCredentialInfo)
        {
            PackageSearchResource   resourceSearch;
            PackageMetadataResource resourceMetadata;
            SearchFilter            filter;
            SourceCacheContext      context;

            // File based Uri scheme.
            if (repositoryUri.Scheme == Uri.UriSchemeFile)
            {
                FindLocalPackagesResourceV2 localResource = new FindLocalPackagesResourceV2(repositoryUri.ToString());
                resourceSearch   = new LocalPackageSearchResource(localResource);
                resourceMetadata = new LocalPackageMetadataResource(localResource);
                filter           = new SearchFilter(_prerelease);
                context          = new SourceCacheContext();

                foreach (PSResourceInfo pkg in SearchAcrossNamesInRepository(
                             repositoryName: repositoryName,
                             pkgSearchResource: resourceSearch,
                             pkgMetadataResource: resourceMetadata,
                             searchFilter: filter,
                             sourceContext: context))
                {
                    yield return(pkg);
                }
                yield break;
            }

            // Check if ADOFeed- for which searching for Name with wildcard has a different logic flow.
            if (repositoryUri.ToString().Contains("pkgs."))
            {
                _isADOFeedRepository = true;
            }

            // HTTP, HTTPS, FTP Uri schemes (only other Uri schemes allowed by RepositorySettings.Read() API).
            PackageSource source = new PackageSource(repositoryUri.ToString());

            // Explicitly passed in Credential takes precedence over repository CredentialInfo.
            if (_credential != null)
            {
                string password = new NetworkCredential(string.Empty, _credential.Password).Password;
                source.Credentials = PackageSourceCredential.FromUserInput(repositoryUri.ToString(), _credential.UserName, password, true, null);
                _cmdletPassedIn.WriteVerbose("credential successfully set for repository: " + repositoryName);
            }
            else if (repositoryCredentialInfo != null)
            {
                PSCredential repoCredential = Utils.GetRepositoryCredentialFromSecretManagement(
                    repositoryName,
                    repositoryCredentialInfo,
                    _cmdletPassedIn);

                string password = new NetworkCredential(string.Empty, repoCredential.Password).Password;
                source.Credentials = PackageSourceCredential.FromUserInput(repositoryUri.ToString(), repoCredential.UserName, password, true, null);
                _cmdletPassedIn.WriteVerbose("credential successfully read from vault and set for repository: " + repositoryName);
            }

            // GetCoreV3() API is able to handle V2 and V3 repository endpoints.
            var provider = FactoryExtensionsV3.GetCoreV3(NuGet.Protocol.Core.Types.Repository.Provider);
            SourceRepository repository = new SourceRepository(source, provider);

            resourceSearch   = null;
            resourceMetadata = null;

            try
            {
                resourceSearch   = repository.GetResourceAsync <PackageSearchResource>().GetAwaiter().GetResult();
                resourceMetadata = repository.GetResourceAsync <PackageMetadataResource>().GetAwaiter().GetResult();
            }
            catch (Exception e)
            {
                Utils.WriteVerboseOnCmdlet(_cmdletPassedIn, "Error retrieving resource from repository: " + e.Message);
            }

            if (resourceSearch == null || resourceMetadata == null)
            {
                yield break;
            }

            filter  = new SearchFilter(_prerelease);
            context = new SourceCacheContext();

            foreach (PSResourceInfo pkg in SearchAcrossNamesInRepository(
                         repositoryName: String.Equals(repositoryUri.AbsoluteUri, _psGalleryUri, StringComparison.InvariantCultureIgnoreCase) ? _psGalleryRepoName :
                         (String.Equals(repositoryUri.AbsoluteUri, _poshTestGalleryUri, StringComparison.InvariantCultureIgnoreCase) ? _poshTestGalleryRepoName : repositoryName),
                         pkgSearchResource: resourceSearch,
                         pkgMetadataResource: resourceMetadata,
                         searchFilter: filter,
                         sourceContext: context))
            {
                yield return(pkg);
            }
        }