summaryrefslogtreecommitdiffstats
path: root/chrome/browser/instant/instant_loader_manager_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/instant/instant_loader_manager_unittest.cc')
-rw-r--r--chrome/browser/instant/instant_loader_manager_unittest.cc209
1 files changed, 209 insertions, 0 deletions
diff --git a/chrome/browser/instant/instant_loader_manager_unittest.cc b/chrome/browser/instant/instant_loader_manager_unittest.cc
new file mode 100644
index 0000000..855bf59
--- /dev/null
+++ b/chrome/browser/instant/instant_loader_manager_unittest.cc
@@ -0,0 +1,209 @@
+// Copyright (c) 2010 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 "base/scoped_ptr.h"
+#include "chrome/browser/instant/instant_loader.h"
+#include "chrome/browser/instant/instant_loader_delegate.h"
+#include "chrome/browser/instant/instant_loader_manager.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+class InstantLoaderDelegateImpl : public InstantLoaderDelegate {
+ public:
+ InstantLoaderDelegateImpl() {}
+
+ virtual void ShowInstantLoader(InstantLoader* loader) {}
+
+ virtual void SetSuggestedTextFor(InstantLoader* loader,
+ const string16& text) {}
+
+ virtual gfx::Rect GetInstantBounds() {
+ return gfx::Rect();
+ }
+
+ virtual bool ShouldCommitInstantOnMouseUp() {
+ return false;
+ }
+
+ virtual void CommitInstantLoader(InstantLoader* loader) {
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(InstantLoaderDelegateImpl);
+};
+
+}
+
+class InstantLoaderManagerTest : public testing::Test {
+ public:
+ InstantLoaderManagerTest() {}
+
+ void MarkReady(InstantLoader* loader) {
+ loader->ready_ = true;
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(InstantLoaderManagerTest);
+};
+
+// Makes sure UpdateLoader works when invoked once.
+TEST_F(InstantLoaderManagerTest, Basic) {
+ InstantLoaderDelegateImpl delegate;
+ InstantLoaderManager manager(&delegate);
+ scoped_ptr<InstantLoader> loader;
+ manager.UpdateLoader(0, &loader);
+ EXPECT_EQ(NULL, loader.get());
+ EXPECT_TRUE(manager.current_loader());
+ EXPECT_EQ(NULL, manager.pending_loader());
+ EXPECT_EQ(0, manager.current_loader()->template_url_id());
+}
+
+// Make sure invoking update twice for non-instant results keeps the same
+// loader.
+TEST_F(InstantLoaderManagerTest, UpdateTwice) {
+ InstantLoaderDelegateImpl delegate;
+ InstantLoaderManager manager(&delegate);
+ scoped_ptr<InstantLoader> loader;
+ manager.UpdateLoader(0, &loader);
+ InstantLoader* current_loader = manager.current_loader();
+ manager.UpdateLoader(0, &loader);
+ EXPECT_EQ(NULL, loader.get());
+ EXPECT_EQ(current_loader, manager.current_loader());
+ EXPECT_EQ(NULL, manager.pending_loader());
+}
+
+// Make sure invoking update twice for instant results keeps the same loader.
+TEST_F(InstantLoaderManagerTest, UpdateInstantTwice) {
+ InstantLoaderDelegateImpl delegate;
+ InstantLoaderManager manager(&delegate);
+ scoped_ptr<InstantLoader> loader;
+ manager.UpdateLoader(1, &loader);
+ InstantLoader* current_loader = manager.current_loader();
+ manager.UpdateLoader(1, &loader);
+ EXPECT_EQ(NULL, loader.get());
+ EXPECT_EQ(current_loader, manager.current_loader());
+ EXPECT_EQ(NULL, manager.pending_loader());
+ EXPECT_EQ(1u, manager.num_instant_loaders());
+}
+
+// Makes sure transitioning from non-instant to instant works.
+TEST_F(InstantLoaderManagerTest, NonInstantToInstant) {
+ InstantLoaderDelegateImpl delegate;
+ InstantLoaderManager manager(&delegate);
+ scoped_ptr<InstantLoader> loader;
+ manager.UpdateLoader(0, &loader);
+ InstantLoader* current_loader = manager.current_loader();
+ manager.UpdateLoader(1, &loader);
+ EXPECT_TRUE(loader.get() != NULL);
+ EXPECT_NE(current_loader, manager.current_loader());
+ EXPECT_EQ(NULL, manager.pending_loader());
+ EXPECT_EQ(1u, manager.num_instant_loaders());
+}
+
+// Makes sure instant loaders aren't deleted when invoking update with different
+// ids.
+TEST_F(InstantLoaderManagerTest, DontDeleteInstantLoaders) {
+ InstantLoaderDelegateImpl delegate;
+ InstantLoaderManager manager(&delegate);
+ scoped_ptr<InstantLoader> loader;
+ manager.UpdateLoader(1, &loader);
+ InstantLoader* current_loader = manager.current_loader();
+ manager.UpdateLoader(2, &loader);
+ EXPECT_EQ(NULL, loader.get());
+ EXPECT_NE(current_loader, manager.current_loader());
+ EXPECT_EQ(NULL, manager.pending_loader());
+ EXPECT_EQ(2u, manager.num_instant_loaders());
+}
+
+// Makes sure a new loader is created and assigned to secondary when
+// transitioning from a ready non-instant to instant.
+TEST_F(InstantLoaderManagerTest, CreateSecondaryWhenReady) {
+ InstantLoaderDelegateImpl delegate;
+ InstantLoaderManager manager(&delegate);
+ scoped_ptr<InstantLoader> loader;
+ manager.UpdateLoader(0, &loader);
+ InstantLoader* current_loader = manager.current_loader();
+ ASSERT_TRUE(current_loader);
+ MarkReady(current_loader);
+
+ manager.UpdateLoader(1, &loader);
+ EXPECT_EQ(NULL, loader.get());
+ EXPECT_EQ(current_loader, manager.current_loader());
+ EXPECT_TRUE(manager.pending_loader());
+ EXPECT_NE(current_loader, manager.pending_loader());
+ EXPECT_EQ(1u, manager.num_instant_loaders());
+
+ // Make the pending loader current.
+ InstantLoader* pending_loader = manager.pending_loader();
+ manager.MakePendingCurrent(&loader);
+ EXPECT_TRUE(loader.get());
+ EXPECT_EQ(pending_loader, manager.current_loader());
+ EXPECT_EQ(NULL, manager.pending_loader());
+ EXPECT_EQ(1u, manager.num_instant_loaders());
+}
+
+// Makes sure releasing an instant updates maps currectly.
+TEST_F(InstantLoaderManagerTest, ReleaseInstant) {
+ InstantLoaderDelegateImpl delegate;
+ InstantLoaderManager manager(&delegate);
+ scoped_ptr<InstantLoader> loader;
+ manager.UpdateLoader(1, &loader);
+ scoped_ptr<InstantLoader> current_loader(manager.ReleaseCurrentLoader());
+ EXPECT_TRUE(current_loader.get());
+ EXPECT_EQ(NULL, manager.current_loader());
+ EXPECT_EQ(0u, manager.num_instant_loaders());
+}
+
+// Tests transitioning from a non-instant ready loader to an instant ready
+// loader is immediate.
+TEST_F(InstantLoaderManagerTest, NonInstantToInstantWhenReady) {
+ InstantLoaderDelegateImpl delegate;
+ InstantLoaderManager manager(&delegate);
+ scoped_ptr<InstantLoader> loader;
+ manager.UpdateLoader(1, &loader);
+ ASSERT_TRUE(manager.current_loader());
+ EXPECT_EQ(1, manager.current_loader()->template_url_id());
+ InstantLoader* instant_loader = manager.current_loader();
+
+ manager.UpdateLoader(0, &loader);
+ InstantLoader* non_instant_loader = manager.current_loader();
+ ASSERT_TRUE(non_instant_loader);
+ MarkReady(non_instant_loader);
+ EXPECT_NE(non_instant_loader, instant_loader);
+
+ MarkReady(instant_loader);
+ manager.UpdateLoader(1, &loader);
+ EXPECT_EQ(non_instant_loader, loader.get());
+ EXPECT_EQ(instant_loader, manager.current_loader());
+ EXPECT_EQ(NULL, manager.pending_loader());
+ EXPECT_EQ(1u, manager.num_instant_loaders());
+}
+
+// Tests transitioning between 3 instant loaders, all ready.
+TEST_F(InstantLoaderManagerTest, ThreeInstant) {
+ InstantLoaderDelegateImpl delegate;
+ InstantLoaderManager manager(&delegate);
+ scoped_ptr<InstantLoader> loader;
+ manager.UpdateLoader(1, &loader);
+ ASSERT_TRUE(manager.current_loader());
+ EXPECT_EQ(1, manager.current_loader()->template_url_id());
+ InstantLoader* instant_loader1 = manager.current_loader();
+ MarkReady(instant_loader1);
+
+ manager.UpdateLoader(2, &loader);
+ InstantLoader* instant_loader2 = manager.pending_loader();
+ ASSERT_TRUE(instant_loader2);
+ EXPECT_EQ(2, instant_loader2->template_url_id());
+ EXPECT_NE(instant_loader1, instant_loader2);
+ EXPECT_EQ(instant_loader1, manager.current_loader());
+
+ manager.UpdateLoader(3, &loader);
+ InstantLoader* instant_loader3 = manager.pending_loader();
+ ASSERT_TRUE(instant_loader3);
+ EXPECT_EQ(3, instant_loader3->template_url_id());
+ EXPECT_NE(instant_loader1, instant_loader3);
+ EXPECT_NE(instant_loader2, instant_loader3);
+ EXPECT_EQ(instant_loader1, manager.current_loader());
+}