summaryrefslogtreecommitdiff
path: root/test/style/pending_resources.cpp
blob: 58dc72937e9f97296d5737373e7f18655398d717 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include "../fixtures/fixture_log_observer.hpp"
#include "../fixtures/mock_file_source.hpp"
#include "../fixtures/util.hpp"

#include <mbgl/map/map.hpp>
#include <mbgl/platform/default/headless_display.hpp>
#include <mbgl/platform/default/headless_view.hpp>
#include <mbgl/util/io.hpp>
#include <mbgl/util/run_loop.hpp>
#include <mbgl/util/uv_detail.hpp>

using namespace mbgl;

class PendingResources : public ::testing::TestWithParam<std::string> {
};

// 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(uv_default_loop());

    auto display = std::make_shared<mbgl::HeadlessDisplay>();
    HeadlessView view(display, 1, 1000, 1000);
    MockFileSource fileSource(MockFileSource::SuccessWithDelay, GetParam());

    std::unique_ptr<Map> map = std::make_unique<Map>(view, fileSource, MapMode::Still);

    uv::async endTest(loop.get(), [&map, &loop] {
        map.reset();
        loop.stop();
    });

    endTest.unref();
    fileSource.setOnRequestDelayedCallback([&endTest] { endTest.send(); });

    const std::string style = util::read_file("test/fixtures/resources/style.json");
    map->setStyleJSON(style, ".");

    map->renderStill([&endTest](std::exception_ptr, UnassociatedImage&&) {
        EXPECT_TRUE(false) << "Should never happen.";
    });

    uv_run(loop.get(), UV_RUN_DEFAULT);
}

// 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"));