#include "../fixtures/fixture_log_observer.hpp" #include "../fixtures/mock_file_source.hpp" #include "../fixtures/util.hpp" #include #include #include #include #include #include using namespace mbgl; class PendingResources : public ::testing::TestWithParam { }; // This test will load a Style but one of the resources requested will not be // replied immediately like the others. We get an notification by the // MockFileSource when some resource is artificially delayed and we destroy // the Map object after that. The idea here is to test if these pending requests // are getting canceled correctly if on shutdown. TEST_P(PendingResources, DeleteMapObjectWithPendingRequest) { util::RunLoop loop; auto display = std::make_shared(); HeadlessView view(display, 1, 1000, 1000); MockFileSource fileSource(MockFileSource::Success, GetParam()); std::unique_ptr map = std::make_unique(view, fileSource, MapMode::Still); util::AsyncTask endTest([&map, &loop] { map.reset(); loop.stop(); }); fileSource.requestEnqueuedCallback = [&endTest] { endTest.send(); }; const std::string style = util::read_file("test/fixtures/resources/style.json"); map->setStyleJSON(style, "."); map->renderStill([](std::exception_ptr, PremultipliedImage&&) { EXPECT_TRUE(false) << "Should never happen."; }); loop.run(); } // In the test data below, "sprite" will match both "sprite.json" and "sprite.png" and cause two // requests to be canceled. "resources" will match everything but in practice will only test the // cancellation of the sprites and "source_*.json" because we only load the rest after "source_*.json" // gets parsed. INSTANTIATE_TEST_CASE_P(Style, PendingResources, ::testing::Values( "source_raster.json", "source_vector.json", "sprite.json", "sprite.png", "sprite", "raster.png", "vector.pbf", "glyphs.pbf", "resources"));