public void GetToken_WhenTokenIsNotInCacheAndTokenProxyReturnsNull_ThrowsException() { //Arrange ICacheProvider cacheProvider = CreateCacheProvider(); cacheProvider .GetAsync <string>(Arg.Is("client-id")) .Returns((string)null); AzureBearerTokenOptions options = CreateOptions(); IAzureBearerTokenProxy proxy = CreateTokenProxy(); proxy .FetchToken(Arg.Any <AzureBearerTokenOptions>()) .Returns((AzureBearerToken)null); AzureBearerTokenProvider tokenProvider = CreateTokenProvider(proxy, cacheProvider, options); //Act Func <Task> test = async() => await tokenProvider.GetToken(); //Assert test .Should() .ThrowExactly <Exception>() .Which .Message .Should() .Be("Failed to refersh access token for url: http://test-token-url/"); }
static AzureBearerTokenProvider CreateTokenProvider(IAzureBearerTokenProxy azureBearerTokenProxy = null, ICacheProvider cacheProvider = null, AzureBearerTokenOptions azureBearerTokenOptions = null) { return(new AzureBearerTokenProvider( azureBearerTokenProxy ?? CreateTokenProxy(), cacheProvider ?? CreateCacheProvider(), azureBearerTokenOptions ?? CreateOptions())); }
public static IServiceCollection AddProfilingInterServiceClient(this IServiceCollection builder, IConfiguration config, TimeSpan[] retryTimeSpans = null, int numberOfExceptionsBeforeCircuitBreaker = 100, TimeSpan circuitBreakerFailurePeriod = default, TimeSpan handlerLifetime = default) { if (retryTimeSpans == null) { retryTimeSpans = new[] { TimeSpan.FromMilliseconds(500), TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(5) }; } if (circuitBreakerFailurePeriod == default) { circuitBreakerFailurePeriod = TimeSpan.FromMinutes(1); } var httpBuilder = builder.AddHttpClient(HttpClientKeys.Profiling, (httpClient) => { ApiOptions apiOptions = new ApiOptions(); config.Bind(ClientName, apiOptions); ApiClientConfigurationOptions.SetDefaultApiClientConfigurationOptions(httpClient, apiOptions); }) .ConfigurePrimaryHttpMessageHandler(() => new ApiClientHandler()) .AddTransientHttpErrorPolicy(c => c.WaitAndRetryAsync(retryTimeSpans)) .AddTransientHttpErrorPolicy(c => c.CircuitBreakerAsync(numberOfExceptionsBeforeCircuitBreaker, circuitBreakerFailurePeriod)) .AddUserProfilerHeaderPropagation(); // if a life time for the handler has been set then set it on the client builder if (handlerLifetime != default) { httpBuilder.SetHandlerLifetime(Timeout.InfiniteTimeSpan); } builder.AddSingleton <ICancellationTokenProvider, InactiveCancellationTokenProvider>(); builder.AddSingleton <IAzureBearerTokenProxy, AzureBearerTokenProxy>(); builder.AddSingleton <IProfilingApiClient>((ctx) => { IHttpClientFactory httpClientFactory = ctx.GetService <IHttpClientFactory>(); ILogger logger = ctx.GetService <ILogger>(); ICancellationTokenProvider cancellationTokenProvider = ctx.GetService <ICancellationTokenProvider>(); IAzureBearerTokenProxy azureBearerTokenProxy = ctx.GetService <IAzureBearerTokenProxy>(); ICacheProvider cacheProvider = ctx.GetService <ICacheProvider>(); AzureBearerTokenOptions azureBearerTokenOptions = new AzureBearerTokenOptions(); config.Bind("providerProfilingAzureBearerTokenOptions", azureBearerTokenOptions); AzureBearerTokenProvider bearerTokenProvider = new AzureBearerTokenProvider(azureBearerTokenProxy, cacheProvider, azureBearerTokenOptions); return(new ProfilingApiClient(httpClientFactory, HttpClientKeys.Profiling, logger, bearerTokenProvider, cancellationTokenProvider)); }); return(builder); }
public AzureBearerTokenProvider(IAzureBearerTokenProxy azureBearerTokenProxy, ICacheProvider cacheProvider, AzureBearerTokenOptions azureBearerTokenOptions) { Guard.ArgumentNotNull(azureBearerTokenProxy, nameof(azureBearerTokenProxy)); Guard.ArgumentNotNull(cacheProvider, nameof(cacheProvider)); Guard.ArgumentNotNull(azureBearerTokenOptions, nameof(azureBearerTokenOptions)); _cacheProvider = cacheProvider; _azureBearerTokenOptions = azureBearerTokenOptions; _azureBearerTokenProxy = azureBearerTokenProxy; }
public async Task GetToken_WhenTokenIsNotInCacheButReturnsFromProxy_SetsInCacheReturnsToken() { //Arrange AzureBearerToken azureBearerToken = new AzureBearerToken { AccessToken = "this-is-a-token", ExpiryLength = 3600 }; ICacheProvider cacheProvider = CreateCacheProvider(); cacheProvider .GetAsync <string>(Arg.Is("client-id")) .Returns((string)null); AzureBearerTokenOptions options = CreateOptions(); IAzureBearerTokenProxy proxy = CreateTokenProxy(); proxy .FetchToken(Arg.Any <AzureBearerTokenOptions>()) .Returns(azureBearerToken); AzureBearerTokenProvider tokenProvider = CreateTokenProvider(proxy, cacheProvider, options); //Act string token = await tokenProvider.GetToken(); //Assert token .Should() .BeEquivalentTo(azureBearerToken.AccessToken); await cacheProvider .Received(1) .SetAsync <string>(Arg.Is("client-id"), Arg.Is("this-is-a-token"), Arg.Is(TimeSpan.FromSeconds(3240)), Arg.Is(false), null); }
private static IServiceProvider Register(IServiceCollection builder, IConfigurationRoot config) { builder.AddSingleton <OnCreateAllocationLineResultStatusUpdates>(); builder.AddSingleton <OnCreateAllocationLineResultStatusUpdatesFailure>(); builder.AddSingleton <OnCreateInstructAllocationLineResultStatusUpdates>(); builder.AddSingleton <OnCreateInstructAllocationLineResultStatusUpdatesFailure>(); builder.AddSingleton <OnFetchProviderProfileEvent>(); builder.AddSingleton <OnFetchProviderProfileFailure>(); builder.AddSingleton <OnMigrateFeedIndexIdEvent>(); builder.AddSingleton <OnMigrateResultVersionsEvent>(); builder.AddSingleton <OnProviderResultsPublishedEvent>(); builder.AddSingleton <OnProviderResultsPublishedFailure>(); builder.AddSingleton <OnProviderResultsSpecificationCleanup>(); builder.AddSingleton <OnReIndexAllocationNotificationFeeds>(); builder.AddSingleton <OnReIndexCalculationResults>(); builder.AddSingleton <OnCalculationResultsCsvGeneration>(); builder.AddSingleton <OnCalculationResultsCsvGenerationTimer>(); builder.AddSingleton <ICalculationResultsRepository, CalculationResultsRepository>(); builder.AddSingleton <IResultsService, ResultsService>(); builder.AddSingleton <IPublishedResultsService, PublishedResultsService>(); builder.AddSingleton <IResultsSearchService, ResultsSearchService>(); builder.AddSingleton <ICalculationProviderResultsSearchService, CalculationProviderResultsSearchService>(); builder.AddSingleton <IProviderImportMappingService, ProviderImportMappingService>(); builder.AddSingleton <IAllocationNotificationsFeedsSearchService, AllocationNotificationsFeedsSearchService>(); builder.AddSingleton <ICalculationsRepository, CalculationsRepository>(); builder.AddSingleton <IValidator <MasterProviderModel>, MasterProviderModelValidator>(); builder.AddSingleton <IProviderVariationAssemblerService, ProviderVariationAssemblerService>(); builder.AddSingleton <IProviderVariationsService, ProviderVariationsService>(); builder.AddSingleton <IProviderService, ProviderService>(); builder.AddSingleton <IJobHelperService, JobHelperService>(); builder.AddSingleton <IProviderCalculationResultsReIndexerService, ProviderCalculationResultsReIndexerService>(); builder.AddSingleton <IProviderVariationsStorageRepository, ProviderVariationsStorageRepository>((ctx) => { BlobStorageOptions blobStorageOptions = new BlobStorageOptions(); config.Bind("CommonStorageSettings", blobStorageOptions); blobStorageOptions.ContainerName = "providervariations"; return(new ProviderVariationsStorageRepository(blobStorageOptions)); }); MapperConfiguration resultsConfig = new MapperConfiguration(c => { c.AddProfile <DatasetsMappingProfile>(); c.AddProfile <ResultServiceMappingProfile>(); c.AddProfile <ProviderMappingProfile>(); }); builder .AddSingleton(resultsConfig.CreateMapper()); builder.AddCaching(config); builder.AddSingleton <ICalculationResultsRepository, CalculationResultsRepository>((ctx) => { CosmosDbSettings calssDbSettings = new CosmosDbSettings(); config.Bind("CosmosDbSettings", calssDbSettings); calssDbSettings.CollectionName = "calculationresults"; CosmosRepository calcsCosmosRepostory = new CosmosRepository(calssDbSettings); return(new CalculationResultsRepository(calcsCosmosRepostory)); }); builder.AddSingleton <IProviderSourceDatasetRepository, ProviderSourceDatasetRepository>((ctx) => { CosmosDbSettings provDbSettings = new CosmosDbSettings(); config.Bind("CosmosDbSettings", provDbSettings); provDbSettings.CollectionName = "providerdatasets"; CosmosRepository calcsCosmosRepostory = new CosmosRepository(provDbSettings); return(new ProviderSourceDatasetRepository(calcsCosmosRepostory)); }); builder.AddSingleton <IPublishedProviderResultsRepository, PublishedProviderResultsRepository>((ctx) => { CosmosDbSettings resultsDbSettings = new CosmosDbSettings(); config.Bind("CosmosDbSettings", resultsDbSettings); resultsDbSettings.CollectionName = "publishedproviderresults"; CosmosRepository resultsRepostory = new CosmosRepository(resultsDbSettings); return(new PublishedProviderResultsRepository(resultsRepostory)); }); builder.AddSingleton <IProviderChangesRepository, ProviderChangesRepository>((ctx) => { CosmosDbSettings cosmosSettings = new CosmosDbSettings(); config.Bind("CosmosDbSettings", cosmosSettings); cosmosSettings.CollectionName = "publishedproviderchanges"; CosmosRepository resultsRepostory = new CosmosRepository(cosmosSettings); ILogger logger = ctx.GetService <ILogger>(); return(new ProviderChangesRepository(resultsRepostory, logger)); }); builder .AddSingleton <ISpecificationsRepository, SpecificationsRepository>(); builder .AddSingleton <IPublishedProviderResultsAssemblerService, PublishedProviderResultsAssemblerService>(); builder.AddSingleton <IPublishedProviderResultsSettings, PublishedProviderResultsSettings>((ctx) => { PublishedProviderResultsSettings settings = new PublishedProviderResultsSettings(); config.Bind("PublishedProviderResultsSettings", settings); return(settings); }); builder.AddSingleton <IVersionRepository <PublishedAllocationLineResultVersion>, VersionRepository <PublishedAllocationLineResultVersion> >((ctx) => { CosmosDbSettings versioningDbSettings = new CosmosDbSettings(); config.Bind("CosmosDbSettings", versioningDbSettings); versioningDbSettings.CollectionName = "publishedproviderresults"; CosmosRepository resultsRepostory = new CosmosRepository(versioningDbSettings); return(new VersionRepository <PublishedAllocationLineResultVersion>(resultsRepostory)); }); builder .AddSingleton <IBlobClient, AzureStorage.BlobClient>((ctx) => { AzureStorageSettings storageSettings = new AzureStorageSettings(); config.Bind("AzureStorageSettings", storageSettings); storageSettings.ContainerName = "calculationresultscsv"; return(new AzureStorage.BlobClient(storageSettings)); }); builder.AddSearch(config); builder.AddServiceBus(config); builder.AddCaching(config); builder.AddApplicationInsights(config, "CalculateFunding.Functions.Results"); builder.AddApplicationInsightsTelemetryClient(config, "CalculateFunding.Functions.Results"); builder.AddLogging("CalculateFunding.Functions.Results"); builder.AddTelemetry(); builder.AddCalcsInterServiceClient(config); builder.AddSpecificationsInterServiceClient(config); builder.AddJobsInterServiceClient(config); builder.AddResultsInterServiceClient(config); builder.AddFeatureToggling(config); builder.AddSingleton <IPublishedAllocationLineLogicalResultVersionService, PublishedAllocationLineLogicalResultVersionService>(); builder.AddSingleton <ICancellationTokenProvider, InactiveCancellationTokenProvider>(); builder.AddSingleton <IAzureBearerTokenProxy, AzureBearerTokenProxy>(); builder.AddHttpClient(HttpClientKeys.Profiling, c => { ApiClientConfigurationOptions opts = new ApiClientConfigurationOptions(); config.Bind("providerProfilingClient", opts); SetDefaultApiClientConfigurationOptions(c, opts, builder); }) .ConfigurePrimaryHttpMessageHandler(() => new ApiClientHandler()) .AddTransientHttpErrorPolicy(c => c.WaitAndRetryAsync(retryTimeSpans)) .AddTransientHttpErrorPolicy(c => c.CircuitBreakerAsync(numberOfExceptionsBeforeCircuitBreaker, circuitBreakerFailurePeriod)); builder.AddSingleton <IProfilingApiClient>((ctx) => { IFeatureToggle featureToggle = ctx.GetService <IFeatureToggle>(); bool enableMockProvider = featureToggle.IsProviderProfilingServiceDisabled(); if (enableMockProvider) { return(new MockProviderProfilingRepository()); } else { IHttpClientFactory httpClientFactory = ctx.GetService <IHttpClientFactory>(); ILogger logger = ctx.GetService <ILogger>(); ICancellationTokenProvider cancellationTokenProvider = ctx.GetService <ICancellationTokenProvider>(); IAzureBearerTokenProxy azureBearerTokenProxy = ctx.GetService <IAzureBearerTokenProxy>(); ICacheProvider cacheProvider = ctx.GetService <ICacheProvider>(); AzureBearerTokenOptions azureBearerTokenOptions = new AzureBearerTokenOptions(); config.Bind("providerProfilingAzureBearerTokenOptions", azureBearerTokenOptions); AzureBearerTokenProvider bearerTokenProvider = new AzureBearerTokenProvider(azureBearerTokenProxy, cacheProvider, azureBearerTokenOptions); return(new ProfilingApiClient(httpClientFactory, HttpClientKeys.Profiling, logger, bearerTokenProvider, cancellationTokenProvider)); } }); PolicySettings policySettings = builder.GetPolicySettings(config); ResiliencePolicies resultsResiliencePolicies = CreateResiliencePolicies(policySettings); builder.AddSingleton <IResultsResiliencePolicies>(resultsResiliencePolicies); builder.AddSingleton <IJobHelperResiliencePolicies>(resultsResiliencePolicies); return(builder.BuildServiceProvider()); }