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

Unified Diff: chrome/browser/google_url_tracker_unittest.cc

Issue 3171019: Reland r56483 - Monitor network change in GoogleURLTracker (Closed)
Patch Set: check Chrome Frame Created 10 years, 4 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
« no previous file with comments | « chrome/browser/google_url_tracker.cc ('k') | chrome/browser/search_engines/template_url_model.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/google_url_tracker_unittest.cc
diff --git a/chrome/browser/google_url_tracker_unittest.cc b/chrome/browser/google_url_tracker_unittest.cc
index 9de0b881d75d4dde8a8277d61c5c96b95c50c7e8..428a3e335f6b76e28083e3a3a4852236adc5b92c 100644
--- a/chrome/browser/google_url_tracker_unittest.cc
+++ b/chrome/browser/google_url_tracker_unittest.cc
@@ -3,33 +3,450 @@
// found in the LICENSE file.
#include "chrome/browser/google_url_tracker.h"
+#include "base/command_line.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/profile.h"
+#include "chrome/browser/tab_contents/infobar_delegate.h"
+#include "chrome/common/net/url_fetcher.h"
+#include "chrome/common/net/url_request_context_getter.h"
+#include "chrome/common/net/test_url_fetcher_factory.h"
+#include "chrome/common/notification_service.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/test/testing_browser_process.h"
+#include "chrome/test/testing_pref_service.h"
+#include "chrome/test/testing_profile.h"
+#include "net/url_request/url_request.h"
+#include "net/url_request/url_request_unittest.h"
#include "testing/gtest/include/gtest/gtest.h"
-TEST(GoogleURLTrackerTest, CheckAndConvertURL) {
- static const struct {
- const char* const source_url;
- const bool can_convert;
- const char* const base_url;
- } data[] = {
- { "http://www.google.com/", true, "http://www.google.com/", },
- { "http://google.fr/", true, "http://google.fr/", },
- { "http://google.co.uk/", true, "http://google.co.uk/", },
- { "http://www.google.com.by/", true, "http://www.google.com.by/", },
- { "http://www.google.com/ig", true, "http://www.google.com/", },
- { "http://www.google.com/intl/xx", true, "http://www.google.com/intl/xx", },
- { "http://a.b.c.google.com/", true, "http://a.b.c.google.com/", },
- { "http://www.yahoo.com/", false, "", },
- { "http://google.evil.com/", false, "", },
- { "http://google.com.com.com/", false, "", },
- { "http://google/", false, "", },
- { "http://wifi.corp.google.com/", false, "" },
- };
-
- for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) {
- GURL base_url;
- const bool can_convert = GoogleURLTracker::CheckAndConvertToGoogleBaseURL(
- GURL(data[i].source_url), &base_url);
- EXPECT_EQ(data[i].can_convert, can_convert);
- EXPECT_STREQ(data[i].base_url, base_url.spec().c_str());
+namespace {
+
+class TestNotificationObserver : public NotificationObserver {
+ public:
+ TestNotificationObserver() : notified_(false) {}
+ virtual ~TestNotificationObserver() {}
+
+ virtual void Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details) {
+ notified_ = true;
+ }
+ bool notified() const { return notified_; }
+ void ClearNotified() { notified_ = false; }
+ private:
+ bool notified_;
+};
+
+class TestInfoBar : public InfoBarDelegate {
+ public:
+ TestInfoBar(GoogleURLTracker* google_url_tracker,
+ const GURL& new_google_url)
+ : InfoBarDelegate(NULL),
+ google_url_tracker_(google_url_tracker),
+ new_google_url_(new_google_url) {}
+ virtual ~TestInfoBar() {}
+ GoogleURLTracker* google_url_tracker() const { return google_url_tracker_; }
+ const GURL& new_google_url() const { return new_google_url_; }
+
+ virtual InfoBar* CreateInfoBar() { return NULL; }
+
+ private:
+ GoogleURLTracker* google_url_tracker_;
+ GURL new_google_url_;
+};
+
+class TestInfoBarDelegateFactory
+ : public GoogleURLTracker::InfoBarDelegateFactory {
+ public:
+ virtual InfoBarDelegate* CreateInfoBar(TabContents* tab_contents,
+ GoogleURLTracker* google_url_tracker,
+ const GURL& new_google_url) {
+ return new TestInfoBar(google_url_tracker, new_google_url);
+ }
+};
+
+} // anonymous namespace
+
+class GoogleURLTrackerTest : public testing::Test {
+ protected:
+ GoogleURLTrackerTest()
+ : original_default_request_context_(NULL) {
+ }
+
+ void SetUp() {
+ original_default_request_context_ = Profile::GetDefaultRequestContext();
+ Profile::set_default_request_context(NULL);
+ message_loop_ = new MessageLoop(MessageLoop::TYPE_IO);
+ network_change_notifier_.reset(net::NetworkChangeNotifier::CreateMock());
+ testing_profile_.reset(new TestingProfile);
+ TestingBrowserProcess* testing_browser_process =
+ static_cast<TestingBrowserProcess*>(g_browser_process);
+ PrefService* pref_service = testing_profile_->GetPrefs();
+ testing_browser_process->SetPrefService(pref_service);
+ testing_browser_process->SetGoogleURLTracker(new GoogleURLTracker);
+
+ URLFetcher::set_factory(&fetcher_factory_);
+ observer_.reset(new TestNotificationObserver);
+ g_browser_process->google_url_tracker()->infobar_factory_.reset(
+ new TestInfoBarDelegateFactory);
+ }
+
+ void TearDown() {
+ URLFetcher::set_factory(NULL);
+ TestingBrowserProcess* testing_browser_process =
+ static_cast<TestingBrowserProcess*>(g_browser_process);
+ testing_browser_process->SetGoogleURLTracker(NULL);
+ testing_browser_process->SetPrefService(NULL);
+ testing_profile_.reset();
+ network_change_notifier_.reset();
+ delete message_loop_;
+ Profile::set_default_request_context(original_default_request_context_);
+ }
+
+ void CreateRequestContext() {
+ testing_profile_->CreateRequestContext();
+ Profile::set_default_request_context(testing_profile_->GetRequestContext());
+ NotificationService::current()->Notify(
+ NotificationType::DEFAULT_REQUEST_CONTEXT_AVAILABLE,
+ NotificationService::AllSources(), NotificationService::NoDetails());
+ }
+
+ TestURLFetcher* GetFetcherByID(int expected_id) {
+ return fetcher_factory_.GetFetcherByID(expected_id);
+ }
+
+ void MockSearchDomainCheckResponse(
+ int expected_id, const std::string& domain) {
+ TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(expected_id);
+ ASSERT_TRUE(fetcher);
+ fetcher->delegate()->OnURLFetchComplete(
+ fetcher,
+ GURL(GoogleURLTracker::kSearchDomainCheckURL),
+ URLRequestStatus(),
+ 200,
+ ResponseCookies(),
+ domain);
+ MessageLoop::current()->RunAllPending();
+ }
+
+ void RequestServerCheck() {
+ registrar_.Add(observer_.get(), NotificationType::GOOGLE_URL_UPDATED,
+ NotificationService::AllSources());
+ GoogleURLTracker::RequestServerCheck();
+ MessageLoop::current()->RunAllPending();
+ }
+
+ void FinishSleep() {
+ g_browser_process->google_url_tracker()->FinishSleep();
+ MessageLoop::current()->RunAllPending();
+ }
+
+ void NotifyIPAddressChanged() {
+ net::NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
+ MessageLoop::current()->RunAllPending();
+ }
+
+ GURL GetFetchedGoogleURL() {
+ return g_browser_process->google_url_tracker()->fetched_google_url_;
+ }
+
+ void SetGoogleURL(const GURL& url) {
+ g_browser_process->google_url_tracker()->google_url_ = url;
}
+
+ void SetLastPromptedGoogleURL(const GURL& url) {
+ g_browser_process->local_state()->SetString(
+ prefs::kLastPromptedGoogleURL, url.spec());
+ }
+
+ GURL GetLastPromptedGoogleURL() {
+ return GURL(g_browser_process->local_state()->GetString(
+ prefs::kLastPromptedGoogleURL));
+ }
+
+ void SearchCommitted(const GURL& search_url) {
+ GoogleURLTracker* google_url_tracker =
+ g_browser_process->google_url_tracker();
+
+ google_url_tracker->SearchCommitted();
+ // GoogleURLTracker wait for NAV_ENTRY_PENDING.
+ // In NAV_ENTRY_PENDING, it will set search_url_.
+ google_url_tracker->search_url_ = search_url;
+ }
+
+ void NavEntryCommitted() {
+ GoogleURLTracker* google_url_tracker =
+ g_browser_process->google_url_tracker();
+ google_url_tracker->ShowGoogleURLInfoBarIfNecessary(NULL);
+ }
+
+ bool InfoBarIsShown() {
+ return (g_browser_process->google_url_tracker()->infobar_ != NULL);
+ }
+
+ GURL GetInfoBarShowingURL() {
+ TestInfoBar* infobar = static_cast<TestInfoBar*>(
+ g_browser_process->google_url_tracker()->infobar_);
+ return infobar->new_google_url();
+ }
+
+ void AcceptGoogleURL() {
+ TestInfoBar* infobar = static_cast<TestInfoBar*>(
+ g_browser_process->google_url_tracker()->infobar_);
+ ASSERT_TRUE(infobar);
+ ASSERT_TRUE(infobar->google_url_tracker());
+ infobar->google_url_tracker()->AcceptGoogleURL(infobar->new_google_url());
+ }
+
+ void InfoBarClosed() {
+ TestInfoBar* infobar = static_cast<TestInfoBar*>(
+ g_browser_process->google_url_tracker()->infobar_);
+ ASSERT_TRUE(infobar);
+ ASSERT_TRUE(infobar->google_url_tracker());
+ infobar->google_url_tracker()->InfoBarClosed();
+ delete infobar;
+ }
+
+ void ExpectDefaultURLs() {
+ EXPECT_EQ(GURL(GoogleURLTracker::kDefaultGoogleHomepage),
+ GoogleURLTracker::GoogleURL());
+ EXPECT_EQ(GURL(), GetFetchedGoogleURL());
+ }
+
+ private:
+ MessageLoop* message_loop_;
+ scoped_ptr<net::NetworkChangeNotifier> network_change_notifier_;
+ scoped_ptr<TestingProfile> testing_profile_;
+
+ TestURLFetcherFactory fetcher_factory_;
+ NotificationRegistrar registrar_;
+ scoped_ptr<NotificationObserver> observer_;
+
+ URLRequestContextGetter* original_default_request_context_;
+};
+
+TEST_F(GoogleURLTrackerTest, StartupSleepFinish) {
+ CreateRequestContext();
+
+ RequestServerCheck();
+ EXPECT_FALSE(GetFetcherByID(0));
+ ExpectDefaultURLs();
+
+ FinishSleep();
+ MockSearchDomainCheckResponse(0, ".google.co.uk");
+
+ EXPECT_EQ(GURL("http://www.google.co.uk/"), GetFetchedGoogleURL());
+ // GoogleURL is updated, becase it was not the last prompted URL.
+ EXPECT_EQ(GURL("http://www.google.co.uk/"), GoogleURLTracker::GoogleURL());
+}
+
+TEST_F(GoogleURLTrackerTest, StartupSleepFinishWithLastPrompted) {
+ CreateRequestContext();
+ SetLastPromptedGoogleURL(GURL("http://www.google.co.uk/"));
+
+ RequestServerCheck();
+ EXPECT_FALSE(GetFetcherByID(0));
+ ExpectDefaultURLs();
+
+ FinishSleep();
+ MockSearchDomainCheckResponse(0, ".google.co.uk");
+
+ EXPECT_EQ(GURL("http://www.google.co.uk/"), GetFetchedGoogleURL());
+ // GoogleURL should not be updated.
+ EXPECT_EQ(GURL(GoogleURLTracker::kDefaultGoogleHomepage),
+ GoogleURLTracker::GoogleURL());
+}
+
+TEST_F(GoogleURLTrackerTest, StartupSleepFinishNoObserver) {
+ CreateRequestContext();
+
+ ExpectDefaultURLs();
+
+ FinishSleep();
+ EXPECT_FALSE(GetFetcherByID(0));
+
+ ExpectDefaultURLs();
+}
+
+TEST_F(GoogleURLTrackerTest, MonitorNetworkChange) {
+ CreateRequestContext();
+
+ RequestServerCheck();
+ EXPECT_FALSE(GetFetcherByID(0));
+ ExpectDefaultURLs();
+
+ FinishSleep();
+ MockSearchDomainCheckResponse(0, ".google.co.uk");
+
+ EXPECT_EQ(GURL("http://www.google.co.uk/"), GetFetchedGoogleURL());
+ // GoogleURL is updated, becase it was not the last prompted URL.
+ EXPECT_EQ(GURL("http://www.google.co.uk/"), GoogleURLTracker::GoogleURL());
+
+ NotifyIPAddressChanged();
+ MockSearchDomainCheckResponse(1, ".google.co.in");
+
+ EXPECT_EQ(GURL("http://www.google.co.in/"), GetFetchedGoogleURL());
+ // Don't update GoogleURL.
+ EXPECT_EQ(GURL("http://www.google.co.uk/"), GoogleURLTracker::GoogleURL());
+}
+
+TEST_F(GoogleURLTrackerTest, MonitorNetworkChangeNoObserver) {
+ CreateRequestContext();
+
+ ExpectDefaultURLs();
+
+ FinishSleep();
+ NotifyIPAddressChanged();
+ EXPECT_FALSE(GetFetcherByID(0));
+
+ ExpectDefaultURLs();
+}
+
+TEST_F(GoogleURLTrackerTest, MonitorNetworkChangeAndObserverRegister) {
+ CreateRequestContext();
+
+ ExpectDefaultURLs();
+
+ FinishSleep();
+ NotifyIPAddressChanged();
+ EXPECT_FALSE(GetFetcherByID(0));
+
+ ExpectDefaultURLs();
+
+ RequestServerCheck();
+ MockSearchDomainCheckResponse(0, ".google.co.uk");
+
+ EXPECT_EQ(GURL("http://www.google.co.uk/"), GetFetchedGoogleURL());
+ EXPECT_EQ(GURL("http://www.google.co.uk/"), GoogleURLTracker::GoogleURL());
+}
+
+TEST_F(GoogleURLTrackerTest, NoSearchCommitedAndPromptedNotChanged) {
+ CreateRequestContext();
+ SetLastPromptedGoogleURL(GURL("http://www.google.co.uk/"));
+ RequestServerCheck();
+ EXPECT_FALSE(GetFetcherByID(0));
+ ExpectDefaultURLs();
+
+ FinishSleep();
+ MockSearchDomainCheckResponse(0, ".google.co.jp");
+
+ EXPECT_EQ(GURL("http://www.google.co.jp/"), GetFetchedGoogleURL());
+ EXPECT_EQ(GURL("http://www.google.co.uk/"), GetLastPromptedGoogleURL());
+}
+
+TEST_F(GoogleURLTrackerTest, SearchCommitedAndUserSayNo) {
+ CreateRequestContext();
+ SetLastPromptedGoogleURL(GURL("http://www.google.co.uk/"));
+
+ ExpectDefaultURLs();
+
+ RequestServerCheck();
+ EXPECT_FALSE(GetFetcherByID(0));
+ ExpectDefaultURLs();
+
+ FinishSleep();
+ MockSearchDomainCheckResponse(0, ".google.co.jp");
+
+ EXPECT_EQ(GURL(GoogleURLTracker::kDefaultGoogleHomepage),
+ GoogleURLTracker::GoogleURL());
+ EXPECT_EQ(GURL("http://www.google.co.jp/"), GetFetchedGoogleURL());
+ EXPECT_EQ(GURL("http://www.google.co.uk/"), GetLastPromptedGoogleURL());
+
+ SearchCommitted(GURL("http://www.google.co.uk/search?q=test"));
+ NavEntryCommitted();
+
+ EXPECT_TRUE(InfoBarIsShown());
+ EXPECT_EQ(GURL(GoogleURLTracker::kDefaultGoogleHomepage),
+ GoogleURLTracker::GoogleURL());
+ EXPECT_EQ(GURL("http://www.google.co.jp/"), GetInfoBarShowingURL());
+ EXPECT_EQ(GURL("http://www.google.co.jp/"), GetLastPromptedGoogleURL());
+
+ InfoBarClosed();
+ EXPECT_FALSE(InfoBarIsShown());
+ EXPECT_EQ(GURL(GoogleURLTracker::kDefaultGoogleHomepage),
+ GoogleURLTracker::GoogleURL());
+ EXPECT_EQ(GURL("http://www.google.co.jp/"), GetLastPromptedGoogleURL());
+}
+
+TEST_F(GoogleURLTrackerTest, SearchCommitedAndUserSayYes) {
+ CreateRequestContext();
+ SetLastPromptedGoogleURL(GURL("http://www.google.co.uk/"));
+
+ ExpectDefaultURLs();
+
+ RequestServerCheck();
+ EXPECT_FALSE(GetFetcherByID(0));
+ ExpectDefaultURLs();
+
+ FinishSleep();
+ MockSearchDomainCheckResponse(0, ".google.co.jp");
+
+ EXPECT_EQ(GURL(GoogleURLTracker::kDefaultGoogleHomepage),
+ GoogleURLTracker::GoogleURL());
+ EXPECT_EQ(GURL("http://www.google.co.jp/"), GetFetchedGoogleURL());
+ EXPECT_EQ(GURL("http://www.google.co.uk/"), GetLastPromptedGoogleURL());
+
+ SearchCommitted(GURL("http://www.google.co.uk/search?q=test"));
+ NavEntryCommitted();
+
+ EXPECT_TRUE(InfoBarIsShown());
+ EXPECT_EQ(GURL(GoogleURLTracker::kDefaultGoogleHomepage),
+ GoogleURLTracker::GoogleURL());
+ EXPECT_EQ(GURL("http://www.google.co.jp/"), GetInfoBarShowingURL());
+ EXPECT_EQ(GURL("http://www.google.co.jp/"), GetLastPromptedGoogleURL());
+
+ AcceptGoogleURL();
+ InfoBarClosed();
+
+ EXPECT_FALSE(InfoBarIsShown());
+ EXPECT_EQ(GURL("http://www.google.co.jp/"), GoogleURLTracker::GoogleURL());
+ EXPECT_EQ(GURL("http://www.google.co.jp/"), GetLastPromptedGoogleURL());
+}
+
+TEST_F(GoogleURLTrackerTest, InitialUpdate) {
+ CreateRequestContext();
+ ExpectDefaultURLs();
+ EXPECT_EQ(GURL(), GetLastPromptedGoogleURL());
+
+ RequestServerCheck();
+ EXPECT_FALSE(GetFetcherByID(0));
+ ExpectDefaultURLs();
+ EXPECT_EQ(GURL(), GetLastPromptedGoogleURL());
+
+ FinishSleep();
+ MockSearchDomainCheckResponse(0, ".google.co.uk");
+
+ EXPECT_EQ(GURL("http://www.google.co.uk/"), GetFetchedGoogleURL());
+ EXPECT_EQ(GURL("http://www.google.co.uk/"), GoogleURLTracker::GoogleURL());
+ EXPECT_EQ(GURL("http://www.google.co.uk/"), GetLastPromptedGoogleURL());
+
+ SearchCommitted(GURL("http://www.google.co.uk/search?q=test"));
+ NavEntryCommitted();
+
+ EXPECT_FALSE(InfoBarIsShown());
+ EXPECT_EQ(GURL("http://www.google.co.uk/"), GetFetchedGoogleURL());
+ EXPECT_EQ(GURL("http://www.google.co.uk/"), GoogleURLTracker::GoogleURL());
+ EXPECT_EQ(GURL("http://www.google.co.uk/"), GetLastPromptedGoogleURL());
+}
+
+TEST_F(GoogleURLTrackerTest, UpdatePromptedURLWhenBack) {
+ CreateRequestContext();
+ SetLastPromptedGoogleURL(GURL("http://www.google.co.jp/"));
+ SetGoogleURL(GURL("http://www.google.co.uk/"));
+
+ RequestServerCheck();
+ FinishSleep();
+ MockSearchDomainCheckResponse(0, ".google.co.uk");
+
+ EXPECT_EQ(GURL("http://www.google.co.uk/"), GetFetchedGoogleURL());
+ EXPECT_EQ(GURL("http://www.google.co.uk/"), GoogleURLTracker::GoogleURL());
+ EXPECT_EQ(GURL("http://www.google.co.uk/"), GetLastPromptedGoogleURL());
+
+ SearchCommitted(GURL("http://www.google.co.uk/search?q=test"));
+ NavEntryCommitted();
+
+ EXPECT_FALSE(InfoBarIsShown());
+ EXPECT_EQ(GURL("http://www.google.co.uk/"), GetFetchedGoogleURL());
+ EXPECT_EQ(GURL("http://www.google.co.uk/"), GoogleURLTracker::GoogleURL());
+ EXPECT_EQ(GURL("http://www.google.co.uk/"), GetLastPromptedGoogleURL());
}
« no previous file with comments | « chrome/browser/google_url_tracker.cc ('k') | chrome/browser/search_engines/template_url_model.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698