public async Task GivenAFhirRequestContextAccessor_WhenOnDifferentAsyncThreads_TheFhirContextIsDifferent() { var fhirRequestContextAccessor = new FhirRequestContextAccessor(); var thread1 = Task.Run(async() => { IFhirRequestContext fhirRequestContext = Substitute.For <IFhirRequestContext>(); fhirRequestContext.CorrelationId.Returns(Guid.NewGuid().ToString()); fhirRequestContextAccessor.FhirRequestContext = fhirRequestContext; await Task.Delay(50); return(fhirRequestContextAccessor.FhirRequestContext); }); var thread2 = Task.Run(async() => { IFhirRequestContext fhirRequestContext = Substitute.For <IFhirRequestContext>(); fhirRequestContext.CorrelationId.Returns(Guid.NewGuid().ToString()); fhirRequestContextAccessor.FhirRequestContext = fhirRequestContext; await Task.Delay(0); return(fhirRequestContextAccessor.FhirRequestContext); }); var correlationId1 = (await thread1).CorrelationId; var correlationId2 = (await thread2).CorrelationId; Assert.NotEqual(Guid.Empty.ToString(), correlationId1); Assert.NotEqual(Guid.Empty.ToString(), correlationId2); Assert.NotEqual(correlationId1, correlationId2); }
public IntegrationTestCosmosDataStore() { _cosmosDataStoreConfiguration = new CosmosDataStoreConfiguration { Host = Environment.GetEnvironmentVariable("CosmosDb:Host") ?? CosmosDbLocalEmulator.Host, Key = Environment.GetEnvironmentVariable("CosmosDb:Key") ?? CosmosDbLocalEmulator.Key, DatabaseId = Environment.GetEnvironmentVariable("CosmosDb:DatabaseId") ?? "FhirTests", AllowDatabaseCreation = true, PreferredLocations = Environment.GetEnvironmentVariable("CosmosDb:PreferredLocations")?.Split(';', StringSplitOptions.RemoveEmptyEntries), }; _cosmosCollectionConfiguration = new CosmosCollectionConfiguration { CollectionId = Guid.NewGuid().ToString(), }; var fhirStoredProcs = typeof(IFhirStoredProcedure).Assembly .GetTypes() .Where(x => !x.IsAbstract && typeof(IFhirStoredProcedure).IsAssignableFrom(x)) .ToArray() .Select(type => (IFhirStoredProcedure)Activator.CreateInstance(type)); var optionsMonitor = Substitute.For <IOptionsMonitor <CosmosCollectionConfiguration> >(); optionsMonitor.Get(CosmosDb.Constants.CollectionConfigurationName).Returns(_cosmosCollectionConfiguration); var updaters = new IFhirCollectionUpdater[] { new FhirCollectionSettingsUpdater(_cosmosDataStoreConfiguration, optionsMonitor, NullLogger <FhirCollectionSettingsUpdater> .Instance), new FhirStoredProcedureInstaller(fhirStoredProcs), }; var dbLock = new CosmosDbDistributedLockFactory(Substitute.For <Func <IScoped <IDocumentClient> > >(), NullLogger <CosmosDbDistributedLock> .Instance); var upgradeManager = new FhirCollectionUpgradeManager(updaters, _cosmosDataStoreConfiguration, optionsMonitor, dbLock, NullLogger <FhirCollectionUpgradeManager> .Instance); IDocumentClientTestProvider testProvider = new DocumentClientReadWriteTestProvider(); var documentClientInitializer = new DocumentClientInitializer(testProvider, NullLogger <DocumentClientInitializer> .Instance); _documentClient = documentClientInitializer.CreateDocumentClient(_cosmosDataStoreConfiguration); var fhirCollectionInitializer = new CollectionInitializer(_cosmosCollectionConfiguration.CollectionId, _cosmosDataStoreConfiguration, _cosmosCollectionConfiguration.InitialCollectionThroughput, upgradeManager, NullLogger <CollectionInitializer> .Instance); documentClientInitializer.InitializeDataStore(_documentClient, _cosmosDataStoreConfiguration, new List <ICollectionInitializer> { fhirCollectionInitializer }).GetAwaiter().GetResult(); var cosmosDocumentQueryFactory = new FhirCosmosDocumentQueryFactory(Substitute.For <IFhirRequestContextAccessor>(), NullFhirDocumentQueryLogger.Instance); var fhirRequestContextAccessor = new FhirRequestContextAccessor(); _dataStore = new FhirDataStore( new NonDisposingScope(_documentClient), _cosmosDataStoreConfiguration, cosmosDocumentQueryFactory, new RetryExceptionPolicyFactory(_cosmosDataStoreConfiguration), fhirRequestContextAccessor, optionsMonitor, NullLogger <FhirDataStore> .Instance); }
public async Task InitializeAsync() { var fhirStoredProcs = typeof(IStoredProcedure).Assembly .GetTypes() .Where(x => !x.IsAbstract && typeof(IStoredProcedure).IsAssignableFrom(x)) .ToArray() .Select(type => (IStoredProcedure)Activator.CreateInstance(type)); var optionsMonitor = Substitute.For <IOptionsMonitor <CosmosCollectionConfiguration> >(); optionsMonitor.Get(CosmosDb.Constants.CollectionConfigurationName).Returns(_cosmosCollectionConfiguration); var searchParameterDefinitionManager = new SearchParameterDefinitionManager(ModelInfoProvider.Instance); searchParameterDefinitionManager.Start(); _filebasedSearchParameterRegistry = new FilebasedSearchParameterRegistry(searchParameterDefinitionManager, ModelInfoProvider.Instance); var updaters = new ICollectionUpdater[] { new FhirCollectionSettingsUpdater(_cosmosDataStoreConfiguration, optionsMonitor, NullLogger <FhirCollectionSettingsUpdater> .Instance), new StoredProcedureInstaller(fhirStoredProcs), new CosmosDbStatusRegistryInitializer( () => _filebasedSearchParameterRegistry, new CosmosQueryFactory( new CosmosResponseProcessor(Substitute.For <IFhirRequestContextAccessor>(), Substitute.For <IMediator>(), NullLogger <CosmosResponseProcessor> .Instance), NullFhirCosmosQueryLogger.Instance)), }; var dbLock = new CosmosDbDistributedLockFactory(Substitute.For <Func <IScoped <Container> > >(), NullLogger <CosmosDbDistributedLock> .Instance); var upgradeManager = new CollectionUpgradeManager(updaters, _cosmosDataStoreConfiguration, optionsMonitor, dbLock, NullLogger <CollectionUpgradeManager> .Instance); ICosmosClientTestProvider testProvider = new CosmosClientReadWriteTestProvider(); var fhirRequestContextAccessor = new FhirRequestContextAccessor(); var cosmosResponseProcessor = Substitute.For <ICosmosResponseProcessor>(); var responseProcessor = new CosmosResponseProcessor(fhirRequestContextAccessor, Substitute.For <IMediator>(), NullLogger <CosmosResponseProcessor> .Instance); var handler = new FhirCosmosResponseHandler(() => new NonDisposingScope(_container), _cosmosDataStoreConfiguration, fhirRequestContextAccessor, responseProcessor); var documentClientInitializer = new FhirCosmosClientInitializer(testProvider, new[] { handler }, NullLogger <FhirCosmosClientInitializer> .Instance); _cosmosClient = documentClientInitializer.CreateCosmosClient(_cosmosDataStoreConfiguration); var fhirCollectionInitializer = new CollectionInitializer(_cosmosCollectionConfiguration.CollectionId, _cosmosDataStoreConfiguration, _cosmosCollectionConfiguration.InitialCollectionThroughput, upgradeManager, NullLogger <CollectionInitializer> .Instance); // Cosmos DB emulators throws errors when multiple collections are initialized concurrently. // Use the semaphore to only allow one initialization at a time. await CollectionInitializationSemaphore.WaitAsync(); try { await documentClientInitializer.InitializeDataStore(_cosmosClient, _cosmosDataStoreConfiguration, new List <ICollectionInitializer> { fhirCollectionInitializer }); _container = documentClientInitializer.CreateFhirContainer(_cosmosClient, _cosmosDataStoreConfiguration.DatabaseId, _cosmosCollectionConfiguration.CollectionId); } finally { CollectionInitializationSemaphore.Release(); } var cosmosDocumentQueryFactory = new CosmosQueryFactory(cosmosResponseProcessor, NullFhirCosmosQueryLogger.Instance); var documentClient = new NonDisposingScope(_container); _fhirDataStore = new CosmosFhirDataStore( documentClient, _cosmosDataStoreConfiguration, optionsMonitor, cosmosDocumentQueryFactory, new RetryExceptionPolicyFactory(_cosmosDataStoreConfiguration), NullLogger <CosmosFhirDataStore> .Instance, new VersionSpecificModelInfoProvider(), Options.Create(new CoreFeatureConfiguration())); _fhirOperationDataStore = new CosmosFhirOperationDataStore( documentClient, _cosmosDataStoreConfiguration, optionsMonitor, new RetryExceptionPolicyFactory(_cosmosDataStoreConfiguration), new CosmosQueryFactory(responseProcessor, new NullFhirCosmosQueryLogger()), NullLogger <CosmosFhirOperationDataStore> .Instance); _fhirStorageTestHelper = new CosmosDbFhirStorageTestHelper( _container, _cosmosDataStoreConfiguration.DatabaseId, _cosmosCollectionConfiguration.CollectionId); }
public async Task InitializeAsync() { var fhirStoredProcs = typeof(IFhirStoredProcedure).Assembly .GetTypes() .Where(x => !x.IsAbstract && typeof(IFhirStoredProcedure).IsAssignableFrom(x)) .ToArray() .Select(type => (IFhirStoredProcedure)Activator.CreateInstance(type)); var optionsMonitor = Substitute.For <IOptionsMonitor <CosmosCollectionConfiguration> >(); optionsMonitor.Get(CosmosDb.Constants.CollectionConfigurationName).Returns(_cosmosCollectionConfiguration); var updaters = new IFhirCollectionUpdater[] { new FhirCollectionSettingsUpdater(_cosmosDataStoreConfiguration, optionsMonitor, NullLogger <FhirCollectionSettingsUpdater> .Instance), new FhirStoredProcedureInstaller(fhirStoredProcs), }; var dbLock = new CosmosDbDistributedLockFactory(Substitute.For <Func <IScoped <IDocumentClient> > >(), NullLogger <CosmosDbDistributedLock> .Instance); var upgradeManager = new FhirCollectionUpgradeManager(updaters, _cosmosDataStoreConfiguration, optionsMonitor, dbLock, NullLogger <FhirCollectionUpgradeManager> .Instance); IDocumentClientTestProvider testProvider = new DocumentClientReadWriteTestProvider(); var fhirRequestContextAccessor = new FhirRequestContextAccessor(); var documentClientInitializer = new FhirDocumentClientInitializer(testProvider, fhirRequestContextAccessor, NullLogger <FhirDocumentClientInitializer> .Instance); _documentClient = documentClientInitializer.CreateDocumentClient(_cosmosDataStoreConfiguration); var fhirCollectionInitializer = new CollectionInitializer(_cosmosCollectionConfiguration.CollectionId, _cosmosDataStoreConfiguration, _cosmosCollectionConfiguration.InitialCollectionThroughput, upgradeManager, NullLogger <CollectionInitializer> .Instance); // Cosmos DB emulators throws errors when multiple collections are initialized concurrently. // Use the semaphore to only allow one initialization at a time. await CollectionInitializationSemaphore.WaitAsync(); try { await documentClientInitializer.InitializeDataStore(_documentClient, _cosmosDataStoreConfiguration, new List <ICollectionInitializer> { fhirCollectionInitializer }); } finally { CollectionInitializationSemaphore.Release(); } var cosmosDocumentQueryFactory = new FhirCosmosDocumentQueryFactory(Substitute.For <IFhirRequestContextAccessor>(), NullFhirDocumentQueryLogger.Instance); var documentClient = new NonDisposingScope(_documentClient); _fhirDataStore = new CosmosFhirDataStore( () => documentClient, _cosmosDataStoreConfiguration, optionsMonitor, cosmosDocumentQueryFactory, new RetryExceptionPolicyFactory(_cosmosDataStoreConfiguration), NullLogger <CosmosFhirDataStore> .Instance, new Stu3ModelInfoProvider()); _fhirOperationDataStore = new CosmosFhirOperationDataStore( () => documentClient, _cosmosDataStoreConfiguration, optionsMonitor, new RetryExceptionPolicyFactory(_cosmosDataStoreConfiguration), NullLogger <CosmosFhirOperationDataStore> .Instance); _fhirStorageTestHelper = new CosmosDbFhirStorageTestHelper( _documentClient, UriFactory.CreateDocumentCollectionUri(_cosmosDataStoreConfiguration.DatabaseId, _cosmosCollectionConfiguration.CollectionId)); }