* Refactoring online file source so that tile server configuration is not hardcoded - part 1 * Added default templates * Update from master * Renaming MGLAccountManager to MGLSettings. Passing ResourceOptions and TileServerOptions to relevant classes and method in order to remove mapbox hardocded configuration * Fixing build * Addedm missing theme * Unit tests fixes * Fixing unit tests, adding factory methods for creating predefined configuration. * Fixing mapbox unit tests * Additional unit test fixes * Making MapboxConfiguration default * Making get/set resource options available in all classes that inherits from FileSource * Making get/set resource options available in all classes that inherits from FileSource - part 2 * Fixes for Android * Disable test coverage reports * Disable test coverage reports * Disable test coverage reports * Disable test coverage reports * Removing hardcoded configuration in iOS project - part 1 * Fixing wrong file extension, making use of tile server options. * Use apiKey and MGL_API_KEY everywhere * Just a rename * Re-enabling tests and improving MGLSettings init * Removing mapbox hardcoded configuration, using api key everywhere, implementing JNI conversion for TileServerOptions * Lint issues. * Integrating configurable tile server properties into Android SDK - part 2 * Removing mabox accounts * Exposing multiple configurations to Android SDK - bug fixes * Removing TileServerOptions from public interface - native methods dont work before mapbox-gl library is loaded * Adding support for configurable predefined styles * Migrating predefined styles in test app + cleanup * Parameter fix * Bug fixes * Fixing render test build * Fixing offline tester * Fixing benchmark tool * Fix: typo in method name * Adding code for public access to TileServerOptions * Bug fixes and debug code removal * Fixes for macOS, adding unit tests from MapLibre, removing redundant members from OnlineFileSource * Unit test fixes * MacOS test app - migrating to configurable tile server options, part 1 * Fixing offline maps * Migrating macOS test app to MapTiler * Minor improvements * Putting back apiKey test * Added unit tests for MapTiler configuration * Migrating test resources to MapTiler * minor fix * A few fixes * Fixing macOS tests, removing feedback functionality * Migrating ios test app to MapTiler * Migrating ui tests * UI tests fix * Benchmarking app fix * Cleanup and strings updates * Migrating benchmark app to maptiler * API key injection in benchmark app * Putting back release configuration * Additional tests and fixing issues identified by thread sanitizer. * Removing test filters * Fixes and addressing lint issues * More Maptiler tests + minro fix * Android instrumentation test migration to MapTiler. Exposing missing TileServerOptions in Android SDK. Minor fixes. * No requirements on API key format. * Fixing offline cache test tool * Adding configurable domain name for sources, adding source domain int MapTiler configuration, cleanup * Migrating tests to MapTiler, adding code for canonicalizing URLs, removing mapbox stuff from comments, cleanup * More tests * Updated database size * Lint issues * Fixed test * Updating developer config API key * Fixes for Android, propagaing updated tileServerOptions to native file sources, more tests * Just a few more fixes * Propagating updated settings to file sources + additional unit test * Lint issues * Removing test filter and fixing incorrect uri * Release preparation * macos release notes
182 lines
5.7 KiB
C++
182 lines
5.7 KiB
C++
#include <mbgl/test/stub_file_source.hpp>
|
|
#include <mbgl/test/getrss.hpp>
|
|
#include <mbgl/test/util.hpp>
|
|
#include <mbgl/test/map_adapter.hpp>
|
|
|
|
#include <mbgl/map/map_options.hpp>
|
|
#include <mbgl/gfx/headless_frontend.hpp>
|
|
#include <mbgl/util/io.hpp>
|
|
#include <mbgl/util/run_loop.hpp>
|
|
#include <mbgl/style/style.hpp>
|
|
|
|
#include <algorithm>
|
|
#include <iostream>
|
|
#include <iterator>
|
|
#include <string>
|
|
#include <unordered_map>
|
|
#include <utility>
|
|
#include <memory>
|
|
|
|
#include <cstdlib>
|
|
#include <unistd.h>
|
|
|
|
using namespace mbgl;
|
|
using namespace std::literals::string_literals;
|
|
|
|
class MemoryTest {
|
|
public:
|
|
MemoryTest() {
|
|
fileSource->styleResponse = [&](const Resource& res) {
|
|
auto resName = "style_" + getType(res) + ".json";
|
|
return response(resName);
|
|
};
|
|
fileSource->tileResponse = [&](const Resource& res) {
|
|
auto resName = getType(res) + ".tile";
|
|
return response(resName);
|
|
};
|
|
fileSource->sourceResponse = [&](const Resource& res) {
|
|
auto resName = "source_" + getType(res) + ".json";
|
|
return response(resName);
|
|
|
|
};
|
|
fileSource->glyphsResponse = [&](const Resource&) { return response("glyphs.pbf"); };
|
|
fileSource->spriteJSONResponse = [&](const Resource&) { return response("sprite.json"); };
|
|
fileSource->spriteImageResponse = [&](const Resource&) { return response("sprite.png"); };
|
|
}
|
|
|
|
util::RunLoop runLoop;
|
|
std::shared_ptr<StubFileSource> fileSource = std::make_shared<StubFileSource>();
|
|
|
|
private:
|
|
Response response(const std::string& path) {
|
|
Response result;
|
|
|
|
auto it = cache.find(path);
|
|
if (it != cache.end()) {
|
|
result.data = it->second;
|
|
} else {
|
|
auto data = std::make_shared<std::string>(
|
|
util::read_file("test/fixtures/resources/"s + path));
|
|
|
|
cache.insert(it, std::make_pair(path, data));
|
|
result.data = data;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
std::string getType(const Resource& res) {
|
|
if (res.url.find("hybrid") != std::string::npos || res.url.find("satellite") != std::string::npos) {
|
|
return "raster";
|
|
} else {
|
|
return "vector";
|
|
}
|
|
};
|
|
|
|
std::unordered_map<std::string, std::shared_ptr<std::string>> cache;
|
|
};
|
|
|
|
TEST(Memory, Vector) {
|
|
MemoryTest test;
|
|
float ratio { 2 };
|
|
|
|
HeadlessFrontend frontend { { 256, 256 }, ratio };
|
|
MapAdapter map(frontend, MapObserver::nullObserver(), test.fileSource,
|
|
MapOptions().withMapMode(MapMode::Static).withSize(frontend.getSize()).withPixelRatio(ratio));
|
|
map.jumpTo(CameraOptions().withZoom(16));
|
|
map.getStyle().loadURL("maptiler://maps/streets");
|
|
|
|
frontend.render(map);
|
|
}
|
|
|
|
TEST(Memory, Raster) {
|
|
MemoryTest test;
|
|
float ratio { 2 };
|
|
|
|
HeadlessFrontend frontend { { 256, 256 }, ratio };
|
|
MapAdapter map(frontend, MapObserver::nullObserver(), test.fileSource,
|
|
MapOptions().withMapMode(MapMode::Static).withSize(frontend.getSize()).withPixelRatio(ratio));
|
|
map.getStyle().loadURL("maptiler://maps/hybrid");
|
|
|
|
frontend.render(map);
|
|
}
|
|
|
|
/**
|
|
On CI, we only run the memory footprint test in the Qt build, because it uses
|
|
jemalloc, which yields more consistent memory usage results. To force it to
|
|
run locally, use `DO_MEMORY_FOOTPRINT=1 make run-test-Memory.Footprint.
|
|
*/
|
|
bool shouldRunFootprint() {
|
|
const char* preload = getenv("LD_PRELOAD");
|
|
|
|
if (preload) {
|
|
return std::string(preload).find("libjemalloc.so") != std::string::npos;
|
|
} else {
|
|
return getenv("DO_MEMORY_FOOTPRINT");
|
|
}
|
|
}
|
|
|
|
// This test will measure the size of a Map object
|
|
// after rendering a raster and a vector style. The
|
|
// idea is to try to keep the memory footprint within
|
|
// reasonable limits, so this test acts more like a
|
|
// safeguard.
|
|
TEST(Memory, Footprint) {
|
|
if (!shouldRunFootprint()) {
|
|
return;
|
|
}
|
|
|
|
MemoryTest test;
|
|
|
|
class FrontendAndMap {
|
|
public:
|
|
FrontendAndMap(MemoryTest& test_, const char* style)
|
|
: frontend(Size{ 256, 256 }, 2)
|
|
, map(frontend, MapObserver::nullObserver(), test_.fileSource,
|
|
MapOptions().withMapMode(MapMode::Static).withSize(frontend.getSize()).withPixelRatio(2)) {
|
|
map.jumpTo(CameraOptions().withZoom(16));
|
|
map.getStyle().loadURL(style);
|
|
frontend.render(map);
|
|
}
|
|
|
|
HeadlessFrontend frontend;
|
|
MapAdapter map;
|
|
};
|
|
|
|
// Warm up buffers and cache.
|
|
for (unsigned i = 0; i < 10; ++i) {
|
|
FrontendAndMap(test, "maptiler://maps/streets");
|
|
FrontendAndMap(test, "maptiler://maps/hybrid");
|
|
}
|
|
|
|
// Process close callbacks, mostly needed by
|
|
// libuv runloop.
|
|
test.runLoop.runOnce();
|
|
|
|
std::vector<std::unique_ptr<FrontendAndMap>> maps;
|
|
unsigned runs = 15;
|
|
|
|
long vectorInitialRSS = mbgl::test::getCurrentRSS();
|
|
for (unsigned i = 0; i < runs; ++i) {
|
|
maps.emplace_back(std::make_unique<FrontendAndMap>(test, "maptiler://maps/streets"));
|
|
}
|
|
|
|
double vectorFootprint = (mbgl::test::getCurrentRSS() - vectorInitialRSS) / double(runs);
|
|
|
|
long rasterInitialRSS = mbgl::test::getCurrentRSS();
|
|
for (unsigned i = 0; i < runs; ++i) {
|
|
maps.emplace_back(std::make_unique<FrontendAndMap>(test, "maptiler://maps/hybrid"));
|
|
}
|
|
|
|
double rasterFootprint = (mbgl::test::getCurrentRSS() - rasterInitialRSS) / double(runs);
|
|
|
|
RecordProperty("vectorFootprint", vectorFootprint);
|
|
RecordProperty("rasterFootprint", rasterFootprint);
|
|
|
|
ASSERT_LT(vectorFootprint, 40 * 1024 * 1024) << "\
|
|
mbgl::Map footprint over 65.2MB for vector styles.";
|
|
|
|
ASSERT_LT(rasterFootprint, 25 * 1024 * 1024) << "\
|
|
mbgl::Map footprint over 25MB for raster styles.";
|
|
}
|