Example #1
0
        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")));
                    }
                }
        }
Example #2
0
        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);
                        }
                    }
                }
        }