Skip to content
This repository was archived by the owner on Jul 30, 2024. It is now read-only.

Commit fd17349

Browse files
committed
Use validator type instead of instance for configuration validation (#360)
Related to NuGet/Engineering#1190
1 parent 3add3e7 commit fd17349

6 files changed

Lines changed: 53 additions & 16 deletions

File tree

src/NuGet.Services.Validation.Orchestrator/Configuration/ConfigurationValidator.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ private void CheckUnknownValidators()
103103
foreach (var validatorItem in _configuration.Validations)
104104
{
105105
// This method will throw if the validator does not exist.
106-
var validator = _validatorProvider.GetValidator(validatorItem.Name);
107-
if (validator == null)
106+
var validatorType = _validatorProvider.GetValidatorType(validatorItem.Name);
107+
if (validatorType == null)
108108
{
109109
throw new ConfigurationErrorsException("Validator implementation not found for " + validatorItem.Name);
110110
}
@@ -142,7 +142,7 @@ private void CheckForCyclesAndParallelProcessors()
142142
var processorNames = _configuration
143143
.Validations
144144
.Select(x => x.Name)
145-
.Where(x => _validatorProvider.GetValidator(x) is IProcessor)
145+
.Where(x => typeof(IProcessor).IsAssignableFrom(_validatorProvider.GetValidatorType(x)))
146146
.ToList();
147147

148148
TopologicalSort.Validate(_configuration.Validations, processorNames);
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
// Copyright (c) .NET Foundation. All rights reserved.
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

4+
using System;
5+
46
namespace NuGet.Services.Validation.Orchestrator
57
{
68
/// <summary>
79
/// Interface for the class that provides validator instances by their name
810
/// </summary>
911
public interface IValidatorProvider
1012
{
13+
Type GetValidatorType(string validatorName);
1114
IValidator GetValidator(string validatorName);
1215
}
1316
}

src/NuGet.Services.Validation.Orchestrator/ValidatorProvider.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,27 @@ public ValidatorProvider(IServiceProvider serviceProvider, ILogger<ValidatorProv
3535
}
3636
}
3737

38-
public IValidator GetValidator(string validatorName)
38+
public Type GetValidatorType(string validatorName)
3939
{
4040
validatorName = validatorName ?? throw new ArgumentNullException(nameof(validatorName));
4141

4242
if (_validatorTypes.TryGetValue(validatorName, out Type validatorType))
4343
{
44-
return (IValidator)_serviceProvider.GetRequiredService(validatorType);
44+
return validatorType;
4545
}
4646

4747
throw new ArgumentException($"Unknown validator name: {validatorName}", nameof(validatorName));
4848
}
4949

50+
public IValidator GetValidator(string validatorName)
51+
{
52+
validatorName = validatorName ?? throw new ArgumentNullException(nameof(validatorName));
53+
54+
var validatorType = GetValidatorType(validatorName);
55+
56+
return (IValidator)_serviceProvider.GetRequiredService(validatorType);
57+
}
58+
5059
private static IEnumerable<Type> GetCandidateTypes(Assembly callingAssembly)
5160
{
5261
var executingAssembly = Assembly.GetExecutingAssembly();

src/NuGet.Services.Validation.Orchestrator/settings.json

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,25 @@
22
"Configuration": {
33
"Validations": [
44
{
5-
"name": "",
5+
"name": "VcsValidator",
66
"failAfter": "1:00:00:00",
77
"requiredValidations": [],
88
"ShouldStart": true,
99
"FailureBehavior": "MustSucceed"
10+
},
11+
{
12+
"name": "PackageSigningValidator",
13+
"failAfter": "1:00:00:00",
14+
"requiredValidations": [],
15+
"ShouldStart": true,
16+
"FailureBehavior": "MustSucceed"
17+
},
18+
{
19+
"name": "PackageCertificatesValidator",
20+
"failAfter": "10:00",
21+
"requiredValidations": [ "PackageSigningValidator" ],
22+
"ShouldStart": true,
23+
"FailureBehavior": "AllowedToFail"
1024
}
1125
],
1226
"ValidationStorageConnectionString": "",

test.ps1

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,17 @@ Function Run-Tests {
4242
& $xUnitExe (Join-Path $PSScriptRoot $Test) -xml "Results.$TestCount.xml"
4343
$TestCount++
4444
}
45+
46+
Trace-Log "Running configuration validations";
47+
48+
$exe = "src\NuGet.Services.Validation.Orchestrator\bin\$Configuration\NuGet.Services.Validation.Orchestrator.exe";
49+
$cfg = "src\NuGet.Services.Validation.Orchestrator\settings.json";
50+
51+
& $exe -Configuration $cfg -Validate
52+
if ( $LASTEXITCODE -gt 0 )
53+
{
54+
Write-Error "Validation of the $cfg failed"
55+
}
4556
}
4657

4758
Write-Host ("`r`n" * 3)

tests/NuGet.Services.Validation.Orchestrator.Tests/Configuration/ConfigurationFacts.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -148,11 +148,11 @@ public void ConfigurationValidatorDetectsParallelProcessors()
148148

149149
var validatorProvider = new Mock<IValidatorProvider>();
150150
validatorProvider
151-
.Setup(x => x.GetValidator(It.Is<string>(n => n == validationName1 || n == validationName2)))
152-
.Returns(() => new Mock<IValidator>().Object);
151+
.Setup(x => x.GetValidatorType(It.Is<string>(n => n == validationName1 || n == validationName2)))
152+
.Returns(() => new Mock<IValidator>().Object.GetType());
153153
validatorProvider
154-
.Setup(x => x.GetValidator(processorName1))
155-
.Returns(() => new Mock<IProcessor>().Object);
154+
.Setup(x => x.GetValidatorType(processorName1))
155+
.Returns(() => new Mock<IProcessor>().Object.GetType());
156156

157157
var ex = Record.Exception(() => Validate(validatorProvider.Object, configuration));
158158

@@ -195,11 +195,11 @@ public void ConfigurationValidatorAllowsNonParallelProcessors()
195195

196196
var validatorProvider = new Mock<IValidatorProvider>();
197197
validatorProvider
198-
.Setup(x => x.GetValidator(It.Is<string>(n => n == validationName1 || n == validationName2)))
199-
.Returns(() => new Mock<IValidator>().Object);
198+
.Setup(x => x.GetValidatorType(It.Is<string>(n => n == validationName1 || n == validationName2)))
199+
.Returns(() => new Mock<IValidator>().Object.GetType());
200200
validatorProvider
201-
.Setup(x => x.GetValidator(processorName1))
202-
.Returns(() => new Mock<IProcessor>().Object);
201+
.Setup(x => x.GetValidatorType(processorName1))
202+
.Returns(() => new Mock<IProcessor>().Object.GetType());
203203

204204
var ex = Record.Exception(() => Validate(validatorProvider.Object, configuration));
205205

@@ -601,8 +601,8 @@ private static void Validate(ValidationConfiguration configuration)
601601
{
602602
var validatorProvider = new Mock<IValidatorProvider>();
603603
validatorProvider
604-
.Setup(x => x.GetValidator(It.IsAny<string>()))
605-
.Returns(() => new Mock<IValidator>().Object);
604+
.Setup(x => x.GetValidatorType(It.IsAny<string>()))
605+
.Returns(() => new Mock<IValidator>().Object.GetType());
606606

607607
Validate(validatorProvider.Object, configuration);
608608
}

0 commit comments

Comments
 (0)