diff --git a/src/Cli.Tests/ValidateConfigTests.cs b/src/Cli.Tests/ValidateConfigTests.cs
index c96e5d6790..9c85ce611e 100644
--- a/src/Cli.Tests/ValidateConfigTests.cs
+++ b/src/Cli.Tests/ValidateConfigTests.cs
@@ -60,4 +60,26 @@ public void TestConfigWithInvalidConfigProperties()
bool isConfigValid = ConfigGenerator.IsConfigValid(validateOptions, _runtimeConfigLoader!, _fileSystem!);
Assert.IsFalse(isConfigValid);
}
+
+ ///
+ /// This method validates that the IsConfigValid method returns false when the config is empty.
+ /// This is to validate that no exceptions are thrown with validate for failures during config deserialization.
+ ///
+ [TestMethod]
+ public void TestValidateWithEmptyConfig()
+ {
+ // create an empty config file
+ ((MockFileSystem)_fileSystem!).AddFile(TEST_RUNTIME_CONFIG_FILE, string.Empty);
+
+ ValidateOptions validateOptions = new(TEST_RUNTIME_CONFIG_FILE);
+
+ try
+ {
+ Assert.IsFalse(ConfigGenerator.IsConfigValid(validateOptions, _runtimeConfigLoader!, _fileSystem!));
+ }
+ catch (Exception ex)
+ {
+ Assert.Fail($"Unexpected Exception thrown: {ex.Message}");
+ }
+ }
}
diff --git a/src/Cli/ConfigGenerator.cs b/src/Cli/ConfigGenerator.cs
index 0c22599fc1..a63b6a19ed 100644
--- a/src/Cli/ConfigGenerator.cs
+++ b/src/Cli/ConfigGenerator.cs
@@ -1091,24 +1091,14 @@ public static bool IsConfigValid(ValidateOptions options, FileSystemRuntimeConfi
return false;
}
- // Validates that config file has data and it is properly deserialized
- // Replaces all the environment variables while deserializing when starting DAB.
- if (!loader.TryLoadKnownConfig(out RuntimeConfig? deserializedRuntimeConfig, replaceEnvVar: true))
- {
- _logger.LogError("Failed to parse the config file: {runtimeConfigFile}.", runtimeConfigFile);
- return false;
- }
- else
- {
- _logger.LogInformation("Loaded config file: {runtimeConfigFile}", runtimeConfigFile);
- }
+ _logger.LogInformation("Validating config file: {runtimeConfigFile}", runtimeConfigFile);
RuntimeConfigProvider runtimeConfigProvider = new(loader);
ILogger runtimeConfigValidatorLogger = LoggerFactoryForCli.CreateLogger();
RuntimeConfigValidator runtimeConfigValidator = new(runtimeConfigProvider, fileSystem, runtimeConfigValidatorLogger, true);
- return runtimeConfigValidator.TryValidateConfig(runtimeConfigFile, deserializedRuntimeConfig, LoggerFactoryForCli).Result;
+ return runtimeConfigValidator.TryValidateConfig(runtimeConfigFile, LoggerFactoryForCli).Result;
}
///
diff --git a/src/Core/Configurations/RuntimeConfigValidator.cs b/src/Core/Configurations/RuntimeConfigValidator.cs
index 328223c9ce..09dc413525 100644
--- a/src/Core/Configurations/RuntimeConfigValidator.cs
+++ b/src/Core/Configurations/RuntimeConfigValidator.cs
@@ -144,16 +144,20 @@ public void ValidateAppInsightsTelemetryConnectionString(RuntimeConfig runtimeCo
/// This method is called by the CLI when the user runs `validate` command with `isValidateOnly=true`.
///
/// full/relative config file path with extension
- /// RuntimeConfig object
/// Logger Factory
- /// true if run for validate only mode
/// true if no validation failures, else false.
public async Task TryValidateConfig(
string configFilePath,
- RuntimeConfig runtimeConfig,
- ILoggerFactory loggerFactory,
- bool isValidateOnly = false)
+ ILoggerFactory loggerFactory)
{
+ RuntimeConfig? runtimeConfig;
+
+ if (!_runtimeConfigProvider.TryGetConfig(out runtimeConfig))
+ {
+ _logger.LogInformation("Failed to parse the config file");
+ return false;
+ }
+
JsonSchemaValidationResult validationResult = await ValidateConfigSchema(runtimeConfig, configFilePath, loggerFactory);
ValidateConfigProperties();
ValidatePermissionsInConfig(runtimeConfig);
diff --git a/src/Service.Tests/Configuration/ConfigurationTests.cs b/src/Service.Tests/Configuration/ConfigurationTests.cs
index fc895e5cca..7f3882bcf4 100644
--- a/src/Service.Tests/Configuration/ConfigurationTests.cs
+++ b/src/Service.Tests/Configuration/ConfigurationTests.cs
@@ -1062,6 +1062,47 @@ public void TestConfigPropertiesAreValid()
configValidator.ValidateConfigProperties();
}
+ ///
+ /// This method tests that config file is validated correctly and no exceptions are thrown.
+ /// This tests gets the json from the integration test config file and then uses that
+ /// to validate the complete config file.
+ ///
+ [TestMethod("Validates the complete config."), TestCategory(TestCategory.MSSQL)]
+ public async Task TestConfigIsValid()
+ {
+ // Fetch the MS_SQL integration test config file.
+ TestHelper.SetupDatabaseEnvironment(MSSQL_ENVIRONMENT);
+ FileSystemRuntimeConfigLoader testConfigPath = TestHelper.GetRuntimeConfigLoader();
+ RuntimeConfig configuration = TestHelper.GetRuntimeConfigProvider(testConfigPath).GetConfig();
+ const string CUSTOM_CONFIG = "custom-config.json";
+
+ MockFileSystem fileSystem = new();
+
+ // write it to the custom-config file and add it to the filesystem.
+ fileSystem.AddFile(CUSTOM_CONFIG, new MockFileData(configuration.ToJson()));
+ FileSystemRuntimeConfigLoader configLoader = new(fileSystem);
+ configLoader.UpdateConfigFilePath(CUSTOM_CONFIG);
+ RuntimeConfigProvider configProvider = TestHelper.GetRuntimeConfigProvider(configLoader);
+
+ Mock> configValidatorLogger = new();
+ RuntimeConfigValidator configValidator =
+ new(
+ configProvider,
+ fileSystem,
+ configValidatorLogger.Object,
+ true);
+
+ try
+ {
+ // Run the validate on the custom config json file.
+ Assert.IsTrue(await configValidator.TryValidateConfig(CUSTOM_CONFIG, TestHelper.ProvisionLoggerFactory()));
+ }
+ catch (Exception e)
+ {
+ Assert.Fail(e.Message);
+ }
+ }
+
///
/// This test method checks a valid config's entities against
/// the database and ensures they are valid.