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()); }
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(); }
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()); }
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()); }
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); }