Esempio n. 1
0
        public void DropAllPendingTileRequests_TileFetcherIsProcessingRequests_RequestsAreDropped()
        {
            // Setup
            var info = new TileInfo();
            var data = new byte[0];

            using (var blockingEvent = new ManualResetEvent(false))
            {
                var blockingTileProvider = new TileProviderStub(blockingEvent)
                {
                    TileDataToReturn = data
                };

                using (var fetcherIsDoneEvent = new ManualResetEvent(false))
                    using (var fetcher = new AsyncTileFetcher(blockingTileProvider, 100, 200))
                    {
                        fetcher.TileReceived += (sender, args) => fetcherIsDoneEvent.Set();
                        fetcher.QueueEmpty   += (sender, args) => fetcherIsDoneEvent.Set();

                        byte[] fetchedData = fetcher.GetTile(info);

                        // Precondition
                        Assert.IsNull(fetchedData);

                        // Call
                        fetcher.DropAllPendingTileRequests();

                        Assert.IsFalse(fetcherIsDoneEvent.WaitOne(allowedTileFetchTime),
                                       "TileFetcher should have dropped request.");
                    }
            }
        }
Esempio n. 2
0
        public void GivenTileFetcherWithoutCachedTile_WhenGettingSameTimeMultipleTimes_IgnoreDuplicateRequests()
        {
            // Given
            var info = new TileInfo();
            var data = new byte[0];

            using (var allRequestsDoneEvent = new ManualResetEvent(false))
            {
                var tileProvider = new TileProviderStub(allRequestsDoneEvent)
                {
                    TileDataToReturn = data
                };

                using (var fetcherIsDoneEvent = new ManualResetEvent(false))
                    using (var fetcher = new AsyncTileFetcher(tileProvider, 100, 200))
                    {
                        TileReceivedEventArgs receivedArguments = null;
                        var tileReceivedCounter = 0;
                        fetcher.TileReceived += (sender, args) =>
                        {
                            receivedArguments = args;
                            tileReceivedCounter++;
                        };

                        var queueEmptyCounter = 0;
                        fetcher.QueueEmpty += (sender, args) =>
                        {
                            queueEmptyCounter++;
                            fetcherIsDoneEvent.Set();
                        };

                        // When
                        byte[] fetchedData1 = fetcher.GetTile(info);
                        byte[] fetchedData2 = fetcher.GetTile(info);
                        byte[] fetchedData3 = fetcher.GetTile(info);
                        byte[] fetchedData4 = fetcher.GetTile(info);
                        Assert.IsTrue(allRequestsDoneEvent.Set());

                        // Assert
                        if (fetcherIsDoneEvent.WaitOne(allowedTileFetchTime))
                        {
                            Assert.AreEqual(1, tileProvider.GetTileCallCount);

                            Assert.AreEqual(1, tileReceivedCounter);
                            Assert.AreSame(data, receivedArguments.Tile);
                            Assert.AreSame(info, receivedArguments.TileInfo);

                            Assert.AreEqual(1, queueEmptyCounter);
                        }
                        else
                        {
                            Assert.Fail("TileFetcher did not respond within timelimit.");
                        }

                        Assert.IsNull(fetchedData1, "Tile data hasn't been cached, so it has to be retrieved asynchronously.");
                        Assert.IsNull(fetchedData2, "Tile data hasn't been cached, so it has to be retrieved asynchronously.");
                        Assert.IsNull(fetchedData3, "Tile data hasn't been cached, so it has to be retrieved asynchronously.");
                        Assert.IsNull(fetchedData4, "Tile data hasn't been cached, so it has to be retrieved asynchronously.");
                    }
            }
        }