public async Task Should_stop_all_applications()
        {
            vostokMultiHost = new VostokMultiHost(new VostokMultiHostSettings(SetupMultiHost));

            var applications = new List <VostokMultiHostApplicationSettings>();

            for (var i = 0; i < 10; i++)
            {
                applications.Add(
                    new VostokMultiHostApplicationSettings(
                        new NeverEndingApplication(),
                        ("test", i.ToString()),
                        SetupMultiHostApplication));
            }

            foreach (var app in applications)
            {
                vostokMultiHost.AddApplication(app);
            }

            await vostokMultiHost.StartAsync();

            await Task.Delay(1000);

            await vostokMultiHost.StopAsync();

            foreach (var app in applications)
            {
                // ReSharper disable once PossibleNullReferenceException
                vostokMultiHost.GetApplication(app.Identifier).ApplicationState.IsTerminal().Should().BeTrue();
            }
        }
示例#2
0
        public void Should_override_default_host_settings()
        {
            void Assertion(IVostokHostingEnvironment environment)
            {
                environment.ApplicationIdentity.Project.Should().Be("testProject");
                environment.ApplicationIdentity.Environment.Should().Be("testEnvironment");
                environment.ApplicationIdentity.Application.Should().Be("testApplication");
                environment.ApplicationIdentity.Instance.Should().Be("testInstance");
            }

            var vostokMultiHost = new VostokMultiHost(
                new VostokMultiHostSettings(
                    builder =>
            {
                builder.SetupApplicationIdentity(
                    identityBuilder => { identityBuilder.SetProject("testProject").SetEnvironment("testEnvironment").SetApplication("default"); });
                builder.SetupLog(logBuilder => logBuilder.SetupConsoleLog());
            }));

            var application = new VostokMultiHostApplicationSettings(
                new TesterApplication(Assertion),
                ("testApplication", "testInstance"),
                SetupMultiHostApplication);

            vostokMultiHost.AddApplication(application);

            Action run = () => vostokMultiHost.RunAsync().GetAwaiter().GetResult().EnsureSuccess();

            run.Should().NotThrow();
        }
        private void SetupMultiHost()
        {
            var workerApplication = new VostokMultiHostApplicationSettings(
                new TestApplication(),
                ("nevermind", "blabla"),
                MultiHostApplicationBuilder);

            vostokMultiHost = new VostokMultiHost(new VostokMultiHostSettings(MultiHostBuilder), workerApplication);
        }
        public void Should_stop_after_applications_finished()
        {
            var application = new VostokMultiHostApplicationSettings(
                new DelayApplication(),
                ("test", "test"),
                SetupMultiHostApplication);

            var vostokMultiHost = new VostokMultiHost(new VostokMultiHostSettings(SetupMultiHost), application);

            Action run = () => vostokMultiHost.RunAsync().GetAwaiter().GetResult();

            run.ShouldPassIn(1.Seconds());

            vostokMultiHost.MultiHostState.Should().Be(VostokMultiHostState.Exited);
        }
        public async Task Should_run_in_parallel()
        {
            await SetupAndStartMultiHost();

            var appList = new List <VostokMultiHostApplicationSettings>();

            for (var i = 1; i < 11; i++)
            {
                appList.Add(
                    new VostokMultiHostApplicationSettings(
                        new DelayApplication(),
                        ("test", i.ToString()),
                        SetupMultiHostApplication)
                    );
            }

            Action runInParallel = () => vostokMultiHost.RunInParallelAsync(appList).GetAwaiter().GetResult();

            runInParallel.ShouldPassIn((150 * 2).Milliseconds());
        }
        public void Should_throw_on_add_if_VostokMultiHost_not_launched()
        {
            var identifier = ("test", "test");

            var badApplication = new VostokMultiHostApplicationSettings(new BadApplication(false), identifier, SetupMultiHostApplication);

            vostokMultiHost = new VostokMultiHost(new VostokMultiHostSettings(SetupMultiHost));

            Action checkStart = () => vostokMultiHost.StartApplicationAsync(badApplication).GetAwaiter().GetResult();

            checkStart.Should().Throw <InvalidOperationException>();
        }
        public async Task Run_should_not_throw()
        {
            await SetupAndStartMultiHost();

            var identifier = ("test", "test");

            var badApplication = new VostokMultiHostApplicationSettings(new BadApplication(false), identifier, SetupMultiHostApplication);

            Action checkStart = () => vostokMultiHost.RunApplicationAsync(badApplication).GetAwaiter().GetResult();

            checkStart.Should().NotThrow <Exception>();
        }
        public async Task Should_throw_on_add_if_VostokMultiHost_is_stopped()
        {
            await SetupAndStartMultiHost();

            await vostokMultiHost.StopAsync();

            var identifier = ("test", "test");

            var badApplication = new VostokMultiHostApplicationSettings(new BadApplication(false), identifier, SetupMultiHostApplication);

            Action checkStart = () => vostokMultiHost.RunApplicationAsync(badApplication).GetAwaiter().GetResult();

            checkStart.Should().Throw <InvalidOperationException>();
        }
示例#9
0
        public void Should_interpret_MultiHost_builder_settings_as_default_in_applications()
        {
            void Assertion(IVostokHostingEnvironment environment) => environment.HostExtensions.Get <TestHostExtension>().A.Should().Be(10);

            var vostokMultiHost = new VostokMultiHost(
                new VostokMultiHostSettings(
                    builder =>
            {
                builder.SetupLog(logBuilder => logBuilder.SetupConsoleLog());
                builder.SetupHostExtensions(extensionsBuilder => extensionsBuilder.Add(new TestHostExtension(10)));
            }));

            var application = new VostokMultiHostApplicationSettings(
                new TesterApplication(Assertion),
                ("test", "test"),
                SetupMultiHostApplication);

            vostokMultiHost.AddApplication(application);

            Action run = () => vostokMultiHost.RunAsync().GetAwaiter().GetResult().EnsureSuccess();

            run.Should().NotThrow();
        }
示例#10
0
        public async Task Should_be_able_to_override_common_components()
        {
            IHerculesSink extractedSink = null;

            void Assert(IVostokHostingEnvironment environment)
            {
                environment.HerculesSink.Should().BeSameAs(extractedSink);
            }

            void Extract(IVostokHostingEnvironment environment)
            {
                extractedSink = environment.HerculesSink;
            }

            var initialSink = new DevNullHerculesSink();

            var vostokMultiHost = new VostokMultiHost(
                new VostokMultiHostSettings(
                    builder =>
            {
                builder.SetupApplicationIdentity(identityBuilder => identityBuilder.SetProject("testProject").SetEnvironment("testEnvironment"));
                builder.SetupHerculesSink(sinkBuilder => sinkBuilder.UseInstance(initialSink));
                builder.SetupLog(logBuilder => logBuilder.SetupConsoleLog());
            }));

            var extractIdentifier = ("testApplication", "testInstance");

            var extractApplication = new VostokMultiHostApplicationSettings(
                new TesterApplication(Extract),
                extractIdentifier,
                SetupMultiHostApplication);

            var assertIdentifier = ("testApplication", "testInstance2");

            var assertApplication = new VostokMultiHostApplicationSettings(
                new TesterApplication(Assert),
                assertIdentifier,
                SetupMultiHostApplication);

            await vostokMultiHost.StartAsync();

            await vostokMultiHost.RunSequentiallyAsync(extractApplication, assertApplication);

            var results = await vostokMultiHost.StopAsync();

            // ReSharper disable once PossibleNullReferenceException
            results.ApplicationRunResults[assertIdentifier].EnsureSuccess();

            extractedSink.Should().BeSameAs(initialSink);
        }
        public async Task Should_run_sequentially()
        {
            var currentIndex = 0;

            int GetIndex() => currentIndex;

            void SetIndex(int newIndex) => currentIndex = newIndex;

            await SetupAndStartMultiHost();

            var appList = new List <VostokMultiHostApplicationSettings>();

            for (var i = 1; i < 11; i++)
            {
                appList.Add(
                    new VostokMultiHostApplicationSettings(
                        new SequentialCheckerApplication(GetIndex, SetIndex, i),
                        ("test", i.ToString()),
                        SetupMultiHostApplication)
                    );
            }

            await vostokMultiHost.RunSequentiallyAsync(appList);
        }
        public async Task Should_not_stop_if_contains_not_finished_application()
        {
            var application = new VostokMultiHostApplicationSettings(
                new DelayApplication(),
                ("test", "test"),
                SetupMultiHostApplication);

            var newApplication = new VostokMultiHostApplicationSettings(
                new NeverEndingApplication(),
                ("nevermind", "delay"),
                SetupMultiHostApplication);

            var vostokMultiHost = new VostokMultiHost(new VostokMultiHostSettings(SetupMultiHost), application);

            await vostokMultiHost.StartAsync();

            vostokMultiHost.AddApplication(newApplication);

            await Task.Delay(500);

            vostokMultiHost.MultiHostState.Should().Be(VostokMultiHostState.Running);

            await vostokMultiHost.StopAsync();
        }
        public async Task Start_and_stop_should_throw_on_initialize_failed()
        {
            await SetupAndStartMultiHost();

            var identifier = ("test", "test");

            var badApplication = new VostokMultiHostApplicationSettings(new BadApplication(true), identifier, SetupMultiHostApplication);

            Action checkStart = () => vostokMultiHost.StartApplicationAsync(badApplication).GetAwaiter().GetResult();

            checkStart.Should().Throw <Exception>().WithMessage("initialize");

            Action checkStop = () => vostokMultiHost.StopApplicationAsync(identifier).GetAwaiter().GetResult();

            checkStop.Should().Throw <Exception>().WithMessage("initialize");
        }
        public async Task Should_not_throw_on_second_start()
        {
            await SetupAndStartMultiHost();

            var workerIdentifier = ("nevermind", "delay");

            var workerApplication = new VostokMultiHostApplicationSettings(
                new DelayApplication(),
                workerIdentifier,
                SetupMultiHostApplication);

            await vostokMultiHost.StartApplicationAsync(workerApplication);

            Action secondStart = () => vostokMultiHost.GetApplication(workerIdentifier).StartAsync().GetAwaiter().GetResult();

            secondStart.Should().NotThrow();
        }
        public async Task Should_return_same_result_on_second_run()
        {
            await SetupAndStartMultiHost();

            var workerIdentifier = ("nevermind", "delay");

            var workerApplication = new VostokMultiHostApplicationSettings(
                new DelayApplication(),
                workerIdentifier,
                SetupMultiHostApplication);

            var result = await vostokMultiHost.RunApplicationAsync(workerApplication);

            var result2 = await vostokMultiHost.GetApplication(workerIdentifier).RunAsync();

            result.Should().BeSameAs(result2);
        }
        public async Task Start_should_wait_until_given_state_occurs(VostokApplicationState stateToAwait)
        {
            var identifier        = ("test", "test");
            var workerApplication = new VostokMultiHostApplicationSettings(new NeverEndingApplication(), identifier, SetupMultiHostApplication);

            vostokMultiHost = new VostokMultiHost(new VostokMultiHostSettings(SetupMultiHost), workerApplication);

            await vostokMultiHost.StartAsync();

            await vostokMultiHost.GetApplication(identifier).StartAsync(stateToAwait);

            vostokMultiHost.GetApplication(identifier).ApplicationState.Should().Match <VostokApplicationState>(state => state >= stateToAwait);

            await vostokMultiHost.StopApplicationAsync(identifier);

            vostokMultiHost.GetApplication(identifier).ApplicationState.IsTerminal().Should().BeTrue();

            await vostokMultiHost.StopAsync();
        }
        public async Task Start_should_not_throw_on_run_failed()
        {
            await SetupAndStartMultiHost();

            var identifier = ("test", "test");

            var badApplication = new VostokMultiHostApplicationSettings(new BadApplication(false), identifier, SetupMultiHostApplication);

            Action checkStart = () => vostokMultiHost.StartApplicationAsync(badApplication).GetAwaiter().GetResult();

            checkStart.Should().NotThrow <Exception>();

            var application = vostokMultiHost.GetApplication(identifier);

            AssertionAssertions.ShouldPassIn(() => { application.ApplicationState.IsTerminal().Should().BeTrue(); }, 10.Seconds());

            Action checkStop = () => vostokMultiHost.StopApplicationAsync(identifier).GetAwaiter().GetResult();

            checkStop.Should().Throw <Exception>().WithMessage("run");
        }
        public async Task Should_allow_to_subscribe_to_state_changes_prior_to_start()
        {
            vostokMultiHost = new VostokMultiHost(new VostokMultiHostSettings(SetupMultiHost));

            var workerIdentifier = ("nevermind", "delay");

            var workerApplication = new VostokMultiHostApplicationSettings(
                new DelayApplication(),
                workerIdentifier,
                SetupMultiHostApplication);

            var stateChangesCount            = 0;
            VostokApplicationState?lastState = null;

            var observable = vostokMultiHost.AddApplication(workerApplication).OnApplicationStateChanged;

            using (observable.Subscribe(state => stateChangesCount++))
                using (observable.Subscribe(state => lastState = state))
                    await vostokMultiHost.RunAsync();

            stateChangesCount.Should().Be(7);
            lastState.Should().Be(VostokApplicationState.Exited);
        }