Index: chrome/browser/ui/browser_instant_controller_unittest.cc |
diff --git a/chrome/browser/ui/browser_instant_controller_unittest.cc b/chrome/browser/ui/browser_instant_controller_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..00fad1be060e8159dfd49d02bb5662dcd40487a8 |
--- /dev/null |
+++ b/chrome/browser/ui/browser_instant_controller_unittest.cc |
@@ -0,0 +1,177 @@ |
+// Copyright 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 <string> |
+ |
+#include "base/basictypes.h" |
+#include "chrome/browser/chrome_notification_types.h" |
+#include "chrome/browser/search/instant_service.h" |
+#include "chrome/browser/search/instant_unittest_base.h" |
+#include "chrome/browser/search/search.h" |
+#include "chrome/browser/ui/tabs/tab_strip_model.h" |
+#include "chrome/common/pref_names.h" |
+#include "chrome/common/url_constants.h" |
+#include "content/public/browser/navigation_controller.h" |
+#include "content/public/browser/render_process_host.h" |
+#include "content/public/browser/web_contents.h" |
+#include "content/public/browser/web_contents_observer.h" |
+ |
+namespace chrome { |
+ |
+namespace { |
+ |
+class BrowserInstantControllerTest : public InstantUnitTestBase { |
+ protected: |
+ friend class FakeWebContentsObserver; |
+}; |
+ |
+class FakeWebContentsObserver : public content::WebContentsObserver { |
+ public: |
+ FakeWebContentsObserver(BrowserInstantControllerTest* base_test, |
+ const GURL& url, |
+ content::NavigationController::ReloadType reload_type, |
+ const char* description) |
+ : base_test_(base_test), |
+ url_(url), |
+ reload_type_(reload_type), |
+ description_(description), |
+ validated_(0) {} |
+ |
+ void NavigateToPendingEntry( |
samarth
2013/08/12 19:07:28
This is an OVERRIDE, right? (and should be virtual
Anuj
2013/08/13 00:18:09
Done.
|
+ const GURL& url, |
+ content::NavigationController::ReloadType reload_type) { |
+ EXPECT_EQ(url_, url) << description_; |
+ EXPECT_EQ(reload_type_, reload_type) << description_; |
+ content::NavigationController* controller = |
+ &web_contents()->GetController(); |
+ Observe(NULL); |
+ base_test_->NavigateAndCommit(controller, url_); |
+ validated_++; |
+ } |
+ |
+ bool Validated() const { |
+ return validated_ == 1; |
samarth
2013/08/12 19:07:28
What is being validated here? Please use a more de
Anuj
2013/08/13 00:18:09
Done.
|
+ } |
+ |
+ protected: |
+ friend class BrowserInstantControllerTabReloadTest; |
+ FRIEND_TEST_ALL_PREFIXES(BrowserInstantControllerTabReloadTest, |
+ DefaultSearchProviderChanged); |
+ |
+ private: |
+ BrowserInstantControllerTest* base_test_; |
+ const GURL& url_; |
+ content::NavigationController::ReloadType reload_type_; |
+ const char* description_; |
+ int validated_; |
+}; |
+ |
+const struct TabReloadTestCase { |
+ const char* description; |
+ const char* start_url; |
+ bool start_in_instant_process; |
+ bool should_reload; |
+ bool end_in_instant_process; |
+} kTabReloadTestCases[] = { |
+ {"Local Embedded SEHP", chrome::kChromeSearchLocalNtpUrl, |
samarth
2013/08/12 19:07:28
s/Embedded SEHP/NTP
Anuj
2013/08/13 00:18:09
Done.
|
+ true, true, true}, |
+ {"Remote Embedded SEHP", "https://www.google.com/instant?strk", |
+ true, true, false}, |
+ {"Remote Embedded SERP", "https://www.google.com/url?strk", |
+ true, true, false}, |
+ {"Other SEHP", "https://bar.com/instant?strk", |
+ false, false, false} |
+}; |
+ |
+struct TabInfo { |
+ content::WebContents* contents; |
+ FakeWebContentsObserver* observer; |
+ const GURL* url; |
+ int pid; |
+}; |
+ |
+class BrowserInstantControllerTabReloadTest |
+ : public BrowserInstantControllerTest { |
+ protected: |
+ TabInfo* SetUpTabReloadTestCases() { |
samarth
2013/08/12 19:07:28
This is way too complex to follow. I shouldn't fee
Anuj
2013/08/13 00:18:09
Done.
|
+ size_t numTestCases = arraysize(kTabReloadTestCases); |
+ TabInfo* tabInfos = new TabInfo[numTestCases]; |
+ for (size_t i = 0; i < numTestCases; ++i) { |
+ const TabReloadTestCase& test = kTabReloadTestCases[i]; |
+ TabInfo& tabInfo = tabInfos[i]; |
+ AddTab(browser(), GURL(test.start_url)); |
+ tabInfo.contents = browser()->tab_strip_model()->GetActiveWebContents(); |
+ tabInfo.url = &tabInfo.contents->GetURL(); |
+ tabInfo.pid = tabInfo.contents->GetRenderProcessHost()->GetID(); |
+ EXPECT_EQ(test.start_in_instant_process, |
+ chrome::IsInstantNTP(tabInfo.contents)) |
+ << test.description; |
+ EXPECT_EQ(test.start_in_instant_process, |
+ instant_service_->IsInstantProcess(tabInfos[i].pid)) |
+ << test.description; |
+ if (test.should_reload) { |
+ tabInfo.observer = new FakeWebContentsObserver( |
+ this, |
+ tabInfo.contents->GetURL(), |
+ (test.start_in_instant_process == test.end_in_instant_process) |
+ ? content::NavigationController::RELOAD |
+ : content::NavigationController::NO_RELOAD, |
+ test.description); |
+ tabInfo.observer->Observe(tabInfo.contents); |
+ } |
+ } |
+ return tabInfos; |
+ } |
+ |
+ void ValidateTabReloadTestCases(TabInfo* tabInfos) { |
+ size_t numTestCases = arraysize(kTabReloadTestCases); |
+ for (size_t i = 0; i < numTestCases; ++i) { |
+ const TabReloadTestCase& test = kTabReloadTestCases[i]; |
+ TabInfo& tabInfo = tabInfos[i]; |
+ if (test.should_reload) { |
+ EXPECT_TRUE(tabInfo.observer->Validated()) << test.description; |
+ } |
+ int pid = tabInfo.contents->GetRenderProcessHost()->GetID(); |
+ EXPECT_EQ(*tabInfo.url, tabInfo.contents->GetURL()) << test.description; |
+ if (test.should_reload) { |
+ EXPECT_EQ(test.end_in_instant_process, |
+ ShouldAssignURLToInstantRenderer(tabInfo.contents->GetURL(), |
+ profile())) |
+ << test.description; |
+ } |
+ EXPECT_EQ(test.end_in_instant_process, |
+ chrome::IsInstantNTP(tabInfo.contents)) |
+ << test.description; |
+ EXPECT_EQ(test.end_in_instant_process, |
+ instant_service_->IsInstantProcess(pid)) |
+ << test.description; |
+ EXPECT_EQ(test.start_in_instant_process == test.end_in_instant_process, |
+ pid == tabInfo.pid) |
+ << test.description; |
+ } |
+ } |
+ |
+ friend class FakeWebContentsObserver; |
+}; |
+ |
+TEST_F(BrowserInstantControllerTabReloadTest, DefaultSearchProviderChanged) { |
+ EXPECT_EQ(1, instant_service_->GetInstantProcessCount()); |
+ TabInfo* tabInfos = SetUpTabReloadTestCases(); |
+ |
+ SetSearchProvider("https://bar.com/"); |
+ |
+ ValidateTabReloadTestCases(tabInfos); |
+} |
+ |
+TEST_F(BrowserInstantControllerTabReloadTest, GoogleBaseURLUpdated) { |
+ EXPECT_EQ(1, instant_service_->GetInstantProcessCount()); |
+ TabInfo* tabInfos = SetUpTabReloadTestCases(); |
+ |
+ NotifyGoogleBaseURLUpdate("https://www.google.es/"); |
+ |
+ ValidateTabReloadTestCases(tabInfos); |
+} |
+ |
+} // namespace |
+} // namespace chrome |