public void AddOrUpdateFunctionSecrets_WithNoFunctionNameAndProvidedSecret_UsesSecretAndPersistsHostFile() { var secretsPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); try { using (var variables = new TestScopedEnvironmentVariables("AzureWebJobsFeatureFlags", "MultiKey")) { Mock <IKeyValueConverterFactory> mockValueConverterFactory = GetConverterFactoryMock(false); KeyOperationResult result; using (var secretManager = new SecretManager(secretsPath, mockValueConverterFactory.Object)) { result = secretManager.AddOrUpdateFunctionSecret("TestSecret", "TestSecretValue"); } string secretsJson = File.ReadAllText(Path.Combine(secretsPath, ScriptConstants.HostMetadataFileName)); HostSecrets persistedSecrets = ScriptSecretSerializer.DeserializeSecrets <HostSecrets>(secretsJson); Key newSecret = persistedSecrets.FunctionKeys.FirstOrDefault(k => string.Equals(k.Name, "TestSecret", StringComparison.Ordinal)); Assert.Equal(OperationResult.Created, result.Result); Assert.Equal("TestSecretValue", result.Secret, StringComparer.Ordinal); Assert.NotNull(persistedSecrets); Assert.NotNull(newSecret); Assert.Equal(result.Secret, newSecret.Value); Assert.Equal("TestSecret", newSecret.Name, StringComparer.Ordinal); Assert.NotNull(persistedSecrets.MasterKey); } } finally { Directory.Delete(secretsPath, true); } }
public void AddOrUpdateFunctionSecrets_WithFunctionNameAndNoSecret_GeneratesFunctionSecretsAndPersistsFile() { var secretsPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); try { using (var variables = new TestScopedEnvironmentVariables("AzureWebJobsFeatureFlags", "MultiKey")) { Mock <IKeyValueConverterFactory> mockValueConverterFactory = GetConverterFactoryMock(false); KeyOperationResult result; using (var secretManager = new SecretManager(secretsPath, mockValueConverterFactory.Object)) { result = secretManager.AddOrUpdateFunctionSecret("TestSecret", null, "TestFunction"); } string secretsJson = File.ReadAllText(Path.Combine(secretsPath, "testfunction.json")); FunctionSecrets persistedSecrets = ScriptSecretSerializer.DeserializeSecrets <FunctionSecrets>(secretsJson); Assert.Equal(OperationResult.Created, result.Result); Assert.NotNull(result.Secret); Assert.NotNull(persistedSecrets); Assert.Equal(result.Secret, persistedSecrets.Keys.First().Value); Assert.Equal("TestSecret", persistedSecrets.Keys.First().Name, StringComparer.Ordinal); } } finally { Directory.Delete(secretsPath, true); } }
public void AddOrUpdateFunctionSecrets_WithNoFunctionNameAndProvidedSecret_UsesSecretAndPersistsHostFile() { using (var directory = new TempDirectory()) { string secretName = "TestSecret"; string expectedTraceMessage = string.Format(Resources.TraceAddOrUpdateFunctionSecret, "Host", secretName, "host", "Created"); Mock <IKeyValueConverterFactory> mockValueConverterFactory = GetConverterFactoryMock(false); KeyOperationResult result; var traceWriter = new TestTraceWriter(TraceLevel.Verbose); using (var secretManager = new SecretManager(directory.Path, mockValueConverterFactory.Object, traceWriter)) { result = secretManager.AddOrUpdateFunctionSecret(secretName, "TestSecretValue"); } string secretsJson = File.ReadAllText(Path.Combine(directory.Path, ScriptConstants.HostMetadataFileName)); HostSecrets persistedSecrets = ScriptSecretSerializer.DeserializeSecrets <HostSecrets>(secretsJson); Key newSecret = persistedSecrets.FunctionKeys.FirstOrDefault(k => string.Equals(k.Name, secretName, StringComparison.Ordinal)); Assert.Equal(OperationResult.Created, result.Result); Assert.Equal("TestSecretValue", result.Secret, StringComparer.Ordinal); Assert.NotNull(persistedSecrets); Assert.NotNull(newSecret); Assert.Equal(result.Secret, newSecret.Value); Assert.Equal(secretName, newSecret.Name, StringComparer.Ordinal); Assert.NotNull(persistedSecrets.MasterKey); Assert.True(traceWriter.Traces.Any(t => t.Level == TraceLevel.Info && t.Message.IndexOf(expectedTraceMessage) > -1), "Expected Trace message not found"); } }
public void AddOrUpdateFunctionSecrets_WithFunctionNameAndNoSecret_GeneratesFunctionSecretsAndPersistsFile() { using (var directory = new TempDirectory()) { string secretName = "TestSecret"; string functionName = "TestFunction"; string expectedTraceMessage = string.Format(Resources.TraceAddOrUpdateFunctionSecret, "Function", secretName, functionName, "Created"); Mock <IKeyValueConverterFactory> mockValueConverterFactory = GetConverterFactoryMock(false); KeyOperationResult result; var traceWriter = new TestTraceWriter(TraceLevel.Verbose); using (var secretManager = new SecretManager(directory.Path, mockValueConverterFactory.Object, traceWriter)) { result = secretManager.AddOrUpdateFunctionSecret(secretName, null, functionName); } string secretsJson = File.ReadAllText(Path.Combine(directory.Path, "testfunction.json")); FunctionSecrets persistedSecrets = ScriptSecretSerializer.DeserializeSecrets <FunctionSecrets>(secretsJson); Assert.Equal(OperationResult.Created, result.Result); Assert.NotNull(result.Secret); Assert.NotNull(persistedSecrets); Assert.Equal(result.Secret, persistedSecrets.Keys.First().Value); Assert.Equal(secretName, persistedSecrets.Keys.First().Name, StringComparer.Ordinal); Assert.True(traceWriter.Traces.Any(t => t.Level == TraceLevel.Info && t.Message.IndexOf(expectedTraceMessage) > -1), "Expected Trace message not found"); } }
public void AddOrUpdateFunctionSecrets_WithNoFunctionNameAndProvidedSecret_UsesSecretAndPersistsHostFile() { using (var directory = new TempDirectory()) { string secretName = "TestSecret"; string expectedTraceMessage = string.Format(Resources.TraceAddOrUpdateFunctionSecret, "Host", secretName, "host", "Created"); Mock<IKeyValueConverterFactory> mockValueConverterFactory = GetConverterFactoryMock(false); KeyOperationResult result; var traceWriter = new TestTraceWriter(TraceLevel.Verbose); using (var secretManager = new SecretManager(directory.Path, mockValueConverterFactory.Object, traceWriter)) { result = secretManager.AddOrUpdateFunctionSecret(secretName, "TestSecretValue"); } string secretsJson = File.ReadAllText(Path.Combine(directory.Path, ScriptConstants.HostMetadataFileName)); HostSecrets persistedSecrets = ScriptSecretSerializer.DeserializeSecrets<HostSecrets>(secretsJson); Key newSecret = persistedSecrets.FunctionKeys.FirstOrDefault(k => string.Equals(k.Name, secretName, StringComparison.Ordinal)); Assert.Equal(OperationResult.Created, result.Result); Assert.Equal("TestSecretValue", result.Secret, StringComparer.Ordinal); Assert.NotNull(persistedSecrets); Assert.NotNull(newSecret); Assert.Equal(result.Secret, newSecret.Value); Assert.Equal(secretName, newSecret.Name, StringComparer.Ordinal); Assert.NotNull(persistedSecrets.MasterKey); Assert.True(traceWriter.Traces.Any(t => t.Level == TraceLevel.Info && t.Message.IndexOf(expectedTraceMessage) > -1), "Expected Trace message not found"); } }
public void AddOrUpdateFunctionSecrets_WithFunctionNameAndNoSecret_GeneratesFunctionSecretsAndPersistsFile() { using (var directory = new TempDirectory()) { string secretName = "TestSecret"; string functionName = "TestFunction"; string expectedTraceMessage = string.Format(Resources.TraceAddOrUpdateFunctionSecret, "Function", secretName, functionName, "Created"); Mock<IKeyValueConverterFactory> mockValueConverterFactory = GetConverterFactoryMock(false); KeyOperationResult result; var traceWriter = new TestTraceWriter(TraceLevel.Verbose); using (var secretManager = new SecretManager(directory.Path, mockValueConverterFactory.Object, traceWriter)) { result = secretManager.AddOrUpdateFunctionSecret(secretName, null, functionName); } string secretsJson = File.ReadAllText(Path.Combine(directory.Path, "testfunction.json")); FunctionSecrets persistedSecrets = ScriptSecretSerializer.DeserializeSecrets<FunctionSecrets>(secretsJson); Assert.Equal(OperationResult.Created, result.Result); Assert.NotNull(result.Secret); Assert.NotNull(persistedSecrets); Assert.Equal(result.Secret, persistedSecrets.Keys.First().Value); Assert.Equal(secretName, persistedSecrets.Keys.First().Name, StringComparer.Ordinal); Assert.True(traceWriter.Traces.Any(t => t.Level == TraceLevel.Info && t.Message.IndexOf(expectedTraceMessage) > -1), "Expected Trace message not found"); } }