public async Task SendsToIndexInBatches()
        {
            var indexer = new Mock <IFunctionIndexer <TestFunctionMessageDto> >();
            var handler = new FunctionIndexTransactionHandler <TestFunctionMessageDto>(indexer.Object, logsPerIndexBatch: 2);

            var transaction1 = new Mock <TransactionWithReceipt>();
            var transaction2 = new Mock <TransactionWithReceipt>();

            var dto1 = new TestFunctionMessageDto();
            var dto2 = new TestFunctionMessageDto();

            transaction1.Setup(t => t.IsForFunction <TestFunctionMessageDto>()).Returns(true);
            transaction2.Setup(t => t.IsForFunction <TestFunctionMessageDto>()).Returns(true);
            transaction1.Setup(t => t.Decode <TestFunctionMessageDto>()).Returns(dto1);
            transaction2.Setup(t => t.Decode <TestFunctionMessageDto>()).Returns(dto2);

            var indexedFunctionCalls = CaptureCallsToIndexer(indexer);

            await handler.HandleTransactionAsync(transaction1.Object);

            Assert.Empty(indexedFunctionCalls);
            Assert.Equal(1, handler.Pending);

            await handler.HandleTransactionAsync(transaction2.Object);

            Assert.Equal(2, indexedFunctionCalls.Count);
            Assert.Equal(0, handler.Pending);
        }
        public async Task IndexingTransferFunctions()
        {
            using (var azureSearchService = new AzureSearchService(AzureSearchServiceName, _azureSearchApiKey))
            {
                await azureSearchService.DeleteIndexAsync(AzureTransferIndexName);

                using (var azureFunctionMessageIndexer =
                           await azureSearchService.GetOrCreateFunctionIndex <TransferFunction>(indexName: AzureTransferIndexName))
                {
                    var transferHandler =
                        new FunctionIndexTransactionHandler <TransferFunction>(azureFunctionMessageIndexer);

                    var web3            = new Web3.Web3("https://rinkeby.infura.io/v3/25e7b6dfc51040b3bfc0e47317d38f60");
                    var blockchainProxy = new BlockchainProxyService(web3);
                    var handlers        = new HandlerContainer {
                        TransactionHandler = transferHandler
                    };
                    var blockProcessor      = BlockProcessorFactory.Create(blockchainProxy, handlers);
                    var processingStrategy  = new ProcessingStrategy(blockProcessor);
                    var blockchainProcessor = new BlockchainProcessor(processingStrategy);

                    var blockRange = new BlockRange(3146684, 3146694);
                    await blockchainProcessor.ProcessAsync(blockRange);

                    await Task.Delay(TimeSpan.FromSeconds(5));

                    //ensure we have written the expected docs to the index
                    Assert.Equal(3, await azureFunctionMessageIndexer.DocumentCountAsync());
                }

                await azureSearchService.DeleteIndexAsync(AzureTransferIndexName);
            }
        }
        public async Task <FunctionIndexTransactionHandler <TFunctionMessage> > CreateFunctionHandlerAsync <TFunctionMessage, TSearchDocument>(
            Index index, IFunctionMessageToSearchDocumentMapper <TFunctionMessage, TSearchDocument> mapper)
            where TFunctionMessage : FunctionMessage, new()
            where TSearchDocument : class, new()
        {
            var functionIndexer = await AzureSearchService.CreateFunctionIndexer <TFunctionMessage, TSearchDocument>(index, mapper);

            var functionHandler = new FunctionIndexTransactionHandler <TFunctionMessage>(functionIndexer);

            return(functionHandler);
        }
コード例 #4
0
        public async Task <FunctionIndexTransactionHandler <TFunctionMessage> > CreateFunctionHandlerAsync <TFunctionMessage, TSearchDocument>(
            string indexName, IFunctionMessageToSearchDocumentMapper <TFunctionMessage, TSearchDocument> mapper)
            where TFunctionMessage : FunctionMessage, new()
            where TSearchDocument : class, IHasId, new()
        {
            var functionIndexer = await _elasticSearchService.CreateFunctionIndexer <TFunctionMessage, TSearchDocument>(indexName, mapper);

            var functionHandler = new FunctionIndexTransactionHandler <TFunctionMessage>(functionIndexer);

            return(functionHandler);
        }
        public async Task WillIgnoreLogsThatDoNotMatchTheEvent()
        {
            var indexer = new Mock <IFunctionIndexer <TestFunctionMessageDto> >();
            var handler = new FunctionIndexTransactionHandler <TestFunctionMessageDto>(indexer.Object, logsPerIndexBatch: 1);

            var transaction1 = new Mock <TransactionWithReceipt>();

            transaction1.Setup(t => t.IsForFunction <TestFunctionMessageDto>()).Returns(false);

            var indexedFunctionCalls = CaptureCallsToIndexer(indexer);

            await handler.HandleTransactionAsync(transaction1.Object);

            Assert.Empty(indexedFunctionCalls);
            Assert.Equal(0, handler.Pending);
        }
コード例 #6
0
        public async Task IndexingTransferFunctions()
        {
            using (var azureSearchService = new AzureSearchService(AzureSearchServiceName, _azureSearchApiKey))
            {
                await azureSearchService.DeleteIndexAsync(AzureTransferIndexName);

                try
                {
                    using (var azureFunctionMessageIndexer =
                               await azureSearchService.CreateFunctionIndexer <TransferFunction>(
                                   indexName: AzureTransferIndexName))
                    {
                        var transferHandler =
                            new FunctionIndexTransactionHandler <TransferFunction>(azureFunctionMessageIndexer);

                        var web3            = new Web3.Web3(TestConfiguration.BlockchainUrls.Infura.Rinkeby);
                        var blockchainProxy = new BlockchainProxyService(web3);
                        var handlers        = new HandlerContainer {
                            TransactionHandler = transferHandler
                        };
                        var blockProcessor      = BlockProcessorFactory.Create(blockchainProxy, handlers);
                        var processingStrategy  = new ProcessingStrategy(blockProcessor);
                        var blockchainProcessor = new BlockchainProcessor(processingStrategy);

                        var blockRange = new BlockRange(3146684, 3146694);
                        await blockchainProcessor.ProcessAsync(blockRange);

                        await Task.Delay(TimeSpan.FromSeconds(5));

                        //ensure we have written the expected docs to the index
                        Assert.Equal(3, await azureFunctionMessageIndexer.DocumentCountAsync());
                    }
                }
                finally
                {
                    await azureSearchService.DeleteIndexAsync(AzureTransferIndexName);
                }
            }
        }
        public async Task WhenDisposeIsCalledWillAttemptToIndexPendingItems()
        {
            var indexer = new Mock <IFunctionIndexer <TestFunctionMessageDto> >();
            var indexedFunctionCalls = CaptureCallsToIndexer(indexer);

            using (var handler =
                       new FunctionIndexTransactionHandler <TestFunctionMessageDto>(indexer.Object, logsPerIndexBatch: 2))
            {
                var transaction1 = new Mock <TransactionWithReceipt>();
                var dto1         = new TestFunctionMessageDto();

                transaction1.Setup(t => t.IsForFunction <TestFunctionMessageDto>()).Returns(true);
                transaction1.Setup(t => t.Decode <TestFunctionMessageDto>()).Returns(dto1);

                await handler.HandleTransactionAsync(transaction1.Object);

                Assert.Equal(1, handler.Pending);
            }

            //calling dispose should cause app to process remaining pending items
            Assert.Single(indexedFunctionCalls);
        }