public void ListCommand_OnlyShowListed() { var nugetexe = Util.GetNuGetExePath(); using (var packageDirectory = TestDirectory.Create()) using (var randomTestFolder = TestDirectory.Create()) { // Arrange var packageFileName1 = Util.CreateTestPackage("testPackage1", "1.1.0", packageDirectory); var packageFileName2 = Util.CreateTestPackage("testPackage2", "2.1", packageDirectory); var package1 = new ZipPackage(packageFileName1); var package2 = new ZipPackage(packageFileName2); package1.Published = new DateTimeOffset?(new DateTime(1800, 1, 1)); package1.Listed = false; using (var server = new MockServer()) { string searchRequest = string.Empty; server.Get.Add("/nuget/$metadata", r => Util.GetMockServerResource()); server.Get.Add("/nuget/Search()", r => new Action <HttpListenerResponse>(response => { searchRequest = r.Url.ToString(); response.ContentType = "application/atom+xml;type=feed;charset=utf-8"; string feed = server.ToODataFeed(new[] { package1, package2 }, "Search"); MockServer.SetResponseContent(response, feed); })); server.Get.Add("/nuget", r => "OK"); server.Start(); // Act var args = "list test -Source " + server.Uri + "nuget"; var r1 = CommandRunner.Run( nugetexe, randomTestFolder, args, waitForExit: true); server.Stop(); // Assert Assert.True(r1.Item1 == 0, r1.Item2 + " " + r1.Item3); // verify that only testPackage2 is listed since the package testPackage1 // is not listed. var expectedOutput = "testPackage2 2.1.0" + Environment.NewLine; Assert.Equal(expectedOutput, r1.Item2); Assert.Contains("$filter=IsLatestVersion", searchRequest); Assert.Contains("searchTerm='test", searchRequest); Assert.Contains("includePrerelease=false", searchRequest); // verify that nuget doesn't include "includeDelisted" in its request Assert.DoesNotContain("includeDelisted", searchRequest); } } }
public void ListCommand_AllVersionsPrerelease() { var nugetexe = Util.GetNuGetExePath(); using (var pathContext = new SimpleTestPathContext()) { // Arrange var packageDirectory = Path.Combine(pathContext.WorkingDirectory, "packageFolder"); Directory.CreateDirectory(packageDirectory); var solutionFolder = Path.Combine(pathContext.SolutionRoot); var packageFileName1 = Util.CreateTestPackage("testPackage1", "1.1.0", packageDirectory); var packageFileName2 = Util.CreateTestPackage("testPackage2", "2.1", packageDirectory); var package1 = new ZipPackage(packageFileName1); var package2 = new ZipPackage(packageFileName2); using (var server = new MockServer()) { string searchRequest = string.Empty; server.Get.Add("/nuget/$metadata", r => Util.GetMockServerResource()); server.Get.Add("/nuget/Search()", r => new Action <HttpListenerResponse>(response => { searchRequest = r.Url.ToString(); response.ContentType = "application/atom+xml;type=feed;charset=utf-8"; string feed = server.ToODataFeed(new[] { package1, package2 }, "Search"); MockServer.SetResponseContent(response, feed); })); server.Get.Add("/nuget", r => "OK"); server.Start(); // Act var args = "list test -AllVersions -Prerelease -Source " + server.Uri + "nuget"; var r1 = CommandRunner.Run( nugetexe, solutionFolder, args, waitForExit: true); server.Stop(); // Assert Assert.Equal(0, r1.Item1); // verify that the output is detailed var expectedOutput = "testPackage1 1.1.0" + Environment.NewLine + "testPackage2 2.1.0" + Environment.NewLine; r1.Item2.Should().Be(expectedOutput); Assert.DoesNotContain("$filter", searchRequest); Assert.Contains("searchTerm='test", searchRequest); Assert.Contains("includePrerelease=true", searchRequest); } } }
public void ListCommand_Prerelease() { Util.ClearWebCache(); var nugetexe = Util.GetNuGetExePath(); using (var packageDirectory = TestFileSystemUtility.CreateRandomTestFolder()) using (var randomTestFolder = TestFileSystemUtility.CreateRandomTestFolder()) { // Arrange var packageFileName1 = Util.CreateTestPackage("testPackage1", "1.1.0", packageDirectory); var packageFileName2 = Util.CreateTestPackage("testPackage2", "2.1", packageDirectory); var package1 = new ZipPackage(packageFileName1); var package2 = new ZipPackage(packageFileName2); using (var server = new MockServer()) { string searchRequest = string.Empty; server.Get.Add("/nuget/$metadata", r => MockServerResource.NuGetV2APIMetadata); server.Get.Add("/nuget/Search()", r => new Action <HttpListenerResponse>(response => { searchRequest = r.Url.ToString(); response.ContentType = "application/atom+xml;type=feed;charset=utf-8"; string feed = server.ToODataFeed(new[] { package1, package2 }, "Search"); MockServer.SetResponseContent(response, feed); })); server.Get.Add("/nuget", r => "OK"); server.Start(); // Act var args = "list test -Prerelease -Source " + server.Uri + "nuget"; var r1 = CommandRunner.Run( nugetexe, randomTestFolder, args, waitForExit: true); server.Stop(); // Assert Assert.Equal(0, r1.Item1); // verify that the output is detailed var expectedOutput = "testPackage1 1.1.0" + Environment.NewLine + "testPackage2 2.1" + Environment.NewLine; Assert.Equal(expectedOutput, r1.Item2); Assert.Contains("$filter=IsAbsoluteLatestVersion", searchRequest); Assert.Contains("searchTerm='test", searchRequest); Assert.Contains("includePrerelease=true", searchRequest); } } }
public void ListCommand_VerboseOutput() { var nugetexe = Util.GetNuGetExePath(); using (var packageDirectory = TestDirectory.Create()) using (var randomTestFolder = TestDirectory.Create()) { // Arrange var packageFileName1 = Util.CreateTestPackage("testPackage1", "1.1.0", packageDirectory); var packageFileName2 = Util.CreateTestPackage("testPackage2", "2.1", packageDirectory); var package1 = new ZipPackage(packageFileName1); var package2 = new ZipPackage(packageFileName2); using (var server = new MockServer()) { string searchRequest = string.Empty; server.Get.Add("/nuget/$metadata", r => Util.GetMockServerResource()); server.Get.Add("/nuget/Search()", r => new Action <HttpListenerResponse>(response => { searchRequest = r.Url.ToString(); response.ContentType = "application/atom+xml;type=feed;charset=utf-8"; string feed = server.ToODataFeed(new[] { package1, package2 }, "Search"); MockServer.SetResponseContent(response, feed); })); server.Get.Add("/nuget", r => "OK"); server.Start(); // Act var args = "list test -Verbosity detailed -Source " + server.Uri + "nuget"; var r1 = CommandRunner.Run( nugetexe, randomTestFolder, args, waitForExit: true); server.Stop(); // Assert Assert.Equal(0, r1.Item1); // verify that the output is detailed Assert.Contains(package1.Description, r1.Item2); Assert.Contains(package2.Description, r1.Item2); Assert.Contains("$filter=IsLatestVersion", searchRequest); Assert.Contains("searchTerm='test", searchRequest); Assert.Contains("includePrerelease=false", searchRequest); } } }
public void RestoreRetry_ProjectJsonRetryOnFailingV2Source() { // Arrange var nugetexe = Util.GetNuGetExePath(); using (var workingDirectory = TestDirectory.Create()) using (var packageDirectory = TestDirectory.Create()) { var packageFileName = Util.CreateTestPackage("testPackage1", "1.1.0", packageDirectory); var package = new ZipPackage(packageFileName); var projectJson = @"{ ""dependencies"": { ""testPackage1"": ""1.1.0"" }, ""frameworks"": { ""net45"": { } } }"; var config = @"<?xml version=""1.0"" encoding=""utf-8""?> <configuration> <config> <add key=""globalPackagesFolder"" value=""globalPackages"" /> </config> </configuration>"; var projectFile = Util.CreateUAPProject(workingDirectory, projectJson, "a", config); // Server setup using (var server = new MockServer()) { var hitsByUrl = new ConcurrentDictionary <string, int>(); server.Get.Add("/", r => { var path = server.GetRequestUrlPathAndQuery(r); // track hits on the url var urlHits = hitsByUrl.AddOrUpdate(path, 1, (s, i) => i + 1); // Fail on the first 2 requests for every url if (urlHits < 3) { return(new Action <HttpListenerResponse>(response => { response.StatusCode = 503; })); } if (path == "/nuget/$metadata") { return(new Action <HttpListenerResponse>(response => { MockServer.SetResponseContent(response, Util.GetMockServerResource()); })); } else if (path == "/package/testPackage1/1.1.0") { return(new Action <HttpListenerResponse>(response => { response.ContentType = "application/zip"; using (var stream = package.GetStream()) { var content = stream.ReadAllBytes(); MockServer.SetResponseContent(response, content); } })); } else if (path == "/nuget/FindPackagesById()?id='testPackage1'") { return(new Action <HttpListenerResponse>(response => { response.ContentType = "application/atom+xml;type=feed;charset=utf-8"; string feed = server.ToODataFeed(new[] { package }, "FindPackagesById"); MockServer.SetResponseContent(response, feed); })); } else if (path == "/nuget") { return(new Action <HttpListenerResponse>(response => { response.StatusCode = 200; })); } throw new Exception("This test needs to be updated to support: " + path); }); server.Start(); // Act var args = string.Format( "restore {0} -SolutionDirectory . -Source {1}nuget -NoCache", projectFile, server.Uri); var timer = new Stopwatch(); timer.Start(); var r1 = CommandRunner.Run( nugetexe, workingDirectory, args, waitForExit: true); timer.Stop(); server.Stop(); // Assert Assert.True(Util.IsSuccess(r1), r1.Item2 + " " + r1.Item3); Assert.True( File.Exists( Path.Combine(workingDirectory, "globalPackages/testpackage1/1.1.0/testpackage1.1.1.0.nupkg"))); Assert.True( File.Exists( Path.Combine(workingDirectory, "globalPackages/testpackage1/1.1.0/testPackage1.1.1.0.nupkg.sha512"))); Assert.True(File.Exists(Path.Combine(workingDirectory, "project.lock.json"))); // Everything should be hit 3 times foreach (var url in hitsByUrl.Keys) { Assert.True(hitsByUrl[url] == 3, url); } } } }
public void ListCommand_WithAuthenticatedSource_AppliesCredentialsFromSettings() { Util.ClearWebCache(); var expectedAuthHeader = "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes("user:password")); var listEndpoint = Guid.NewGuid().ToString() + "/api/v2"; bool serverReceiveProperAuthorizationHeader = false; using (var randomTestFolder = TestDirectory.Create()) { // Arrange var packageFileName1 = Util.CreateTestPackage("testPackage1", "1.1.0", randomTestFolder); var package1 = new ZipPackage(packageFileName1); // Server setup using (var serverV3 = new MockServer()) { var indexJson = Util.CreateIndexJson(); Util.AddFlatContainerResource(indexJson, serverV3); Util.AddLegacyGalleryResource(indexJson, serverV3, listEndpoint); serverV3.Get.Add("/", r => { var h = r.Headers["Authorization"]; if (h == null) { return(new Action <HttpListenerResponse>(response => { response.StatusCode = 401; response.AddHeader("WWW-Authenticate", @"Basic realm=""Test"""); MockServer.SetResponseContent(response, "401 Unauthenticated"); })); } if (expectedAuthHeader != h) { return(HttpStatusCode.Forbidden); } var path = serverV3.GetRequestUrlAbsolutePath(r); if (path == "/index.json") { return(new Action <HttpListenerResponse>(response => { response.StatusCode = 200; response.ContentType = "text/javascript"; MockServer.SetResponseContent(response, indexJson.ToString()); })); } if (path == $"/{listEndpoint}/$metadata") { return(Util.GetMockServerResource()); } if (path == $"/{listEndpoint}/Search()") { return(new Action <HttpListenerResponse>(response => { response.ContentType = "application/atom+xml;type=feed;charset=utf-8"; var feed = serverV3.ToODataFeed(new[] { package1 }, "Search"); MockServer.SetResponseContent(response, feed); })); } serverReceiveProperAuthorizationHeader = true; return("OK"); }); var config = $@"<?xml version='1.0' encoding='utf-8'?> <configuration> <packageSources> <add key='vsts' value='{serverV3.Uri}index.json' protocolVersion='3' /> </packageSources> <packageSourceCredentials> <vsts> <add key='Username' value='user' /> <add key='ClearTextPassword' value='password' /> </vsts> </packageSourceCredentials> </configuration>"; var configFileName = Path.Combine(randomTestFolder, "nuget.config"); File.WriteAllText(configFileName, config); serverV3.Start(); // Act var result = CommandRunner.Run( Util.GetNuGetExePath(), Directory.GetCurrentDirectory(), $"list test -source {serverV3.Uri}index.json -configfile {configFileName} -verbosity detailed -noninteractive", waitForExit: true); serverV3.Stop(); // Assert Assert.True(0 == result.Item1, $"{result.Item2} {result.Item3}"); Assert.True(serverReceiveProperAuthorizationHeader); Assert.Contains($"GET {serverV3.Uri}{listEndpoint}/Search()", result.Item2); // verify that only package id & version is displayed Assert.Matches(@"(?m)testPackage1\s+1\.1\.0", result.Item2); } } }
public void ListCommand_SimpleV3() { Util.ClearWebCache(); var nugetexe = Util.GetNuGetExePath(); using (var packageDirectory = TestDirectory.Create()) { // Arrange var packageFileName1 = Util.CreateTestPackage("testPackage1", "1.1.0", packageDirectory); var packageFileName2 = Util.CreateTestPackage("testPackage2", "2.1", packageDirectory); var package1 = new ZipPackage(packageFileName1); var package2 = new ZipPackage(packageFileName2); // Server setup var indexJson = Util.CreateIndexJson(); using (var serverV3 = new MockServer()) { serverV3.Get.Add("/", r => { var path = serverV3.GetRequestUrlAbsolutePath(r); if (path == "/index.json") { return(new Action <HttpListenerResponse>(response => { response.StatusCode = 200; response.ContentType = "text/javascript"; MockServer.SetResponseContent(response, indexJson.ToString()); })); } throw new Exception("This test needs to be updated to support: " + path); }); using (var serverV2 = new MockServer()) { Util.AddFlatContainerResource(indexJson, serverV3); Util.AddLegacyGalleryResource(indexJson, serverV2); string searchRequest = string.Empty; serverV2.Get.Add("/", r => { var path = serverV2.GetRequestUrlAbsolutePath(r); if (path == "/") { return("OK"); } if (path == "/$metadata") { return(Util.GetMockServerResource()); } if (path == "/Search()") { return(new Action <HttpListenerResponse>(response => { searchRequest = r.Url.ToString(); response.ContentType = "application/atom+xml;type=feed;charset=utf-8"; string feed = serverV2.ToODataFeed(new[] { package1, package2 }, "Search"); MockServer.SetResponseContent(response, feed); })); } throw new Exception("This test needs to be updated to support: " + path); }); serverV3.Start(); serverV2.Start(); // Act var args = "list test -Source " + serverV3.Uri + "index.json"; var result = CommandRunner.Run( nugetexe, Directory.GetCurrentDirectory(), args, waitForExit: true); serverV2.Stop(); serverV3.Stop(); // Assert Assert.True(result.Item1 == 0, result.Item2 + " " + result.Item3); // verify that only package id & version is displayed var expectedOutput = "testPackage1 1.1.0" + Environment.NewLine + "testPackage2 2.1.0" + Environment.NewLine; Assert.Equal(expectedOutput, result.Item2); Assert.Contains("$filter=IsLatestVersion", searchRequest); Assert.Contains("searchTerm='test", searchRequest); Assert.Contains("includePrerelease=false", searchRequest); } } } }
/// <summary> /// Creates a mock server that contains the specified list of packages /// </summary> public static MockServer CreateMockServer(IList <IPackage> packages) { var server = new MockServer(); server.Get.Add("/nuget/$metadata", r => Util.GetMockServerResource()); server.Get.Add("/nuget/FindPackagesById()", r => new Action <HttpListenerResponse>(response => { response.ContentType = "application/atom+xml;type=feed;charset=utf-8"; string feed = server.ToODataFeed(packages, "FindPackagesById"); MockServer.SetResponseContent(response, feed); })); foreach (var package in packages) { var url = string.Format( CultureInfo.InvariantCulture, "/nuget/Packages(Id='{0}',Version='{1}')", package.Id, package.Version); server.Get.Add(url, r => new Action <HttpListenerResponse>(response => { response.ContentType = "application/atom+xml;type=entry;charset=utf-8"; var p1 = server.ToOData(package); MockServer.SetResponseContent(response, p1); })); // download url url = string.Format( CultureInfo.InvariantCulture, "/package/{0}/{1}", package.Id, package.Version); server.Get.Add(url, r => new Action <HttpListenerResponse>(response => { response.ContentType = "application/zip"; using (var stream = package.GetStream()) { var content = stream.ReadAllBytes(); MockServer.SetResponseContent(response, content); } })); } // fall through to "package not found" server.Get.Add("/nuget/Packages(Id='", r => new Action <HttpListenerResponse>(response => { response.StatusCode = 404; MockServer.SetResponseContent(response, @"<?xml version=""1.0"" encoding=""utf-8""?> <m:error xmlns:m=""http://schemas.microsoft.com/ado/2007/08/dataservices/metadata""> <m:code /> <m:message xml:lang=""en-US"">Resource not found for the segment 'Packages'.</m:message> </m:error>"); })); server.Get.Add("/nuget", r => new Action <HttpListenerResponse>(response => { response.StatusCode = 404; })); return(server); }
public void ListCommand_WithAuthenticatedSource_AppliesCredentialsFromSettings() { var expectedAuthHeader = "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes("user:password")); var listEndpoint = Guid.NewGuid().ToString() + "/api/v2"; bool serverReceiveProperAuthorizationHeader = false; using (var pathContext = new SimpleTestPathContext()) { // Arrange var repo = Path.Combine(pathContext.WorkingDirectory, "repo"); var packageFileName1 = Util.CreateTestPackage("testPackage1", "1.1.0", repo); var package1 = new ZipPackage(packageFileName1); // Server setup using (var serverV3 = new MockServer()) { var indexJson = Util.CreateIndexJson(); Util.AddFlatContainerResource(indexJson, serverV3); Util.AddLegacyGalleryResource(indexJson, serverV3, listEndpoint); serverV3.Get.Add("/", r => { var h = r.Headers["Authorization"]; if (h == null) { return(new Action <HttpListenerResponse>(response => { response.StatusCode = 401; response.AddHeader("WWW-Authenticate", @"Basic realm=""Test"""); MockServer.SetResponseContent(response, "401 Unauthenticated"); })); } if (expectedAuthHeader != h) { return(HttpStatusCode.Forbidden); } var path = serverV3.GetRequestUrlAbsolutePath(r); if (path == "/index.json") { return(new Action <HttpListenerResponse>(response => { response.StatusCode = 200; response.ContentType = "text/javascript"; MockServer.SetResponseContent(response, indexJson.ToString()); })); } if (path == $"/{listEndpoint}/$metadata") { return(Util.GetMockServerResource()); } if (path == $"/{listEndpoint}/Search()") { return(new Action <HttpListenerResponse>(response => { response.ContentType = "application/atom+xml;type=feed;charset=utf-8"; var feed = serverV3.ToODataFeed(new[] { package1 }, "Search"); MockServer.SetResponseContent(response, feed); })); } serverReceiveProperAuthorizationHeader = true; return("OK"); }); // Add source into NuGet.Config file var settings = pathContext.Settings; SimpleTestSettingsContext.RemoveSource(settings.XML, "source"); var source = serverV3.Uri + "index.json"; var packageSourcesSection = SimpleTestSettingsContext.GetOrAddSection(settings.XML, "packageSources"); SimpleTestSettingsContext.AddEntry(packageSourcesSection, "vsts", source, additionalAtrributeName: "protocolVersion", additionalAttributeValue: "3"); //var packageSourceCredentialsSection = SimpleTestSettingsContext.GetOrAddSection(settings.XML, "packageSourceCredentials"); SimpleTestSettingsContext.AddPackageSourceCredentialsSection(settings.XML, "vsts", "user", "password", clearTextPassword: true); settings.Save(); serverV3.Start(); // Act var result = CommandRunner.Run( Util.GetNuGetExePath(), pathContext.SolutionRoot, $"list test -source {serverV3.Uri}index.json -configfile {pathContext.NuGetConfig} -verbosity detailed -noninteractive", waitForExit: true); serverV3.Stop(); // Assert Assert.True(0 == result.Item1, $"{result.Item2} {result.Item3}"); Assert.True(serverReceiveProperAuthorizationHeader); Assert.Contains($"GET {serverV3.Uri}{listEndpoint}/Search()", result.Item2); // verify that only package id & version is displayed Assert.Matches(@"(?m)testPackage1\s+1\.1\.0", result.Item2); } } }