Index: headless/public/util/deterministic_dispatcher_test.cc |
diff --git a/headless/public/util/deterministic_dispatcher_test.cc b/headless/public/util/deterministic_dispatcher_test.cc |
index 24cede8b2e9a9df3bf368a6d6e03513c4ef4139a..7c2c60494bd8830613b0fa43e2fad1dec0c6585b 100644 |
--- a/headless/public/util/deterministic_dispatcher_test.cc |
+++ b/headless/public/util/deterministic_dispatcher_test.cc |
@@ -8,8 +8,10 @@ |
#include <string> |
#include <vector> |
+#include "base/memory/ptr_util.h" |
#include "base/run_loop.h" |
#include "base/single_thread_task_runner.h" |
+#include "headless/public/util/navigation_request.h" |
#include "headless/public/util/testing/fake_managed_dispatch_url_request_job.h" |
#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -126,4 +128,70 @@ TEST_F(DeterministicDispatcherTest, JobKilled) { |
EXPECT_TRUE(notifications.empty()); |
} |
+namespace { |
+class NavigationRequestForTest : public NavigationRequest { |
+ public: |
+ explicit NavigationRequestForTest(base::Closure* done_closure) |
+ : done_closure_(done_closure) {} |
+ |
+ ~NavigationRequestForTest() override {} |
+ |
+ // NavigationRequest implementation: |
+ void StartProcessing(base::Closure done_callback) override { |
+ *done_closure_ = std::move(done_callback); |
+ } |
+ |
+ private: |
+ base::Closure* done_closure_; // NOT OWNED |
+}; |
+} // namespace |
+ |
+TEST_F(DeterministicDispatcherTest, NavigationBlocksUrlRequests) { |
+ std::vector<std::string> notifications; |
+ std::unique_ptr<FakeManagedDispatchURLRequestJob> job1( |
+ new FakeManagedDispatchURLRequestJob(deterministic_dispatcher_.get(), 1, |
+ ¬ifications)); |
+ base::Closure navigation_done_closure; |
+ deterministic_dispatcher_->NavigationRequested( |
+ base::MakeUnique<NavigationRequestForTest>(&navigation_done_closure)); |
+ std::unique_ptr<FakeManagedDispatchURLRequestJob> job2( |
+ new FakeManagedDispatchURLRequestJob(deterministic_dispatcher_.get(), 2, |
+ ¬ifications)); |
+ std::unique_ptr<FakeManagedDispatchURLRequestJob> job3( |
+ new FakeManagedDispatchURLRequestJob(deterministic_dispatcher_.get(), 3, |
+ ¬ifications)); |
+ std::unique_ptr<FakeManagedDispatchURLRequestJob> job4( |
+ new FakeManagedDispatchURLRequestJob(deterministic_dispatcher_.get(), 4, |
+ ¬ifications)); |
+ job1->DispatchHeadersComplete(); |
+ job2->DispatchHeadersComplete(); |
+ job3->DispatchHeadersComplete(); |
+ job4->DispatchHeadersComplete(); |
+ |
+ EXPECT_TRUE(notifications.empty()); |
+ |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_THAT(notifications, ElementsAre("id: 1 OK")); |
+ |
+ // This triggers a call to NavigationRequestForTest::StartProcessing. |
+ job1.reset(); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_THAT(notifications, ElementsAre("id: 1 OK")); |
+ |
+ // Navigations should be blocked until we call the done closure. |
+ navigation_done_closure.Run(); |
+ |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_THAT(notifications, ElementsAre("id: 1 OK", "id: 2 OK")); |
+ |
+ job2.reset(); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_THAT(notifications, ElementsAre("id: 1 OK", "id: 2 OK", "id: 3 OK")); |
+ |
+ job3.reset(); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_THAT(notifications, |
+ ElementsAre("id: 1 OK", "id: 2 OK", "id: 3 OK", "id: 4 OK")); |
+} |
+ |
} // namespace headless |