| Index: chrome/renderer/net/net_error_helper_unittest.cc
|
| diff --git a/chrome/renderer/net/net_error_helper_unittest.cc b/chrome/renderer/net/net_error_helper_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..55cb2a3e5ce9f1d5e6bb9c686475183419e3bf28
|
| --- /dev/null
|
| +++ b/chrome/renderer/net/net_error_helper_unittest.cc
|
| @@ -0,0 +1,412 @@
|
| +// Copyright (c) 2013 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 "chrome/renderer/net/net_error_helper.h"
|
| +
|
| +#include "base/logging.h"
|
| +#include "chrome/common/net/net_error_info.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +using chrome_common_net::DnsProbeStatus;
|
| +using chrome_common_net::DnsProbeStatusToString;
|
| +
|
| +// NetErrorHelperTest cases consist of a string of these steps.
|
| +enum TestStep {
|
| + // Simulate a provisional load start, fail, commit or a finish-load event.
|
| + // (Start and fail differentiate between normal and error pages.)
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, LOAD_ERROR_START,
|
| + LOAD_COMMIT, LOAD_FINISH,
|
| +
|
| + // Simulate an IPC from the browser with DNS_PROBE_STARTED, _NOT_RUN, or
|
| + // _FINISHED_NXDOMAIN.
|
| + STATUS_STARTED, STATUS_NOT_RUN, STATUS_FINISHED,
|
| +
|
| + // Expect that the *next* step will cause an update. (Any step that is not
|
| + // prefixed by this pseudo-step is expected *not* to cause an update.)
|
| + EXPECT_UPDATE
|
| +};
|
| +
|
| +class TestNetErrorHelper : public NetErrorHelper {
|
| + public:
|
| + TestNetErrorHelper()
|
| + : NetErrorHelper(NULL),
|
| + mock_page_update_count_(0),
|
| + mock_displayed_probe_status_(chrome_common_net::DNS_PROBE_MAX) {}
|
| +
|
| + virtual ~TestNetErrorHelper() {}
|
| +
|
| + void StartLoad(bool is_main_frame, bool is_error_page) {
|
| + OnStartLoad(is_main_frame, is_error_page);
|
| + }
|
| +
|
| + void FailLoad(bool is_main_frame, bool is_dns_error) {
|
| + OnFailLoad(is_main_frame, is_dns_error);
|
| + }
|
| +
|
| + void CommitLoad(bool is_main_frame) {
|
| + OnCommitLoad(is_main_frame);
|
| + }
|
| +
|
| + void FinishLoad(bool is_main_frame) {
|
| + OnFinishLoad(is_main_frame);
|
| + }
|
| +
|
| + void ReceiveProbeStatus(DnsProbeStatus status) {
|
| + OnNetErrorInfo(static_cast<int>(status));
|
| + }
|
| +
|
| + int mock_page_update_count() const { return mock_page_update_count_; }
|
| + DnsProbeStatus mock_displayed_probe_status() const {
|
| + return mock_displayed_probe_status_;
|
| + }
|
| +
|
| + protected:
|
| + virtual void UpdateErrorPage() OVERRIDE {
|
| + DVLOG(1) << "Updating error page with status "
|
| + << DnsProbeStatusToString(last_probe_status_);
|
| + mock_page_update_count_++;
|
| + mock_displayed_probe_status_ = last_probe_status_;
|
| + }
|
| +
|
| + private:
|
| + int mock_page_update_count_;
|
| + DnsProbeStatus mock_displayed_probe_status_;
|
| +};
|
| +
|
| +class NetErrorHelperTest : public testing::Test {
|
| + protected:
|
| + enum MainFrame { SUB_FRAME, MAIN_FRAME };
|
| + enum ErrorPage { NORMAL_PAGE, ERROR_PAGE };
|
| + enum ErrorType { OTHER_ERROR, DNS_ERROR };
|
| +
|
| + void StartLoad(MainFrame main_frame, ErrorPage error_page) {
|
| + helper_.StartLoad(main_frame == MAIN_FRAME, error_page == ERROR_PAGE);
|
| + }
|
| +
|
| + void FailLoad(MainFrame main_frame, ErrorType error_type) {
|
| + helper_.FailLoad(main_frame == MAIN_FRAME, error_type == DNS_ERROR);
|
| + }
|
| +
|
| + void CommitLoad(MainFrame main_frame) {
|
| + helper_.CommitLoad(main_frame == MAIN_FRAME);
|
| + }
|
| +
|
| + void FinishLoad(MainFrame main_frame) {
|
| + helper_.FinishLoad(main_frame == MAIN_FRAME);
|
| + }
|
| +
|
| + void ReceiveProbeStatus(DnsProbeStatus status) {
|
| + helper_.ReceiveProbeStatus(status);
|
| + }
|
| +
|
| + void RunTest(const TestStep steps[], int step_count);
|
| +
|
| + int page_update_count() const { return helper_.mock_page_update_count(); }
|
| + DnsProbeStatus displayed_probe_status() const {
|
| + return helper_.mock_displayed_probe_status();
|
| + }
|
| +
|
| + private:
|
| + TestNetErrorHelper helper_;
|
| +};
|
| +
|
| +void NetErrorHelperTest::RunTest(const TestStep steps[], int step_count) {
|
| + // Whether the next instruction is expected to cause an update (since the
|
| + // step right before it was EXPECT_UPDATE) or not.
|
| + bool update_expected = false;
|
| + int expected_update_count = page_update_count();
|
| + // The last status that the test simulated receiving from the browser.
|
| + // When an update is expected, the status is expected to match this.
|
| + chrome_common_net::DnsProbeStatus last_status_received =
|
| + chrome_common_net::DNS_PROBE_POSSIBLE;
|
| +
|
| + for (int i = 0; i < step_count; i++) {
|
| + switch (steps[i]) {
|
| + case LOAD_NORMAL_START:
|
| + StartLoad(MAIN_FRAME, NORMAL_PAGE);
|
| + break;
|
| + case LOAD_NORMAL_FAIL:
|
| + FailLoad(MAIN_FRAME, DNS_ERROR);
|
| + break;
|
| + case LOAD_ERROR_START:
|
| + StartLoad(MAIN_FRAME, ERROR_PAGE);
|
| + break;
|
| + case LOAD_COMMIT:
|
| + CommitLoad(MAIN_FRAME);
|
| + break;
|
| + case LOAD_FINISH:
|
| + FinishLoad(MAIN_FRAME);
|
| + break;
|
| + case STATUS_STARTED:
|
| + ReceiveProbeStatus(chrome_common_net::DNS_PROBE_STARTED);
|
| + last_status_received = chrome_common_net::DNS_PROBE_STARTED;
|
| + break;
|
| + case STATUS_NOT_RUN:
|
| + ReceiveProbeStatus(chrome_common_net::DNS_PROBE_NOT_RUN);
|
| + last_status_received = chrome_common_net::DNS_PROBE_NOT_RUN;
|
| + break;
|
| + case STATUS_FINISHED:
|
| + ReceiveProbeStatus(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
|
| + last_status_received = chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN;
|
| + break;
|
| + case EXPECT_UPDATE:
|
| + ASSERT_FALSE(update_expected);
|
| + update_expected = true;
|
| + // Skip to next step to see if it updates the status, instead of
|
| + // checking whether EXPECT_UPDATE itself caused an update.
|
| + continue;
|
| + }
|
| +
|
| + if (update_expected) {
|
| + DCHECK_NE(chrome_common_net::DNS_PROBE_POSSIBLE, last_status_received);
|
| + ++expected_update_count;
|
| +
|
| + EXPECT_EQ(last_status_received, displayed_probe_status());
|
| + if (displayed_probe_status() != last_status_received) {
|
| + LOG(ERROR) << "Unexpected status at step " << i << ".";
|
| + return;
|
| + }
|
| + }
|
| +
|
| + EXPECT_EQ(expected_update_count, page_update_count());
|
| + if (page_update_count() != expected_update_count) {
|
| + LOG(ERROR) << (update_expected ? "Missing" : "Spurious")
|
| + << " update at step " << i << ".";
|
| + return;
|
| + }
|
| +
|
| + update_expected = false;
|
| + }
|
| +
|
| + DCHECK(!update_expected);
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperTest, Null) {
|
| + // Test that we can simply create and destroy a NetErrorHelper.
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperTest, SuccessfulPageLoad) {
|
| + StartLoad(MAIN_FRAME, NORMAL_PAGE);
|
| + CommitLoad(MAIN_FRAME);
|
| + FinishLoad(MAIN_FRAME);
|
| +
|
| + // Ignore spurious status.
|
| + ReceiveProbeStatus(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
|
| + EXPECT_EQ(0, page_update_count());
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperTest, MainFrameNonDnsError) {
|
| + StartLoad(MAIN_FRAME, NORMAL_PAGE);
|
| + FailLoad(MAIN_FRAME, OTHER_ERROR);
|
| + StartLoad(MAIN_FRAME, ERROR_PAGE);
|
| + CommitLoad(MAIN_FRAME);
|
| + FinishLoad(MAIN_FRAME);
|
| +
|
| + // Ignore spurious status.
|
| + ReceiveProbeStatus(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
|
| + EXPECT_EQ(0, page_update_count());
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperTest, SubFrameDnsError) {
|
| + StartLoad(SUB_FRAME, NORMAL_PAGE);
|
| + FailLoad(SUB_FRAME, DNS_ERROR);
|
| + StartLoad(SUB_FRAME, ERROR_PAGE);
|
| + CommitLoad(SUB_FRAME);
|
| + FinishLoad(SUB_FRAME);
|
| +
|
| + // Ignore spurious status.
|
| + ReceiveProbeStatus(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
|
| + EXPECT_EQ(0, page_update_count());
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperTest, FinishedAfterFail) {
|
| + const TestStep steps[] = {
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, STATUS_FINISHED, LOAD_ERROR_START,
|
| + LOAD_COMMIT, EXPECT_UPDATE, LOAD_FINISH
|
| + };
|
| + RunTest(steps, arraysize(steps));
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperTest, FinishedAfterFail_StartedAfterFail) {
|
| + const TestStep steps[] = {
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, STATUS_STARTED, STATUS_FINISHED,
|
| + LOAD_ERROR_START, LOAD_COMMIT, EXPECT_UPDATE, LOAD_FINISH
|
| + };
|
| + RunTest(steps, arraysize(steps));
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperTest, FinishedAfterStart) {
|
| + const TestStep steps[] = {
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, LOAD_ERROR_START, STATUS_FINISHED,
|
| + LOAD_COMMIT, EXPECT_UPDATE, LOAD_FINISH
|
| + };
|
| + RunTest(steps, arraysize(steps));
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperTest, FinishedAfterStart_StartedAfterFail) {
|
| + const TestStep steps[] = {
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, STATUS_STARTED, LOAD_ERROR_START,
|
| + STATUS_FINISHED, LOAD_COMMIT, EXPECT_UPDATE, LOAD_FINISH
|
| + };
|
| + RunTest(steps, arraysize(steps));
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperTest, FinishedAfterStart_StartedAfterStart) {
|
| + const TestStep steps[] = {
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, STATUS_STARTED, LOAD_ERROR_START,
|
| + STATUS_FINISHED, LOAD_COMMIT, EXPECT_UPDATE, LOAD_FINISH
|
| + };
|
| + RunTest(steps, arraysize(steps));
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperTest, FinishedAfterCommit) {
|
| + const TestStep steps[] = {
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, LOAD_ERROR_START, LOAD_COMMIT,
|
| + STATUS_FINISHED, EXPECT_UPDATE, LOAD_FINISH
|
| + };
|
| + RunTest(steps, arraysize(steps));
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperTest, FinishedAfterCommit_StartedAfterFail) {
|
| + const TestStep steps[] = {
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, STATUS_STARTED, LOAD_ERROR_START,
|
| + LOAD_COMMIT, STATUS_FINISHED, EXPECT_UPDATE, LOAD_FINISH
|
| + };
|
| + RunTest(steps, arraysize(steps));
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperTest, FinishedAfterCommit_StartedAfterStart) {
|
| + const TestStep steps[] = {
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, LOAD_ERROR_START, STATUS_STARTED,
|
| + LOAD_ERROR_START, LOAD_COMMIT, STATUS_FINISHED, EXPECT_UPDATE, LOAD_FINISH
|
| + };
|
| + RunTest(steps, arraysize(steps));
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperTest, FinishedAfterCommit_StartedAfterCommit) {
|
| + const TestStep steps[] = {
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, LOAD_ERROR_START, LOAD_COMMIT,
|
| + STATUS_STARTED, STATUS_FINISHED, EXPECT_UPDATE, LOAD_FINISH
|
| + };
|
| + RunTest(steps, arraysize(steps));
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperTest, FinishedAfterFinish) {
|
| + const TestStep steps[] = {
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, LOAD_ERROR_START, LOAD_COMMIT,
|
| + LOAD_FINISH, EXPECT_UPDATE, STATUS_FINISHED
|
| + };
|
| + RunTest(steps, arraysize(steps));
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperTest, FinishedAfterFinish_StartAfterFail) {
|
| + const TestStep steps[] = {
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, STATUS_STARTED, LOAD_ERROR_START,
|
| + LOAD_COMMIT, EXPECT_UPDATE, LOAD_FINISH, EXPECT_UPDATE, STATUS_FINISHED
|
| + };
|
| + RunTest(steps, arraysize(steps));
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperTest, FinishedAfterFinish_StartAfterStart) {
|
| + const TestStep steps[] = {
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, LOAD_ERROR_START, STATUS_STARTED,
|
| + LOAD_COMMIT, EXPECT_UPDATE, LOAD_FINISH, EXPECT_UPDATE, STATUS_FINISHED
|
| + };
|
| + RunTest(steps, arraysize(steps));
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperTest, FinishedAfterFinish_StartAfterCommit) {
|
| + const TestStep steps[] = {
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, LOAD_ERROR_START, LOAD_COMMIT,
|
| + STATUS_STARTED, EXPECT_UPDATE, LOAD_FINISH, EXPECT_UPDATE, STATUS_FINISHED
|
| + };
|
| + RunTest(steps, arraysize(steps));
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperTest, FinishedAfterFinish_StartAfterFinish) {
|
| + const TestStep steps[] = {
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, LOAD_ERROR_START, LOAD_COMMIT,
|
| + LOAD_FINISH, EXPECT_UPDATE, STATUS_STARTED, EXPECT_UPDATE, STATUS_FINISHED
|
| + };
|
| + RunTest(steps, arraysize(steps));
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperTest, FinishedAfterNewStart) {
|
| + const TestStep steps[] = {
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, LOAD_ERROR_START, LOAD_COMMIT,
|
| + LOAD_FINISH, LOAD_NORMAL_START, EXPECT_UPDATE, STATUS_FINISHED,
|
| + LOAD_COMMIT, LOAD_FINISH
|
| + };
|
| + RunTest(steps, arraysize(steps));
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperTest, NotRunAfterFail) {
|
| + const TestStep steps[] = {
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, STATUS_NOT_RUN, LOAD_ERROR_START,
|
| + LOAD_COMMIT, EXPECT_UPDATE, LOAD_FINISH
|
| + };
|
| + RunTest(steps, arraysize(steps));
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperTest, NotRunAfterStart) {
|
| + const TestStep steps[] = {
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, LOAD_ERROR_START, STATUS_NOT_RUN,
|
| + LOAD_COMMIT, EXPECT_UPDATE, LOAD_FINISH
|
| + };
|
| + RunTest(steps, arraysize(steps));
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperTest, NotRunAfterCommit) {
|
| + const TestStep steps[] = {
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, LOAD_ERROR_START, LOAD_COMMIT,
|
| + STATUS_NOT_RUN, EXPECT_UPDATE, LOAD_FINISH
|
| + };
|
| + RunTest(steps, arraysize(steps));
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperTest, NotRunAfterFinish) {
|
| + const TestStep steps[] = {
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, LOAD_ERROR_START, LOAD_COMMIT,
|
| + LOAD_FINISH, EXPECT_UPDATE, STATUS_NOT_RUN
|
| + };
|
| + RunTest(steps, arraysize(steps));
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperTest, FinishedAfterNewCommit) {
|
| + const TestStep steps[] = {
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, LOAD_ERROR_START, LOAD_COMMIT,
|
| + LOAD_FINISH, LOAD_NORMAL_START, LOAD_COMMIT, STATUS_FINISHED, LOAD_FINISH
|
| + };
|
| + RunTest(steps, arraysize(steps));
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperTest, FinishedAfterNewFinish) {
|
| + const TestStep steps[] = {
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, LOAD_ERROR_START, LOAD_COMMIT,
|
| + LOAD_FINISH, LOAD_NORMAL_START, LOAD_COMMIT, LOAD_FINISH, STATUS_FINISHED
|
| + };
|
| + RunTest(steps, arraysize(steps));
|
| +}
|
| +
|
| +// Two iterations of FinishedAfterStart_StartAfterFail
|
| +TEST_F(NetErrorHelperTest, TwoProbes_FinishedAfterStart_StartAfterFail) {
|
| + const TestStep steps[] = {
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, STATUS_STARTED, LOAD_ERROR_START,
|
| + STATUS_FINISHED, LOAD_COMMIT, EXPECT_UPDATE, LOAD_FINISH,
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, STATUS_STARTED, LOAD_ERROR_START,
|
| + STATUS_FINISHED, LOAD_COMMIT, EXPECT_UPDATE, LOAD_FINISH
|
| + };
|
| + RunTest(steps, arraysize(steps));
|
| +}
|
| +
|
| +// Two iterations of FinishedAfterFinish
|
| +TEST_F(NetErrorHelperTest, TwoProbes_FinishedAfterFinish) {
|
| + const TestStep steps[] = {
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, LOAD_ERROR_START, LOAD_COMMIT,
|
| + LOAD_FINISH, EXPECT_UPDATE, STATUS_FINISHED,
|
| + LOAD_NORMAL_START, LOAD_NORMAL_FAIL, LOAD_ERROR_START, LOAD_COMMIT,
|
| + LOAD_FINISH, EXPECT_UPDATE, STATUS_FINISHED
|
| + };
|
| + RunTest(steps, arraysize(steps));
|
| +}
|
|
|