public async Task CopyPackagesToOriginalCaseAsync_WhenPackageMustComeFromProvider_ConvertsPackagesAsync()
        {
            // Arrange
            using (var workingDirectory = TestDirectory.Create())
            {
                var packagesDirectory = Path.Combine(workingDirectory, "packages");
                var sourceDirectory   = Path.Combine(workingDirectory, "source");

                // Add the package to the source.
                var identity    = new PackageIdentity("PackageA", NuGetVersion.Parse("1.0.0-Beta"));
                var packagePath = await SimpleTestPackageUtility.CreateFullPackageAsync(
                    sourceDirectory,
                    identity.Id,
                    identity.Version.ToString());

                var logger = new TestLogger();
                var graph  = GetRestoreTargetGraph(sourceDirectory, identity, packagePath, logger);

                var request  = GetRestoreRequest(packagesDirectory, logger);
                var resolver = new VersionFolderPathResolver(packagesDirectory, isLowercase: false);

                var target = new OriginalCaseGlobalPackageFolder(request);

                // Act
                await target.CopyPackagesToOriginalCaseAsync(
                    new[] { graph },
                    CancellationToken.None);

                // Assert
                Assert.True(File.Exists(resolver.GetPackageFilePath(identity.Id, identity.Version)));
                Assert.Equal(1, logger.Messages.Count(x => x.Contains(identity.ToString())));
            }
        }
예제 #2
0
        public async Task PushCommand_AbsolutePathSourceAsync()
        {
            using (var workingDir = TestDirectory.Create())
            {
                // Arrange (create a test package)
                var packagePushDest = new DirectoryInfo(Path.Combine(workingDir, "packagePushDest"));
                packagePushDest.Create();

                var packageSources = new List <PackageSource>
                {
                    new PackageSource(packagePushDest.FullName)
                };

                var packageInfo = await SimpleTestPackageUtility.CreateFullPackageAsync(workingDir, "test", "1.0.0");

                // Act
                await PushRunner.Run(
                    Settings.LoadDefaultSettings(null, null, null),
                    new TestPackageSourceProvider(packageSources),
                    packageInfo.FullName,
                    packagePushDest.FullName,
                    null,  // api key
                    null,  // symbols source
                    null,  // symbols api key
                    0,     // timeout
                    false, // disable buffering
                    false, // no symbols,
                    false, // enable server endpoint
                    new TestLogger());

                // Assert
                var destFile = Path.Combine(packagePushDest.FullName, packageInfo.Name);
                Assert.Equal(true, File.Exists(destFile));
            }
        }
            internal static async Task <HttpFileSystemBasedFindPackageByIdResourceTest> CreateAsync(TestEnvironmentVariableReader testEnvironmentVariableReader = null)
            {
                var packageIdentity = new PackageIdentity(id: "DeepEqual", version: NuGetVersion.Parse("1.4.0"));
                var testDirectory   = TestDirectory.Create();
                var packageSource   = new PackageSource("http://unit.test/v3-flatcontainer");
                var package         = await SimpleTestPackageUtility.CreateFullPackageAsync(
                    testDirectory.Path,
                    packageIdentity.Id,
                    packageIdentity.Version.ToNormalizedString());

                var packageBytes = File.ReadAllBytes(package.FullName);

                var responses = new Dictionary <string, Func <HttpRequestMessage, Task <HttpResponseMessage> > >
                {
                    {
                        $"{packageSource.Source}/deepequal/index.json",
                        request => Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
                        {
                            Content = new TestContent(JsonData.DeepEqualFlatContainerIndex)
                        })
                    },
                    {
                        $"{packageSource.Source}/deepequal/1.4.0/deepequal.1.4.0.nupkg",
                        _ => Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
                        {
                            Content = new ByteArrayContent(packageBytes)
                        })
                    },
                    {
                        $"{packageSource.Source}/a/index.json",
                        request => Task.FromResult(new HttpResponseMessage(HttpStatusCode.NotFound))
                    },
                    {
                        $"{packageSource.Source}/socketexception/index.json",
                        request =>
                        {
                            SocketExceptionCallsMade += 1;
                            throw new Exception("Oh this isn't going well", new IOException("This is what TCP hang-ups look like", new SocketException(123)));
                        }
                    },
                };

                var baseUris = new List <Uri>()
                {
                    packageSource.SourceUri
                };
                var httpSource = new TestHttpSource(packageSource, responses);
                var resource   = new HttpFileSystemBasedFindPackageByIdResource(
                    baseUris,
                    httpSource,
                    testEnvironmentVariableReader != null ? testEnvironmentVariableReader : EnvironmentVariableWrapper.Instance);

                return(new HttpFileSystemBasedFindPackageByIdResourceTest(
                           resource,
                           package,
                           packageIdentity,
                           new SourceCacheContext(),
                           httpSource,
                           testDirectory));
            }
        public async Task Push_WhenPushingToAnHttpSourceAndSymbolSource_WarnsForBoth()
        {
            // Arrange
            using var workingDir = TestDirectory.Create();
            var source       = "http://www.nuget.org/api/v2/";
            var symbolSource = "http://other.smbsrc.net/";
            HttpRequestMessage sourceRequest = null;
            HttpRequestMessage symbolRequest = null;
            var apiKey = "serverapikey";

            var packageInfo = await SimpleTestPackageUtility.CreateFullPackageAsync(workingDir, "test", "1.0.0");

            var symbolPackageInfo = await SimpleTestPackageUtility.CreateSymbolPackageAsync(workingDir, "test", "1.0.0");

            var responses = new Dictionary <string, Func <HttpRequestMessage, Task <HttpResponseMessage> > >
            {
                {
                    source,
                    request =>
                    {
                        sourceRequest = request;
                        return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)));
                    }
                },
                {
                    "http://other.smbsrc.net/api/v2/package/",
                    request =>
                    {
                        symbolRequest = request;
                        return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)));
                    }
                },
            };

            var resource = await StaticHttpHandler.CreateSource(source, Repository.Provider.GetCoreV3(), responses).GetResourceAsync <PackageUpdateResource>();

            UserAgent.SetUserAgentString(new UserAgentStringBuilder("test client"));
            var logger = new TestLogger();

            // Act
            await resource.Push(
                packagePaths : new[] { packageInfo.FullName },
                symbolSource : symbolSource,
                timeoutInSecond : 5,
                disableBuffering : false,
                getApiKey : _ => apiKey,
                getSymbolApiKey : _ => apiKey,
                noServiceEndpoint : false,
                skipDuplicate : false,
                symbolPackageUpdateResource : null,
                log : logger);

            // Assert
            Assert.NotNull(sourceRequest);
            Assert.NotNull(symbolRequest);
            Assert.Equal(2, logger.WarningMessages.Count);
            Assert.Contains("You are running the 'push' operation with an 'HTTP' source, 'http://www.nuget.org/api/v2/'. Non-HTTPS access will be removed in a future version. Consider migrating to an 'HTTPS' source.", logger.WarningMessages.First());
            Assert.Contains("You are running the 'push' operation with an 'HTTP' source, 'http://other.smbsrc.net/api/v2/package/'. Non-HTTPS access will be removed in a future version. Consider migrating to an 'HTTPS' source.", logger.WarningMessages.Last());
        }
        public async Task DependencyTypeConstraint_RootProjectIsUsedOverPackageAsync()
        {
            // Arrange
            var sources = new List <PackageSource>();

            var project1Json = @"
            {
              ""version"": ""1.0.0"",
              ""description"": """",
              ""authors"": [ ""author"" ],
              ""tags"": [ """" ],
              ""projectUrl"": """",
              ""licenseUrl"": """",
              ""frameworks"": {
                ""net45"": {
                }
              }
            }";

            using (var workingDir = TestDirectory.Create())
            {
                var packagesDir   = new DirectoryInfo(Path.Combine(workingDir, "globalPackages"));
                var packageSource = new DirectoryInfo(Path.Combine(workingDir, "packageSource"));
                var project1      = new DirectoryInfo(Path.Combine(workingDir, "projects", "project1"));
                packagesDir.Create();
                packageSource.Create();
                project1.Create();
                sources.Add(new PackageSource(packageSource.FullName));

                File.WriteAllText(Path.Combine(project1.FullName, "project.json"), project1Json);

                var specPath1 = Path.Combine(project1.FullName, "project.json");
                var spec1     = JsonPackageSpecReader.GetPackageSpec(project1Json, "project1", specPath1).EnsureProjectJsonRestoreMetadata();

                var project1PackagePath = await SimpleTestPackageUtility.CreateFullPackageAsync(
                    packageSource.FullName,
                    "project1",
                    "1.0.0");

                await GlobalFolderUtility.AddPackageToGlobalFolderAsync(project1PackagePath, packagesDir);

                var logger  = new TestLogger();
                var request = new TestRestoreRequest(spec1, sources, packagesDir.FullName, logger)
                {
                    LockFilePath = Path.Combine(project1.FullName, "project.lock.json")
                };

                // Act
                var command = new RestoreCommand(request);
                var result  = await command.ExecuteAsync();

                var lockFile = result.LockFile;
                await result.CommitAsync(logger, CancellationToken.None);

                // Assert
                Assert.True(result.Success);
                Assert.Equal(0, lockFile.Libraries.Count);
            }
        }
예제 #6
0
        public async Task GetDependencyInfoAsync_GetOriginalIdentity_IdNotInResponseAsync()
        {
            // Arrange
            using (var workingDir = TestDirectory.Create())
            {
                var serviceAddress = ProtocolUtility.CreateServiceAddress();
                var package        = await SimpleTestPackageUtility.CreateFullPackageAsync(workingDir, "WindowsAzure.Storage", "6.2.2-preview");

                var packageBytes = File.ReadAllBytes(package.FullName);

                var responses = new Dictionary <string, Func <HttpRequestMessage, Task <HttpResponseMessage> > >
                {
                    {
                        serviceAddress,
                        _ => Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
                        {
                            Content = new TestContent(string.Empty)
                        })
                    },
                    {
                        serviceAddress + "FindPackagesById()?id='WINDOWSAZURE.STORAGE'&semVerLevel=2.0.0",
                        _ => Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
                        {
                            Content = new TestContent(ProtocolUtility.GetResource("NuGet.Protocol.Tests.compiler.resources.WindowsAzureStorageFindPackagesById.xml", GetType()))
                        })
                    },
                    {
                        "https://www.nuget.org/api/v2/package/WindowsAzure.Storage/6.2.2-preview",
                        _ => Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
                        {
                            Content = new ByteArrayContent(packageBytes)
                        })
                    }
                };

                var repo   = StaticHttpHandler.CreateSource(serviceAddress, Repository.Provider.GetCoreV3(), responses);
                var logger = new TestLogger();

                using (var cacheContext = new SourceCacheContext())
                {
                    var resource = await repo.GetResourceAsync <FindPackageByIdResource>();

                    // Act
                    var info = await resource.GetDependencyInfoAsync(
                        "WINDOWSAZURE.STORAGE",
                        new NuGetVersion("6.2.2-PREVIEW"),
                        cacheContext,
                        logger,
                        CancellationToken.None);

                    // Assert
                    Assert.IsType <RemoteV2FindPackageByIdResource>(resource);
                    Assert.Equal("WindowsAzure.Storage", info.PackageIdentity.Id);
                    Assert.Equal("6.2.2-preview", info.PackageIdentity.Version.ToNormalizedString());
                }
            }
        }
        public async Task GetDependencyInfoAsync_GetsOriginalIdentityAsync()
        {
            // Arrange
            using (var workingDir = TestDirectory.Create())
            {
                var source  = "http://unit.test/v3-with-flat-container/index.json";
                var package = await SimpleTestPackageUtility.CreateFullPackageAsync(workingDir, "DeepEqual", "1.4.0.1-rc");

                var packageBytes = File.ReadAllBytes(package.FullName);

                var responses = new Dictionary <string, Func <HttpRequestMessage, Task <HttpResponseMessage> > >
                {
                    {
                        source,
                        _ => Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
                        {
                            Content = new TestContent(JsonData.IndexWithFlatContainer)
                        })
                    },
                    {
                        "https://api.nuget.org/v3-flatcontainer/deepequal/index.json",
                        _ => Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
                        {
                            Content = new TestContent(JsonData.DeepEqualFlatContainerIndex)
                        })
                    },
                    {
                        "https://api.nuget.org/v3-flatcontainer/deepequal/1.4.0.1-rc/deepequal.1.4.0.1-rc.nupkg",
                        _ => Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
                        {
                            Content = new ByteArrayContent(packageBytes)
                        })
                    }
                };

                var repo   = StaticHttpHandler.CreateSource(source, Repository.Provider.GetCoreV3(), responses);
                var logger = new TestLogger();

                using (var cacheContext = new SourceCacheContext())
                {
                    var resource = await repo.GetResourceAsync <FindPackageByIdResource>();

                    // Act
                    var info = await resource.GetDependencyInfoAsync(
                        "DEEPEQUAL",
                        new NuGetVersion("1.4.0.1-RC"),
                        cacheContext,
                        logger,
                        CancellationToken.None);

                    // Assert
                    Assert.IsType <HttpFileSystemBasedFindPackageByIdResource>(resource);
                    Assert.Equal("DeepEqual", info.PackageIdentity.Id);
                    Assert.Equal("1.4.0.1-rc", info.PackageIdentity.Version.ToNormalizedString());
                }
            }
        }
예제 #8
0
            internal static async Task <PluginFindPackageByIdResourceTest> CreateAsync(
                MessageResponseCode responseCode = MessageResponseCode.Error)
            {
                var packageIdentity = new PackageIdentity(id: "a", version: NuGetVersion.Parse("1.0.0"));
                var testDirectory   = TestDirectory.Create();
                var packageSource   = new PackageSource("http://unit.test");
                var package         = await SimpleTestPackageUtility.CreateFullPackageAsync(
                    testDirectory.Path,
                    packageIdentity.Id,
                    packageIdentity.Version.ToNormalizedString());

                var packageBytes = File.ReadAllBytes(package.FullName);
                var plugin       = new Mock <IPlugin>();
                var dispatcher   = new Mock <IMessageDispatcher>();
                var connection   = new Mock <IConnection>();

                dispatcher.SetupGet(x => x.RequestHandlers)
                .Returns(new RequestHandlers());

                connection.SetupGet(x => x.MessageDispatcher)
                .Returns(dispatcher.Object);

                var versions = responseCode == MessageResponseCode.Success ? new[] { "1.0.0", "2.0.0", "3.0.0" } : null;
                var response = new GetPackageVersionsResponse(responseCode, versions);

                connection.Setup(x => x.SendRequestAndReceiveResponseAsync <GetPackageVersionsRequest, GetPackageVersionsResponse>(
                                     It.Is <MessageMethod>(m => m == MessageMethod.GetPackageVersions),
                                     It.Is <GetPackageVersionsRequest>(
                                         c => string.Equals(c.PackageId, packageIdentity.Id, StringComparison.OrdinalIgnoreCase) &&
                                         c.PackageSourceRepository == packageSource.Source),
                                     It.IsAny <CancellationToken>()))
                .ReturnsAsync(response);

                plugin.SetupGet(x => x.Connection)
                .Returns(connection.Object);

                var utilities           = new Mock <IPluginMulticlientUtilities>();
                var credentialService   = new Mock <ICredentialService>();
                var credentialsProvider = new GetCredentialsRequestHandler(
                    plugin.Object,
                    proxy: null,
                    credentialService: credentialService.Object);

                var resource = new PluginFindPackageByIdResource(
                    plugin.Object,
                    utilities.Object,
                    packageSource);

                return(new PluginFindPackageByIdResourceTest(
                           resource,
                           package,
                           packageIdentity,
                           connection,
                           new SourceCacheContext(),
                           testDirectory));
            }
예제 #9
0
        public async Task GetInstalledVersion_WithFloating_WithAssetsFile_ReturnsVersionsFromAssetsSpecs()
        {
            using (var testDirectory = TestDirectory.Create())
            {
                // Setup
                var projectName     = "project1";
                var projectFullPath = Path.Combine(testDirectory.Path, projectName + ".csproj");

                // Project
                var projectCache = new ProjectSystemCache();
                IVsProjectAdapter projectAdapter = (new Mock <IVsProjectAdapter>()).Object;
                var project = CreateNetCorePackageReferenceProject(projectName, projectFullPath, projectCache);

                var projectNames = GetTestProjectNames(projectFullPath, projectName);
                var packageSpec  = GetPackageSpec(projectName, projectFullPath, "[*, )");

                // Restore info
                var projectRestoreInfo = ProjectJsonTestHelpers.GetDGSpecFromPackageSpecs(packageSpec);
                projectCache.AddProjectRestoreInfo(projectNames, projectRestoreInfo, new List <IAssetsLogMessage>());
                projectCache.AddProject(projectNames, projectAdapter, project).Should().BeTrue();

                // Package directories
                var sources       = new List <PackageSource>();
                var packagesDir   = new DirectoryInfo(Path.Combine(testDirectory, "globalPackages"));
                var packageSource = new DirectoryInfo(Path.Combine(testDirectory, "packageSource"));
                packagesDir.Create();
                packageSource.Create();
                sources.Add(new PackageSource(packageSource.FullName));

                var logger  = new TestLogger();
                var request = new TestRestoreRequest(packageSpec, sources, packagesDir.FullName, logger)
                {
                    LockFilePath = Path.Combine(testDirectory, "project.assets.json")
                };

                await SimpleTestPackageUtility.CreateFullPackageAsync(packageSource.FullName, "packageA", "4.0.0");

                // Act
                var command = new RestoreCommand(request);
                var result  = await command.ExecuteAsync();

                await result.CommitAsync(logger, CancellationToken.None);

                var packages = await project.GetInstalledPackagesAsync(CancellationToken.None);

                // Asert
                Assert.True(result.Success);
                packages.Should().Contain(a => a.PackageIdentity.Equals(new PackageIdentity("packageA", new NuGetVersion("4.0.0"))));

                var cache_packages = await project.GetInstalledPackagesAsync(CancellationToken.None);

                cache_packages.Should().Contain(a => a.PackageIdentity.Equals(new PackageIdentity("packageA", new NuGetVersion("4.0.0"))));
            }
        }
예제 #10
0
        public async Task PackageUpdateResource_AllowsApiKeyWhenPushingAsync()
        {
            // Arrange
            using (var workingDir = TestDirectory.Create())
            {
                var source = "https://www.nuget.org/api/v2";
                HttpRequestMessage actualRequest = null;
                var responses = new Dictionary <string, Func <HttpRequestMessage, Task <HttpResponseMessage> > >
                {
                    {
                        "https://www.nuget.org/api/v2/",
                        request =>
                        {
                            actualRequest = request;
                            return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)));
                        }
                    }
                };

                var repo     = StaticHttpHandler.CreateSource(source, Repository.Provider.GetCoreV3(), responses);
                var resource = await repo.GetResourceAsync <PackageUpdateResource>();

                var apiKey = "SomeApiKey";

                var packageInfo = await SimpleTestPackageUtility.CreateFullPackageAsync(workingDir, "test", "1.0.0");

                // Act
                await resource.Push(
                    packagePaths : new[] { packageInfo.FullName },
                    symbolSource : null,
                    timeoutInSecond : 5,
                    disableBuffering : false,
                    getApiKey : _ => apiKey,
                    getSymbolApiKey : _ => null,
                    noServiceEndpoint : false,
                    skipDuplicate : false,
                    symbolPackageUpdateResource : null,
                    log : NullLogger.Instance);

                // Assert
                Assert.NotNull(actualRequest);
                Assert.Equal(HttpMethod.Put, actualRequest.Method);

                IEnumerable <string> values;
                actualRequest.Headers.TryGetValues(ProtocolConstants.ApiKeyHeader, out values);
                Assert.Equal(1, values.Count());
                Assert.Equal(apiKey, values.First());

                Assert.False(
                    actualRequest.GetOrCreateConfiguration().PromptOn403,
                    "When the API key is provided, the user should not be prompted on HTTP 403.");
            }
        }
예제 #11
0
            public async Task <DownloadResourceResult> InitializePackageAsync()
            {
                var context = new SimpleTestPackageContext(PackageIdentity);

                context.PackageTypes.Clear();
                context.PackageTypes.AddRange(PackageTypes);

                var package = await SimpleTestPackageUtility.CreateFullPackageAsync(
                    TestDirectory,
                    context);

                return(new DownloadResourceResult(package.OpenRead(), TestDirectory.Path));
            }
            internal static async Task <HttpFileSystemBasedFindPackageByIdResourceTest> CreateAsync()
            {
                var packageIdentity = new PackageIdentity(id: "DeepEqual", version: NuGetVersion.Parse("1.4.0"));
                var testDirectory   = TestDirectory.Create();
                var packageSource   = new PackageSource("http://unit.test/v3-flatcontainer");
                var package         = await SimpleTestPackageUtility.CreateFullPackageAsync(
                    testDirectory.Path,
                    packageIdentity.Id,
                    packageIdentity.Version.ToNormalizedString());

                var packageBytes = File.ReadAllBytes(package.FullName);

                var responses = new Dictionary <string, Func <HttpRequestMessage, Task <HttpResponseMessage> > >
                {
                    {
                        $"{packageSource.Source}/deepequal/index.json",
                        request => Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
                        {
                            Content = new TestContent(JsonData.DeepEqualFlatContainerIndex)
                        })
                    },
                    {
                        $"{packageSource.Source}/deepequal/1.4.0/deepequal.1.4.0.nupkg",
                        _ => Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
                        {
                            Content = new ByteArrayContent(packageBytes)
                        })
                    },
                    {
                        $"{packageSource.Source}/a/index.json",
                        request => Task.FromResult(new HttpResponseMessage(HttpStatusCode.NotFound))
                    }
                };

                var baseUris = new List <Uri>()
                {
                    packageSource.SourceUri
                };
                var httpSource = new TestHttpSource(packageSource, responses);
                var resource   = new HttpFileSystemBasedFindPackageByIdResource(
                    baseUris,
                    httpSource);

                return(new HttpFileSystemBasedFindPackageByIdResourceTest(
                           resource,
                           package,
                           packageIdentity,
                           new SourceCacheContext(),
                           httpSource,
                           testDirectory));
            }
예제 #13
0
            internal static async Task <LocalV3FindPackageByIdResourceTest> CreateAsync(bool createFiles = false)
            {
                var packageIdentity  = new PackageIdentity(id: "a", version: NuGetVersion.Parse("1.0.0"));
                var testDirectory    = TestDirectory.Create();
                var packageDirectory = Directory.CreateDirectory(
                    Path.Combine(
                        testDirectory.Path,
                        packageIdentity.Id,
                        packageIdentity.Version.ToNormalizedString()));
                var      packageSource = new PackageSource(testDirectory.Path);
                FileInfo package       = null;

                // Only a few tests have outcomes that rely on the presence of these files,
                // so only create them if necessary.
                if (createFiles)
                {
                    package = await SimpleTestPackageUtility.CreateFullPackageAsync(
                        packageDirectory.FullName,
                        packageIdentity.Id,
                        packageIdentity.Version.ToNormalizedString());

                    File.WriteAllText(
                        Path.Combine(packageDirectory.FullName, $"{packageIdentity.Id}.nuspec"),
                        $@"<?xml version=""1.0"" encoding=""utf-8""?>
                        <package>
                            <metadata>
                                <id>{packageIdentity.Id}</id>
                                <version>{packageIdentity.Version.ToNormalizedString()}</version>
                                <title />
                                <frameworkAssemblies>
                                    <frameworkAssembly assemblyName=""System.Runtime"" />
                                </frameworkAssemblies>
                            </metadata>
                        </package>");

                    File.WriteAllText(
                        Path.Combine(
                            packageDirectory.FullName,
                            $"{packageIdentity.Id}.{packageIdentity.Version.ToNormalizedString()}.nupkg.sha512"),
                        string.Empty);
                }

                var resource = new LocalV3FindPackageByIdResource(packageSource);

                return(new LocalV3FindPackageByIdResourceTest(
                           resource,
                           package,
                           packageIdentity,
                           testDirectory));
            }
예제 #14
0
            public static async Task <TestContext> CreateAsync(TestDirectory testDirectory)
            {
                var identity = new PackageIdentity("PackageA", NuGetVersion.Parse("1.0.0-Beta"));

                var packageDirectory = Path.Combine(testDirectory, "packages");
                var package          = await SimpleTestPackageUtility.CreateFullPackageAsync(
                    packageDirectory,
                    identity.Id,
                    identity.Version.ToString());

                var expectedContent = File.ReadAllBytes(package.FullName);

                return(new TestContext(testDirectory, identity, expectedContent));
            }
예제 #15
0
        public async Task CopyPackagesToOriginalCaseAsync_EmitsTelemetryWithParentIdAsync()
        {
            // Set up telemetry service
            var telemetryEvents = new ConcurrentQueue <TelemetryEvent>();
            var telSvc          = new Mock <INuGetTelemetryService>();

            telSvc.Setup(x => x.EmitTelemetryEvent(It.IsAny <TelemetryEvent>()))
            .Callback <TelemetryEvent>(x => telemetryEvents.Enqueue(x));
            TelemetryActivity.NuGetTelemetryService = telSvc.Object;

            var parentIdGuid = Guid.NewGuid();

            // Arrange
            using (var workingDirectory = TestDirectory.Create())
            {
                var packagesDirectory = Path.Combine(workingDirectory, "packages");
                var sourceDirectory   = Path.Combine(workingDirectory, "source");

                var identity    = new PackageIdentity("PackageA", NuGetVersion.Parse("1.0.0-Beta"));
                var packagePath = await SimpleTestPackageUtility.CreateFullPackageAsync(
                    sourceDirectory,
                    identity.Id,
                    identity.Version.ToString());

                var logger = new TestLogger();
                var graphA = GetRestoreTargetGraph(sourceDirectory, identity, packagePath, logger);
                var graphB = GetRestoreTargetGraph(sourceDirectory, identity, packagePath, logger);

                var request  = GetRestoreRequest(packagesDirectory, logger);
                var resolver = new VersionFolderPathResolver(packagesDirectory, isLowercase: false);

                var target = new OriginalCaseGlobalPackageFolder(request, parentIdGuid);

                // Act
                await target.CopyPackagesToOriginalCaseAsync(
                    new[] { graphA, graphB },
                    CancellationToken.None);
            }

            // Assert
            var eventSingleCollection = telemetryEvents.Where(x => x.Name == "PackageExtractionInformation");

            Assert.Single(eventSingleCollection);
            var evt = eventSingleCollection.Single();

            Assert.NotNull(evt["ParentId"]);
            Assert.Equal(evt["ParentId"], parentIdGuid.ToString());
        }
예제 #16
0
        public async Task PackageUpdateResource_NoServiceEndpointOnCustomServer_ShouldAddEndpointAsync()
        {
            // Arrange
            using (var workingDir = TestDirectory.Create())
            {
                var source = "https://nuget.customsrc.net/";

                HttpRequestMessage sourceRequest = null;
                var apiKey = "serverapikey";

                var packageInfo = await SimpleTestPackageUtility.CreateFullPackageAsync(workingDir, "test", "1.0.0");

                var responses = new Dictionary <string, Func <HttpRequestMessage, Task <HttpResponseMessage> > >
                {
                    {
                        "https://nuget.customsrc.net/api/v2/package/",
                        request =>
                        {
                            sourceRequest = request;
                            return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)));
                        }
                    }
                };

                var repo     = StaticHttpHandler.CreateSource(source, Repository.Provider.GetCoreV3(), responses);
                var resource = await repo.GetResourceAsync <PackageUpdateResource>();

                UserAgent.SetUserAgentString(new UserAgentStringBuilder("test client"));

                // Act
                await resource.Push(
                    packagePaths : new[] { packageInfo.FullName },
                    symbolSource : null,
                    timeoutInSecond : 5,
                    disableBuffering : false,
                    getApiKey : _ => apiKey,
                    getSymbolApiKey : _ => null,
                    noServiceEndpoint : false,
                    skipDuplicate : false,
                    symbolPackageUpdateResource : null,
                    log : NullLogger.Instance);

                // Assert
                Assert.NotNull(sourceRequest);
                Assert.Equal(HttpMethod.Put, sourceRequest.Method);
                Assert.Equal(source + "api/v2/package/", sourceRequest.RequestUri.AbsoluteUri);
            }
        }
            internal static async Task <LocalV2FindPackageByIdResourceTest> CreateAsync()
            {
                var packageIdentity   = new PackageIdentity(id: "a", version: NuGetVersion.Parse("1.0.0"));
                var testDirectory     = TestDirectory.Create();
                var packagesDirectory = Directory.CreateDirectory(Path.Combine(testDirectory.Path, "packages"));
                var packageSource     = new PackageSource(testDirectory.Path);
                var package           = await SimpleTestPackageUtility.CreateFullPackageAsync(
                    packagesDirectory.FullName,
                    packageIdentity.Id,
                    packageIdentity.Version.ToNormalizedString());

                var packageBytes = File.ReadAllBytes(package.FullName);
                var resource     = new LocalV2FindPackageByIdResource(packageSource);

                return(new LocalV2FindPackageByIdResourceTest(
                           resource,
                           package,
                           packageIdentity,
                           testDirectory));
            }
        public async Task Push_WithAnHttpSource_NupkgOnly_Warns()
        {
            // Arrange
            using var workingDir = TestDirectory.Create();
            var source = "http://www.nuget.org/api/v2/";
            HttpRequestMessage sourceRequest = null;
            var packageInfo = await SimpleTestPackageUtility.CreateFullPackageAsync(workingDir, "test", "1.0.0");

            var responses = new Dictionary <string, Func <HttpRequestMessage, Task <HttpResponseMessage> > >
            {
                {
                    source,
                    request =>
                    {
                        sourceRequest = request;
                        return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)));
                    }
                },
            };
            var resource = await StaticHttpHandler.CreateSource(source, Repository.Provider.GetCoreV3(), responses).GetResourceAsync <PackageUpdateResource>();

            var logger = new TestLogger();

            // Act
            await resource.Push(
                packagePaths : new[] { packageInfo.FullName },
                symbolSource : string.Empty,
                timeoutInSecond : 5,
                disableBuffering : false,
                getApiKey : _ => "serverapikey",
                getSymbolApiKey : _ => null,
                noServiceEndpoint : false,
                skipDuplicate : false,
                symbolPackageUpdateResource : null,
                log : logger);

            // Assert
            Assert.NotNull(sourceRequest);
            Assert.Equal(1, logger.WarningMessages.Count);
            Assert.Contains("You are running the 'push' operation with an 'HTTP' source", logger.WarningMessages.First());
        }
        public async Task CopyPackagesToOriginalCaseAsync_DoesNothingIfPackageIsAlreadyInstalledAsync()
        {
            // Arrange
            using (var workingDirectory = TestDirectory.Create())
            {
                var packagesDirectory = Path.Combine(workingDirectory, "packages");
                var sourceDirectory   = Path.Combine(workingDirectory, "source");

                var identity    = new PackageIdentity("PackageA", NuGetVersion.Parse("1.0.0-Beta"));
                var packagePath = await SimpleTestPackageUtility.CreateFullPackageAsync(
                    sourceDirectory,
                    identity.Id,
                    identity.Version.ToString());

                var logger = new TestLogger();
                var graph  = GetRestoreTargetGraph(sourceDirectory, identity, packagePath, logger);

                var request  = GetRestoreRequest(packagesDirectory, logger);
                var resolver = new VersionFolderPathResolver(packagesDirectory, isLowercase: false);

                var hashPath = resolver.GetNupkgMetadataPath(identity.Id, identity.Version);
                Directory.CreateDirectory(Path.GetDirectoryName(hashPath));

                // The hash file is what determines if the package is installed or not.
                File.WriteAllText(hashPath, string.Empty);

                var target = new OriginalCaseGlobalPackageFolder(request);

                // Act
                await target.CopyPackagesToOriginalCaseAsync(
                    new[] { graph },
                    CancellationToken.None);

                // Assert
                Assert.True(File.Exists(resolver.GetNupkgMetadataPath(identity.Id, identity.Version)));
                Assert.Equal(0, logger.Messages.Count(x => x.Contains(identity.ToString())));
            }
        }
        public async Task DependencyTypeConstraint_TargetPackageAsync()
        {
            // Arrange
            var sources = new List <PackageSource>();

            var project1Json = @"
            {
              ""version"": ""1.0.0"",
              ""description"": """",
              ""authors"": [ ""author"" ],
              ""tags"": [ """" ],
              ""projectUrl"": """",
              ""licenseUrl"": """",
              ""dependencies"": {
                ""packageA"": {
                    ""version"": ""1.0.0"",
                    ""target"": ""package""
                }
              },
              ""frameworks"": {
                ""net45"": {
                }
              }
            }";

            var packageAProjectJson = @"
            {
              ""version"": ""1.0.0"",
              ""description"": """",
              ""authors"": [ ""author"" ],
              ""tags"": [ """" ],
              ""projectUrl"": """",
              ""licenseUrl"": """",
              ""frameworks"": {
                ""net45"": {
                }
              }
            }";

            using (var workingDir = TestDirectory.Create())
            {
                var packagesDir             = new DirectoryInfo(Path.Combine(workingDir, "globalPackages"));
                var packageSource           = new DirectoryInfo(Path.Combine(workingDir, "packageSource"));
                var project1                = new DirectoryInfo(Path.Combine(workingDir, "projects", "project1"));
                var packageAProject         = new DirectoryInfo(Path.Combine(workingDir, "projects", "packageA"));
                var packageAExternalProject = new DirectoryInfo(Path.Combine(workingDir, "external", "packageA"));
                packagesDir.Create();
                packageSource.Create();
                project1.Create();
                packageAProject.Create();
                packageAExternalProject.Create();
                sources.Add(new PackageSource(packageSource.FullName));

                File.WriteAllText(Path.Combine(project1.FullName, "project.json"), project1Json);
                File.WriteAllText(Path.Combine(packageAProject.FullName, "project.json"), packageAProjectJson);

                var project1ProjPath = Path.Combine(project1.FullName, "project1.xproj");
                File.WriteAllText(project1ProjPath, string.Empty);
                File.WriteAllText(Path.Combine(packageAProject.FullName, "packageA.xproj"), string.Empty);

                var specPath1 = Path.Combine(project1.FullName, "project.json");
                var specPath2 = Path.Combine(packageAProject.FullName, "project.json");
                var spec1     = JsonPackageSpecReader.GetPackageSpec(project1Json, "project1", specPath1).EnsureProjectJsonRestoreMetadata();
                var spec2     = JsonPackageSpecReader.GetPackageSpec(packageAProjectJson, "packageA", specPath2).EnsureProjectJsonRestoreMetadata();

                var packageAPath = await SimpleTestPackageUtility.CreateFullPackageAsync(
                    packageSource.FullName,
                    "packageA",
                    "1.0.0");

                await GlobalFolderUtility.AddPackageToGlobalFolderAsync(packageAPath, packagesDir);

                var logger  = new TestLogger();
                var request = new TestRestoreRequest(spec1, sources, packagesDir.FullName, logger)
                {
                    LockFilePath = Path.Combine(project1.FullName, "project.lock.json")
                };

                // Act
                var command = new RestoreCommand(request);
                var result  = await command.ExecuteAsync();

                var lockFile = result.LockFile;
                await result.CommitAsync(logger, CancellationToken.None);

                var packageALib = lockFile.GetLibrary("packageA", NuGetVersion.Parse("1.0.0"));

                var packageATarget = lockFile.GetTarget(
                    FrameworkConstants.CommonFrameworks.Net45,
                    runtimeIdentifier: null)
                                     .Libraries
                                     .Single(lib => lib.Name == "packageA");

                // Assert
                Assert.True(result.Success);

                Assert.Equal(LibraryType.Package, packageALib.Type);
                Assert.Equal(LibraryType.Package, packageATarget.Type);
            }
        }
        public async Task DependencyTypeConstraint_PackagesDependOnProjectAsync()
        {
            // Arrange
            var sources = new List <PackageSource>();

            var project1Json = @"
            {
              ""version"": ""1.0.0"",
              ""description"": """",
              ""authors"": [ ""author"" ],
              ""tags"": [ """" ],
              ""projectUrl"": """",
              ""licenseUrl"": """",
              ""dependencies"": {
                ""packageA"": ""1.0.0""
              },
              ""frameworks"": {
                ""net45"": {
                }
              }
            }";

            var packageBProjectJson = @"
            {
              ""version"": ""1.0.0"",
              ""description"": """",
              ""authors"": [ ""author"" ],
              ""tags"": [ """" ],
              ""projectUrl"": """",
              ""licenseUrl"": """",
              ""frameworks"": {
                ""net45"": {
                }
              }
            }";

            using (var workingDir = TestDirectory.Create())
            {
                var packagesDir     = new DirectoryInfo(Path.Combine(workingDir, "globalPackages"));
                var packageSource   = new DirectoryInfo(Path.Combine(workingDir, "packageSource"));
                var project1        = new DirectoryInfo(Path.Combine(workingDir, "projects", "project1"));
                var packageBProject = new DirectoryInfo(Path.Combine(workingDir, "projects", "packageB"));
                packagesDir.Create();
                packageSource.Create();
                project1.Create();
                packageBProject.Create();
                sources.Add(new PackageSource(packageSource.FullName));

                File.WriteAllText(Path.Combine(project1.FullName, "project.json"), project1Json);
                File.WriteAllText(Path.Combine(packageBProject.FullName, "project.json"), packageBProjectJson);

                var specPath1 = Path.Combine(project1.FullName, "project.json");
                var specPath2 = Path.Combine(packageBProject.FullName, "project.json");
                var spec1     = JsonPackageSpecReader.GetPackageSpec(project1Json, "project1", specPath1);
                var spec2     = JsonPackageSpecReader.GetPackageSpec(packageBProjectJson, "packageB", specPath2);

                var packageAPath = await SimpleTestPackageUtility.CreateFullPackageAsync(
                    packageSource.FullName,
                    "packageA",
                    "1.0.0",
                    new Packaging.Core.PackageDependency[]
                {
                    new Packaging.Core.PackageDependency("packageB", VersionRange.Parse("1.0.0"))
                });

                await GlobalFolderUtility.AddPackageToGlobalFolderAsync(packageAPath, packagesDir);

                var logger = new TestLogger();

                var restoreContext = new RestoreArgs()
                {
                    Sources = new List <string>()
                    {
                        packageSource.FullName
                    },
                    GlobalPackagesFolder = packagesDir.FullName,
                    Log          = logger,
                    CacheContext = new SourceCacheContext()
                };

                // Modify specs for netcore
                spec2 = spec2.WithTestRestoreMetadata();
                spec1 = spec1.WithTestRestoreMetadata().WithTestProjectReference(spec2);

                var request = await ProjectJsonTestHelpers.GetRequestAsync(restoreContext, spec1, spec2);

                request.LockFilePath = Path.Combine(project1.FullName, "project.lock.json");

                // Act
                var command = new RestoreCommand(request);
                var result  = await command.ExecuteAsync();

                var lockFile = result.LockFile;
                await result.CommitAsync(logger, CancellationToken.None);

                // Assert
                Assert.True(result.Success);
                var packageBLib = lockFile.GetLibrary("packageB", NuGetVersion.Parse("1.0.0"));
                Assert.NotNull(packageBLib);
                Assert.Equal(LibraryType.Project, packageBLib.Type);
            }
        }
        public async Task BuildAssetsUtils_GeneratePathPropertyForTools(bool hasTools)
        {
            using (var pathContext = new SimpleTestPathContext())
            {
                // Arrange
                var identity = new PackageIdentity("packagea", NuGetVersion.Parse("1.0.0"));

                var packageDirectory = Directory.CreateDirectory(Path.Combine(pathContext.UserPackagesFolder, identity.Id, identity.Version.ToNormalizedString()));

                File.WriteAllText(Path.Combine(packageDirectory.FullName, $"{identity.Id}.{identity.Version.ToNormalizedString()}.nupkg.sha512"), string.Empty);

                var packagePath = await SimpleTestPackageUtility.CreateFullPackageAsync(
                    packageDirectory.FullName,
                    identity.Id,
                    identity.Version.ToString());

                var logger = new TestLogger();

                const string referenceSpec    = @"
                {
                    ""frameworks"": {
                        ""netcoreapp1.0"": {
                            ""dependencies"": {
                            }
                        }
                    }
                }";
                var          projectName      = "a";
                var          rootProjectsPath = pathContext.WorkingDirectory;
                var          projectDirectory = Path.Combine(rootProjectsPath, projectName);

                var spec = JsonPackageSpecReader.GetPackageSpec(referenceSpec, projectName, Path.Combine(projectDirectory, projectName)).WithTestRestoreMetadata();

                spec.Dependencies.Add(new LibraryDependency
                {
                    IncludeType  = LibraryIncludeFlags.All,
                    LibraryRange = new LibraryRange(identity.Id, new VersionRange(identity.Version), LibraryDependencyTarget.Package)
                });

                var targetGraphs = new List <RestoreTargetGraph>
                {
                    OriginalCaseGlobalPackageFolderTests.GetRestoreTargetGraph(pathContext.PackageSource, identity, packagePath, logger)
                };

                targetGraphs[0].Graphs.FirstOrDefault().Item.Data.Dependencies = spec.Dependencies;

                var lockFile = new LockFile
                {
                    Libraries =
                    {
                        new LockFileLibrary
                        {
                            Name     = identity.Id,
                            Version  = identity.Version,
                            Path     = $"{identity.Id.ToLowerInvariant()}/{identity.Version.ToNormalizedString()}",
                            Type     = LibraryType.Package,
                            HasTools = hasTools,
                        }
                    },
                    Targets =
                    {
                        new LockFileTarget
                        {
                            RuntimeIdentifier = targetGraphs[0].RuntimeIdentifier,
                            TargetFramework   = targetGraphs[0].Framework,
                            Libraries         =
                            {
                                new LockFileTargetLibrary
                                {
                                    Name    = identity.Id,
                                    Version = identity.Version
                                }
                            }
                        }
                    }
                };

                var repositories = new List <NuGetv3LocalRepository>
                {
                    new NuGetv3LocalRepository(pathContext.UserPackagesFolder)
                };

                var restoreRequest = new TestRestoreRequest(spec, new[] { new PackageSource(pathContext.PackageSource) }, pathContext.PackagesV2, logger)
                {
                    ProjectStyle = spec.RestoreMetadata.ProjectStyle
                };

                var assetsFilePath = Path.Combine(projectDirectory, "obj", "project.assets.json");

                // Act
                var outputFiles = BuildAssetsUtils.GetMSBuildOutputFiles(spec, lockFile, targetGraphs, repositories, restoreRequest, assetsFilePath, true, logger);

                var expectedPropertyName = $"Pkg{identity.Id.Replace(".", "_")}";

                var actualPropertyElement = outputFiles.FirstOrDefault().Content.Root.Descendants().Where(i => i.Name.LocalName.Equals(expectedPropertyName)).FirstOrDefault();

                if (hasTools)
                {
                    // Assert
                    Assert.NotNull(actualPropertyElement);


                    Assert.Equal($" '$({actualPropertyElement.Name.LocalName})' == '' ", actualPropertyElement.Attribute("Condition")?.Value);

                    Assert.Equal(packageDirectory.FullName, actualPropertyElement?.Value, ignoreCase: true);

                    Assert.Equal(" '$(ExcludeRestorePackageImports)' != 'true' ", actualPropertyElement.Parent.Attribute("Condition")?.Value);
                }
                else
                {
                    Assert.Null(actualPropertyElement);
                }
            }
        }
        public async Task BuildAssetsUtils_GeneratePathProperty()
        {
            using (var pathContext = new SimpleTestPathContext())
                using (var randomProjectDirectory = TestDirectory.Create())
                {
                    // Arrange
                    var identity = new PackageIdentity("packagea", NuGetVersion.Parse("1.0.0"));

                    var packageDirectory = Directory.CreateDirectory(Path.Combine(pathContext.UserPackagesFolder, identity.Id, identity.Version.ToNormalizedString()));

                    File.WriteAllText(Path.Combine(packageDirectory.FullName, $"{identity.Id}.{identity.Version.ToNormalizedString()}.nupkg.sha512"), string.Empty);

                    var packagePath = await SimpleTestPackageUtility.CreateFullPackageAsync(
                        packageDirectory.FullName,
                        identity.Id,
                        identity.Version.ToString());

                    var logger = new TestLogger();

                    var spec = ToolRestoreUtility.GetSpec(
                        Path.Combine(pathContext.SolutionRoot, "tool", "fake.csproj"),
                        "a",
                        VersionRange.Parse("1.0.0"),
                        NuGetFramework.Parse("netcoreapp1.0"),
                        pathContext.UserPackagesFolder,
                        new List <string>()
                    {
                        pathContext.FallbackFolder
                    },
                        new List <PackageSource>()
                    {
                        new PackageSource(pathContext.PackageSource)
                    },
                        projectWideWarningProperties: null);

                    spec.RestoreMetadata.ProjectStyle = ProjectStyle.PackageReference;

                    spec.Dependencies.Add(new LibraryDependency
                    {
                        GeneratePathProperty = true,
                        IncludeType          = LibraryIncludeFlags.All,
                        LibraryRange         = new LibraryRange(identity.Id.ToUpperInvariant(), new VersionRange(identity.Version), LibraryDependencyTarget.Package)
                    });

                    var targetGraphs = new List <RestoreTargetGraph>
                    {
                        OriginalCaseGlobalPackageFolderTests.GetRestoreTargetGraph(pathContext.PackageSource, identity, packagePath, logger)
                    };

                    targetGraphs[0].Graphs.FirstOrDefault().Item.Data.Dependencies = spec.Dependencies;

                    var lockFile = new LockFile
                    {
                        Libraries =
                        {
                            new LockFileLibrary
                            {
                                Name    = identity.Id,
                                Version = identity.Version,
                                Path    = $"{identity.Id.ToLowerInvariant()}/{identity.Version.ToNormalizedString()}",
                                Type    = LibraryType.Package
                            }
                        },
                        Targets =
                        {
                            new LockFileTarget
                            {
                                RuntimeIdentifier = targetGraphs[0].RuntimeIdentifier,
                                TargetFramework   = targetGraphs[0].Framework,
                                Libraries         =
                                {
                                    new LockFileTargetLibrary
                                    {
                                        Name    = identity.Id,
                                        Version = identity.Version
                                    }
                                }
                            }
                        }
                    };

                    var repositories = new List <NuGetv3LocalRepository>
                    {
                        new NuGetv3LocalRepository(pathContext.UserPackagesFolder)
                    };

                    var restoreRequest = new TestRestoreRequest(spec, new[] { new PackageSource(pathContext.PackageSource) }, pathContext.PackagesV2, logger)
                    {
                        ProjectStyle = spec.RestoreMetadata.ProjectStyle
                    };

                    var assetsFilePath = Path.Combine(randomProjectDirectory, "obj", "project.assets.json");

                    // Act
                    var outputFiles = BuildAssetsUtils.GetMSBuildOutputFiles(spec, lockFile, targetGraphs, repositories, restoreRequest, assetsFilePath, true, logger);

                    // Assert
                    var expectedPropertyGroup = outputFiles.FirstOrDefault().Content.Root.Elements().LastOrDefault();

                    Assert.NotNull(expectedPropertyGroup);

                    Assert.Equal(" '$(ExcludeRestorePackageImports)' != 'true' ", expectedPropertyGroup.Attribute("Condition")?.Value);

                    var expectedProperty = expectedPropertyGroup.Elements().FirstOrDefault();

                    Assert.Equal($"Pkg{identity.Id.Replace(".", "_")}", expectedProperty.Name.LocalName);

                    Assert.Equal($" '$({expectedProperty.Name.LocalName})' == '' ", expectedProperty.Attribute("Condition")?.Value);

                    Assert.Equal(packageDirectory.FullName, expectedProperty?.Value, ignoreCase: true);
                }
        }
예제 #24
0
        public async Task PackageUpdateResource_GetErrorFromCreateKeyPushingAsync()
        {
            // Arrange
            using (var workingDir = TestDirectory.Create())
            {
                var source       = "https://www.myget.org/api/v2";
                var symbolSource = "https://nuget.smbsrc.net/";
                HttpRequestMessage sourceRequest = null;
                HttpRequestMessage symbolRequest = null;
                var apiKey = "serverapikey";

                var packageInfo = await SimpleTestPackageUtility.CreateFullPackageAsync(workingDir, "test", "1.0.0");

                var symbolPackageInfo =
                    await SimpleTestPackageUtility.CreateSymbolPackageAsync(workingDir, "test", "1.0.0");

                var responses = new Dictionary <string, Func <HttpRequestMessage, Task <HttpResponseMessage> > >
                {
                    {
                        "https://www.myget.org/api/v2/", request =>
                        {
                            sourceRequest = request;
                            return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)));
                        }
                    },
                    {
                        "https://nuget.smbsrc.net/api/v2/package/", request =>
                        {
                            symbolRequest = request;
                            return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)));
                        }
                    },
                    {
                        "https://www.nuget.org/api/v2/package/create-verification-key/test/1.0.0",
                        request =>
                        {
                            return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.InternalServerError)));
                        }
                    }
                };

                var repo     = StaticHttpHandler.CreateSource(source, Repository.Provider.GetCoreV3(), responses);
                var resource = await repo.GetResourceAsync <PackageUpdateResource>();

                UserAgent.SetUserAgentString(new UserAgentStringBuilder("test client"));

                // Act
                var ex = await Assert.ThrowsAsync <HttpRequestException>(
                    async() => await resource.Push(
                        packagePaths: new[] { packageInfo.FullName },
                        symbolSource: symbolSource,
                        timeoutInSecond: 5,
                        disableBuffering: false,
                        getApiKey: _ => apiKey,
                        getSymbolApiKey: _ => apiKey,
                        noServiceEndpoint: false,
                        skipDuplicate: false,
                        symbolPackageUpdateResource: null,
                        log: NullLogger.Instance));

                // Assert
                Assert.True(ex.Message.Contains("Response status code does not indicate success: 500 (Internal Server Error)"));
            }
        }
예제 #25
0
        public async Task PackageUpdateResource_PackageNotExistOnNuGetOrgPushingAsync()
        {
            // Arrange
            using (var workingDir = TestDirectory.Create())
            {
                var source = "https://nuget.smbsrc.net/";

                HttpRequestMessage symbolRequest = null;
                var apiKey = "serverapikey";

                var packageInfo = await SimpleTestPackageUtility.CreateFullPackageAsync(workingDir, "test", "1.0.0");

                var symbolPackageInfo = await SimpleTestPackageUtility.CreateSymbolPackageAsync(workingDir, "test", "1.0.0");

                var responses = new Dictionary <string, Func <HttpRequestMessage, Task <HttpResponseMessage> > >
                {
                    {
                        "https://nuget.smbsrc.net/api/v2/package/",
                        request =>
                        {
                            symbolRequest = request;
                            return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)));
                        }
                    },
                    {
                        "https://www.nuget.org/api/v2/package/create-verification-key/test/1.0.0",
                        request =>
                        {
                            var content  = new StringContent(string.Format(JsonData.TempApiKeyJsonData, "tempkey"), Encoding.UTF8, "application/json");
                            var response = new HttpResponseMessage(HttpStatusCode.OK)
                            {
                                Content = content
                            };
                            return(Task.FromResult(response));
                        }
                    }
                };

                var repo     = StaticHttpHandler.CreateSource(source, Repository.Provider.GetCoreV3(), responses);
                var resource = await repo.GetResourceAsync <PackageUpdateResource>();

                UserAgent.SetUserAgentString(new UserAgentStringBuilder("test client"));

                // Act
                await resource.Push(
                    packagePaths : new[] { packageInfo.FullName },
                    symbolSource : null,
                    timeoutInSecond : 5,
                    disableBuffering : false,
                    getApiKey : _ => apiKey,
                    getSymbolApiKey : _ => null,
                    noServiceEndpoint : false,
                    skipDuplicate : false,
                    symbolPackageUpdateResource : null,
                    log : NullLogger.Instance);

                // Assert
                IEnumerable <string> apiValues;
                IEnumerable <string> symbolClientVersionValues;
                symbolRequest.Headers.TryGetValues(ApiKeyHeader, out apiValues);
                symbolRequest.Headers.TryGetValues(NuGetClientVersionHeader, out symbolClientVersionValues);

                Assert.Equal("tempkey", apiValues.First());
                Assert.NotNull(symbolClientVersionValues.First());
            }
        }
예제 #26
0
            internal static async Task <RemoteV2FindPackageByIdResourceTest> CreateAsync()
            {
                var serviceAddress  = ProtocolUtility.CreateServiceAddress();
                var packageIdentity = new PackageIdentity(
                    id: "xunit",
                    version: NuGetVersion.Parse("2.2.0-beta1-build3239"));
                var testDirectory = TestDirectory.Create();
                var packageSource = new PackageSource(serviceAddress);
                var package       = await SimpleTestPackageUtility.CreateFullPackageAsync(
                    testDirectory.Path,
                    packageIdentity.Id,
                    packageIdentity.Version.ToNormalizedString());

                var packageBytes = File.ReadAllBytes(package.FullName);

                var responses = new Dictionary <string, Func <HttpRequestMessage, Task <HttpResponseMessage> > >
                {
                    {
                        serviceAddress,
                        request => Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
                        {
                            Content = new TestContent(string.Empty)
                        })
                    },
                    {
                        serviceAddress + $"FindPackagesById()?id='{packageIdentity.Id}'&semVerLevel=2.0.0",
                        request => Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
                        {
                            Content = new TestContent(
                                ProtocolUtility.GetResource(
                                    "NuGet.Protocol.Tests.compiler.resources.XunitFindPackagesById.xml",
                                    typeof(RemoteV2FindPackageByIdResourceTest)))
                        })
                    },
                    {
                        serviceAddress + $"FindPackagesById()?id='{packageIdentity.Id.ToUpper()}'&semVerLevel=2.0.0",
                        request => Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
                        {
                            Content = new TestContent(
                                ProtocolUtility.GetResource(
                                    "NuGet.Protocol.Tests.compiler.resources.XunitFindPackagesById.xml",
                                    typeof(RemoteV2FindPackageByIdResourceTest)))
                        })
                    },
                    {
                        "https://www.nuget.org/api/v2/package/xunit/2.2.0-beta1-build3239",
                        request => Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
                        {
                            Content = new ByteArrayContent(packageBytes)
                        })
                    },
                    {
                        serviceAddress + $"FindPackagesById()?id='a'&semVerLevel=2.0.0",
                        request => Task.FromResult(new HttpResponseMessage(HttpStatusCode.NoContent))
                    }
                };

                var httpSource = new TestHttpSource(packageSource, responses);
                var resource   = new RemoteV2FindPackageByIdResource(
                    packageSource,
                    httpSource);

                return(new RemoteV2FindPackageByIdResourceTest(
                           resource,
                           packageSource,
                           package,
                           packageIdentity,
                           new SourceCacheContext(),
                           httpSource,
                           testDirectory));
            }
        public async Task PackageUpdateResource_NuGetOrgSourceOnlyPushingAsync()
        {
            // Arrange
            using (var workingDir = TestDirectory.Create())
            {
                var source       = "https://www.nuget.org/api/v2";
                var symbolSource = "https://other.smbsrc.net/";
                HttpRequestMessage sourceRequest = null;
                HttpRequestMessage symbolRequest = null;
                var apiKey = "serverapikey";

                var packageInfo = await SimpleTestPackageUtility.CreateFullPackageAsync(workingDir, "test", "1.0.0");

                var symbolPackageInfo = await SimpleTestPackageUtility.CreateSymbolPackageAsync(workingDir, "test", "1.0.0");

                var responses = new Dictionary <string, Func <HttpRequestMessage, Task <HttpResponseMessage> > >
                {
                    {
                        "https://www.nuget.org/api/v2/",
                        request =>
                        {
                            sourceRequest = request;
                            return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)));
                        }
                    },
                    {
                        "https://other.smbsrc.net/api/v2/package/",
                        request =>
                        {
                            symbolRequest = request;
                            return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)));
                        }
                    },
                };

                var repo     = StaticHttpHandler.CreateSource(source, Repository.Provider.GetCoreV3(), responses);
                var resource = await repo.GetResourceAsync <PackageUpdateResource>();

                UserAgent.SetUserAgentString(new UserAgentStringBuilder("test client"));
                var logger = new TestLogger();
                // Act
                await resource.Push(
                    packagePaths : new[] { packageInfo.FullName },
                    symbolSource : symbolSource,
                    timeoutInSecond : 5,
                    disableBuffering : false,
                    getApiKey : _ => apiKey,
                    getSymbolApiKey : _ => apiKey,
                    noServiceEndpoint : false,
                    skipDuplicate : false,
                    symbolPackageUpdateResource : null,
                    log : logger);

                // Assert
                IEnumerable <string> apiValues;
                IEnumerable <string> symbolClientVersionValues;
                IEnumerable <string> sourceClientVersionValues;
                symbolRequest.Headers.TryGetValues(ApiKeyHeader, out apiValues);
                symbolRequest.Headers.TryGetValues(NuGetClientVersionHeader, out symbolClientVersionValues);
                sourceRequest.Headers.TryGetValues(NuGetClientVersionHeader, out sourceClientVersionValues);

                Assert.Equal("serverapikey", apiValues.First());
                Assert.NotNull(symbolClientVersionValues.First());
                Assert.NotNull(sourceClientVersionValues.First());
                Assert.Equal(0, logger.WarningMessages.Count);
            }
        }
예제 #28
0
            internal static async Task <RemoteV3FindPackageByIdResourceTest> CreateAsync()
            {
                var serviceAddress  = ProtocolUtility.CreateServiceAddress();
                var packageIdentity = new PackageIdentity(
                    id: "xunit",
                    version: NuGetVersion.Parse("2.2.0-beta1-build3239"));
                var testDirectory = TestDirectory.Create();
                var packageSource = new PackageSource(serviceAddress);

                var dependencyInfoResourceProvider = new Mock <INuGetResourceProvider>();
                var dependencyInfoResource         = new Mock <DependencyInfoResource>();
                var remoteSourceDependencyInfo     = new RemoteSourceDependencyInfo(
                    packageIdentity,
                    listed: true,
                    dependencyGroups: Enumerable.Empty <PackageDependencyGroup>(),
                    contentUri: serviceAddress + "api/v2/package/xunit/2.2.0-beta1-build3239");

                dependencyInfoResource.Setup(x => x.ResolvePackages(
                                                 It.Is <string>(id => id == packageIdentity.Id),
                                                 It.IsAny <SourceCacheContext>(),
                                                 It.IsNotNull <ILogger>(),
                                                 It.IsAny <CancellationToken>()))
                .ReturnsAsync(new[] { remoteSourceDependencyInfo });

                dependencyInfoResourceProvider.SetupGet(x => x.Before)
                .Returns(Enumerable.Empty <string>());
                dependencyInfoResourceProvider.SetupGet(x => x.After)
                .Returns(Enumerable.Empty <string>());
                dependencyInfoResourceProvider.SetupGet(x => x.ResourceType)
                .Returns(typeof(DependencyInfoResource));
                dependencyInfoResourceProvider.SetupGet(x => x.Name)
                .Returns("DependencyInfoResourceProvider");
                dependencyInfoResourceProvider.Setup(
                    x => x.TryCreate(It.IsNotIn <SourceRepository>(), It.IsAny <CancellationToken>()))
                .ReturnsAsync(new Tuple <bool, INuGetResource>(true, dependencyInfoResource.Object));

                var sourceRepository = new SourceRepository(
                    packageSource,
                    new[] { dependencyInfoResourceProvider.Object });
                var package = await SimpleTestPackageUtility.CreateFullPackageAsync(
                    testDirectory.Path,
                    packageIdentity.Id,
                    packageIdentity.Version.ToNormalizedString());

                var packageBytes = File.ReadAllBytes(package.FullName);

                var responses = new Dictionary <string, Func <HttpRequestMessage, Task <HttpResponseMessage> > >
                {
                    {
                        serviceAddress,
                        request => Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
                        {
                            Content = new TestContent(string.Empty)
                        })
                    },
                    {
                        serviceAddress + "api/v2/package/xunit/2.2.0-beta1-build3239",
                        request => Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
                        {
                            Content = new ByteArrayContent(packageBytes)
                        })
                    }
                };

                var httpSource = new TestHttpSource(packageSource, responses);
                var resource   = new RemoteV3FindPackageByIdResource(
                    sourceRepository,
                    httpSource);

                return(new RemoteV3FindPackageByIdResourceTest(
                           resource,
                           sourceRepository,
                           package,
                           packageIdentity,
                           new SourceCacheContext(),
                           httpSource,
                           testDirectory));
            }
예제 #29
0
        public async Task RestoreSemVer_RestorePackageWithMetadata_DifferentMetadataDoesNotMatterAsync()
        {
            // Arrange
            var sources = new List <PackageSource>();

            var project1Json = @"
            {
              ""version"": ""1.0.0"",
              ""description"": """",
              ""authors"": [ ""author"" ],
              ""tags"": [ """" ],
              ""projectUrl"": """",
              ""licenseUrl"": """",
              ""frameworks"": {
                ""netstandard1.5"": {
                    ""dependencies"": {
                        ""packageA"": ""1.0.0+1""
                    }
                }
              }
            }";

            using (var workingDir = TestDirectory.Create())
            {
                var packagesDir   = new DirectoryInfo(Path.Combine(workingDir, "globalPackages"));
                var packageSource = new DirectoryInfo(Path.Combine(workingDir, "packageSource"));
                var project1      = new DirectoryInfo(Path.Combine(workingDir, "projects", "project1"));
                packagesDir.Create();
                packageSource.Create();
                project1.Create();
                sources.Add(new PackageSource(packageSource.FullName));

                File.WriteAllText(Path.Combine(project1.FullName, "project.json"), project1Json);

                var specPath1 = Path.Combine(project1.FullName, "project.json");
                var spec1     = JsonPackageSpecReader.GetPackageSpec(project1Json, "project1", specPath1);

                var logger  = new TestLogger();
                var request = new TestRestoreRequest(spec1, sources, packagesDir.FullName, logger)
                {
                    LockFilePath = Path.Combine(project1.FullName, "project.lock.json")
                };

                var packageAContext = new SimpleTestPackageContext("packageA")
                {
                    Version = "1.0.0+B"
                };

                packageAContext.AddFile("lib/netstandard1.5/a.dll");

                await SimpleTestPackageUtility.CreateFullPackageAsync(packageSource.FullName, packageAContext);

                // Act
                var command = new RestoreCommand(request);
                var result  = await command.ExecuteAsync();

                var lockFile = result.LockFile;
                await result.CommitAsync(logger, CancellationToken.None);

                var targetLib = lockFile.GetTarget(NuGetFramework.Parse("netstandard1.5"), null)
                                .Libraries
                                .Single(library => library.Name == "packageA");

                var compile = targetLib.CompileTimeAssemblies.Single();

                // Assert
                Assert.True(result.Success);
                Assert.Equal("lib/netstandard1.5/a.dll", compile.Path);
                Assert.Equal("1.0.0", targetLib.Version.ToNormalizedString());
            }
        }
예제 #30
0
        public async Task RestoreRunner_BasicRestore_VerifyFailureWritesFilesAsync()
        {
            // Arrange
            var sources = new List <PackageSource>();

            var project1Json = @"
            {
              ""version"": ""1.0.0"",
              ""description"": """",
              ""authors"": [ ""author"" ],
              ""tags"": [ """" ],
              ""projectUrl"": """",
              ""licenseUrl"": """",
              ""frameworks"": {
                ""net45"": {
                    ""dependencies"": {
                        ""x"": ""1.0.0""
                    }
                }
              }
            }";

            using (var workingDir = TestDirectory.Create())
            {
                var packagesDir   = new DirectoryInfo(Path.Combine(workingDir, "globalPackages"));
                var packageSource = new DirectoryInfo(Path.Combine(workingDir, "packageSource"));
                var project1      = new DirectoryInfo(Path.Combine(workingDir, "projects", "project1"));
                packagesDir.Create();
                packageSource.Create();
                project1.Create();
                sources.Add(new PackageSource(packageSource.FullName));

                File.WriteAllText(Path.Combine(project1.FullName, "project.json"), project1Json);

                var specPath1 = Path.Combine(project1.FullName, "project.json");
                var spec1     = JsonPackageSpecReader.GetPackageSpec(project1Json, "project1", specPath1);
                spec1 = spec1.EnsureRestoreMetadata();
                spec1.RestoreMetadata.Sources = new List <PackageSource> {
                    new PackageSource(packageSource.FullName)
                };
                spec1.RestoreMetadata.PackagesPath = packagesDir.FullName;
                var dgFile = new DependencyGraphSpec();
                dgFile.AddProject(spec1);
                dgFile.AddRestore("project1");

                var logger   = new TestLogger();
                var lockPath = Path.Combine(project1.FullName, "project.assets.json");

                var sourceRepos = sources.Select(source => Repository.Factory.GetCoreV3(source.Source)).ToList();

                var packageX = new SimpleTestPackageContext()
                {
                    Id      = "x",
                    Version = "1.0.0"
                };

                packageX.AddFile("build/net45/x.targets");

                var packageY = new SimpleTestPackageContext("y");
                packageX.Dependencies.Add(packageY);

                var yPath = await SimpleTestPackageUtility.CreateFullPackageAsync(packageSource.FullName, packageY);

                await SimpleTestPackageUtility.CreateFullPackageAsync(packageSource.FullName, packageX);

                // y does not exist
                yPath.Delete();

                var providerCache = new RestoreCommandProvidersCache();

                using (var cacheContext = new SourceCacheContext())
                {
                    var restoreContext = new RestoreArgs()
                    {
                        CacheContext         = cacheContext,
                        DisableParallel      = true,
                        GlobalPackagesFolder = packagesDir.FullName,
                        Sources = new List <string>()
                        {
                            packageSource.FullName
                        },
                        Log = logger,
                        CachingSourceProvider     = new CachingSourceProvider(new TestPackageSourceProvider(sources)),
                        PreLoadedRequestProviders = new List <IPreLoadedRestoreRequestProvider>()
                        {
                            new DependencyGraphSpecRequestProvider(providerCache, dgFile)
                        }
                    };

                    var targetsPath = Path.Combine(project1.FullName, "project1.csproj.nuget.g.targets");
                    var propsPath   = Path.Combine(project1.FullName, "project1.nuget.props");

                    // Act
                    var summaries = await RestoreRunner.RunAsync(restoreContext);

                    var summary = summaries.Single();

                    var targets = TargetsUtility.GetMSBuildPackageImports(targetsPath);

                    // Assert
                    Assert.False(summary.Success);
                    Assert.True(File.Exists(lockPath), lockPath);
                    Assert.True(File.Exists(targetsPath));
                    Assert.False(File.Exists(propsPath));
                    Assert.Equal(1, targets.Count);
                }
            }
        }