public void GetsPrefixedValueOverExactMatch()
        {
            var config         = GetConfiguration();
            var settingsConfig = new SettingsConfig
            {
                Prefix     = "SampleTest_",
                Properties = new List <ValueConfig>
                {
                    new ValueConfig
                    {
                        Name         = "SampleProp2",
                        PropertyType = PropertyType.String
                    }
                }
            };

            config.Configuration.AppSettings[config.ProjectName] = new List <SettingsConfig>(new[] { settingsConfig });
            var projectDir = new DirectoryInfo(config.IntermediateOutputPath).Parent.FullName;

            config.SolutionDirectory = config.ProjectDirectory = projectDir;
            Environment.SetEnvironmentVariable("SampleTest_SampleProp2", nameof(GetsValuesFromPrefixedHostEnvironmentVariable), EnvironmentVariableTarget.Process);
            Environment.SetEnvironmentVariable("SampleProp2", "Wrong Value", EnvironmentVariableTarget.Process);

            var generator     = new SecretsClassGenerator(config);
            var mergedSecrets = generator.GetMergedSecrets(settingsConfig, out var hasErrors);

            Environment.SetEnvironmentVariable("SampleTest_SampleProp2", null, EnvironmentVariableTarget.Process);
            Environment.SetEnvironmentVariable("SampleProp2", null, EnvironmentVariableTarget.Process);

            Assert.False(hasErrors);
            Assert.True(mergedSecrets.ContainsKey("SampleProp2"));
            Assert.Equal(nameof(GetsValuesFromPrefixedHostEnvironmentVariable), mergedSecrets["SampleProp2"]);
        }
        public void GetsDefaultValueFromValueConfig()
        {
            var config         = GetConfiguration();
            var settingsConfig = new SettingsConfig
            {
                Properties = new List <ValueConfig>
                {
                    new ValueConfig
                    {
                        Name         = "SampleProp",
                        PropertyType = PropertyType.String,
                        DefaultValue = "Hello World"
                    }
                }
            };

            config.Configuration.AppSettings[config.ProjectName] = new List <SettingsConfig>(new[] { settingsConfig });
            var projectDir = new DirectoryInfo(config.IntermediateOutputPath).Parent.FullName;

            config.SolutionDirectory = config.ProjectDirectory = projectDir;

            var generator     = new SecretsClassGenerator(config);
            var mergedSecrets = generator.GetMergedSecrets(settingsConfig, out var hasErrors);

            Assert.False(hasErrors);
            Assert.True(mergedSecrets.ContainsKey("SampleProp"));
            Assert.Equal("Hello World", mergedSecrets["SampleProp"]);
        }
예제 #3
0
        public void GeneratesValidClass(string secretsFile, PropertyType propertyType, Type expectedType, bool isArray)
        {
            var config = GetConfiguration($"{nameof(GeneratesValidClass)}-{expectedType.Name}");

            config.SecretsConfig.Properties.Add(new ValueConfig
            {
                Name         = "Prop",
                PropertyType = propertyType,
                IsArray      = isArray
            });
            var generator = new SecretsClassGenerator(config)
            {
                SecretsJsonFilePath = Path.Combine("Templates", "Secrets", secretsFile),
                BaseNamespace       = config.ProjectName
            };

            generator.Execute();

            var filePath = generator.Outputs.ItemSpec;

            Assert.True(File.Exists(filePath));

            var csc        = new CSharpCodeProvider();
            var parameters = new CompilerParameters(new[] { "mscorlib.dll", "System.dll", "System.Core.dll" }, Path.Combine(config.IntermediateOutputPath, $"{Path.GetFileNameWithoutExtension(secretsFile)}.dll"), true);
            var results    = csc.CompileAssemblyFromFile(parameters, filePath);

            results.Errors.Cast <CompilerError>().ToList().ForEach(error => _testOutputHelper.WriteLine(error.ErrorText));

            Assert.Empty(results.Errors);
            Assert.NotNull(results.CompiledAssembly);
            var secretsClassType = results.CompiledAssembly.DefinedTypes.FirstOrDefault(t => t.Name == config.SecretsConfig.ClassName);

            Assert.NotNull(secretsClassType);
            var propField = secretsClassType.GetField("Prop", BindingFlags.NonPublic | BindingFlags.Static);

            Assert.NotNull(propField);
            Assert.Equal(expectedType.FullName, propField.FieldType.FullName);

            object value = null;
            var    ex    = Record.Exception(() => value = propField.GetValue(null));

            Assert.Null(ex);
            Assert.NotNull(value);

            if (isArray)
            {
                var array = (IEnumerable)value;
                Assert.NotNull(array);
                Assert.Equal(3, array.Cast <object>().Count());
            }
        }
예제 #4
0
        public override bool Execute()
        {
            if (!ValidateParameters())
            {
                return(false);
            }

            try
            {
                if (File.Exists(SecretsJsonFilePath))
                {
                    Log.LogMessage($"ProjectBasePath: {ProjectBasePath}");
                    Log.LogMessage($"SecretsClassName: {SecretsClassName}");
                    Log.LogMessage($"SecretsJsonFilePath: {SecretsJsonFilePath}");
                    Log.LogMessage($"RootNamespace: {RootNamespace}");
                    Log.LogMessage($"OutputPath: {OutputPath}");

                    bool debug = false;
                    bool.TryParse(DebugOutput, out debug);
                    var generator = new SecretsClassGenerator()
                    {
                        ProjectBasePath        = ProjectBasePath,
                        SecretsClassName       = SecretsClassName,
                        SecretsJsonFilePath    = SecretsJsonFilePath,
                        BaseNamespace          = RootNamespace,
                        OutputPath             = OutputPath,
                        IntermediateOutputPath = IntermediateOutputPath,
                        DebugOutput            = debug,
                        Log = (BuildHostLoggingHelper)Log
                    };
                    generator.Execute();
                    _generatedCodeFiles = generator.GeneratedFiles;
                }
                else
                {
                    Log.LogMessage("No Secrets Json File was found.");
                }
            }
            catch (Exception ex)
            {
                Log.LogError(ex.ToString());
                return(false);
            }

            return(true);
        }
예제 #5
0
        internal override void ExecuteInternal(IBuildConfiguration config)
        {
            var standardSecrets = Path.Combine(ProjectDirectory, Constants.SecretsJsonFileName);
            var configSecrets   = Path.Combine(ProjectDirectory, string.Format(Constants.SecretsJsonConfigurationFileFormat, config.BuildConfiguration.ToLower()));

            if (File.Exists(standardSecrets) || File.Exists(configSecrets))
            {
                var generator = new SecretsClassGenerator(config)
                {
                    ConfigurationSecretsJsonFilePath = configSecrets,
                    SecretsJsonFilePath = standardSecrets,
                    BaseNamespace       = RootNamespace,
                };
                generator.Execute();
                _generatedCodeFiles = new[] { generator.Outputs };
            }
            else
            {
                Log.LogMessage("No Secrets Json File was found.");
            }
        }
예제 #6
0
        internal override void ExecuteInternal(IBuildConfiguration config)
        {
            if (config.GetSecretsConfig().Disable)
            {
                return;
            }

            var configJson = string.Format(Constants.SecretsJsonConfigurationFileFormat, config.BuildConfiguration.ToLower());

            var generator = new SecretsClassGenerator(config,
                                                      Path.Combine(SolutionDirectory, Constants.SecretsJsonFileName),
                                                      Path.Combine(SolutionDirectory, configJson),
                                                      Path.Combine(ProjectDirectory, Constants.SecretsJsonFileName),
                                                      Path.Combine(ProjectDirectory, configJson),
                                                      JsonSecretsFilePath)
            {
                BaseNamespace = RootNamespace,
            };

            generator.Execute();
            _generatedCodeFiles = new[] { generator.Outputs };
        }