Exemplo n.º 1
0
        private async Task RunPackageValidatorAsync(
            PackageValidatorContext queuedContext,
            CancellationToken token)
        {
            var feedPackage = queuedContext.Package;

            Logger.LogInformation("Running PackageValidator on PackageValidatorContext for {PackageId} {PackageVersion}.", feedPackage.Id, feedPackage.Version);
            var catalogEntries = queuedContext.CatalogEntries;
            var existingStatus = await _statusService.GetAsync(feedPackage, token);

            if (catalogEntries != null && existingStatus?.ValidationResult?.CatalogEntries != null && CompareCatalogEntries(catalogEntries, existingStatus.ValidationResult.CatalogEntries))
            {
                // A newer catalog entry of this package has already been validated.
                Logger.LogInformation("A newer catalog entry of {PackageId} {PackageVersion} has already been processed ({OldCommitTimeStamp} < {NewCommitTimeStamp}).",
                                      feedPackage.Id, feedPackage.Version,
                                      catalogEntries.Max(c => c.CommitTimeStamp),
                                      existingStatus.ValidationResult.CatalogEntries.Max(c => c.CommitTimeStamp));

                return;
            }

            var context = new PackageValidatorContext(feedPackage, catalogEntries);
            var result  = await _packageValidator.ValidateAsync(context, _client, token);

            await _notificationService.OnPackageValidationFinishedAsync(result, token);

            var status = new PackageMonitoringStatus(result);

            PackageMonitoringStatusAccessConditionHelper.UpdateFromExisting(status, existingStatus);
            await _statusService.UpdateAsync(status, token);
        }
        public void Constructor_WhenArgumentsAreValid_InitializesInstance(CatalogIndexEntry[] catalogEntries)
        {
            var context = new PackageValidatorContext(_feedPackageIdentity, catalogEntries);

            Assert.Same(_feedPackageIdentity, context.Package);
            Assert.Same(catalogEntries, context.CatalogEntries);
        }
        private async Task SaveFailedPackageMonitoringStatusAsync(
            PackageValidatorContext queuedContext,
            Exception exception,
            CancellationToken token)
        {
            var feedPackage = new FeedPackageIdentity(queuedContext.Package.Id, queuedContext.Package.Version);

            await _notificationService.OnPackageValidationFailedAsync(feedPackage.Id, feedPackage.Version, exception, token);

            var status = new PackageMonitoringStatus(feedPackage, exception);
            await _statusService.UpdateAsync(status, token);
        }
Exemplo n.º 4
0
        private async Task SaveFailedPackageMonitoringStatusAsync(
            PackageValidatorContext queuedContext,
            Exception exception,
            CancellationToken token)
        {
            var queuedVersion = queuedContext.Package.Version;
            var version       = NuGetVersion.TryParse(queuedVersion, out var parsedVersion)
                ? parsedVersion.ToFullString() : queuedVersion;

            var feedPackage = new FeedPackageIdentity(queuedContext.Package.Id, version);
            await _notificationService.OnPackageValidationFailedAsync(feedPackage.Id, feedPackage.Version, exception, token);

            var status = new PackageMonitoringStatus(feedPackage, exception);
            await _statusService.UpdateAsync(status, token);
        }
        public void Constructor_WhenArgumentsAreValid_InitializesInstance()
        {
            var catalogEntries = new[]
            {
                new CatalogIndexEntry(
                    new Uri("https://nuget.test/a"),
                    CatalogConstants.NuGetPackageDetails,
                    Guid.NewGuid().ToString(),
                    DateTime.UtcNow,
                    _packageIdentity)
            };
            var context = new PackageValidatorContext(_feedPackageIdentity, catalogEntries);

            Assert.Same(_feedPackageIdentity, context.Package);
            Assert.Same(catalogEntries, context.CatalogEntries);
        }
Exemplo n.º 6
0
 private async Task ProcessPackagesAsync(
     ConcurrentBag <PackageStatusOutdatedCheck> checkBag, CancellationToken cancellationToken)
 {
     while (checkBag.TryTake(out var check))
     {
         if (await IsStatusOutdatedAsync(check, cancellationToken))
         {
             Logger.LogWarning("Status for {Id} {Version} is outdated!", check.Identity.Id, check.Identity.Version);
             var context = new PackageValidatorContext(check.Identity, null);
             await _packageValidatorContextQueue.AddAsync(context, cancellationToken);
         }
         else
         {
             Logger.LogInformation("Status for {Id} {Version} is up to date.", check.Identity.Id, check.Identity.Version);
         }
     }
 }
        private async Task RunPackageValidatorAsync(
            PackageValidatorContext queuedContext,
            CancellationToken token)
        {
            var feedPackage = queuedContext.Package;

            Logger.LogInformation("Running PackageValidator on PackageValidatorContext for {PackageId} {PackageVersion}.", feedPackage.Id, feedPackage.Version);
            IEnumerable <CatalogIndexEntry> catalogEntries = null;

            if (queuedContext.CatalogEntries != null)
            {
                catalogEntries = queuedContext.CatalogEntries;
            }
            else
            {
                Logger.LogInformation("PackageValidatorContext for {PackageId} {PackageVersion} is missing catalog entries! " +
                                      "Attempting to fetch most recent catalog entry from registration.",
                                      feedPackage.Id, feedPackage.Version);

                catalogEntries = await FetchCatalogIndexEntriesFromRegistrationAsync(feedPackage, token);
            }

            var existingStatus = await _statusService.GetAsync(feedPackage, token);

            if (existingStatus?.ValidationResult != null && CompareCatalogEntries(catalogEntries, existingStatus.ValidationResult.CatalogEntries))
            {
                // A newer catalog entry of this package has already been validated.
                Logger.LogInformation("A newer catalog entry of {PackageId} {PackageVersion} has already been processed ({OldCommitTimeStamp} < {NewCommitTimeStamp}).",
                                      feedPackage.Id, feedPackage.Version,
                                      catalogEntries.Max(c => c.CommitTimeStamp),
                                      existingStatus.ValidationResult.CatalogEntries.Max(c => c.CommitTimeStamp));

                return;
            }

            var context = new PackageValidatorContext(feedPackage, catalogEntries);

            var result = await _packageValidator.ValidateAsync(context, _client, token);

            await _notificationService.OnPackageValidationFinishedAsync(result, token);

            var status = new PackageMonitoringStatus(result);
            await _statusService.UpdateAsync(status, token);
        }
Exemplo n.º 8
0
        public async Task ValidateAsync_WhenCancellationTokenIsCancelled_Throws()
        {
            var validator = new PackageValidator(
                _aggregateValidators,
                _storageFactory,
                _feedToSource,
                _logger,
                _contextLogger);

            var context = new PackageValidatorContext(
                new FeedPackageIdentity(id: "a", version: "1.0.0"),
                catalogEntries: Enumerable.Empty <CatalogIndexEntry>());

            using (var client = new CollectorHttpClient())
            {
                await Assert.ThrowsAsync <OperationCanceledException>(
                    () => validator.ValidateAsync(context, client, new CancellationToken(canceled: true)));
            }
        }
Exemplo n.º 9
0
        public async Task ValidateAsync_WhenClientIsNull_Throws()
        {
            var validator = new PackageValidator(
                _aggregateValidators,
                _storageFactory,
                _feedToSource,
                _logger,
                _contextLogger);

            var context = new PackageValidatorContext(
                new FeedPackageIdentity(id: "a", version: "1.0.0"),
                catalogEntries: Enumerable.Empty <CatalogIndexEntry>());
            const CollectorHttpClient client = null;

            var exception = await Assert.ThrowsAsync <ArgumentNullException>(
                () => validator.ValidateAsync(context, client, CancellationToken.None));

            Assert.Equal("client", exception.ParamName);
        }
Exemplo n.º 10
0
        public async Task ValidateAsync_WhenContextIsNull_Throws()
        {
            var validator = new PackageValidator(
                _aggregateValidators,
                _storageFactory,
                _feedToSource,
                _logger,
                _contextLogger);

            const PackageValidatorContext context = null;

            using (var client = new CollectorHttpClient())
            {
                var exception = await Assert.ThrowsAsync <ArgumentNullException>(
                    () => validator.ValidateAsync(context, client, CancellationToken.None));

                Assert.Equal("context", exception.ParamName);
            }
        }
Exemplo n.º 11
0
        public async Task ValidateAsync_WhenArgumentsAreValid_ReturnsResults()
        {
            var validator = new PackageValidator(
                _aggregateValidators,
                _storageFactory,
                _feedToSource,
                _logger,
                _contextLogger);

            var packageIdentity = new PackageIdentity(id: "a", version: new NuGetVersion("1.0.0"));
            var catalogEntries  = new[]
            {
                new CatalogIndexEntry(
                    new Uri($"https://nuget.test/{packageIdentity.Id}"),
                    CatalogConstants.NuGetPackageDetails,
                    Guid.NewGuid().ToString(),
                    DateTime.UtcNow,
                    packageIdentity)
            };
            var context = new PackageValidatorContext(new FeedPackageIdentity(packageIdentity), catalogEntries);

            using (var httpClient = new CollectorHttpClient())
            {
                var actualResult = await validator.ValidateAsync(context, httpClient, CancellationToken.None);

                Assert.Equal(catalogEntries, actualResult.CatalogEntries);
                Assert.Empty(actualResult.DeletionAuditEntries);
                Assert.Equal(packageIdentity, actualResult.Package);

                Assert.Single(actualResult.AggregateValidationResults);

                var actualValidationResult = actualResult.AggregateValidationResults.Single();
                Assert.Same(_aggregateValidator, actualValidationResult.AggregateValidator);
                Assert.Same(_validationResults, actualValidationResult.ValidationResults);
            }
        }