public void RestoreRetry_PackagesConfigRetryOnFailingV2Source() { // 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); Util.CreateFile( workingDirectory, "packages.config", @"<packages> <package id=""testPackage1"" version=""1.1.0"" /> </packages>"); // 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); if (path == "/nuget/$metadata") { return(new Action <HttpListenerResponse>(response => { MockServer.SetResponseContent(response, Util.GetMockServerResource()); })); } else if (path == "/package/testPackage1/1.1.0") { // Fail on the first two requests for this download if (urlHits < 3) { return(new Action <HttpListenerResponse>(response => { response.StatusCode = 503; })); } 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/Packages(Id='testPackage1',Version='1.1.0')") { return(new Action <HttpListenerResponse>(response => { response.ContentType = "application/atom+xml;type=entry;charset=utf-8"; var odata = server.ToOData(package); MockServer.SetResponseContent(response, odata); })); } 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 packages.config -SolutionDirectory . -Source {0}nuget -NoCache", 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, "packages/testpackage1.1.1.0/testpackage1.1.1.0.nupkg"))); } } }
/// <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); }