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

Unified Diff: chrome/renderer/net/net_error_helper_unittest.cc

Issue 13270005: Display DNS probe results. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 7 years, 5 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: 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
mmenke 2013/07/15 16:33:22 Hmm...This test, and a bunch of others, skip STATU
Deprecated (see juliatuttle) 2013/07/15 19:33:38 I do cover cases with STARTED and FINISHED above,
+ };
+ RunTest(steps, arraysize(steps));
+}

Powered by Google App Engine
This is Rietveld 408576698