| 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
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b4c1c1fe08928e25d40d664fe88107973863355a
|
| --- /dev/null
|
| +++ b/headless/public/util/deterministic_dispatcher_test.cc
|
| @@ -0,0 +1,113 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "headless/public/util/deterministic_dispatcher.h"
|
| +
|
| +#include <memory>
|
| +#include <string>
|
| +#include <vector>
|
| +
|
| +#include "base/run_loop.h"
|
| +#include "base/single_thread_task_runner.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"
|
| +
|
| +using testing::ElementsAre;
|
| +
|
| +namespace headless {
|
| +
|
| +class DeterministicDispatcherTest : public ::testing::Test {
|
| + protected:
|
| + DeterministicDispatcherTest() {}
|
| + ~DeterministicDispatcherTest() override {}
|
| +
|
| + void SetUp() override {
|
| + deterministic_dispatcher_.reset(
|
| + new DeterministicDispatcher(loop_.task_runner()));
|
| + }
|
| +
|
| + base::MessageLoop loop_;
|
| + std::unique_ptr<DeterministicDispatcher> deterministic_dispatcher_;
|
| +};
|
| +
|
| +TEST_F(DeterministicDispatcherTest, DispatchDataReadyInReverseOrder) {
|
| + std::vector<std::string> notifications;
|
| + std::unique_ptr<FakeManagedDispatchURLRequestJob> job1(
|
| + new FakeManagedDispatchURLRequestJob(deterministic_dispatcher_.get(), 1,
|
| + ¬ifications));
|
| + 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));
|
| + job4->DispatchHeadersComplete();
|
| + job3->DispatchHeadersComplete();
|
| + job2->DispatchHeadersComplete();
|
| + job1->DispatchHeadersComplete();
|
| +
|
| + EXPECT_TRUE(notifications.empty());
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_THAT(notifications, ElementsAre("id: 1 OK"));
|
| +
|
| + job1.reset();
|
| + 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"));
|
| +}
|
| +
|
| +TEST_F(DeterministicDispatcherTest,
|
| + ErrorsAndDataReadyDispatchedInCreationOrder) {
|
| + std::vector<std::string> notifications;
|
| + std::unique_ptr<FakeManagedDispatchURLRequestJob> job1(
|
| + new FakeManagedDispatchURLRequestJob(deterministic_dispatcher_.get(), 1,
|
| + ¬ifications));
|
| + 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));
|
| + job4->DispatchHeadersComplete();
|
| + job3->DispatchStartError(static_cast<net::Error>(-123));
|
| + job2->DispatchHeadersComplete();
|
| + job1->DispatchHeadersComplete();
|
| +
|
| + EXPECT_TRUE(notifications.empty());
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_THAT(notifications, ElementsAre("id: 1 OK"));
|
| +
|
| + job1.reset();
|
| + 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 err: -123"));
|
| +
|
| + job3.reset();
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_THAT(notifications, ElementsAre("id: 1 OK", "id: 2 OK",
|
| + "id: 3 err: -123", "id: 4 OK"));
|
| +}
|
| +
|
| +} // namespace headless
|
|
|