예제 #1
0
            public void ShouldFilter()
            {
                var documentItFiltered = "document.it.filtered";
                var commandFilterThis  = "command.filter.this";
                var consumedEvent      = new AutoResetEvent(false);
                var storage            = new InMemoryKeyValueStorage <ExpandoObject>();
                var filter             = new DynamicFilter <ExpandoObject>((m, s) => true, storage);

                this.StartBus(
                    "pipeline",
                    cfg =>
                {
                    cfg.On(commandFilterThis)
                    .ReactWith(new PipelineConsumerOf <ExpandoObject>(filter, new StaticRouter(documentItFiltered)))
                    .RequiresAccept();
                    cfg.Route(documentItFiltered);
                });

                var producer = this.StartBus(
                    "producer",
                    cfg => { cfg.Route(commandFilterThis); });

                this.StartBus(
                    "consumer",
                    cfg =>
                {
                    cfg.On(documentItFiltered)
                    .ReactWith <ExpandoObject>((m, ctx) => { consumedEvent.Set(); });
                });

                producer.Emit(commandFilterThis, new { });
                var consumed = consumedEvent.WaitOne(5000);

                consumed.Should().BeTrue("Должно быть получено сообщение обработанное фильтом.");
            }
예제 #2
0
            public void ShouldRoute()
            {
                var documentItRouted = "document.it.routed";
                var commandRouteThis = "command.route.this";
                var consumedEvent = new AutoResetEvent(false);
                var storage = new InMemoryKeyValueStorage<ExpandoObject>();
                var router = new DynamicRouter<ExpandoObject>((m, s) => documentItRouted.ToMessageLabel(), storage);
                this.StartBus(
                    "pipeline", 
                    cfg =>
                        {
                            cfg.On(commandRouteThis)
                                .ReactWith(new PipelineConsumerOf<ExpandoObject>(router))
                                .RequiresAccept();
                            cfg.Route(documentItRouted);
                        });

                var producer = this.StartBus(
                    "producer", 
                    cfg => { cfg.Route(commandRouteThis); });

                this.StartBus(
                    "consumer", 
                    cfg =>
                        {
                            cfg.On(documentItRouted)
                                .ReactWith<ExpandoObject>((m, ctx) => { consumedEvent.Set(); });
                        });

                producer.Emit(commandRouteThis, new { });
                var consumed = consumedEvent.WaitOne(5000);
                consumed.Should()
                    .BeTrue("Должно быть получено сообщение перенаправленое роутером.");
            }
        public void StaticDataTests()
        {
            var storage = new InMemoryKeyValueStorage <Guid, Book>(RandomDataGenerator.SampleData());

            Assert.AreEqual(storage.Count, (uint)2);
            Assert.AreEqual(storage.Get(RandomDataGenerator.theHobbit.Key), RandomDataGenerator.theHobbit.Value);
            Assert.AreEqual(storage.Get(RandomDataGenerator.theLordOfTheRings.Key), RandomDataGenerator.theLordOfTheRings.Value);
            Assert.AreEqual(storage.Get(Guid.NewGuid()), default(Book));
        }
예제 #4
0
        //Load.File("C:\Temp\MandolineCache\IND_DB\aug136fdbin_mandoline.db.fcst.rawdic");


        static void Main(string[] args)
        {
            var repl = new Replify.ClearScriptRepl();

            var randomData = RandomDataGenerator.RandomData(100000).ToArray();
            var storage    = new InMemoryKeyValueStorage <Guid, Book>(randomData);

            repl.AddHostObject("inmemory", storage);
            repl.AddHostObject("Mode", typeof(Tester.Mode));
            repl.AddHostObject("test", new Tester());
            repl.AddHostObject("Load", new Loader());

            repl.StartReplLoop(args);
        }
예제 #5
0
            public void ShouldChangeFilterCondition()
            {
                var documentItFiltered  = "document.it.fitered";
                var commandFilterThis   = "command.filter.this";
                var commandChangeFilter = "command.change.filter";
                var key             = "key";
                var switchCondition = 4;
                var callCount       = 0;
                var filteredEvent   = new AutoResetEvent(false);
                var consumedEvent   = new ManualResetEvent(false);
                var storage         = new InMemoryKeyValueStorage <ExpandoObject>();
                var filter          = new DynamicFilter <ExpandoObject>(
                    (m, s) =>
                {
                    dynamic data = s.Get(key);
                    filteredEvent.Set();
                    return(!(data == null || data.Count < switchCondition));
                },
                    storage);
                var control = new DynamicRouter <ExpandoObject> .DynamicRouterControlConsumer <ExpandoObject>(
                    (message, filterStorage) =>
                {
                    dynamic data = filterStorage.Get(key);
                    if (data == null)
                    {
                        dynamic item = new ExpandoObject();
                        item.Count   = 1;
                        filterStorage.Set(key, item);
                        filteredEvent.Set();
                        return;
                    }

                    data.Count++;
                    filterStorage.Set(key, data);
                    filteredEvent.Set();
                },
                    storage);

                this.StartBus(
                    "pipeline",
                    cfg =>
                {
                    cfg.On(commandFilterThis)
                    .ReactWith(new PipelineConsumerOf <ExpandoObject>(filter, new StaticRouter(documentItFiltered)))
                    .RequiresAccept();
                    cfg.On(commandChangeFilter)
                    .ReactWith(control);
                    cfg.Route(documentItFiltered);
                });

                var producer = this.StartBus(
                    "producer",
                    cfg =>
                {
                    cfg.Route(commandFilterThis);
                    cfg.Route(commandChangeFilter);
                });

                this.StartBus(
                    "consumer",
                    cfg =>
                {
                    cfg.On(documentItFiltered)
                    .ReactWith <ExpandoObject>(
                        (m, ctx) =>
                    {
                        callCount++;
                        consumedEvent.Set();
                    });
                });

                for (int i = 0; i <= switchCondition; i++)
                {
                    producer.Emit(commandFilterThis, new { });
                    filteredEvent.WaitOne();
                    producer.Emit(commandChangeFilter, new { });
                    filteredEvent.WaitOne();
                }

                consumedEvent.WaitOne().Should().BeTrue("Должно быть получено сообщение перенаправленое роутером.");
                callCount.Should().Be(1, "Сообщение должно быть получено только один раз.");
            }
예제 #6
0
            public void ShouldChangeRoute()
            {
                var documentItRouted   = "document.it.routed";
                var documentItDirected = "document.it.directed";
                var commandRouteThis   = "command.route.this";
                var commandChangeRoute = "command.change.route";
                var key             = "key";
                var switchCondition = 4;
                var consumedEvent   = new AutoResetEvent(false);
                var directedEvent   = new AutoResetEvent(false);
                var storage         = new InMemoryKeyValueStorage <ExpandoObject>();
                var router          = new DynamicRouter <ExpandoObject>(
                    (m, s) =>
                {
                    dynamic data = s.Get(key);
                    if (data == null || data.Count < switchCondition)
                    {
                        return(documentItRouted.ToMessageLabel());
                    }

                    return(documentItDirected.ToMessageLabel());
                },
                    storage);
                var control = new DynamicRouter <ExpandoObject> .DynamicRouterControlConsumer <ExpandoObject>(
                    (message, routeStorage) =>
                {
                    dynamic data = routeStorage.Get(key);
                    if (data == null)
                    {
                        dynamic item = new ExpandoObject();
                        item.Count   = 1;
                        routeStorage.Set(key, item);
                        directedEvent.Set();
                        return;
                    }

                    data.Count++;
                    routeStorage.Set(key, data);
                    directedEvent.Set();
                },
                    storage);

                this.StartBus(
                    "pipeline",
                    cfg =>
                {
                    cfg.On(commandRouteThis)
                    .ReactWith(new PipelineConsumerOf <ExpandoObject>(router))
                    .RequiresAccept();
                    cfg.On(commandChangeRoute)
                    .ReactWith(control);
                    cfg.Route(documentItRouted);
                    cfg.Route(documentItDirected);
                });

                var producer = this.StartBus(
                    "producer",
                    cfg => { cfg.Route(commandRouteThis); });

                this.StartBus(
                    "director",
                    cfg =>
                {
                    cfg.On(documentItRouted)
                    .ReactWith <ExpandoObject>(
                        (m, ctx) => { ctx.Bus.Emit(commandChangeRoute, new { }); });
                    cfg.Route(commandChangeRoute);
                });

                this.StartBus(
                    "consumer",
                    cfg =>
                {
                    cfg.On(documentItDirected)
                    .ReactWith <ExpandoObject>((m, ctx) => { consumedEvent.Set(); });
                });

                for (int i = 0; i <= switchCondition; i++)
                {
                    producer.Emit(commandRouteThis, new { });

                    if (i < switchCondition)
                    {
                        directedEvent.WaitOne(5000).Should().BeTrue("Сообщение должно быть обработано.");
                    }
                }

                consumedEvent.WaitOne(5000).Should().BeTrue("Должно быть получено сообщение перенаправленое роутером.");
            }