protected ValidationContext CreateValidationContext(string packageResource = null)
            {
                // Add the package
                if (packageResource != null)
                {
                    var packageId      = PackageIdentity.Id.ToLowerInvariant();
                    var packageVersion = PackageIdentity.Version.ToNormalizedString().ToLowerInvariant();
                    var relativeUrl    = $"/packages/{packageId}/{packageVersion}/{packageId}.{packageVersion}.nupkg";
                    var bytes          = File.ReadAllBytes(packageResource);

                    _mockServer.SetAction(
                        relativeUrl,
                        request => Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
                    {
                        Content = new ByteArrayContent(bytes)
                    }));
                }

                var httpClient = new CollectorHttpClient(_mockServer);

                // Mock V2 feed response for the package's Created/LastEdited timestamps. These timestamps must match
                // the mocked catalog entry's timestamps.
                var timestamp = PackageTimestampMetadata.CreateForExistingPackage(created: PackageCreationTime, lastEdited: PackageCreationTime);
                var timestampMetadataResource = new Mock <IPackageTimestampMetadataResource>();

                timestampMetadataResource.Setup(t => t.GetAsync(It.IsAny <ValidationContext>()))
                .ReturnsAsync(timestamp);

                return(ValidationContextStub.Create(
                           PackageIdentity,
                           _catalogEntries,
                           client: httpClient,
                           timestampMetadataResource: timestampMetadataResource.Object));
            }
        public async Task FromCatalogEntry_HandlesDeleted_NotNull()
        {
            // Arrange
            var catalogStorage = Catalogs.CreateTestCatalogWithThreePackagesAndDelete();
            var client         = await CreateDummyClient(catalogStorage);

            var expectedTimestamp = DateTime.Parse("2015-01-01T01:01:01.0748028");

            var uri = new Uri(catalogStorage.BaseAddress, "data/2015.10.13.06.40.07/otherpackage.1.0.0.json");
            var catalogIndexEntry = new CatalogIndexEntry(
                uri,
                CatalogConstants.NuGetPackageDelete,
                "afc8c1f4-486e-4142-b3ec-cf5841eb8883",
                DateTime.ParseExact(
                    "2015-10-13T06:40:07.7850657Z",
                    CatalogConstants.CommitTimeStampFormat,
                    DateTimeFormatInfo.CurrentInfo,
                    DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal),
                new PackageIdentity("OtherPackage", new NuGetVersion("1.0.0")));

            // Act
            var entry = await PackageTimestampMetadata.FromCatalogEntry(client, catalogIndexEntry);

            // Assert
            Assert.False(entry.Exists);
            Assert.Null(entry.Created);
            Assert.Null(entry.LastEdited);
            Assert.Equal(expectedTimestamp.Ticks, entry.Deleted.Value.Ticks);
            Assert.Equal(expectedTimestamp.Ticks, entry.Last.Value.Ticks);
        }
Exemplo n.º 3
0
            protected ValidationContext CreateValidationContext(string packageResource = null)
            {
                // Add the package
                if (packageResource != null)
                {
                    var resourceStream = File.OpenRead(packageResource);

                    _mockServer.SetAction(
                        $"/packages/testpackage/1.0.0/testpackage.1.0.0.nupkg",
                        request => Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
                    {
                        Content = new StreamContent(resourceStream)
                    }));
                }

                var httpClient = new CollectorHttpClient(_mockServer);

                // Mock V2 feed response for the package's Created/LastEdited timestamps. These timestamps must match
                // the mocked catalog entry's timestamps.
                var timestamp = PackageTimestampMetadata.CreateForPackageExistingOnFeed(created: PackageCreationTime, lastEdited: PackageCreationTime);
                var timestampMetadataResource = new Mock <IPackageTimestampMetadataResource>();

                timestampMetadataResource.Setup(t => t.GetAsync(It.IsAny <ValidationContext>()))
                .ReturnsAsync(timestamp);

                return(ValidationContextStub.Create(
                           PackageIdentity,
                           _catalogEntries,
                           client: httpClient,
                           timestampMetadataResource: timestampMetadataResource.Object));
            }
        public async Task FromCatalogEntry_HandlesCreatedLastEdited()
        {
            // Arrange
            var catalogStorage = Catalogs.CreateTestCatalogWithThreePackagesAndDelete();
            var client         = await CreateDummyClient(catalogStorage);

            var expectedTimestamp = DateTime.Parse("2015-01-01T00:00:00");

            var uris = new List <Uri>
            {
                new Uri(catalogStorage.BaseAddress, "data/2015.10.12.10.08.54/listedpackage.1.0.0.json"),
                new Uri(catalogStorage.BaseAddress, "data/2015.10.12.10.08.54/unlistedpackage.1.0.0.json"),
                new Uri(catalogStorage.BaseAddress, "data/2015.10.12.10.08.55/listedpackage.1.0.1.json")
            };

            // Act
            var entries = await Task.WhenAll(uris.Select(uri => PackageTimestampMetadata.FromCatalogEntry(client, new CatalogIndexEntry(uri, null, null, DateTime.MinValue, null, null))));

            // Assert
            foreach (var entry in entries)
            {
                Assert.True(entry.Exists);
                Assert.Equal(expectedTimestamp.Ticks, entry.Created.Value.Ticks);
                Assert.Equal(expectedTimestamp.Ticks, entry.LastEdited.Value.Ticks);
                Assert.Null(entry.Deleted);
                Assert.Equal(expectedTimestamp.Ticks, entry.Last.Value.Ticks);
            }
        }
        public async Task FromCatalogEntry_HandlesCreatedLastEdited()
        {
            // Arrange
            var catalogStorage = Catalogs.CreateTestCatalogWithThreePackagesAndDelete();
            var client         = await CreateDummyClient(catalogStorage);

            var expectedTimestamp = DateTime.Parse("2015-01-01T00:00:00");
            var commitTimeStamp1  = DateTime.ParseExact(
                "2015-10-12T10:08:54.1506742Z",
                CatalogConstants.CommitTimeStampFormat,
                DateTimeFormatInfo.CurrentInfo,
                DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal);
            var commitTimeStamp2 = DateTime.ParseExact(
                "2015-10-12T10:08:55.3335317Z",
                CatalogConstants.CommitTimeStampFormat,
                DateTimeFormatInfo.CurrentInfo,
                DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal);

            var tasks = new Task <PackageTimestampMetadata>[]
            {
                PackageTimestampMetadata.FromCatalogEntry(
                    client,
                    new CatalogIndexEntry(
                        new Uri(catalogStorage.BaseAddress, "data/2015.10.12.10.08.54/listedpackage.1.0.0.json"),
                        CatalogConstants.NuGetPackageDetails,
                        "9a37734f-1960-4c07-8934-c8bc797e35c1",
                        commitTimeStamp1,
                        new PackageIdentity("ListedPackage", new NuGetVersion("1.0.0")))),
                PackageTimestampMetadata.FromCatalogEntry(
                    client,
                    new CatalogIndexEntry(
                        new Uri(catalogStorage.BaseAddress, "data/2015.10.12.10.08.54/unlistedpackage.1.0.0.json"),
                        CatalogConstants.NuGetPackageDetails,
                        "9a37734f-1960-4c07-8934-c8bc797e35c1",
                        commitTimeStamp1,
                        new PackageIdentity("UnlistedPackage", new NuGetVersion("1.0.0")))),
                PackageTimestampMetadata.FromCatalogEntry(
                    client,
                    new CatalogIndexEntry(
                        new Uri(catalogStorage.BaseAddress, "data/2015.10.12.10.08.55/listedpackage.1.0.1.json"),
                        CatalogConstants.NuGetPackageDetails,
                        "8a9e7694-73d4-4775-9b7a-20aa59b9773e",
                        commitTimeStamp2,
                        new PackageIdentity("ListedPackage", new NuGetVersion("1.0.1"))))
            };

            // Act
            var entries = await Task.WhenAll(tasks);

            // Assert
            foreach (var entry in entries)
            {
                Assert.True(entry.Exists);
                Assert.Equal(expectedTimestamp.Ticks, entry.Created.Value.Ticks);
                Assert.Equal(expectedTimestamp.Ticks, entry.LastEdited.Value.Ticks);
                Assert.Null(entry.Deleted);
                Assert.Equal(expectedTimestamp.Ticks, entry.Last.Value.Ticks);
            }
        }
        public async Task GetTimestampMetadataV2Async_ReturnsCorrectValue()
        {
            var timestampMetadataResourceV2 = new Mock <IPackageTimestampMetadataResource>();
            var timestampMetadata           = new PackageTimestampMetadata();

            var context = CreateContext(timestampMetadataResource: timestampMetadataResourceV2.Object);

            timestampMetadataResourceV2.Setup(x => x.GetAsync(It.Is <ValidationContext>(vc => vc == context)))
            .ReturnsAsync(timestampMetadata);

            var actualResult = await context.GetTimestampMetadataV2Async();

            Assert.Same(timestampMetadata, actualResult);
        }
        public void GetTimestampMetadataV2Async_ReturnsMemoizedTimestampMetadataV2Task()
        {
            var timestampMetadataResourceV2 = new Mock <IPackageTimestampMetadataResource>();
            var timestampMetadata           = new PackageTimestampMetadata();

            var context = CreateContext(timestampMetadataResource: timestampMetadataResourceV2.Object);

            timestampMetadataResourceV2.Setup(x => x.GetAsync(It.Is <ValidationContext>(vc => vc == context)))
            .ReturnsAsync(timestampMetadata);

            var task1 = context.GetTimestampMetadataV2Async();
            var task2 = context.GetTimestampMetadataV2Async();

            Assert.Same(task1, task2);
        }
Exemplo n.º 8
0
        private async Task <bool> IsStatusOutdatedAsync(
            PackageStatusOutdatedCheck check, CancellationToken cancellationToken)
        {
            var status = await _statusService.GetAsync(check.Identity, cancellationToken);

            var catalogEntries = status?.ValidationResult?.CatalogEntries;

            if (catalogEntries == null || !catalogEntries.Any())
            {
                return(true);
            }

            var latestCatalogEntryTimestampMetadata = await PackageTimestampMetadata.FromCatalogEntries(_client, catalogEntries);

            return(check.Timestamp > latestCatalogEntryTimestampMetadata.Last);
        }
Exemplo n.º 9
0
        static TestableValidator()
        {
            var sourceRepository = new Mock <SourceRepository>();
            var metadataResource = new Mock <IPackageTimestampMetadataResource>();

            metadataResource.Setup(x => x.GetAsync(It.IsAny <ValidationContext>()))
            .ReturnsAsync(PackageTimestampMetadata.CreateForExistingPackage(DateTime.Now, DateTime.Now));

            sourceRepository.Setup(x => x.GetResource <IPackageTimestampMetadataResource>())
            .Returns(metadataResource.Object);

            var feedToSource = new Mock <IDictionary <FeedType, SourceRepository> >();

            feedToSource.Setup(x => x[It.IsAny <FeedType>()]).Returns(sourceRepository.Object);

            _validatorConfiguration = new ValidatorConfiguration(packageBaseAddress: "a", requireRepositorySignature: true);
            _logger = Mock.Of <ILogger <Validator> >();
        }
        public void Last_PicksLatest(bool exists, DateTime?created, DateTime?lastEdited, DateTime?deleted)
        {
            // Act
            PackageTimestampMetadata package;

            if (exists)
            {
                package = PackageTimestampMetadata.CreateForExistingPackage(created.Value, lastEdited.Value);
            }
            else
            {
                package = PackageTimestampMetadata.CreateForMissingPackage(deleted);
            }

            // Assert
            Assert.True(created == null || package.Last >= created);
            Assert.True(lastEdited == null || package.Last >= lastEdited);
            Assert.True(deleted == null || package.Last >= deleted);
        }
            public FactsBase()
            {
                var feedToSource      = new Mock <IDictionary <FeedType, SourceRepository> >();
                var timestampResource = new Mock <IPackageTimestampMetadataResource>();
                var logger            = Mock.Of <ILogger <PackageIsRepositorySignedValidator> >();

                _source     = new Mock <SourceRepository>();
                _mockServer = new MockServerHttpClientHandler();

                feedToSource.Setup(x => x[It.IsAny <FeedType>()]).Returns(_source.Object);

                // Mock a catalog entry and leaf for the package we are validating.
                _catalogEntries = new[]
                {
                    new CatalogIndexEntry(
                        new Uri("https://localhost/catalog/leaf.json"),
                        string.Empty,
                        string.Empty,
                        DateTime.UtcNow,
                        PackageId,
                        PackageNuGetVersion)
                };

                AddCatalogLeafToMockServer("/catalog/leaf.json", new CatalogLeaf
                {
                    Created    = PackageCreationTime,
                    LastEdited = PackageCreationTime,
                });

                // Mock V2 feed response for the package's Created/LastEdited timestamps. These timestamps must match
                // the mocked catalog entry's timestamps.
                var timestamp = PackageTimestampMetadata.CreateForPackageExistingOnFeed(created: PackageCreationTime, lastEdited: PackageCreationTime);

                timestampResource.Setup(t => t.GetAsync(It.IsAny <ValidationContext>())).ReturnsAsync(timestamp);
                _source.Setup(s => s.GetResource <IPackageTimestampMetadataResource>()).Returns(timestampResource.Object);

                // Add the package base address resource
                var resource = new PackageBaseAddressResource("https://localhost/packages/");

                _source.Setup(s => s.GetResource <PackageBaseAddressResource>()).Returns(resource);

                _target = new PackageIsRepositorySignedValidator(feedToSource.Object, logger);
            }
        public async Task FromCatalogEntry_HandlesDeleted_NotNull()
        {
            // Arrange
            var catalogStorage = Catalogs.CreateTestCatalogWithThreePackagesAndDelete();
            var client         = await CreateDummyClient(catalogStorage);

            var expectedTimestamp = DateTime.Parse("2015-01-01T01:01:01.0748028");

            var uri = new Uri(catalogStorage.BaseAddress, "data/2015.10.13.06.40.07/otherpackage.1.0.0.json");

            // Act
            var entry = await PackageTimestampMetadata.FromCatalogEntry(client, new CatalogIndexEntry(uri, "nuget:PackageDelete", null, DateTime.MinValue, null, null));

            // Assert
            Assert.False(entry.Exists);
            Assert.Null(entry.Created);
            Assert.Null(entry.LastEdited);
            Assert.Equal(expectedTimestamp.Ticks, entry.Deleted.Value.Ticks);
            Assert.Equal(expectedTimestamp.Ticks, entry.Last.Value.Ticks);
        }
Exemplo n.º 13
0
            protected ValidationContext CreateValidationContext()
            {
                var timestamp = PackageTimestampMetadata.CreateForExistingPackage(created: PackageCreationTime, lastEdited: PackageCreationTime);
                var timestampMetadataResource = new Mock <IPackageTimestampMetadataResource>();

                timestampMetadataResource.Setup(t => t.GetAsync(It.IsAny <ValidationContext>())).ReturnsAsync(timestamp);

                var v2Resource = new Mock <IPackageRegistrationMetadataResource>();

                v2Resource
                .Setup(x => x.GetIndexAsync(
                           It.IsAny <PackageIdentity>(),
                           It.IsAny <NuGet.Common.ILogger>(),
                           It.IsAny <CancellationToken>()))
                .ReturnsAsync(() => DatabaseIndex);

                return(ValidationContextStub.Create(
                           PackageIdentity,
                           CatalogEntries,
                           clientHandler: MockServer,
                           timestampMetadataResource: timestampMetadataResource.Object,
                           v2Resource: v2Resource.Object));
            }
        private static ValidationContext CreateContext(CollectorHttpClient client, DateTime commitTimeStamp)
        {
            var catalogEntries = new[]
            {
                new CatalogIndexEntry(
                    _packageDetailsUri,
                    CatalogConstants.NuGetPackageDetails,
                    Guid.NewGuid().ToString(),
                    commitTimeStamp,
                    _packageIdentity)
            };

            var metadataResource = new Mock <IPackageTimestampMetadataResource>();

            metadataResource.Setup(x => x.GetAsync(It.IsAny <ValidationContext>()))
            .ReturnsAsync(PackageTimestampMetadata.CreateForPackageExistingOnFeed(commitTimeStamp, commitTimeStamp));

            return(ValidationContextStub.Create(
                       _packageIdentity,
                       catalogEntries,
                       client: client,
                       timestampMetadataResource: metadataResource.Object));
        }