示例#1
0
        public async Task TestTearDownStreamBroken()
        {
            var source = new StreamMessageSenderComposite <int>(_provider, 2);

            var factory = new DefaultStreamProcessorAggregateFactory(GrainFactory);
            var query   = await source.Select(x => x, factory);

            var queryOutputStreams = await query.GetOutputStreams();

            var resultConsumer = new TestTransactionalTransactionalStreamConsumerAggregate <int>(_provider);
            await resultConsumer.SetInput(queryOutputStreams);

            Assert.AreEqual(2, queryOutputStreams.Count);
            Assert.AreEqual(0, resultConsumer.Items.Count);

            Assert.IsFalse(await resultConsumer.AllConsumersTearDownCalled());

            await query.TearDown();

            await resultConsumer.TearDown();

            Assert.IsTrue(await resultConsumer.AllConsumersTearDownCalled());

            await source.SendMessage(new ItemMessage <int>(new List <int>()
            {
                2, 3
            }));

            Assert.AreEqual(0, resultConsumer.Items.Count);
            Assert.IsTrue(await resultConsumer.AllConsumersTearDownCalled());
        }
示例#2
0
        public async Task TestOneLevelSelectManyDataPass()
        {
            var inputChunks = new List <int>()
            {
                5, 213, 23, -21, 23, 99
            }.BatchIEnumerable(2).ToList();
            var outputChunks = inputChunks.SelectMany(i => i).Select(i => (i > 0) ? Enumerable.Range(0, i).ToList() : i.SingleValueToList()).ToList();

            var source  = new StreamMessageSenderComposite <int>(_provider, 2);
            var factory = new DefaultStreamProcessorAggregateFactory(GrainFactory);
            var query   = await source.SimpleSelectMany(i => (i > 0)?Enumerable.Range(0, i) : i.SingleValueToList(), factory);

            var queryOutputStreams = await query.GetOutputStreams();

            var resultConsumer = new TestTransactionalTransactionalStreamConsumerAggregate <int>(_provider);
            await resultConsumer.SetInput(queryOutputStreams);

            Assert.AreEqual(2, queryOutputStreams.Count);
            Assert.AreEqual(0, resultConsumer.Items.Count);

            for (int i = 0; i < inputChunks.Count; i++)
            {
                var input          = inputChunks[i];
                var expectedOutput = new List <int>();
                expectedOutput.AddRange(outputChunks[2 * i]);
                expectedOutput.AddRange(outputChunks[2 * i + 1]);

                var tid = TransactionGenerator.GenerateTransactionId();
                await source.StartTransaction(tid);

                await source.SendMessage(new ItemMessage <int>(input));

                await source.EndTransaction(tid);

                CollectionAssert.AreEquivalent(expectedOutput, resultConsumer.Items);
                resultConsumer.Items.Clear();
            }

            await query.TearDown();

            await resultConsumer.TearDown();
        }
示例#3
0
        private async Task ValidateTwoLevelAggregateSetupAndTearDown()
        {
            int numberOfStreamsPerLevel = 2;


            var source = new MultiStreamProvider <int>(_provider, numberOfStreamsPerLevel);

            var factory      = new DefaultStreamProcessorAggregateFactory(GrainFactory);
            var aggregateOne = await factory.CreateSelect(_ => _, await source.GetStreamIdentities());

            var aggregateTwo = await factory.CreateSelect(_ => _, await aggregateOne.GetStreamIdentities());


            var firstElement = new StreamProcessorChainStart <int, int>(aggregateOne, source, new DefaultStreamProcessorAggregateFactory(GrainFactory));
            var query        = new StreamProcessorChain <int, int>(aggregateTwo, firstElement);

            Assert.IsFalse(await aggregateOne.IsTearedDown());
            Assert.IsFalse(await aggregateTwo.IsTearedDown());

            await query.TearDown();

            Assert.IsTrue(await aggregateOne.IsTearedDown());
            Assert.IsTrue(await aggregateTwo.IsTearedDown());
        }
示例#4
0
        private async Task ValidateTwoLevelAggregateSetupAndTearDown()
        {
            int numberOfStreamsPerLevel = 2;


            var source = new StreamMessageSenderComposite <int>(_provider, numberOfStreamsPerLevel);

            var factory      = new DefaultStreamProcessorAggregateFactory(GrainFactory);
            var aggregateOne = await factory.CreateSelect <int, int>(_ => _, new StreamProcessorAggregateConfiguration(await source.GetOutputStreams()));

            var aggregateTwo = await factory.CreateSelect <int, int>(_ => _, new StreamProcessorAggregateConfiguration(await aggregateOne.GetOutputStreams()));


            var firstElement = new StreamProcessorChainStart <int, int, DefaultStreamProcessorAggregateFactory>(aggregateOne, source, new DefaultStreamProcessorAggregateFactory(GrainFactory));
            var query        = new StreamProcessorChain <int, int, DefaultStreamProcessorAggregateFactory>(aggregateTwo, firstElement);

            Assert.IsFalse(await aggregateOne.IsTearedDown());
            Assert.IsFalse(await aggregateTwo.IsTearedDown());

            await query.TearDown();

            Assert.IsTrue(await aggregateOne.IsTearedDown());
            Assert.IsTrue(await aggregateTwo.IsTearedDown());
        }
示例#5
0
 public void TestInitialize()
 {
     _provider = GrainClient.GetStreamProvider(StreamProviderString);
     _factory  = new DefaultStreamProcessorAggregateFactory(GrainFactory);
 }
        public async Task Execute()
        {
            var provider = GetStreamProvider("CollectionStreamProvider");

            // Simple collection sample
            var container = GrainClient.GrainFactory.GetGrain <IContainerGrain <DummyInt> >(Guid.NewGuid());
            await container.SetNumberOfNodes(4);

            await container.BatchAdd(Enumerable.Range(0, 10).Select(x => new DummyInt(x)).ToList());

            await container.ExecuteSync((i) => { i.Value += 2; }); // Pass action to container

            var consumer = new TransactionalStreamListConsumer <ContainerElement <DummyInt> >(provider);
            await consumer.SetInput(await container.GetOutputStreams());

            var transactionId = await container.EnumerateToSubscribers();

            await consumer.TransactionComplete(transactionId);

            Console.WriteLine(consumer.Items);


            // Sample with observable collection and data query.
            var collection    = GrainClient.GrainFactory.GetGrain <IContainerGrain <DummyInt> >(Guid.NewGuid());
            int numContainers = 4;
            await collection.SetNumberOfNodes(numContainers);

            var aggregateFactory = new DefaultStreamProcessorAggregateFactory(GrainClient.GrainFactory);
            var query            = await collection.Select(x => x.Item.Value, aggregateFactory).Where(x => x > 500);

            var matchingItemConsumer = new TransactionalStreamListConsumer <int>(provider);
            await matchingItemConsumer.SetInput(await query.GetOutputStreams());

            var observedCollectionConsumer = new TransactionalStreamListConsumer <ContainerElement <DummyInt> >(provider);
            await observedCollectionConsumer.SetInput(await collection.GetOutputStreams());

            var inputList = Enumerable.Range(0, 1000).Select(x => new DummyInt(x)).ToList();
            await collection.BatchAdd(inputList);

            Console.WriteLine("#Items: {0}", observedCollectionConsumer.Items.Count);
            Console.WriteLine("#Items resultQuery: {0}", matchingItemConsumer.Items.Count);

            // Simple query using stream provider and consumer.

            var simpleProvider = new StreamMessageSenderComposite <int>(provider, numberOfOutputStreams: 10);

            var queryNumbersLessThan1000 = await simpleProvider.Where(x => x < 1000, aggregateFactory);

            var simpleResultConsumer = new TransactionalStreamListConsumer <int>(provider);
            await simpleResultConsumer.SetInput(await queryNumbersLessThan1000.GetOutputStreams());

            var        rand    = new Random(123);
            List <int> numbers = Enumerable.Repeat(2000, 10000).Select(x => rand.Next(x)).ToList();
            await simpleProvider.SendMessage(new ItemMessage <int>(numbers));

            var tid = Guid.NewGuid();
            await simpleProvider.StartTransaction(tid);

            await simpleProvider.EndTransaction(tid);

            Console.WriteLine("#Items less than 1000: {0}", simpleResultConsumer.Items.Count);
        }