From 31be5d3c3a51976ed5db51fc7b59fd994b09b611 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Tue, 4 Oct 2016 13:48:59 -0700 Subject: [core] Tiles that error on load are not renderable --- cmake/test-files.cmake | 4 ++- src/mbgl/tile/geometry_tile.cpp | 6 ++++- src/mbgl/tile/geometry_tile.hpp | 5 +++- src/mbgl/tile/geometry_tile_worker.cpp | 8 +++--- src/mbgl/tile/raster_tile.cpp | 8 ++++-- src/mbgl/tile/raster_tile.hpp | 4 +-- src/mbgl/tile/raster_tile_worker.cpp | 2 +- test/tile/raster_tile.test.cpp | 47 ++++++++++++++++++++++++++++++++++ test/tile/vector_tile.test.cpp | 47 ++++++++++++++++++++++++++++++++++ 9 files changed, 119 insertions(+), 12 deletions(-) create mode 100644 test/tile/raster_tile.test.cpp create mode 100644 test/tile/vector_tile.test.cpp diff --git a/cmake/test-files.cmake b/cmake/test-files.cmake index e98e993fe8..814936d786 100644 --- a/cmake/test-files.cmake +++ b/cmake/test-files.cmake @@ -61,9 +61,9 @@ set(MBGL_TEST_FILES # storage test/storage/asset_file_source.test.cpp test/storage/default_file_source.test.cpp - test/storage/local_file_source.test.cpp test/storage/headers.test.cpp test/storage/http_file_source.test.cpp + test/storage/local_file_source.test.cpp test/storage/offline.test.cpp test/storage/offline_database.test.cpp test/storage/offline_download.test.cpp @@ -88,7 +88,9 @@ set(MBGL_TEST_FILES # tile test/tile/geometry_tile_data.test.cpp + test/tile/raster_tile.test.cpp test/tile/tile_id.test.cpp + test/tile/vector_tile.test.cpp # util test/util/async_task.test.cpp diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp index ef40ea8e70..1f64b6b6c6 100644 --- a/src/mbgl/tile/geometry_tile.cpp +++ b/src/mbgl/tile/geometry_tile.cpp @@ -41,7 +41,6 @@ void GeometryTile::cancel() { } void GeometryTile::setError(std::exception_ptr err) { - availableData = DataAvailability::All; observer->onTileError(*this, err); } @@ -113,6 +112,11 @@ void GeometryTile::onPlacement(PlacementResult result) { observer->onTileChanged(*this); } +void GeometryTile::onError(std::exception_ptr err) { + availableData = DataAvailability::All; + observer->onTileError(*this, err); +} + Bucket* GeometryTile::getBucket(const Layer& layer) { const auto it = buckets.find(layer.baseImpl->bucketName()); if (it == buckets.end()) { diff --git a/src/mbgl/tile/geometry_tile.hpp b/src/mbgl/tile/geometry_tile.hpp index a644992376..bcc71480af 100644 --- a/src/mbgl/tile/geometry_tile.hpp +++ b/src/mbgl/tile/geometry_tile.hpp @@ -31,8 +31,9 @@ public: ~GeometryTile() override; - void setError(std::exception_ptr err); + void setError(std::exception_ptr); void setData(std::unique_ptr); + void setPlacementConfig(const PlacementConfig&) override; void redoLayout() override; @@ -64,6 +65,8 @@ public: }; void onPlacement(PlacementResult); + void onError(std::exception_ptr); + private: const std::string sourceID; style::Style& style; diff --git a/src/mbgl/tile/geometry_tile_worker.cpp b/src/mbgl/tile/geometry_tile_worker.cpp index 6d26d85093..b6f166be56 100644 --- a/src/mbgl/tile/geometry_tile_worker.cpp +++ b/src/mbgl/tile/geometry_tile_worker.cpp @@ -88,7 +88,7 @@ void GeometryTileWorker::setData(std::unique_ptr data_, break; } } catch (...) { - parent.invoke(&GeometryTile::setError, std::current_exception()); + parent.invoke(&GeometryTile::onError, std::current_exception()); } } @@ -112,7 +112,7 @@ void GeometryTileWorker::setLayers(std::vector> layers_, break; } } catch (...) { - parent.invoke(&GeometryTile::setError, std::current_exception()); + parent.invoke(&GeometryTile::onError, std::current_exception()); } } @@ -136,7 +136,7 @@ void GeometryTileWorker::setPlacementConfig(PlacementConfig placementConfig_, ui break; } } catch (...) { - parent.invoke(&GeometryTile::setError, std::current_exception()); + parent.invoke(&GeometryTile::onError, std::current_exception()); } } @@ -162,7 +162,7 @@ void GeometryTileWorker::coalesced() { break; } } catch (...) { - parent.invoke(&GeometryTile::setError, std::current_exception()); + parent.invoke(&GeometryTile::onError, std::current_exception()); } } diff --git a/src/mbgl/tile/raster_tile.cpp b/src/mbgl/tile/raster_tile.cpp index 303212da80..c7a051f841 100644 --- a/src/mbgl/tile/raster_tile.cpp +++ b/src/mbgl/tile/raster_tile.cpp @@ -28,8 +28,6 @@ void RasterTile::cancel() { } void RasterTile::setError(std::exception_ptr err) { - bucket.reset(); - availableData = DataAvailability::All; observer->onTileError(*this, err); } @@ -47,6 +45,12 @@ void RasterTile::onParsed(std::unique_ptr result) { observer->onTileChanged(*this); } +void RasterTile::onError(std::exception_ptr err) { + bucket.reset(); + availableData = DataAvailability::All; + observer->onTileError(*this, err); +} + Bucket* RasterTile::getBucket(const style::Layer&) { return bucket.get(); } diff --git a/src/mbgl/tile/raster_tile.hpp b/src/mbgl/tile/raster_tile.hpp index 2b2e84d463..1f6ceef0db 100644 --- a/src/mbgl/tile/raster_tile.hpp +++ b/src/mbgl/tile/raster_tile.hpp @@ -23,8 +23,7 @@ public: void setNecessity(Necessity) final; - void setError(std::exception_ptr err); - + void setError(std::exception_ptr); void setData(std::shared_ptr data, optional modified_, optional expires_); @@ -33,6 +32,7 @@ public: Bucket* getBucket(const style::Layer&) override; void onParsed(std::unique_ptr result); + void onError(std::exception_ptr); private: TileLoader loader; diff --git a/src/mbgl/tile/raster_tile_worker.cpp b/src/mbgl/tile/raster_tile_worker.cpp index d7621e35b8..443ee10400 100644 --- a/src/mbgl/tile/raster_tile_worker.cpp +++ b/src/mbgl/tile/raster_tile_worker.cpp @@ -19,7 +19,7 @@ void RasterTileWorker::parse(std::shared_ptr data) { auto bucket = std::make_unique(decodeImage(*data)); parent.invoke(&RasterTile::onParsed, std::move(bucket)); } catch (...) { - parent.invoke(&RasterTile::setError, std::current_exception()); + parent.invoke(&RasterTile::onError, std::current_exception()); } } diff --git a/test/tile/raster_tile.test.cpp b/test/tile/raster_tile.test.cpp new file mode 100644 index 0000000000..a5a7e65b35 --- /dev/null +++ b/test/tile/raster_tile.test.cpp @@ -0,0 +1,47 @@ +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +using namespace mbgl; + +class RasterTileTest { +public: + FakeFileSource fileSource; + TransformState transformState; + ThreadPool threadPool { 1 }; + AnnotationManager annotationManager { 1.0 }; + style::Style style { fileSource, 1.0 }; + Tileset tileset { { "https://example.com" }, { 0, 22 }, "none" }; + + style::UpdateParameters updateParameters { + 1.0, + MapDebugOptions(), + transformState, + threadPool, + fileSource, + MapMode::Continuous, + annotationManager, + style + }; +}; + +TEST(RasterTile, setError) { + RasterTileTest test; + RasterTile tile(OverscaledTileID(0, 0, 0), test.updateParameters, test.tileset); + tile.setError(std::make_exception_ptr(std::runtime_error("test"))); + EXPECT_FALSE(tile.isRenderable()); +} + +TEST(RasterTile, onError) { + RasterTileTest test; + RasterTile tile(OverscaledTileID(0, 0, 0), test.updateParameters, test.tileset); + tile.onError(std::make_exception_ptr(std::runtime_error("test"))); + EXPECT_TRUE(tile.isRenderable()); +} diff --git a/test/tile/vector_tile.test.cpp b/test/tile/vector_tile.test.cpp new file mode 100644 index 0000000000..e22b88a61d --- /dev/null +++ b/test/tile/vector_tile.test.cpp @@ -0,0 +1,47 @@ +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +using namespace mbgl; + +class VectorTileTest { +public: + FakeFileSource fileSource; + TransformState transformState; + ThreadPool threadPool { 1 }; + AnnotationManager annotationManager { 1.0 }; + style::Style style { fileSource, 1.0 }; + Tileset tileset { { "https://example.com" }, { 0, 22 }, "none" }; + + style::UpdateParameters updateParameters { + 1.0, + MapDebugOptions(), + transformState, + threadPool, + fileSource, + MapMode::Continuous, + annotationManager, + style + }; +}; + +TEST(VectorTile, setError) { + VectorTileTest test; + VectorTile tile(OverscaledTileID(0, 0, 0), "source", test.updateParameters, test.tileset); + tile.setError(std::make_exception_ptr(std::runtime_error("test"))); + EXPECT_FALSE(tile.isRenderable()); +} + +TEST(VectorTile, onError) { + VectorTileTest test; + VectorTile tile(OverscaledTileID(0, 0, 0), "source", test.updateParameters, test.tileset); + tile.onError(std::make_exception_ptr(std::runtime_error("test"))); + EXPECT_TRUE(tile.isRenderable()); +} -- cgit v1.2.1