예제 #1
0
        public virtual void Dispose()
        {
            var busControl = _serviceProvider.GetRequiredService <IBusControl>();

            busControl.Stop();

            JaneBlobStorageClient.Dispose();
            JohnBlobStorageClient.Dispose();
        }
예제 #2
0
        public BlobStorageTestHarness()
        {
            var configuration = new ConfigurationBuilder()
                                .AddJsonFile("appsettings.json", true, true)
                                .AddEnvironmentVariables()
                                .Build();

            Log.Logger = new LoggerConfiguration()
                         .ReadFrom.Configuration(configuration)
                         .MinimumLevel.ControlledBy(new EnvironmentVariableLoggingLevelSwitch("%OSDR_LOG_LEVEL%"))
                         .CreateLogger();

            Log.Information("Staring integration tests");

            JaneBlobStorageClient.Authorize("jane", "qqq123").Wait();
            JohnBlobStorageClient.Authorize("john", "qqq123").Wait();

            var services = new ServiceCollection();

            services.AddOptions();
            services.Configure <MassTransitSettings>(configuration.GetSection("MassTransit"));

            services.AddSingleton(container => Bus.Factory.CreateUsingRabbitMq(x =>
            {
                var mtSettings = container.GetService <IOptions <MassTransitSettings> >().Value;

                IRabbitMqHost host = x.Host(new Uri(Environment.ExpandEnvironmentVariables(mtSettings.ConnectionString)), h => { });

                x.ReceiveEndpoint(host, "processing_fault_queue", e =>
                {
                    e.Handler <Fault>(async context =>
                    {
                        Faults.AddRange(context.Message.Exceptions.Where(ex => !ex.ExceptionType.Equals("System.InvalidOperationException")));

                        await Task.CompletedTask;
                    });
                });

                x.ReceiveEndpoint(host, "processing_update_queue", e =>
                {
                    e.Handler <BlobLoaded>(context => { Received.Add(context); return(Task.CompletedTask); });
                });
            }));

            _serviceProvider = services.BuildServiceProvider();

            var busControl = _serviceProvider.GetRequiredService <IBusControl>();

            busControl.ConnectPublishObserver(new PublishObserver());
            busControl.ConnectConsumeObserver(new ConsumeObserver());

            busControl.Start();
        }
예제 #3
0
        public OsdrTestHarness()
        {
            var configuration = new ConfigurationBuilder()
                                .AddJsonFile("appsettings.json", true, true)
                                .AddEnvironmentVariables()
                                .Build();

            Log.Logger = new LoggerConfiguration()
                         .ReadFrom.Configuration(configuration)
                         .MinimumLevel.ControlledBy(new EnvironmentVariableLoggingLevelSwitch("%OSDR_LOG_LEVEL%"))
                         .CreateLogger();

            Log.Information("Staring integration tests");

            JaneBlobStorageClient.Authorize("jane", "qqq123").Wait();
            JohnBlobStorageClient.Authorize("john", "qqq123").Wait();

            var services = new ServiceCollection();

            services.AddOptions();
            services.Configure <MassTransitSettings>(configuration.GetSection("MassTransit"));

            services.AddSingleton <IEventStore>(y => new GetEventStore(Environment.ExpandEnvironmentVariables(configuration["EventStore:ConnectionString"])));
            services.AddSingleton <IEventPublisher, CqrsLite.MassTransit.MassTransitBus>();
            services.AddTransient <ISession, Session>();
            services.AddSingleton <IRepository, Repository>();
            services.AddSingleton <EventStore.IEventStore>(new EventStore.EventStore(Environment.ExpandEnvironmentVariables(configuration["EventStore:ConnectionString"])));

            var mongoUrl = new MongoUrl(Environment.ExpandEnvironmentVariables(configuration["MongoDb:ConnectionString"]));

            services.AddSingleton(new MongoClient(mongoUrl));
            services.AddScoped(service => service.GetService <MongoClient>().GetDatabase(mongoUrl.DatabaseName));

            services.AddTransient <IBlobStorage, GridFsStorage>(x =>
            {
                var blobStorageUrl = new MongoUrl(Environment.ExpandEnvironmentVariables(configuration["GridFs:ConnectionString"]));
                var client         = new MongoClient(blobStorageUrl);

                return(new GridFsStorage(client.GetDatabase(blobStorageUrl.DatabaseName)));
            });

            services.AddSingleton <IConsumerScopeProvider, DependencyInjectionConsumerScopeProvider>();

            var integrationTestsAssembly = Assembly.LoadFrom("Sds.Osdr.IntegrationTests.dll");

            services.AddAllConsumers(integrationTestsAssembly);

            services.AddSingleton(container => Bus.Factory.CreateUsingRabbitMq(x =>
            {
                var mtSettings = container.GetService <IOptions <MassTransitSettings> >().Value;

                IRabbitMqHost host = x.Host(new Uri(Environment.ExpandEnvironmentVariables(mtSettings.ConnectionString)), h => { });

                x.RegisterConsumers(host, container, e =>
                {
                    e.UseDelayedRedelivery(r =>
                    {
                        r.Interval(mtSettings.RedeliveryCount, TimeSpan.FromMilliseconds(mtSettings.RedeliveryInterval));
                        r.Handle <ConcurrencyException>();
                    });
                    e.UseMessageRetry(r =>
                    {
                        r.Interval(mtSettings.RetryCount, TimeSpan.FromMilliseconds(mtSettings.RetryInterval));
                        r.Handle <ConcurrencyException>();
                    });

                    e.PrefetchCount = mtSettings.PrefetchCount;
                    e.UseInMemoryOutbox();
                }, integrationTestsAssembly);

                x.ReceiveEndpoint(host, "processing_fault_queue", e =>
                {
                    e.Handler <Fault>(async context =>
                    {
                        Faults.AddRange(context.Message.Exceptions.Where(ex => !ex.ExceptionType.Equals("System.InvalidOperationException")));

                        await Task.CompletedTask;
                    });
                });

                x.ReceiveEndpoint(host, "processing_update_queue", e =>
                {
                    e.Handler <Storage.Blob.Events.BlobLoaded>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <Generic.Domain.Events.Users.UserPersisted>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <Generic.Domain.Events.Nodes.UserPersisted>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <Generic.Domain.Events.Folders.FolderPersisted>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <Generic.Domain.Events.Nodes.FolderPersisted>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <Generic.Domain.Events.Files.FileCreated>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <Generic.Domain.Events.Files.NodeStatusPersisted>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <Generic.Domain.Events.Files.StatusPersisted>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <Generic.Sagas.Events.FileProcessed>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <RecordsFile.Sagas.Events.RecordsFileProcessed>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <RecordsFile.Sagas.Events.RecordProcessed>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <RecordsFile.Sagas.Events.InvalidRecordProcessed>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <RecordsFile.Domain.Events.Records.NodeStatusPersisted>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <RecordsFile.Domain.Events.Records.StatusPersisted>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <RecordsFile.Domain.Events.Records.RecordPersisted>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <RecordsFile.Domain.Events.Records.NodeRecordPersisted>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <MachineLearning.Domain.Events.TrainingFinished>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <MachineLearning.Sagas.Events.ModelTrainingFinished>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <MachineLearning.Sagas.Events.PropertiesPredictionFinished>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <MachineLearning.Domain.Events.ModelPersisted>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <MachineLearning.Domain.Events.PermissionChangedPersisted>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <Generic.Domain.Events.Folders.DeletedFolderPersisted>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <Generic.Domain.Events.Nodes.DeletedFolderPersisted>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <Generic.Domain.Events.Folders.MovedFolderPersisted>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <Generic.Domain.Events.Nodes.MovedFolderPersisted>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <Generic.Domain.Events.Folders.RenamedFolderPersisted>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <Generic.Domain.Events.Nodes.RenamedFolderPersisted>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <Generic.Domain.Events.Nodes.RenamedFolderPersisted>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <Generic.Domain.Events.Nodes.PermissionChangedPersisted>(context => { Received.Add(context); return(Task.CompletedTask); });

                    e.Handler <Generic.Domain.Events.Files.PermissionChangedPersisted>(context => { Received.Add(context); return(Task.CompletedTask); });
                });

                x.UseConcurrencyLimit(mtSettings.ConcurrencyLimit);
            }));

            _serviceProvider = services.BuildServiceProvider();

            var busControl = _serviceProvider.GetRequiredService <IBusControl>();

            busControl.ConnectPublishObserver(new PublishObserver());
            busControl.ConnectConsumeObserver(new ConsumeObserver());

            busControl.Start();

            Seed();

            //  Specify how to compare DateTimes inside FluentAssertions
            AssertionOptions.AssertEquivalencyUsing(options =>
                                                    options
                                                    .Using <DateTime>(ctx => ctx.Subject.Should().BeCloseTo(ctx.Expectation, 10000)).WhenTypeIs <DateTime>()
                                                    .Using <DateTimeOffset>(ctx => ctx.Subject.Should().BeCloseTo(ctx.Expectation, 10000)).WhenTypeIs <DateTimeOffset>()
                                                    );
        }