summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2017-07-25 11:29:03 +0200
committerKonstantin Käfer <mail@kkaefer.com>2017-09-22 10:57:15 +0200
commitbd553de7bc5899a8e4a3a9c5e1d27a9f4d10e90e (patch)
tree6ac9fa0f63051b257d00fede260e91877aa1fe07
parentfc2ca19bc553d90b3aafdbddc17d4e8170c02259 (diff)
downloadqtlocation-mapboxgl-bd553de7bc5899a8e4a3a9c5e1d27a9f4d10e90e.tar.gz
[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.hpp1
-rw-r--r--include/mbgl/storage/online_file_source.hpp3
-rw-r--r--platform/default/default_file_source.cpp8
-rw-r--r--platform/default/online_file_source.cpp31
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 9911e0ce67..91e442cf85 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 ffd75662e6..28d70ce544 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 b9d35ae4ed..1e855dd9f7 100644
--- a/platform/default/default_file_source.cpp
+++ b/platform/default/default_file_source.cpp
@@ -177,6 +177,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);
}
@@ -303,6 +307,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 1c594f87a0..d685109b95 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) };
};
@@ -389,4 +406,10 @@ ActorRef<OnlineFileRequest> OnlineFileRequest::actor() {
return ActorRef<OnlineFileRequest>(*this, mailbox);
}
+// For testing only:
+
+void OnlineFileSource::setOnlineStatus(const bool status) {
+ impl->setOnlineStatus(status);
+}
+
} // namespace mbgl