Home | History | Annotate | Download | only in automation
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include <map>
      6 
      7 #include "base/basictypes.h"
      8 #include "chrome/browser/automation/automation_tab_helper.h"
      9 #include "chrome/browser/automation/mock_tab_event_observer.h"
     10 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
     11 #include "chrome/browser/ui/tab_contents/test_tab_contents_wrapper.h"
     12 #include "content/browser/tab_contents/tab_contents.h"
     13 #include "content/browser/tab_contents/test_tab_contents.h"
     14 #include "testing/gmock/include/gmock/gmock.h"
     15 #include "testing/gtest/include/gtest/gtest.h"
     16 
     17 using testing::_;
     18 
     19 class AutomationTabHelperTest : public TabContentsWrapperTestHarness {
     20  public:
     21   virtual void SetUp() {
     22     TabContentsWrapperTestHarness::SetUp();
     23     mock_observer_.StartObserving(tab_helper());
     24   }
     25 
     26  protected:
     27   // These are here so that we don't have to add each test as a
     28   // |AutomationTabHelper| friend.
     29   void StartLoading() {
     30     tab_helper()->DidStartLoading();
     31   }
     32 
     33   void StopLoading() {
     34     tab_helper()->DidStopLoading();
     35   }
     36 
     37   void TabContentsDestroyed() {
     38     tab_helper()->TabContentsDestroyed(contents_wrapper()->tab_contents());
     39   }
     40 
     41   void WillPerformClientRedirect(int64 frame_id) {
     42     tab_helper()->OnWillPerformClientRedirect(frame_id, 0);
     43   }
     44 
     45   void CompleteOrCancelClientRedirect(int64 frame_id) {
     46     tab_helper()->OnDidCompleteOrCancelClientRedirect(frame_id);
     47   }
     48 
     49   AutomationTabHelper* tab_helper() {
     50     return contents_wrapper()->automation_tab_helper();
     51   }
     52 
     53   MockTabEventObserver mock_observer_;
     54 };
     55 
     56 ACTION_P2(CheckHasPendingLoads, tab_helper, has_pending_loads) {
     57   EXPECT_EQ(has_pending_loads, tab_helper->has_pending_loads());
     58 }
     59 
     60 TEST_F(AutomationTabHelperTest, AddAndRemoveObserver) {
     61   testing::MockFunction<void()> check;
     62 
     63   {
     64     testing::InSequence expect_in_sequence;
     65     EXPECT_CALL(mock_observer_, OnFirstPendingLoad(_));
     66     EXPECT_CALL(check, Call());
     67   }
     68 
     69   StartLoading();
     70   check.Call();
     71   tab_helper()->RemoveObserver(&mock_observer_);
     72   StartLoading();
     73 }
     74 
     75 TEST_F(AutomationTabHelperTest, StartStopLoading) {
     76   testing::MockFunction<void()> check;
     77 
     78   testing::InSequence expect_in_sequence;
     79   EXPECT_CALL(mock_observer_, OnFirstPendingLoad(contents()))
     80       .WillOnce(CheckHasPendingLoads(tab_helper(), true));
     81   EXPECT_CALL(check, Call());
     82   EXPECT_CALL(mock_observer_, OnNoMorePendingLoads(contents()))
     83       .WillOnce(CheckHasPendingLoads(tab_helper(), false));
     84 
     85   EXPECT_FALSE(tab_helper()->has_pending_loads());
     86   StartLoading();
     87   EXPECT_TRUE(tab_helper()->has_pending_loads());
     88   check.Call();
     89   StopLoading();
     90   EXPECT_FALSE(tab_helper()->has_pending_loads());
     91 }
     92 
     93 TEST_F(AutomationTabHelperTest, DuplicateLoads) {
     94   testing::InSequence expect_in_sequence;
     95   EXPECT_CALL(mock_observer_, OnFirstPendingLoad(contents()));
     96   EXPECT_CALL(mock_observer_, OnNoMorePendingLoads(contents()));
     97 
     98   StartLoading();
     99   StartLoading();
    100   StopLoading();
    101   StopLoading();
    102 }
    103 
    104 TEST_F(AutomationTabHelperTest, ClientRedirect) {
    105   testing::MockFunction<void()> check;
    106 
    107   testing::InSequence expect_in_sequence;
    108   EXPECT_CALL(mock_observer_, OnFirstPendingLoad(contents()))
    109       .WillOnce(CheckHasPendingLoads(tab_helper(), true));
    110   EXPECT_CALL(check, Call());
    111   EXPECT_CALL(mock_observer_, OnNoMorePendingLoads(contents()))
    112       .WillOnce(CheckHasPendingLoads(tab_helper(), false));
    113 
    114   WillPerformClientRedirect(1);
    115   EXPECT_TRUE(tab_helper()->has_pending_loads());
    116   check.Call();
    117   CompleteOrCancelClientRedirect(1);
    118   EXPECT_FALSE(tab_helper()->has_pending_loads());
    119 }
    120 
    121 TEST_F(AutomationTabHelperTest, DiscardExtraClientRedirects) {
    122   EXPECT_CALL(mock_observer_, OnFirstPendingLoad(contents()));
    123   EXPECT_CALL(mock_observer_, OnNoMorePendingLoads(contents()));
    124 
    125   WillPerformClientRedirect(1);
    126   WillPerformClientRedirect(1);
    127   CompleteOrCancelClientRedirect(1);
    128   EXPECT_FALSE(tab_helper()->has_pending_loads());
    129   CompleteOrCancelClientRedirect(1);
    130   CompleteOrCancelClientRedirect(2);
    131 }
    132 
    133 TEST_F(AutomationTabHelperTest, StartStopLoadingWithClientRedirect) {
    134   testing::MockFunction<void()> check;
    135 
    136   testing::InSequence expect_in_sequence;
    137   EXPECT_CALL(mock_observer_, OnFirstPendingLoad(contents()));
    138   EXPECT_CALL(mock_observer_, OnNoMorePendingLoads(contents()));
    139 
    140   StartLoading();
    141   WillPerformClientRedirect(1);
    142   CompleteOrCancelClientRedirect(1);
    143   StopLoading();
    144 }
    145 
    146 TEST_F(AutomationTabHelperTest, ClientRedirectBeforeLoad) {
    147   testing::MockFunction<void()> check;
    148 
    149   testing::InSequence expect_in_sequence;
    150   EXPECT_CALL(mock_observer_, OnFirstPendingLoad(contents()));
    151   EXPECT_CALL(check, Call());
    152   EXPECT_CALL(mock_observer_, OnNoMorePendingLoads(contents()));
    153 
    154   StartLoading();
    155   WillPerformClientRedirect(1);
    156   CompleteOrCancelClientRedirect(1);
    157   EXPECT_TRUE(tab_helper()->has_pending_loads());
    158   check.Call();
    159   StopLoading();
    160 }
    161 
    162 TEST_F(AutomationTabHelperTest, ClientRedirectAfterLoad) {
    163   testing::MockFunction<void()> check;
    164 
    165   testing::InSequence expect_in_sequence;
    166   EXPECT_CALL(mock_observer_, OnFirstPendingLoad(contents()));
    167   EXPECT_CALL(check, Call());
    168   EXPECT_CALL(mock_observer_, OnNoMorePendingLoads(contents()));
    169 
    170   StartLoading();
    171   WillPerformClientRedirect(1);
    172   StopLoading();
    173   EXPECT_TRUE(tab_helper()->has_pending_loads());
    174   check.Call();
    175   CompleteOrCancelClientRedirect(1);
    176   EXPECT_FALSE(tab_helper()->has_pending_loads());
    177 }
    178 
    179 TEST_F(AutomationTabHelperTest, AllFramesMustFinishRedirects) {
    180   testing::MockFunction<void()> check;
    181 
    182   testing::InSequence expect_in_sequence;
    183   EXPECT_CALL(mock_observer_, OnFirstPendingLoad(contents()));
    184   EXPECT_CALL(check, Call());
    185   EXPECT_CALL(mock_observer_, OnNoMorePendingLoads(contents()));
    186 
    187   WillPerformClientRedirect(1);
    188   WillPerformClientRedirect(2);
    189   CompleteOrCancelClientRedirect(1);
    190   check.Call();
    191   EXPECT_TRUE(tab_helper()->has_pending_loads());
    192   CompleteOrCancelClientRedirect(2);
    193   EXPECT_FALSE(tab_helper()->has_pending_loads());
    194 }
    195 
    196 TEST_F(AutomationTabHelperTest, DestroyedTabStopsLoading) {
    197   testing::MockFunction<void()> check;
    198 
    199   testing::InSequence expect_in_sequence;
    200   EXPECT_CALL(mock_observer_, OnFirstPendingLoad(contents()));
    201   EXPECT_CALL(mock_observer_, OnNoMorePendingLoads(contents()));
    202 
    203   StartLoading();
    204   WillPerformClientRedirect(1);
    205   TabContentsDestroyed();
    206   EXPECT_FALSE(tab_helper()->has_pending_loads());
    207 }
    208