From 69c8f602de9ab087dd841dfabf33a72d46672673 Mon Sep 17 00:00:00 2001 From: "Thiago Marcos P. Santos" Date: Tue, 24 Jan 2017 14:39:08 +0200 Subject: [tests] Add unit test for tile prefetching --- test/fixtures/map/prefetch/empty.json | 5 ++ test/fixtures/map/prefetch/expected.png | Bin 0 -> 2198 bytes test/fixtures/map/prefetch/style.json | 24 ++++++++ test/fixtures/map/prefetch/tile_green.png | Bin 0 -> 659 bytes test/fixtures/map/prefetch/tile_red.png | Bin 0 -> 659 bytes test/map/prefetch.test.cpp | 93 ++++++++++++++++++++++++++++++ 6 files changed, 122 insertions(+) create mode 100644 test/fixtures/map/prefetch/empty.json create mode 100644 test/fixtures/map/prefetch/expected.png create mode 100644 test/fixtures/map/prefetch/style.json create mode 100644 test/fixtures/map/prefetch/tile_green.png create mode 100644 test/fixtures/map/prefetch/tile_red.png create mode 100644 test/map/prefetch.test.cpp (limited to 'test') diff --git a/test/fixtures/map/prefetch/empty.json b/test/fixtures/map/prefetch/empty.json new file mode 100644 index 0000000000..61a8fadcdb --- /dev/null +++ b/test/fixtures/map/prefetch/empty.json @@ -0,0 +1,5 @@ +{ + "version": 8, + "sources": {}, + "layers": [] +} diff --git a/test/fixtures/map/prefetch/expected.png b/test/fixtures/map/prefetch/expected.png new file mode 100644 index 0000000000..e1111b37f7 Binary files /dev/null and b/test/fixtures/map/prefetch/expected.png differ diff --git a/test/fixtures/map/prefetch/style.json b/test/fixtures/map/prefetch/style.json new file mode 100644 index 0000000000..b4e163888c --- /dev/null +++ b/test/fixtures/map/prefetch/style.json @@ -0,0 +1,24 @@ +{ + "version": 8, + "name": "Test", + "sources": { + "raster": { + "type": "raster", + "tiles": [ "{z}" ], + "tileSize": 256, + "maxzoom": 20, + "minzoom": 0 + } + }, + "layers": [{ + "id": "background", + "type": "background", + "paint": { + "background-color": "blue" + } + }, { + "id": "raster", + "type": "raster", + "source": "raster" + }] +} diff --git a/test/fixtures/map/prefetch/tile_green.png b/test/fixtures/map/prefetch/tile_green.png new file mode 100644 index 0000000000..553cd10cd1 Binary files /dev/null and b/test/fixtures/map/prefetch/tile_green.png differ diff --git a/test/fixtures/map/prefetch/tile_red.png b/test/fixtures/map/prefetch/tile_red.png new file mode 100644 index 0000000000..5fa561fb92 Binary files /dev/null and b/test/fixtures/map/prefetch/tile_red.png differ diff --git a/test/map/prefetch.test.cpp b/test/map/prefetch.test.cpp new file mode 100644 index 0000000000..af2cd4e92f --- /dev/null +++ b/test/map/prefetch.test.cpp @@ -0,0 +1,93 @@ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +using namespace mbgl; +using namespace mbgl::style; +using namespace std::literals::string_literals; + +TEST(Map, PrefetchTiles) { + util::RunLoop runLoop; + HeadlessBackend backend(test::sharedDisplay()); + BackendScope scope(backend); + OffscreenView view(backend.getContext(), { 512, 512 }); + ThreadPool threadPool(4); + StubFileSource fileSource; + Map map(backend, view.getSize(), 1, fileSource, threadPool, MapMode::Still); + + std::vector tiles; + + fileSource.response = [&] (const Resource& res) -> optional { + Response response; + + auto zoom = std::stoi(res.url); + tiles.push_back(zoom); + + // Return a red tile for prefetched tiles or green to the actual tile. + // The end rendering result should be all green because the map is only + // considered fully rendered when only ideal tiles are shown. + if (zoom == int(map.getZoom()) + 1) { + response.data = std::make_shared( + util::read_file("test/fixtures/map/prefetch/tile_green.png")); + } else { + response.data = std::make_shared( + util::read_file("test/fixtures/map/prefetch/tile_red.png")); + } + + return { std::move(response) }; + }; + + auto checkTilesForZoom = [&](int zoom, const std::vector& expected) { + tiles.clear(); + + // Force tile reloading. + map.getStyle().loadJSON(util::read_file("test/fixtures/map/prefetch/empty.json")); + map.getStyle().loadJSON(util::read_file("test/fixtures/map/prefetch/style.json")); + + map.setLatLngZoom({ 40.726989, -73.992857 }, zoom); // Manhattan + + // Should always render the ideal tiles (i.e. a green map) + test::checkImage("test/fixtures/map/prefetch", test::render(map, view)); + + ASSERT_TRUE(std::is_permutation(tiles.begin(), tiles.end(), expected.begin())); + ASSERT_FALSE(tiles.empty()); + }; + + // Check defaults, should be 4. + ASSERT_EQ(map.getPrefetchZoomDelta(), 4); + checkTilesForZoom(12, { 13, 13, 13, 13, 13, 13, 13, 13, 13, 9 }); + + // Setting it to 0 disables prefetching. + map.setPrefetchZoomDelta(0); + + // No prefetching, raster tiles will use ideal + // tiles instead of the actual zoom level, that is + // why the zoom levels for non-prefetched tiles are + // not the same. + checkTilesForZoom(10, { 11, 11, 11, 11, 11, 11, 11, 11, 11 }); + + map.setPrefetchZoomDelta(5); + checkTilesForZoom(12, { 13, 13, 13, 13, 13, 13, 13, 13, 13, 8 }); + + // Should clamp at `minzoom`. + map.setPrefetchZoomDelta(20); + checkTilesForZoom(10, { 11, 11, 11, 11, 11, 11, 11, 11, 11, 0 }); + + // Disabled again. + map.setPrefetchZoomDelta(0); + checkTilesForZoom(13, { 14, 14, 14, 14, 14, 14, 14, 14, 14 }); +} -- cgit v1.2.1