summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2016-10-04 13:48:59 -0700
committerJohn Firebaugh <john.firebaugh@gmail.com>2016-10-05 10:26:04 -0700
commit31be5d3c3a51976ed5db51fc7b59fd994b09b611 (patch)
treea82eea517c3debf873ab5ca4a3bf3fce889f6f34
parent3b72c288adbb9aa689047fbb277b98ab7be6ec75 (diff)
downloadqtlocation-mapboxgl-31be5d3c3a51976ed5db51fc7b59fd994b09b611.tar.gz
[core] Tiles that error on load are not renderable
-rw-r--r--cmake/test-files.cmake4
-rw-r--r--src/mbgl/tile/geometry_tile.cpp6
-rw-r--r--src/mbgl/tile/geometry_tile.hpp5
-rw-r--r--src/mbgl/tile/geometry_tile_worker.cpp8
-rw-r--r--src/mbgl/tile/raster_tile.cpp8
-rw-r--r--src/mbgl/tile/raster_tile.hpp4
-rw-r--r--src/mbgl/tile/raster_tile_worker.cpp2
-rw-r--r--test/tile/raster_tile.test.cpp47
-rw-r--r--test/tile/vector_tile.test.cpp47
9 files changed, 119 insertions, 12 deletions
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<const GeometryTileData>);
+
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<const GeometryTileData> 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<std::unique_ptr<Layer>> 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<Bucket> 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<const std::string> data,
optional<Timestamp> modified_,
optional<Timestamp> expires_);
@@ -33,6 +32,7 @@ public:
Bucket* getBucket(const style::Layer&) override;
void onParsed(std::unique_ptr<Bucket> result);
+ void onError(std::exception_ptr);
private:
TileLoader<RasterTile> 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<const std::string> data) {
auto bucket = std::make_unique<RasterBucket>(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 <mbgl/test/util.hpp>
+#include <mbgl/test/fake_file_source.hpp>
+#include <mbgl/tile/raster_tile.hpp>
+#include <mbgl/tile/tile_loader_impl.hpp>
+
+#include <mbgl/actor/thread_pool.hpp>
+#include <mbgl/map/transform.hpp>
+#include <mbgl/style/style.hpp>
+#include <mbgl/style/update_parameters.hpp>
+#include <mbgl/annotation/annotation_manager.hpp>
+
+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 <mbgl/test/util.hpp>
+#include <mbgl/test/fake_file_source.hpp>
+#include <mbgl/tile/vector_tile.hpp>
+#include <mbgl/tile/tile_loader_impl.hpp>
+
+#include <mbgl/actor/thread_pool.hpp>
+#include <mbgl/map/transform.hpp>
+#include <mbgl/style/style.hpp>
+#include <mbgl/style/update_parameters.hpp>
+#include <mbgl/annotation/annotation_manager.hpp>
+
+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());
+}