| Index: chrome/renderer/net/net_error_helper_core_unittest.cc
|
| diff --git a/chrome/renderer/net/net_error_helper_core_unittest.cc b/chrome/renderer/net/net_error_helper_core_unittest.cc
|
| index fc18323bb5db54540144cabcdbd288a94b25a456..67eb65e422d119ccfdde9a23e1599da5f7384059 100644
|
| --- a/chrome/renderer/net/net_error_helper_core_unittest.cc
|
| +++ b/chrome/renderer/net/net_error_helper_core_unittest.cc
|
| @@ -7,6 +7,8 @@
|
| #include "base/json/json_writer.h"
|
| #include "base/logging.h"
|
| #include "base/strings/stringprintf.h"
|
| +#include "base/timer/mock_timer.h"
|
| +#include "base/timer/timer.h"
|
| #include "base/values.h"
|
| #include "chrome/common/net/net_error_info.h"
|
| #include "net/base/net_errors.h"
|
| @@ -112,9 +114,13 @@ std::string NetErrorString(net::Error net_error) {
|
| class NetErrorHelperCoreTest : public testing::Test,
|
| public NetErrorHelperCore::Delegate {
|
| public:
|
| - NetErrorHelperCoreTest() : core_(this),
|
| + NetErrorHelperCoreTest() : timer_(new base::MockTimer(false, false)),
|
| + core_(this),
|
| update_count_(0),
|
| - error_html_update_count_(0) {
|
| + error_html_update_count_(0),
|
| + reload_count_(0) {
|
| + core_.set_auto_reload_enabled(false);
|
| + core_.set_timer_for_testing(scoped_ptr<base::Timer>(timer_));
|
| }
|
|
|
| virtual ~NetErrorHelperCoreTest() {
|
| @@ -127,6 +133,10 @@ class NetErrorHelperCoreTest : public testing::Test,
|
| const GURL& url_being_fetched() const { return url_being_fetched_; }
|
| bool is_url_being_fetched() const { return !url_being_fetched_.is_empty(); }
|
|
|
| + int reload_count() const {
|
| + return reload_count_;
|
| + }
|
| +
|
| const std::string& last_update_string() const { return last_update_string_; }
|
| int update_count() const { return update_count_; }
|
|
|
| @@ -137,6 +147,8 @@ class NetErrorHelperCoreTest : public testing::Test,
|
| return last_error_page_params_.get();
|
| }
|
|
|
| + base::MockTimer* timer() { return timer_; }
|
| +
|
| void NavigationCorrectionsLoadSuccess(
|
| const NavigationCorrection* corrections, int num_corrections) {
|
| NavigationCorrectionsLoadFinished(
|
| @@ -152,6 +164,33 @@ class NetErrorHelperCoreTest : public testing::Test,
|
| core().OnNavigationCorrectionsFetched(result, "en", false);
|
| }
|
|
|
| + void DoErrorLoad(net::Error error) {
|
| + core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
|
| + NetErrorHelperCore::NON_ERROR_PAGE);
|
| + std::string html;
|
| + core().GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
|
| + NetError(error), false, &html);
|
| + EXPECT_FALSE(html.empty());
|
| + EXPECT_EQ(NetErrorString(error), html);
|
| +
|
| + core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
|
| + NetErrorHelperCore::ERROR_PAGE);
|
| + core().OnCommitLoad(NetErrorHelperCore::MAIN_FRAME);
|
| + core().OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
|
| + }
|
| +
|
| + void DoSuccessLoad() {
|
| + core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
|
| + NetErrorHelperCore::NON_ERROR_PAGE);
|
| + core().OnCommitLoad(NetErrorHelperCore::MAIN_FRAME);
|
| + core().OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
|
| + }
|
| +
|
| + void DoDnsProbe(chrome_common_net::DnsProbeStatus final_status) {
|
| + core().OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
|
| + core().OnNetErrorInfo(final_status);
|
| + }
|
| +
|
| void EnableNavigationCorrections() {
|
| SetNavigationCorrectionURL(GURL(kNavigationCorrectionUrl));
|
| }
|
| @@ -215,6 +254,12 @@ class NetErrorHelperCoreTest : public testing::Test,
|
| request_body_.clear();
|
| }
|
|
|
| + virtual void ReloadPage() OVERRIDE {
|
| + reload_count_++;
|
| + }
|
| +
|
| + base::MockTimer* timer_;
|
| +
|
| NetErrorHelperCore core_;
|
|
|
| GURL url_being_fetched_;
|
| @@ -233,6 +278,8 @@ class NetErrorHelperCoreTest : public testing::Test,
|
|
|
| // Mutable because GenerateLocalizedErrorPage is const.
|
| mutable scoped_ptr<LocalizedError::ErrorPageParams> last_error_page_params_;
|
| +
|
| + int reload_count_;
|
| };
|
|
|
| //------------------------------------------------------------------------------
|
| @@ -1655,3 +1702,270 @@ TEST_F(NetErrorHelperCoreTest, CorrectionServiceReturnsInvalidJsonResult) {
|
| core().OnCommitLoad(NetErrorHelperCore::MAIN_FRAME);
|
| core().OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
|
| }
|
| +
|
| +TEST_F(NetErrorHelperCoreTest, AutoReloadDisabled) {
|
| + DoErrorLoad(net::ERR_CONNECTION_RESET);
|
| +
|
| + EXPECT_FALSE(timer()->IsRunning());
|
| + EXPECT_EQ(0, reload_count());
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperCoreTest, AutoReloadSucceeds) {
|
| + core().set_auto_reload_enabled(true);
|
| + DoErrorLoad(net::ERR_CONNECTION_RESET);
|
| +
|
| + EXPECT_TRUE(timer()->IsRunning());
|
| + EXPECT_EQ(0, reload_count());
|
| +
|
| + timer()->Fire();
|
| + EXPECT_FALSE(timer()->IsRunning());
|
| + EXPECT_EQ(1, reload_count());
|
| +
|
| + DoSuccessLoad();
|
| +
|
| + EXPECT_FALSE(timer()->IsRunning());
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperCoreTest, AutoReloadRetries) {
|
| + core().set_auto_reload_enabled(true);
|
| + DoErrorLoad(net::ERR_CONNECTION_RESET);
|
| +
|
| + EXPECT_TRUE(timer()->IsRunning());
|
| + base::TimeDelta first_delay = timer()->GetCurrentDelay();
|
| + EXPECT_EQ(0, reload_count());
|
| +
|
| + timer()->Fire();
|
| + EXPECT_FALSE(timer()->IsRunning());
|
| + EXPECT_EQ(1, reload_count());
|
| +
|
| + DoErrorLoad(net::ERR_CONNECTION_RESET);
|
| +
|
| + EXPECT_TRUE(timer()->IsRunning());
|
| + EXPECT_GT(timer()->GetCurrentDelay(), first_delay);
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperCoreTest, AutoReloadStopsTimerOnStop) {
|
| + core().set_auto_reload_enabled(true);
|
| + DoErrorLoad(net::ERR_CONNECTION_RESET);
|
| + EXPECT_TRUE(timer()->IsRunning());
|
| + core().OnStop();
|
| + EXPECT_FALSE(timer()->IsRunning());
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperCoreTest, AutoReloadStopsLoadingOnStop) {
|
| + core().set_auto_reload_enabled(true);
|
| + DoErrorLoad(net::ERR_CONNECTION_RESET);
|
| + EXPECT_EQ(1, core().auto_reload_count());
|
| + timer()->Fire();
|
| + EXPECT_EQ(1, reload_count());
|
| + core().OnStop();
|
| + EXPECT_FALSE(timer()->IsRunning());
|
| + EXPECT_EQ(0, core().auto_reload_count());
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperCoreTest, AutoReloadStopsOnOtherLoadStart) {
|
| + core().set_auto_reload_enabled(true);
|
| + DoErrorLoad(net::ERR_CONNECTION_RESET);
|
| + EXPECT_TRUE(timer()->IsRunning());
|
| + core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
|
| + NetErrorHelperCore::NON_ERROR_PAGE);
|
| + EXPECT_FALSE(timer()->IsRunning());
|
| + EXPECT_EQ(1, core().auto_reload_count());
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperCoreTest, AutoReloadResetsCountOnSuccess) {
|
| + core().set_auto_reload_enabled(true);
|
| + DoErrorLoad(net::ERR_CONNECTION_RESET);
|
| + base::TimeDelta delay = timer()->GetCurrentDelay();
|
| + EXPECT_EQ(1, core().auto_reload_count());
|
| + timer()->Fire();
|
| + EXPECT_EQ(1, reload_count());
|
| + DoSuccessLoad();
|
| + DoErrorLoad(net::ERR_CONNECTION_RESET);
|
| + EXPECT_EQ(1, core().auto_reload_count());
|
| + EXPECT_EQ(timer()->GetCurrentDelay(), delay);
|
| + timer()->Fire();
|
| + EXPECT_EQ(2, reload_count());
|
| + DoSuccessLoad();
|
| + EXPECT_EQ(0, core().auto_reload_count());
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperCoreTest, AutoReloadRestartsOnOnline) {
|
| + core().set_auto_reload_enabled(true);
|
| + DoErrorLoad(net::ERR_CONNECTION_RESET);
|
| + base::TimeDelta delay = timer()->GetCurrentDelay();
|
| + timer()->Fire();
|
| + DoErrorLoad(net::ERR_CONNECTION_RESET);
|
| + EXPECT_TRUE(timer()->IsRunning());
|
| + EXPECT_NE(delay, timer()->GetCurrentDelay());
|
| + core().NetworkStateChanged(true);
|
| + EXPECT_TRUE(timer()->IsRunning());
|
| + EXPECT_EQ(delay, timer()->GetCurrentDelay());
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperCoreTest, AutoReloadDoesNotStartOnOnline) {
|
| + core().set_auto_reload_enabled(true);
|
| + DoErrorLoad(net::ERR_CONNECTION_RESET);
|
| + timer()->Fire();
|
| + DoSuccessLoad();
|
| + EXPECT_FALSE(timer()->IsRunning());
|
| + core().NetworkStateChanged(true);
|
| + EXPECT_FALSE(timer()->IsRunning());
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperCoreTest, AutoReloadStopsOnOffline) {
|
| + core().set_auto_reload_enabled(true);
|
| + DoErrorLoad(net::ERR_CONNECTION_RESET);
|
| + EXPECT_TRUE(timer()->IsRunning());
|
| + core().NetworkStateChanged(false);
|
| + EXPECT_FALSE(timer()->IsRunning());
|
| + EXPECT_EQ(0, core().auto_reload_count());
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperCoreTest, AutoReloadStopsOnOfflineThenRestartsOnOnline) {
|
| + core().set_auto_reload_enabled(true);
|
| + DoErrorLoad(net::ERR_CONNECTION_RESET);
|
| + EXPECT_TRUE(timer()->IsRunning());
|
| + core().NetworkStateChanged(false);
|
| + EXPECT_FALSE(timer()->IsRunning());
|
| + core().NetworkStateChanged(true);
|
| + EXPECT_TRUE(timer()->IsRunning());
|
| + EXPECT_EQ(1, core().auto_reload_count());
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperCoreTest, AutoReloadDoesNotRestartOnOnlineAfterStop) {
|
| + core().set_auto_reload_enabled(true);
|
| + DoErrorLoad(net::ERR_CONNECTION_RESET);
|
| + timer()->Fire();
|
| + core().OnStop();
|
| + core().NetworkStateChanged(true);
|
| + EXPECT_FALSE(timer()->IsRunning());
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperCoreTest, AutoReloadWithDnsProbes) {
|
| + core().set_auto_reload_enabled(true);
|
| + DoErrorLoad(net::ERR_CONNECTION_RESET);
|
| + DoDnsProbe(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
|
| + timer()->Fire();
|
| + EXPECT_EQ(1, reload_count());
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperCoreTest, AutoReloadExponentialBackoffLevelsOff) {
|
| + core().set_auto_reload_enabled(true);
|
| + base::TimeDelta previous = base::TimeDelta::FromMilliseconds(0);
|
| + const int kMaxTries = 50;
|
| + int tries = 0;
|
| + for (tries = 0; tries < kMaxTries; tries++) {
|
| + DoErrorLoad(net::ERR_CONNECTION_RESET);
|
| + EXPECT_TRUE(timer()->IsRunning());
|
| + if (previous == timer()->GetCurrentDelay())
|
| + break;
|
| + previous = timer()->GetCurrentDelay();
|
| + timer()->Fire();
|
| + }
|
| +
|
| + EXPECT_LT(tries, kMaxTries);
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperCoreTest, AutoReloadSlowError) {
|
| + core().set_auto_reload_enabled(true);
|
| + core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
|
| + NetErrorHelperCore::NON_ERROR_PAGE);
|
| + std::string html;
|
| + core().GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
|
| + NetError(net::ERR_CONNECTION_RESET), false, &html);
|
| + core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
|
| + NetErrorHelperCore::ERROR_PAGE);
|
| + core().OnCommitLoad(NetErrorHelperCore::MAIN_FRAME);
|
| + EXPECT_FALSE(timer()->IsRunning());
|
| + // Start a new non-error page load.
|
| + core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
|
| + NetErrorHelperCore::NON_ERROR_PAGE);
|
| + EXPECT_FALSE(timer()->IsRunning());
|
| + // Finish the error page load.
|
| + core().OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
|
| + EXPECT_FALSE(timer()->IsRunning());
|
| + core().OnCommitLoad(NetErrorHelperCore::MAIN_FRAME);
|
| + core().OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
|
| + EXPECT_FALSE(timer()->IsRunning());
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperCoreTest, AutoReloadOnlineSlowError) {
|
| + core().set_auto_reload_enabled(true);
|
| + core().NetworkStateChanged(false);
|
| + core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
|
| + NetErrorHelperCore::NON_ERROR_PAGE);
|
| + std::string html;
|
| + core().GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
|
| + NetError(net::ERR_CONNECTION_RESET), false, &html);
|
| + core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
|
| + NetErrorHelperCore::ERROR_PAGE);
|
| + core().OnCommitLoad(NetErrorHelperCore::MAIN_FRAME);
|
| + EXPECT_FALSE(timer()->IsRunning());
|
| + core().NetworkStateChanged(true);
|
| + EXPECT_FALSE(timer()->IsRunning());
|
| + core().NetworkStateChanged(false);
|
| + core().OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
|
| + EXPECT_FALSE(timer()->IsRunning());
|
| + core().NetworkStateChanged(true);
|
| + EXPECT_TRUE(timer()->IsRunning());
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperCoreTest, AutoReloadOnlinePendingError) {
|
| + core().set_auto_reload_enabled(true);
|
| + core().NetworkStateChanged(false);
|
| + core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
|
| + NetErrorHelperCore::NON_ERROR_PAGE);
|
| + std::string html;
|
| + core().GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
|
| + NetError(net::ERR_CONNECTION_RESET), false, &html);
|
| + core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
|
| + NetErrorHelperCore::ERROR_PAGE);
|
| + EXPECT_FALSE(timer()->IsRunning());
|
| + core().NetworkStateChanged(true);
|
| + EXPECT_FALSE(timer()->IsRunning());
|
| + core().NetworkStateChanged(false);
|
| + core().OnCommitLoad(NetErrorHelperCore::MAIN_FRAME);
|
| + core().OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
|
| + EXPECT_FALSE(timer()->IsRunning());
|
| + core().NetworkStateChanged(true);
|
| + EXPECT_TRUE(timer()->IsRunning());
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperCoreTest, AutoReloadOnlinePartialErrorReplacement) {
|
| + core().set_auto_reload_enabled(true);
|
| + core().NetworkStateChanged(false);
|
| + core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
|
| + NetErrorHelperCore::NON_ERROR_PAGE);
|
| + std::string html;
|
| + core().GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
|
| + NetError(net::ERR_CONNECTION_RESET), false, &html);
|
| + core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
|
| + NetErrorHelperCore::ERROR_PAGE);
|
| + core().OnCommitLoad(NetErrorHelperCore::MAIN_FRAME);
|
| + core().OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
|
| + core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
|
| + NetErrorHelperCore::NON_ERROR_PAGE);
|
| + core().GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
|
| + NetError(net::ERR_CONNECTION_RESET), false, &html);
|
| + core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
|
| + NetErrorHelperCore::ERROR_PAGE);
|
| + EXPECT_FALSE(timer()->IsRunning());
|
| + core().NetworkStateChanged(true);
|
| + EXPECT_FALSE(timer()->IsRunning());
|
| +}
|
| +
|
| +TEST_F(NetErrorHelperCoreTest, ShouldSuppressErrorPage) {
|
| + // Set up the environment to test ShouldSuppressErrorPage: auto-reload is
|
| + // enabled, an error page is loaded, and the auto-reload callback is running.
|
| + core().set_auto_reload_enabled(true);
|
| + DoErrorLoad(net::ERR_CONNECTION_RESET);
|
| + timer()->Fire();
|
| +
|
| + EXPECT_FALSE(core().ShouldSuppressErrorPage(NetErrorHelperCore::SUB_FRAME,
|
| + GURL(kFailedUrl)));
|
| + EXPECT_FALSE(core().ShouldSuppressErrorPage(NetErrorHelperCore::MAIN_FRAME,
|
| + GURL("http://some.other.url")));
|
| + EXPECT_TRUE(core().ShouldSuppressErrorPage(NetErrorHelperCore::MAIN_FRAME,
|
| + GURL(kFailedUrl)));
|
| +}
|
|
|