Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(71)

Unified Diff: components/offline_pages/background/request_coordinator_unittest.cc

Issue 2119613002: Adds a prerenderer watchdog timer. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/offline_pages/background/request_coordinator_unittest.cc
diff --git a/components/offline_pages/background/request_coordinator_unittest.cc b/components/offline_pages/background/request_coordinator_unittest.cc
index 314ea0693beb27552e17d7d0479b5d9816860d6f..9dc6c7016044c45e6e66ae676a1f547e0111feed 100644
--- a/components/offline_pages/background/request_coordinator_unittest.cc
+++ b/components/offline_pages/background/request_coordinator_unittest.cc
@@ -11,7 +11,8 @@
#include "base/bind.h"
#include "base/location.h"
#include "base/logging.h"
-#include "base/test/test_simple_task_runner.h"
+#include "base/synchronization/waitable_event.h"
+#include "base/test/test_mock_time_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "components/offline_pages/background/device_conditions.h"
#include "components/offline_pages/background/offliner.h"
@@ -30,6 +31,9 @@ namespace {
const GURL kUrl("http://universe.com/everything");
const ClientId kClientId("bookmark", "42");
const int kRequestId(1);
+const long TEST_TIMEOUT_SECONDS = 1;
+const int BATTERY_PERCENTAGE_HIGH = 75;
+const bool POWER_NOT_REQUIRED = false;
dougarnett 2016/06/30 19:16:48 nit - this declaration is bit confusing to me - vs
Pete Williamson 2016/07/01 17:16:55 Done.
} // namespace
class SchedulerStub : public Scheduler {
@@ -132,14 +136,15 @@ class RequestCoordinatorTest
return coordinator_->is_busy();
}
- void SendRequestToOffliner(SavePageRequest& request) {
- coordinator_->SendRequestToOffliner(request);
- }
-
// Empty callback function
void EmptyCallbackFunction(bool result) {
}
+ // Callback function which releases a wait for it.
+ void WaitingCallbackFunction(bool result) {
+ waiter_.Signal();
+ }
+
// Callback for Add requests
void AddRequestDone(RequestQueue::AddRequestResult result,
const SavePageRequest& request);
@@ -163,6 +168,18 @@ class RequestCoordinatorTest
offliner_->enable_callback(enable);
}
+ void SetOfflinerTimeoutForTest(long timeout) {
+ coordinator_->SetOfflinerTimeoutForTest(timeout);
+ }
+
+ void WaitForCallback() {
+ waiter_.Wait();
+ }
+
+ void AdvanceClockBy(base::TimeDelta delta) {
+ task_runner_->FastForwardBy(delta);
+ }
+
Offliner::RequestStatus last_offlining_status() const {
return coordinator_->last_offlining_status_;
}
@@ -170,17 +187,20 @@ class RequestCoordinatorTest
private:
RequestQueue::GetRequestsResult last_get_requests_result_;
std::vector<SavePageRequest> last_requests_;
- scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
+ scoped_refptr<base::TestMockTimeTaskRunner> task_runner_;
base::ThreadTaskRunnerHandle task_runner_handle_;
std::unique_ptr<RequestCoordinator> coordinator_;
OfflinerStub* offliner_;
+ base::WaitableEvent waiter_;
};
RequestCoordinatorTest::RequestCoordinatorTest()
: last_get_requests_result_(RequestQueue::GetRequestsResult::STORE_FAILURE),
- task_runner_(new base::TestSimpleTaskRunner),
+ task_runner_(new base::TestMockTimeTaskRunner),
task_runner_handle_(task_runner_),
- offliner_(nullptr) {}
+ offliner_(nullptr),
+ waiter_(base::WaitableEvent::ResetPolicy::MANUAL,
+ base::WaitableEvent::InitialState::NOT_SIGNALED) {}
RequestCoordinatorTest::~RequestCoordinatorTest() {}
@@ -416,4 +436,48 @@ TEST_F(RequestCoordinatorTest, StartProcessingThenStopProcessingLater) {
EXPECT_EQ(Offliner::RequestStatus::CANCELED, last_offlining_status());
}
+TEST_F(RequestCoordinatorTest, PrerendererTimeout) {
+ // Build a request to use with the pre-renderer, and put it on the queue.
+ offline_pages::SavePageRequest request(
+ kRequestId, kUrl, kClientId, base::Time::Now());
+ coordinator()->queue()->AddRequest(
+ request,
+ base::Bind(&RequestCoordinatorTest::AddRequestDone,
+ base::Unretained(this)));
+ PumpLoop();
+
+ // Set up for the call to StartProcessing.
+ DeviceConditions device_conditions(
+ POWER_NOT_REQUIRED, BATTERY_PERCENTAGE_HIGH,
+ net::NetworkChangeNotifier::CONNECTION_3G);
+ base::Callback<void(bool)> callback =
+ base::Bind(&RequestCoordinatorTest::WaitingCallbackFunction,
+ base::Unretained(this));
+
+ // Ensure that the new request does not finish - we simulate it being
+ // in progress by asking it to skip making the completion callback.
+ EnableOfflinerCallback(false);
+
+ // Ask RequestCoordinator to stop waiting for the offliner after this many
+ // seconds.
+ SetOfflinerTimeoutForTest(TEST_TIMEOUT_SECONDS);
+
+ // Sending the request to the offliner.
+ EXPECT_TRUE(coordinator()->StartProcessing(device_conditions, callback));
+ PumpLoop();
+
+ // Advance the mock clock far enough to cause a watchdog timeout
+ AdvanceClockBy(base::TimeDelta::FromSeconds(TEST_TIMEOUT_SECONDS + 1));
+ PumpLoop();
+
+ // Wait for timeout to expire. Use a TaskRunner with a DelayedTaskRunner
+ // which won't time out immediately, so the watchdog thread doesn't kill valid
+ // tasks too soon.
+ WaitForCallback();
+ PumpLoop();
+
+ // Now trying to start processing on another request should return false.
+ EXPECT_EQ(Offliner::RequestStatus::CANCELED, last_offlining_status());
+}
+
} // namespace offline_pages

Powered by Google App Engine
This is Rietveld 408576698