Ejemplo n.º 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")));
                    }
                }
        }
Ejemplo n.º 2
0
        /// <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);
        }