diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2017-07-25 11:29:03 +0200 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2017-07-25 11:29:03 +0200 |
commit | ddfbfd0ed18b5dfc3dfd3c934eeba0df36675fd4 (patch) | |
tree | ce0eb07f71860e17761a554599a017c23a60bfda | |
parent | 3364992be94364a6e8b302124db53aeed5d99c15 (diff) |
[test] add ability to take the OnlineFileSource offline
This functionality is used for testing to ensure correct offline behavior when connectivity is missing.
-rw-r--r-- | include/mbgl/storage/default_file_source.hpp | 1 | ||||
-rw-r--r-- | include/mbgl/storage/online_file_source.hpp | 3 | ||||
-rw-r--r-- | platform/default/default_file_source.cpp | 8 | ||||
-rw-r--r-- | platform/default/online_file_source.cpp | 31 |
4 files changed, 39 insertions, 4 deletions
diff --git a/include/mbgl/storage/default_file_source.hpp b/include/mbgl/storage/default_file_source.hpp index 9911e0ce6..91e442cf8 100644 --- a/include/mbgl/storage/default_file_source.hpp +++ b/include/mbgl/storage/default_file_source.hpp @@ -140,6 +140,7 @@ public: void resume(); // For testing only. + void setOnlineStatus(bool); void put(const Resource&, const Response&); class Impl; diff --git a/include/mbgl/storage/online_file_source.hpp b/include/mbgl/storage/online_file_source.hpp index ffd75662e..28d70ce54 100644 --- a/include/mbgl/storage/online_file_source.hpp +++ b/include/mbgl/storage/online_file_source.hpp @@ -24,6 +24,9 @@ public: std::unique_ptr<AsyncRequest> request(const Resource&, Callback) override; + // For testing only. + void setOnlineStatus(bool); + private: friend class OnlineFileRequest; diff --git a/platform/default/default_file_source.cpp b/platform/default/default_file_source.cpp index bf8d7b634..3ba89ca93 100644 --- a/platform/default/default_file_source.cpp +++ b/platform/default/default_file_source.cpp @@ -162,6 +162,10 @@ public: offlineDatabase.setOfflineMapboxTileCountLimit(limit); } + void setOnlineStatus(const bool status) { + onlineFileSource.setOnlineStatus(status); + } + void put(const Resource& resource, const Response& response) { offlineDatabase.put(resource, response); } @@ -288,6 +292,10 @@ void DefaultFileSource::resume() { // For testing only: +void DefaultFileSource::setOnlineStatus(const bool status) { + impl->actor().invoke(&Impl::setOnlineStatus, status); +} + void DefaultFileSource::put(const Resource& resource, const Response& response) { impl->actor().invoke(&Impl::put, resource, response); } diff --git a/platform/default/online_file_source.cpp b/platform/default/online_file_source.cpp index f10e0f8ff..fd8293190 100644 --- a/platform/default/online_file_source.cpp +++ b/platform/default/online_file_source.cpp @@ -117,13 +117,24 @@ public: } void activateRequest(OnlineFileRequest* request) { - activeRequests.insert(request); - request->request = httpFileSource.request(request->resource, [=] (Response response) { + auto callback = [=](Response response) { activeRequests.erase(request); - activatePendingRequest(); request->request.reset(); request->completed(response); - }); + activatePendingRequest(); + }; + + activeRequests.insert(request); + + if (online) { + request->request = httpFileSource.request(request->resource, callback); + } else { + Response response; + response.error = std::make_unique<Response::Error>(Response::Error::Reason::Connection, + "Online connectivity is disabled."); + callback(response); + } + assert(pendingRequestsMap.size() == pendingRequestsList.size()); } @@ -153,6 +164,11 @@ public: resourceTransform = std::move(transform); } + void setOnlineStatus(const bool status) { + online = status; + networkIsReachableAgain(); + } + private: void networkIsReachableAgain() { for (auto& request : allRequests) { @@ -178,6 +194,7 @@ private: std::unordered_map<OnlineFileRequest*, std::list<OnlineFileRequest*>::iterator> pendingRequestsMap; std::unordered_set<OnlineFileRequest*> activeRequests; + bool online = true; HTTPFileSource httpFileSource; util::AsyncTask reachability { std::bind(&Impl::networkIsReachableAgain, this) }; }; @@ -381,4 +398,10 @@ ActorRef<OnlineFileRequest> OnlineFileRequest::actor() { return ActorRef<OnlineFileRequest>(*this, mailbox); } +// For testing only: + +void OnlineFileSource::setOnlineStatus(const bool status) { + impl->setOnlineStatus(status); +} + } // namespace mbgl |