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); }
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); }
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); }
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); }
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)); }