From b558b24ff024a8461521977b09b216d6f102be16 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Thu, 15 Feb 2024 14:16:15 +0530 Subject: [PATCH 01/10] fix dataSourceName mismatch --- src/Cli/ConfigGenerator.cs | 4 ++-- src/Core/Configurations/RuntimeConfigValidator.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Cli/ConfigGenerator.cs b/src/Cli/ConfigGenerator.cs index 0c22599fc1..5d26ed9f02 100644 --- a/src/Cli/ConfigGenerator.cs +++ b/src/Cli/ConfigGenerator.cs @@ -1093,7 +1093,7 @@ public static bool IsConfigValid(ValidateOptions options, FileSystemRuntimeConfi // 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)) + if (!loader.TryLoadKnownConfig(out _, replaceEnvVar: true)) { _logger.LogError("Failed to parse the config file: {runtimeConfigFile}.", runtimeConfigFile); return false; @@ -1108,7 +1108,7 @@ public static bool IsConfigValid(ValidateOptions options, FileSystemRuntimeConfi 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..580d6f8c3d 100644 --- a/src/Core/Configurations/RuntimeConfigValidator.cs +++ b/src/Core/Configurations/RuntimeConfigValidator.cs @@ -150,10 +150,10 @@ public void ValidateAppInsightsTelemetryConnectionString(RuntimeConfig runtimeCo /// true if no validation failures, else false. public async Task TryValidateConfig( string configFilePath, - RuntimeConfig runtimeConfig, ILoggerFactory loggerFactory, bool isValidateOnly = false) { + RuntimeConfig runtimeConfig = _runtimeConfigProvider.GetConfig(); JsonSchemaValidationResult validationResult = await ValidateConfigSchema(runtimeConfig, configFilePath, loggerFactory); ValidateConfigProperties(); ValidatePermissionsInConfig(runtimeConfig); From e607d1ce66897bb50e52decfd5d5cc47128fd246 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Thu, 15 Feb 2024 14:49:09 +0530 Subject: [PATCH 02/10] remove redundant code --- src/Cli/ConfigGenerator.cs | 12 +----------- src/Core/Configurations/RuntimeConfigValidator.cs | 12 +++++++++++- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Cli/ConfigGenerator.cs b/src/Cli/ConfigGenerator.cs index 5d26ed9f02..a63b6a19ed 100644 --- a/src/Cli/ConfigGenerator.cs +++ b/src/Cli/ConfigGenerator.cs @@ -1091,17 +1091,7 @@ 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 _, 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); diff --git a/src/Core/Configurations/RuntimeConfigValidator.cs b/src/Core/Configurations/RuntimeConfigValidator.cs index 580d6f8c3d..193d5c6064 100644 --- a/src/Core/Configurations/RuntimeConfigValidator.cs +++ b/src/Core/Configurations/RuntimeConfigValidator.cs @@ -153,7 +153,17 @@ public async Task TryValidateConfig( ILoggerFactory loggerFactory, bool isValidateOnly = false) { - RuntimeConfig runtimeConfig = _runtimeConfigProvider.GetConfig(); + RuntimeConfig runtimeConfig; + try + { + runtimeConfig = _runtimeConfigProvider.GetConfig(); + } + catch (Exception ex) + { + _logger.LogInformation("Failed to parse the config file due to : {message}", ex.Message); + return false; + } + JsonSchemaValidationResult validationResult = await ValidateConfigSchema(runtimeConfig, configFilePath, loggerFactory); ValidateConfigProperties(); ValidatePermissionsInConfig(runtimeConfig); From 9f457694681fc883c29d98032eb951d43f11d9ce Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Thu, 15 Feb 2024 14:58:14 +0530 Subject: [PATCH 03/10] adding test --- src/Cli.Tests/ValidateConfigTests.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/Cli.Tests/ValidateConfigTests.cs b/src/Cli.Tests/ValidateConfigTests.cs index c96e5d6790..05ba8b7b01 100644 --- a/src/Cli.Tests/ValidateConfigTests.cs +++ b/src/Cli.Tests/ValidateConfigTests.cs @@ -60,4 +60,20 @@ 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 test no exception gets thrown with validate during failure 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); + + bool isConfigValid = ConfigGenerator.IsConfigValid(validateOptions, _runtimeConfigLoader!, _fileSystem!); + Assert.IsFalse(isConfigValid); + } } From e3d3d0f0a706a4388a05a88c27111edc971855d0 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar <102276754+abhishekkumams@users.noreply.github.com> Date: Fri, 16 Feb 2024 10:36:47 +0530 Subject: [PATCH 04/10] removing stale comments --- src/Core/Configurations/RuntimeConfigValidator.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Core/Configurations/RuntimeConfigValidator.cs b/src/Core/Configurations/RuntimeConfigValidator.cs index 193d5c6064..85a4ec706b 100644 --- a/src/Core/Configurations/RuntimeConfigValidator.cs +++ b/src/Core/Configurations/RuntimeConfigValidator.cs @@ -144,7 +144,6 @@ 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. From a8036d5ca15d5e3afa3a778b42d0762073dd0ff9 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Thu, 22 Feb 2024 16:29:45 +0530 Subject: [PATCH 05/10] adding test --- .../Configurations/RuntimeConfigValidator.cs | 15 +++------ .../Configuration/ConfigurationTests.cs | 33 +++++++++++++++++++ 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/Core/Configurations/RuntimeConfigValidator.cs b/src/Core/Configurations/RuntimeConfigValidator.cs index 85a4ec706b..09dc413525 100644 --- a/src/Core/Configurations/RuntimeConfigValidator.cs +++ b/src/Core/Configurations/RuntimeConfigValidator.cs @@ -145,21 +145,16 @@ public void ValidateAppInsightsTelemetryConnectionString(RuntimeConfig runtimeCo /// /// full/relative config file path with extension /// Logger Factory - /// true if run for validate only mode /// true if no validation failures, else false. public async Task TryValidateConfig( string configFilePath, - ILoggerFactory loggerFactory, - bool isValidateOnly = false) + ILoggerFactory loggerFactory) { - RuntimeConfig runtimeConfig; - try - { - runtimeConfig = _runtimeConfigProvider.GetConfig(); - } - catch (Exception ex) + RuntimeConfig? runtimeConfig; + + if (!_runtimeConfigProvider.TryGetConfig(out runtimeConfig)) { - _logger.LogInformation("Failed to parse the config file due to : {message}", ex.Message); + _logger.LogInformation("Failed to parse the config file"); return false; } diff --git a/src/Service.Tests/Configuration/ConfigurationTests.cs b/src/Service.Tests/Configuration/ConfigurationTests.cs index fc895e5cca..8453822bde 100644 --- a/src/Service.Tests/Configuration/ConfigurationTests.cs +++ b/src/Service.Tests/Configuration/ConfigurationTests.cs @@ -1062,6 +1062,39 @@ public void TestConfigPropertiesAreValid() configValidator.ValidateConfigProperties(); } + /// + /// This method tests the config properties like data-source, runtime settings and entities. + /// + [TestMethod("Validates the config for everything."), TestCategory(TestCategory.MSSQL)] + public async Task TestConfigIsValid() + { + TestHelper.SetupDatabaseEnvironment(MSSQL_ENVIRONMENT); + DataSource dataSource = new(DatabaseType.MSSQL, + GetConnectionStringFromEnvironmentConfig(environment: TestCategory.MSSQL), + Options: null); + + RuntimeConfig configuration = InitMinimalRuntimeConfig(dataSource, new(), new()); + + const string CUSTOM_CONFIG = "custom-config.json"; + + MockFileSystem fileSystem = new(); + 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); + + bool isValid = await configValidator.TryValidateConfig(CUSTOM_CONFIG, TestHelper.ProvisionLoggerFactory()); + Assert.IsTrue(isValid); + } + /// /// This test method checks a valid config's entities against /// the database and ensures they are valid. From 5f157fe3c7c050ccbb16d732235c4831a0592770 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Thu, 22 Feb 2024 16:55:06 +0530 Subject: [PATCH 06/10] updating summary --- .../Configuration/ConfigurationTests.cs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/Service.Tests/Configuration/ConfigurationTests.cs b/src/Service.Tests/Configuration/ConfigurationTests.cs index 8453822bde..778a144108 100644 --- a/src/Service.Tests/Configuration/ConfigurationTests.cs +++ b/src/Service.Tests/Configuration/ConfigurationTests.cs @@ -1063,9 +1063,9 @@ public void TestConfigPropertiesAreValid() } /// - /// This method tests the config properties like data-source, runtime settings and entities. + /// This method tests that config file is validated correctly and no exceptions are thrown. /// - [TestMethod("Validates the config for everything."), TestCategory(TestCategory.MSSQL)] + [TestMethod("Validates the complete config."), TestCategory(TestCategory.MSSQL)] public async Task TestConfigIsValid() { TestHelper.SetupDatabaseEnvironment(MSSQL_ENVIRONMENT); @@ -1091,8 +1091,14 @@ public async Task TestConfigIsValid() configValidatorLogger.Object, true); - bool isValid = await configValidator.TryValidateConfig(CUSTOM_CONFIG, TestHelper.ProvisionLoggerFactory()); - Assert.IsTrue(isValid); + try + { + Assert.IsTrue(await configValidator.TryValidateConfig(CUSTOM_CONFIG, TestHelper.ProvisionLoggerFactory())); + } + catch (Exception e) + { + Assert.Fail(e.Message); + } } /// From e14ed3f808b6c98b091c8bfee27293ec51586e2d Mon Sep 17 00:00:00 2001 From: Abhishek Kumar <102276754+abhishekkumams@users.noreply.github.com> Date: Fri, 23 Feb 2024 13:41:18 +0530 Subject: [PATCH 07/10] Update src/Cli.Tests/ValidateConfigTests.cs Co-authored-by: Shyam Sundar J --- src/Cli.Tests/ValidateConfigTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Cli.Tests/ValidateConfigTests.cs b/src/Cli.Tests/ValidateConfigTests.cs index 05ba8b7b01..e2a699f4b8 100644 --- a/src/Cli.Tests/ValidateConfigTests.cs +++ b/src/Cli.Tests/ValidateConfigTests.cs @@ -63,7 +63,7 @@ public void TestConfigWithInvalidConfigProperties() /// /// This method validates that the IsConfigValid method returns false when the config is empty. - /// This is to test no exception gets thrown with validate during failure config deserialization. + /// This is to validate that no exceptions are thrown with validate for failures during config deserialization. /// [TestMethod] public void TestValidateWithEmptyConfig() From 1f07c9007bb6c8cf9226a2ad0f922a5c593a2abd Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Fri, 23 Feb 2024 14:52:25 +0530 Subject: [PATCH 08/10] using the main test config file and validating it --- src/Cli.Tests/ValidateConfigTests.cs | 7 ++- .../Configuration/ConfigurationTests.cs | 44 ++++++++++++++++--- 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/src/Cli.Tests/ValidateConfigTests.cs b/src/Cli.Tests/ValidateConfigTests.cs index e2a699f4b8..cadb4ae621 100644 --- a/src/Cli.Tests/ValidateConfigTests.cs +++ b/src/Cli.Tests/ValidateConfigTests.cs @@ -73,7 +73,10 @@ public void TestValidateWithEmptyConfig() ValidateOptions validateOptions = new(TEST_RUNTIME_CONFIG_FILE); - bool isConfigValid = ConfigGenerator.IsConfigValid(validateOptions, _runtimeConfigLoader!, _fileSystem!); - Assert.IsFalse(isConfigValid); + try { + Assert.IsFalse(ConfigGenerator.IsConfigValid(validateOptions, _runtimeConfigLoader!, _fileSystem!)); + } catch (Exception ex) { + Assert.Fail($"Unexpected Exception thrown: {ex.Message}"); + } } } diff --git a/src/Service.Tests/Configuration/ConfigurationTests.cs b/src/Service.Tests/Configuration/ConfigurationTests.cs index 778a144108..693a11b8dc 100644 --- a/src/Service.Tests/Configuration/ConfigurationTests.cs +++ b/src/Service.Tests/Configuration/ConfigurationTests.cs @@ -1064,21 +1064,55 @@ public void TestConfigPropertiesAreValid() /// /// 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); - DataSource dataSource = new(DatabaseType.MSSQL, - GetConnectionStringFromEnvironmentConfig(environment: TestCategory.MSSQL), - Options: null); + FileSystemRuntimeConfigLoader testConfigPath = TestHelper.GetRuntimeConfigLoader(); + RuntimeConfig configuration = TestHelper.GetRuntimeConfigProvider(testConfigPath).GetConfig(); + const string CUSTOM_CONFIG = "custom-config.json"; - RuntimeConfig configuration = InitMinimalRuntimeConfig(dataSource, new(), new()); + 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 method tests that config file is validated correctly and no exceptions are thrown. + /// + [TestMethod("Validates the config with data-source containing invalid db type and empty connection-string."), TestCategory(TestCategory.MSSQL)] + public async Task TestValidateConfigWithInvalidDataSource() + { const string CUSTOM_CONFIG = "custom-config.json"; MockFileSystem fileSystem = new(); - fileSystem.AddFile(CUSTOM_CONFIG, new MockFileData(configuration.ToJson())); + fileSystem.AddFile(CUSTOM_CONFIG, new MockFileData(CONFIG_WITH_INVALID_SCHEMA)); FileSystemRuntimeConfigLoader configLoader = new(fileSystem); configLoader.UpdateConfigFilePath(CUSTOM_CONFIG); RuntimeConfigProvider configProvider = TestHelper.GetRuntimeConfigProvider(configLoader); From fb5492392c254f0e1ad32b9feaf8acbe179135ce Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Fri, 23 Feb 2024 14:53:48 +0530 Subject: [PATCH 09/10] fix formatting --- src/Cli.Tests/ValidateConfigTests.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Cli.Tests/ValidateConfigTests.cs b/src/Cli.Tests/ValidateConfigTests.cs index cadb4ae621..9c85ce611e 100644 --- a/src/Cli.Tests/ValidateConfigTests.cs +++ b/src/Cli.Tests/ValidateConfigTests.cs @@ -73,9 +73,12 @@ public void TestValidateWithEmptyConfig() ValidateOptions validateOptions = new(TEST_RUNTIME_CONFIG_FILE); - try { + try + { Assert.IsFalse(ConfigGenerator.IsConfigValid(validateOptions, _runtimeConfigLoader!, _fileSystem!)); - } catch (Exception ex) { + } + catch (Exception ex) + { Assert.Fail($"Unexpected Exception thrown: {ex.Message}"); } } From 705170aa2888be2b56dd433b254c23b380022501 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar <102276754+abhishekkumams@users.noreply.github.com> Date: Fri, 23 Feb 2024 16:53:46 +0530 Subject: [PATCH 10/10] Update ConfigurationTests.cs --- .../Configuration/ConfigurationTests.cs | 32 ------------------- 1 file changed, 32 deletions(-) diff --git a/src/Service.Tests/Configuration/ConfigurationTests.cs b/src/Service.Tests/Configuration/ConfigurationTests.cs index 693a11b8dc..7f3882bcf4 100644 --- a/src/Service.Tests/Configuration/ConfigurationTests.cs +++ b/src/Service.Tests/Configuration/ConfigurationTests.cs @@ -1103,38 +1103,6 @@ public async Task TestConfigIsValid() } } - /// - /// This method tests that config file is validated correctly and no exceptions are thrown. - /// - [TestMethod("Validates the config with data-source containing invalid db type and empty connection-string."), TestCategory(TestCategory.MSSQL)] - public async Task TestValidateConfigWithInvalidDataSource() - { - const string CUSTOM_CONFIG = "custom-config.json"; - - MockFileSystem fileSystem = new(); - fileSystem.AddFile(CUSTOM_CONFIG, new MockFileData(CONFIG_WITH_INVALID_SCHEMA)); - 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 - { - 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.