public async Task ConfigureSecretStore_AddMultipleSecretProviders_UsesAllSecretStores() { // Arrange string secretKey1 = "MySecret1"; string secretValue1 = $"secret-{Guid.NewGuid()}"; var stubProvider1 = new InMemorySecretProvider((secretKey1, secretValue1)); string secretKey2 = "MySecret2"; string secretValue2 = $"secret-{Guid.NewGuid()}"; var stubProvider2 = new InMemorySecretProvider((secretKey2, secretValue2)); string secretKey3 = "MySecret3"; string secretValue3 = $"secret-{Guid.NewGuid()}"; var stubProvider3 = new InMemorySecretProvider((secretKey3, secretValue3)); var builder = new StubFunctionsHostBuilder(); // Act builder.ConfigureSecretStore(stores => { stores.AddProvider(stubProvider1); stores.AddProvider(stubProvider2); }).ConfigureSecretStore(stores => stores.AddProvider(stubProvider3)); // Assert IServiceProvider serviceProvider = builder.Build(); var secretProvider = serviceProvider.GetRequiredService <ISecretProvider>(); Assert.Equal(secretValue1, await secretProvider.GetRawSecretAsync(secretKey1)); Assert.Equal(secretValue2, await secretProvider.GetRawSecretAsync(secretKey2)); Assert.Equal(secretValue3, await secretProvider.GetRawSecretAsync(secretKey3)); }
public async Task ConfigureSecretStore_WithDuplicateNames_MakesSubsetOfDuplicateSecretProviderNames() { // Arrange var name = $"duplicate-name-{Guid.NewGuid()}"; string secretName1 = "MySecret-1", secretName2 = "My-Secret2", secretName3 = "My-Secret3", secretName4 = $"My-Secret4"; string secretValue1 = $"secret-{Guid.NewGuid()}", secretValue2 = $"secret-{Guid.NewGuid()}", secretValue3 = $"secret-{Guid.NewGuid()}", secretValue4 = $"secret-{Guid.NewGuid()}"; var builder = new StubFunctionsHostBuilder(); // Act builder.ConfigureSecretStore(stores => { stores.AddProvider(new InMemorySecretProvider((secretName1, secretValue1)), options => options.Name = name) .AddProvider(new InMemorySecretProvider((secretName3, secretValue3)), options => options.Name = "some other name") .AddProvider(new InMemoryCachedSecretProvider((secretName2, secretValue2)), options => options.Name = name) .AddProvider(new InMemorySecretProvider((secretName4, secretValue4))); }); // Assert var store = builder.Build().GetRequiredService <ISecretStore>(); ISecretProvider provider = store.GetProvider(name); Assert.IsNotType <InMemoryCachedSecretProvider>(provider); Assert.Equal(secretValue1, await provider.GetRawSecretAsync(secretName1)); Assert.Equal(secretValue2, await provider.GetRawSecretAsync(secretName2)); await Assert.ThrowsAsync <SecretNotFoundException>(() => provider.GetRawSecretAsync(secretName3)); await Assert.ThrowsAsync <SecretNotFoundException>(() => provider.GetRawSecretAsync(secretName4)); }
public async Task ConfigureSecretStore_WithoutSecretProviders_ThrowsException() { // Arrange var builder = new StubFunctionsHostBuilder(); // Act builder.ConfigureSecretStore(stores => { }); // Assert IServiceProvider serviceProvider = builder.Build(); var secretProvider = serviceProvider.GetRequiredService <ISecretProvider>(); await Assert.ThrowsAsync <SecretNotFoundException>(() => secretProvider.GetSecretAsync("ignored-key")); }
public async Task ConfigureSecretStore_WithoutFoundCachedProvider_ThrowsException() { // Arrange const string secretKey = "MySecret"; var stubProvider = new InMemorySecretProvider((secretKey, $"secret-{Guid.NewGuid()}")); var builder = new StubFunctionsHostBuilder(); // Act builder.ConfigureSecretStore(stores => stores.AddProvider(stubProvider)); // Assert IServiceProvider serviceProvider = builder.Build(); var secretProvider = serviceProvider.GetRequiredService <ICachedSecretProvider>(); await Assert.ThrowsAsync <SecretNotFoundException>(() => secretProvider.InvalidateSecretAsync(secretKey)); }
public void ConfigureSecretStore_WithDuplicateNames_FailsWhenRetrievingTypedCachedSecretProvider() { // Arrange string name = $"duplicate-name-{Guid.NewGuid()}"; var builder = new StubFunctionsHostBuilder(); // Act builder.ConfigureSecretStore(stores => { stores.AddProvider(new InMemoryCachedSecretProvider(), options => options.Name = name) .AddProvider(new InMemoryCachedSecretProvider(), options => options.Name = name); }); // Assert var store = builder.Build().GetRequiredService <ISecretStore>(); Assert.Throws <InvalidOperationException>(() => store.GetProvider <InMemoryCachedSecretProvider>(name)); }
public async Task ConfigureSecretStore_AddInMemorySecretProvider_UsesInMemorySecretsInSecretStore() { // Arrange const string secretKey = "MySecret"; string secretValue = $"secret-{Guid.NewGuid()}"; var stubProvider = new InMemorySecretProvider((secretKey, secretValue)); var builder = new StubFunctionsHostBuilder(); // Act builder.ConfigureSecretStore(stores => stores.AddProvider(stubProvider)); // Assert IServiceProvider serviceProvider = builder.Build(); var secretProvider = serviceProvider.GetRequiredService <ISecretProvider>(); Assert.Equal(secretValue, await secretProvider.GetRawSecretAsync(secretKey)); Assert.NotNull(serviceProvider.GetService <ICachedSecretProvider>()); }