diff options
author | Thiago Marcos P. Santos <thiago@mapbox.com> | 2015-11-26 22:34:00 +0200 |
---|---|---|
committer | Thiago Marcos P. Santos <thiago@mapbox.com> | 2015-12-01 11:49:02 +0200 |
commit | 7caaebb16236ae014f534b490b05f5b5d6a90213 (patch) | |
tree | 5464b2d6895f8f17ded5889fab14b5308c63042d /test/storage | |
parent | ab6477d9065f76c1b560ce2ad4a3da6214e041f6 (diff) | |
download | qtlocation-mapboxgl-7caaebb16236ae014f534b490b05f5b5d6a90213.tar.gz |
[tests] Fix/improve Asset utests
ASSET=zip make test-* was broken and now works.
Also added a test stressing concurrent file access.
Diffstat (limited to 'test/storage')
-rw-r--r-- | test/storage/directory_reading.cpp | 2 | ||||
-rw-r--r-- | test/storage/file_reading.cpp | 105 |
2 files changed, 90 insertions, 17 deletions
diff --git a/test/storage/directory_reading.cpp b/test/storage/directory_reading.cpp index 72aabe2eb3..5ef2983abf 100644 --- a/test/storage/directory_reading.cpp +++ b/test/storage/directory_reading.cpp @@ -27,7 +27,7 @@ TEST_F(Storage, AssetReadDirectory) { EXPECT_EQ(Seconds::zero(), res.modified); EXPECT_EQ("", res.etag); #ifdef MBGL_ASSET_ZIP - EXPECT_EQ("No such file", res.error->message); + EXPECT_EQ("Could not stat file in zip archive", res.error->message); #elif MBGL_ASSET_FS EXPECT_EQ("Is a directory", res.error->message); #endif diff --git a/test/storage/file_reading.cpp b/test/storage/file_reading.cpp index 8d38303096..1b1b1b2888 100644 --- a/test/storage/file_reading.cpp +++ b/test/storage/file_reading.cpp @@ -4,6 +4,91 @@ #include <mbgl/platform/platform.hpp> #include <mbgl/util/chrono.hpp> #include <mbgl/util/run_loop.hpp> +#include <mbgl/util/thread.hpp> + +namespace { + +std::string getFileSourceRoot() { +#ifdef MBGL_ASSET_ZIP + return "test/fixtures/storage/assets.zip"; +#else + return ""; +#endif +} + +class TestWorker { +public: + TestWorker(mbgl::DefaultFileSource* fs_) : fs(fs_) {} + + void run(std::function<void()> endCallback) { + const std::string asset("asset://TEST_DATA/fixtures/storage/nonempty"); + + requestCallback = [this, asset, endCallback](mbgl::Response res) { + EXPECT_EQ(nullptr, res.error); + ASSERT_TRUE(res.data.get()); + EXPECT_EQ("content is here\n", *res.data); + + if (res.stale) { + return; + } + + if (!--numRequests) { + endCallback(); + request.reset(); + } else { + request = fs->request({ mbgl::Resource::Unknown, asset }, requestCallback); + } + }; + + request = fs->request({ mbgl::Resource::Unknown, asset }, requestCallback); + } + +private: + unsigned numRequests = 1000; + + mbgl::DefaultFileSource* fs; + std::unique_ptr<mbgl::FileRequest> request; + + std::function<void(mbgl::Response)> requestCallback; +}; + +} + +TEST_F(Storage, AssetStress) { + SCOPED_TEST(AssetStress) + + using namespace mbgl; + + util::RunLoop loop; + + mbgl::DefaultFileSource fs(nullptr, getFileSourceRoot()); + + unsigned numThreads = 50; + + auto callback = [&] { + if (!--numThreads) { + loop.stop(); + } + }; + + std::vector<std::unique_ptr<util::Thread<TestWorker>>> threads; + std::vector<std::unique_ptr<mbgl::WorkRequest>> requests; + util::ThreadContext context = { "Test", util::ThreadType::Map, util::ThreadPriority::Regular }; + + for (unsigned i = 0; i < numThreads; ++i) { + std::unique_ptr<util::Thread<TestWorker>> thread = + std::make_unique<util::Thread<TestWorker>>(context, &fs); + + requests.push_back( + thread->invokeWithCallback(&TestWorker::run, callback)); + + threads.push_back(std::move(thread)); + } + + loop.run(); + + AssetStress.finish(); +} TEST_F(Storage, AssetEmptyFile) { SCOPED_TEST(EmptyFile) @@ -12,11 +97,7 @@ TEST_F(Storage, AssetEmptyFile) { util::RunLoop loop; -#ifdef MBGL_ASSET_ZIP - DefaultFileSource fs(nullptr, "test/fixtures/storage/assets.zip"); -#else - DefaultFileSource fs(nullptr); -#endif + DefaultFileSource fs(nullptr, getFileSourceRoot()); std::unique_ptr<FileRequest> req = fs.request({ Resource::Unknown, "asset://TEST_DATA/fixtures/storage/empty" }, [&](Response res) { req.reset(); @@ -41,11 +122,7 @@ TEST_F(Storage, AssetNonEmptyFile) { util::RunLoop loop; -#ifdef MBGL_ASSET_ZIP - DefaultFileSource fs(nullptr, "test/fixtures/storage/assets.zip"); -#else - DefaultFileSource fs(nullptr); -#endif + DefaultFileSource fs(nullptr, getFileSourceRoot()); std::unique_ptr<FileRequest> req = fs.request({ Resource::Unknown, "asset://TEST_DATA/fixtures/storage/nonempty" }, [&](Response res) { req.reset(); @@ -72,11 +149,7 @@ TEST_F(Storage, AssetNonExistentFile) { util::RunLoop loop; -#ifdef MBGL_ASSET_ZIP - DefaultFileSource fs(nullptr, "test/fixtures/storage/assets.zip"); -#else - DefaultFileSource fs(nullptr); -#endif + DefaultFileSource fs(nullptr, getFileSourceRoot()); std::unique_ptr<FileRequest> req = fs.request({ Resource::Unknown, "asset://TEST_DATA/fixtures/storage/does_not_exist" }, [&](Response res) { req.reset(); @@ -88,7 +161,7 @@ TEST_F(Storage, AssetNonExistentFile) { EXPECT_EQ(Seconds::zero(), res.modified); EXPECT_EQ("", res.etag); #ifdef MBGL_ASSET_ZIP - EXPECT_EQ("No such file", res.error->message); + EXPECT_EQ("Could not stat file in zip archive", res.error->message); #elif MBGL_ASSET_FS EXPECT_EQ("No such file or directory", res.error->message); #endif |