diff options
Diffstat (limited to 'chrome/browser/instant/instant_loader_manager_unittest.cc')
-rw-r--r-- | chrome/browser/instant/instant_loader_manager_unittest.cc | 209 |
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()); +} |