Skip to content

Commit f7e2580

Browse files
committed
Add DI Credentials Factory tests
1 parent d0cf353 commit f7e2580

File tree

2 files changed

+288
-3
lines changed

2 files changed

+288
-3
lines changed

extensions/src/AWSSDK.Extensions.NETCore.Setup/ServiceCollectionExtensions.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ private static IServiceCollection AddCredentialsFactoryInternal(
219219
collection.SetCustomCredentialsFactoryRegistered();
220220
}
221221

222-
awsCredentialsFactoryFunc = awsCredentialsFactoryFunc ?? (sp => new DefaultAWSCredentialsFactory(sp.GetService<AWSOptions>(), sp.GetService<ILoggerFactory>()?.CreateLogger<DefaultAWSCredentialsFactory>()));
222+
awsCredentialsFactoryFunc = awsCredentialsFactoryFunc ?? (sp => sp.CreateDefaultCredentialsFactory(sp.GetService<AWSOptions>()));
223223

224224
var serviceDescriptor = new ServiceDescriptor(typeof(IAWSCredentialsFactory), awsCredentialsFactoryFunc, lifetime);
225225

@@ -271,7 +271,10 @@ private static object CreateServiceClient<T>(
271271
?? sp.GetService<AWSOptions>()
272272
?? sp.GetService<IConfiguration>()?.GetAWSOptions();
273273

274-
if (optionsFunc != null && credentialsFactoryFunc == null && sp.CustomCredentialsFactoryRegistered() && options?.Equals(sp.GetService<AWSOptions>()) != true)
274+
if (optionsFunc != null &&
275+
credentialsFactoryFunc == null &&
276+
sp.CustomCredentialsFactoryRegistered() && // If we're using the default credentials factory, no harm done since we're creating one with the provided AWSOptions below.
277+
options?.Equals(sp.GetService<AWSOptions>()) != true)
275278
{
276279
throw new ArgumentNullException(
277280
nameof(credentialsFactoryFunc),
@@ -281,7 +284,7 @@ private static object CreateServiceClient<T>(
281284

282285
var awsCredentialsFactory = credentialsFactoryFunc?.Invoke(sp, options)
283286
?? sp.GetService<IAWSCredentialsFactory>()
284-
?? new DefaultAWSCredentialsFactory(options, sp.GetService<ILoggerFactory>()?.CreateLogger<DefaultAWSCredentialsFactory>());
287+
?? sp.CreateDefaultCredentialsFactory(options);
285288

286289
var clientFactory = new ClientFactory(
287290
typeof(T),
@@ -293,6 +296,9 @@ private static object CreateServiceClient<T>(
293296
return clientFactory.CreateServiceClient();
294297
}
295298

299+
private static IAWSCredentialsFactory CreateDefaultCredentialsFactory(this IServiceProvider sp, AWSOptions options) =>
300+
new DefaultAWSCredentialsFactory(options, sp.GetService<ILoggerFactory>()?.CreateLogger<DefaultAWSCredentialsFactory>());
301+
296302
private static bool CustomCredentialsFactoryRegistered(this IServiceProvider sp) => sp.GetService<CustomCredentialsFactoryRegisteredType>() != null;
297303

298304
private static void SetCustomCredentialsFactoryRegistered(this IServiceCollection collection) => collection.AddSingleton<CustomCredentialsFactoryRegisteredType>();

extensions/test/NETCore.SetupTests/DependencyInjectionTests.cs

Lines changed: 279 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
using Amazon.Extensions.NETCore.Setup;
99
using Moq;
1010
using System;
11+
using Amazon.Runtime;
12+
using AWSSDK.Extensions.NETCore.Setup;
13+
using Castle.Core.Logging;
1114

1215
namespace DependencyInjectionTests
1316
{
@@ -149,6 +152,282 @@ public void InjectS3ClientWithFactoryBuiltConfig()
149152
Assert.Equal(expectRegion, controller.S3Client.Config.RegionEndpoint);
150153
}
151154

155+
[Fact]
156+
public void InjectS3ClientWithOverridingConfigAndCustomCredentialsProviderFunc()
157+
{
158+
var builder = new ConfigurationBuilder();
159+
builder.AddJsonFile("./TestFiles/GetClientConfigSettingsTest.json");
160+
161+
IConfiguration config = builder.Build();
162+
163+
ServiceCollection services = new ServiceCollection();
164+
services.AddDefaultAWSOptions(config.GetAWSOptions());
165+
services.AddAWSService<IAmazonS3>(
166+
new AWSOptions {Region = RegionEndpoint.EUCentral1 },
167+
credentialsFactoryFunc: (sp, options) => new DefaultAWSCredentialsFactory(options, Mock.Of<Microsoft.Extensions.Logging.ILogger<DefaultAWSCredentialsFactory>>()));
168+
169+
var serviceProvider = services.BuildServiceProvider();
170+
171+
var controller = ActivatorUtilities.CreateInstance<TestController>(serviceProvider);
172+
Assert.NotNull(controller.S3Client);
173+
Assert.Equal(RegionEndpoint.EUCentral1, controller.S3Client.Config.RegionEndpoint);
174+
}
175+
176+
[Fact]
177+
public void GivenCustomAddCredentialsFactoryCall_WhenInjectingS3Client_ThenUseCustomCredentials()
178+
{
179+
var builder = new ConfigurationBuilder();
180+
builder.AddJsonFile("./TestFiles/GetClientConfigSettingsTest.json");
181+
182+
IConfiguration config = builder.Build();
183+
184+
var mockCredentialsFactory = new Mock<IAWSCredentialsFactory>();
185+
mockCredentialsFactory
186+
.Setup(x => x.Create())
187+
.Returns(new BasicAWSCredentials("test", "test"));
188+
189+
ServiceCollection services = new ServiceCollection();
190+
services.AddDefaultAWSOptions(config.GetAWSOptions());
191+
services.AddCredentialsFactory(_ => mockCredentialsFactory.Object);
192+
services.AddAWSService<IAmazonS3>();
193+
194+
var serviceProvider = services.BuildServiceProvider();
195+
196+
var controller = ActivatorUtilities.CreateInstance<TestController>(serviceProvider);
197+
Assert.NotNull(controller.S3Client);
198+
Assert.Equal(RegionEndpoint.USWest2, controller.S3Client.Config.RegionEndpoint);
199+
mockCredentialsFactory.Verify(x => x.Create(), Times.Once);
200+
}
201+
202+
[Fact]
203+
public void GivenCustomAddCredentialsFactory_WhenInjectingS3ClientWithOverridingConfigAndCustomCredentialsProviderFunc_ThenUseOverride()
204+
{
205+
var builder = new ConfigurationBuilder();
206+
builder.AddJsonFile("./TestFiles/GetClientConfigSettingsTest.json");
207+
208+
IConfiguration config = builder.Build();
209+
210+
var mockCredentialsFactory = new Mock<IAWSCredentialsFactory>();
211+
mockCredentialsFactory
212+
.Setup(x => x.Create())
213+
.Returns(new BasicAWSCredentials("test", "test"));
214+
215+
var mockOverridenCredentialsFactory = new Mock<IAWSCredentialsFactory>();
216+
mockOverridenCredentialsFactory
217+
.Setup(x => x.Create())
218+
.Returns(new BasicAWSCredentials("overriden", "overriden"));
219+
220+
var awsOptions = new AWSOptions {Region = RegionEndpoint.EUCentral1 };
221+
AWSOptions providedOptionsToCredentialsFactoryFunc = new AWSOptions();
222+
223+
ServiceCollection services = new ServiceCollection();
224+
services.AddDefaultAWSOptions(config.GetAWSOptions());
225+
services.AddCredentialsFactory(sp => mockCredentialsFactory.Object);
226+
services.AddAWSService<IAmazonS3>(
227+
awsOptions,
228+
credentialsFactoryFunc: (sp, options) =>
229+
{
230+
providedOptionsToCredentialsFactoryFunc = options;
231+
return mockOverridenCredentialsFactory.Object;
232+
});
233+
234+
var serviceProvider = services.BuildServiceProvider();
235+
236+
var controller = ActivatorUtilities.CreateInstance<TestController>(serviceProvider);
237+
Assert.NotNull(controller.S3Client);
238+
Assert.Equal(RegionEndpoint.EUCentral1, controller.S3Client.Config.RegionEndpoint);
239+
Assert.Equal(providedOptionsToCredentialsFactoryFunc, awsOptions);
240+
mockOverridenCredentialsFactory.Verify(x => x.Create(), Times.Once);
241+
mockCredentialsFactory.Verify(x => x.Create(), Times.Never);
242+
}
243+
244+
[Fact]
245+
public void GivenCustomAddCredentialsFactory_WhenInjectingS3ClientWithOverridingConfigAndNoCustomCredentialsProviderFunc_ThrowException()
246+
{
247+
var builder = new ConfigurationBuilder();
248+
builder.AddJsonFile("./TestFiles/GetClientConfigSettingsTest.json");
249+
250+
IConfiguration config = builder.Build();
251+
252+
var mockCredentialsFactory = new Mock<IAWSCredentialsFactory>();
253+
mockCredentialsFactory
254+
.Setup(x => x.Create())
255+
.Returns(new BasicAWSCredentials("test", "test"));
256+
257+
ServiceCollection services = new ServiceCollection();
258+
services.AddDefaultAWSOptions(config.GetAWSOptions());
259+
services.AddCredentialsFactory(sp => mockCredentialsFactory.Object);
260+
services.AddAWSService<IAmazonS3>(new AWSOptions {Region = RegionEndpoint.EUCentral1 });
261+
262+
var serviceProvider = services.BuildServiceProvider();
263+
264+
Func<TestController> controllerAction = () => ActivatorUtilities.CreateInstance<TestController>(serviceProvider);
265+
Assert.Throws<ArgumentNullException>(controllerAction);
266+
mockCredentialsFactory.Verify(x => x.Create(), Times.Never);
267+
}
268+
269+
[Fact]
270+
public void GivenDefaultAddCredentialsFactory_WhenInjectingS3ClientWithSameConfigAsRegisteredAndNoCustomCredentialsProviderFunc_ThenWork()
271+
{
272+
var builder = new ConfigurationBuilder();
273+
builder.AddJsonFile("./TestFiles/GetClientConfigSettingsTest.json");
274+
275+
IConfiguration config = builder.Build();
276+
277+
var awsOptions = new AWSOptions {Region = RegionEndpoint.EUCentral1 };
278+
var mockCredentialsFactory = new Mock<IAWSCredentialsFactory>();
279+
mockCredentialsFactory
280+
.Setup(x => x.Create())
281+
.Returns(new BasicAWSCredentials("test", "test"));
282+
283+
ServiceCollection services = new ServiceCollection();
284+
services.AddDefaultAWSOptions(awsOptions);
285+
services.AddCredentialsFactory(_ => mockCredentialsFactory.Object);
286+
services.AddAWSService<IAmazonS3>(awsOptions);
287+
288+
var serviceProvider = services.BuildServiceProvider();
289+
290+
var controller = ActivatorUtilities.CreateInstance<TestController>(serviceProvider);
291+
Assert.NotNull(controller.S3Client);
292+
Assert.Equal(RegionEndpoint.EUCentral1, controller.S3Client.Config.RegionEndpoint);
293+
mockCredentialsFactory.Verify(x => x.Create(), Times.Once);
294+
}
295+
296+
[Fact]
297+
public void GivenDefaultAddCredentialsFactoryCall_WhenInjectingS3ClientWithOverridingConfigAndNoCustomCredentialsProviderFunc_ThenWork()
298+
{
299+
var builder = new ConfigurationBuilder();
300+
builder.AddJsonFile("./TestFiles/GetClientConfigSettingsTest.json");
301+
302+
IConfiguration config = builder.Build();
303+
304+
ServiceCollection services = new ServiceCollection();
305+
services.AddDefaultAWSOptions(config.GetAWSOptions());
306+
services.AddCredentialsFactory();
307+
services.AddAWSService<IAmazonS3>(new AWSOptions {Region = RegionEndpoint.EUCentral1 });
308+
309+
var serviceProvider = services.BuildServiceProvider();
310+
311+
var controller = ActivatorUtilities.CreateInstance<TestController>(serviceProvider);
312+
Assert.NotNull(controller.S3Client);
313+
Assert.Equal(RegionEndpoint.EUCentral1, controller.S3Client.Config.RegionEndpoint);
314+
}
315+
316+
[Fact]
317+
public void GivenDefaultAddCredentialsFactoryCall_WhenInjectingS3Client_ThenWork()
318+
{
319+
var builder = new ConfigurationBuilder();
320+
builder.AddJsonFile("./TestFiles/GetClientConfigSettingsTest.json");
321+
322+
IConfiguration config = builder.Build();
323+
324+
ServiceCollection services = new ServiceCollection();
325+
services.AddDefaultAWSOptions(config.GetAWSOptions());
326+
services.AddCredentialsFactory();
327+
services.AddAWSService<IAmazonS3>();
328+
329+
var serviceProvider = services.BuildServiceProvider();
330+
331+
var controller = ActivatorUtilities.CreateInstance<TestController>(serviceProvider);
332+
Assert.NotNull(controller.S3Client);
333+
Assert.Equal(RegionEndpoint.USWest2, controller.S3Client.Config.RegionEndpoint);
334+
}
335+
336+
[Fact]
337+
public void GivenNoAddCredentialsFactoryCall_WhenInjectingS3ClientWithOverridingConfigAndNoCustomCredentialsProviderFunc_ThenUseDefault()
338+
{
339+
var builder = new ConfigurationBuilder();
340+
builder.AddJsonFile("./TestFiles/GetClientConfigSettingsTest.json");
341+
342+
IConfiguration config = builder.Build();
343+
344+
ServiceCollection services = new ServiceCollection();
345+
services.AddDefaultAWSOptions(config.GetAWSOptions());
346+
services.AddAWSService<IAmazonS3>(new AWSOptions {Region = RegionEndpoint.EUCentral1 });
347+
348+
var serviceProvider = services.BuildServiceProvider();
349+
350+
var controller = ActivatorUtilities.CreateInstance<TestController>(serviceProvider);
351+
Assert.NotNull(controller.S3Client);
352+
Assert.Equal(RegionEndpoint.EUCentral1, controller.S3Client.Config.RegionEndpoint);
353+
}
354+
355+
[Fact]
356+
public void GivenNoAddCredentialsFactoryCall_WhenInjectingS3ClientWithNoOverridingConfigAndNoCustomCredentialsProviderFunc_ThenUseDefault()
357+
{
358+
var builder = new ConfigurationBuilder();
359+
builder.AddJsonFile("./TestFiles/GetClientConfigSettingsTest.json");
360+
361+
IConfiguration config = builder.Build();
362+
363+
ServiceCollection services = new ServiceCollection();
364+
services.AddDefaultAWSOptions(config.GetAWSOptions());
365+
services.AddAWSService<IAmazonS3>();
366+
367+
var serviceProvider = services.BuildServiceProvider();
368+
369+
var controller = ActivatorUtilities.CreateInstance<TestController>(serviceProvider);
370+
Assert.NotNull(controller.S3Client);
371+
Assert.Equal(RegionEndpoint.USWest2, controller.S3Client.Config.RegionEndpoint);
372+
}
373+
374+
[Fact]
375+
public void GivenNoAddCredentialsFactoryCall_WhenInjectingS3ClientWithNoOverridingConfigButCustomCredentialsProviderFunc_ThenUseCustom()
376+
{
377+
var builder = new ConfigurationBuilder();
378+
builder.AddJsonFile("./TestFiles/GetClientConfigSettingsTest.json");
379+
380+
IConfiguration config = builder.Build();
381+
382+
var mockOverridenCredentialsFactory = new Mock<IAWSCredentialsFactory>();
383+
mockOverridenCredentialsFactory
384+
.Setup(x => x.Create())
385+
.Returns(new BasicAWSCredentials("overriden", "overriden"));
386+
387+
ServiceCollection services = new ServiceCollection();
388+
services.AddDefaultAWSOptions(config.GetAWSOptions());
389+
services.AddAWSService<IAmazonS3>((AWSOptions)null, credentialsFactoryFunc: (sp, options) => mockOverridenCredentialsFactory.Object);
390+
391+
var serviceProvider = services.BuildServiceProvider();
392+
393+
var controller = ActivatorUtilities.CreateInstance<TestController>(serviceProvider);
394+
Assert.NotNull(controller.S3Client);
395+
Assert.Equal(RegionEndpoint.USWest2, controller.S3Client.Config.RegionEndpoint);
396+
mockOverridenCredentialsFactory.Verify(x => x.Create(), Times.Once);
397+
}
398+
399+
[Fact]
400+
public void GivenCustomAddCredentialsFactoryCall_WhenInjectingS3ClientWithNoOverridingConfigButCustomCredentialsProviderFunc_ThenUseCustom()
401+
{
402+
var builder = new ConfigurationBuilder();
403+
builder.AddJsonFile("./TestFiles/GetClientConfigSettingsTest.json");
404+
405+
IConfiguration config = builder.Build();
406+
407+
var mockCredentialsFactory = new Mock<IAWSCredentialsFactory>();
408+
mockCredentialsFactory
409+
.Setup(x => x.Create())
410+
.Returns(new BasicAWSCredentials("test", "test"));
411+
412+
var mockOverridenCredentialsFactory = new Mock<IAWSCredentialsFactory>();
413+
mockOverridenCredentialsFactory
414+
.Setup(x => x.Create())
415+
.Returns(new BasicAWSCredentials("overriden", "overriden"));
416+
417+
ServiceCollection services = new ServiceCollection();
418+
services.AddDefaultAWSOptions(config.GetAWSOptions());
419+
services.AddCredentialsFactory(_ => mockCredentialsFactory.Object);
420+
services.AddAWSService<IAmazonS3>((AWSOptions)null, credentialsFactoryFunc: (sp, options) => mockOverridenCredentialsFactory.Object);
421+
422+
var serviceProvider = services.BuildServiceProvider();
423+
424+
var controller = ActivatorUtilities.CreateInstance<TestController>(serviceProvider);
425+
Assert.NotNull(controller.S3Client);
426+
Assert.Equal(RegionEndpoint.USWest2, controller.S3Client.Config.RegionEndpoint);
427+
mockOverridenCredentialsFactory.Verify(x => x.Create(), Times.Once);
428+
mockCredentialsFactory.Verify(x => x.Create(), Times.Never);
429+
}
430+
152431
public class TestController
153432
{
154433
public IAmazonS3 S3Client { get; private set; }

0 commit comments

Comments
 (0)