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."); } } }
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."); } } }