From e1546644b55dab8ea0171f415fe491ae21d5d89b Mon Sep 17 00:00:00 2001 From: Jesse Bounds Date: Mon, 27 Feb 2017 12:02:06 -0800 Subject: [PATCH] [core] Cache file source base URL and access token This caches the base URL and access token values when they are set so that they can still be retrieved even when the thread is paused. --- include/mbgl/storage/default_file_source.hpp | 18 ++++++++++++++++++ platform/default/default_file_source.cpp | 10 ++++++---- test/storage/default_file_source.test.cpp | 16 ++++++++++++++++ 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/include/mbgl/storage/default_file_source.hpp b/include/mbgl/storage/default_file_source.hpp index effc60745..9262e0a1b 100644 --- a/include/mbgl/storage/default_file_source.hpp +++ b/include/mbgl/storage/default_file_source.hpp @@ -115,7 +115,23 @@ public: */ void setOfflineMapboxTileCountLimit(uint64_t) const; + /* + * Pause file request activity. + * + * If pause is called then no revalidation or network request activity + * will occur. + * + * Note: Calling pause and then calling getAPIBaseURL or getAccessToken + * will lock the thread that those calls are made on. + */ void pause(); + + /* + * Resume file request activity. + * + * Calling resume will unpause the file source and process any tasks that + * expired while the file source was paused. + */ void resume(); // For testing only. @@ -127,6 +143,8 @@ private: const std::unique_ptr> thread; const std::unique_ptr assetFileSource; const std::unique_ptr localFileSource; + std::string cachedBaseURL = mbgl::util::API_BASE_URL; + std::string cachedAccessToken; }; } // namespace mbgl diff --git a/platform/default/default_file_source.cpp b/platform/default/default_file_source.cpp index 46178dbb8..20a3eadc8 100644 --- a/platform/default/default_file_source.cpp +++ b/platform/default/default_file_source.cpp @@ -176,19 +176,21 @@ DefaultFileSource::DefaultFileSource(const std::string& cachePath, DefaultFileSource::~DefaultFileSource() = default; void DefaultFileSource::setAPIBaseURL(const std::string& baseURL) { - thread->invokeSync(&Impl::setAPIBaseURL, baseURL); + thread->invoke(&Impl::setAPIBaseURL, baseURL); + cachedBaseURL = baseURL; } std::string DefaultFileSource::getAPIBaseURL() const { - return thread->invokeSync(&Impl::getAPIBaseURL); + return cachedBaseURL; } void DefaultFileSource::setAccessToken(const std::string& accessToken) { - thread->invokeSync(&Impl::setAccessToken, accessToken); + thread->invoke(&Impl::setAccessToken, accessToken); + cachedAccessToken = accessToken; } std::string DefaultFileSource::getAccessToken() const { - return thread->invokeSync(&Impl::getAccessToken); + return cachedAccessToken; } void DefaultFileSource::setResourceTransform(std::function transform) { diff --git a/test/storage/default_file_source.test.cpp b/test/storage/default_file_source.test.cpp index ffbeea109..03f107655 100644 --- a/test/storage/default_file_source.test.cpp +++ b/test/storage/default_file_source.test.cpp @@ -267,6 +267,22 @@ TEST(DefaultFileSource, OptionalExpired) { loop.run(); } +TEST(DefaultFileSource, GetBaseURLAndAccessTokenWhilePaused) { + util::RunLoop loop; + DefaultFileSource fs(":memory:", "."); + + fs.pause(); + + auto baseURL = "http://url"; + auto accessToken = "access_token"; + + fs.setAPIBaseURL(baseURL); + fs.setAccessToken(accessToken); + + EXPECT_EQ(fs.getAPIBaseURL(), baseURL); + EXPECT_EQ(fs.getAccessToken(), accessToken); +} + TEST(DefaultFileSource, OptionalNotFound) { util::RunLoop loop; DefaultFileSource fs(":memory:", ".");