Home | History | Annotate | Download | only in extensions
      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 "chrome/browser/extensions/extension_event_router_forwarder.h"
      6 
      7 #include "base/message_loop.h"
      8 #include "chrome/browser/profiles/profile_manager.h"
      9 #include "chrome/test/testing_browser_process_test.h"
     10 #include "chrome/test/testing_profile.h"
     11 #include "chrome/test/thread_test_helper.h"
     12 #include "content/browser/browser_thread.h"
     13 #include "googleurl/src/gurl.h"
     14 #include "testing/gmock/include/gmock/gmock.h"
     15 #include "testing/gtest/include/gtest/gtest.h"
     16 #include "ui/base/system_monitor/system_monitor.h"
     17 
     18 namespace {
     19 
     20 const char kEventName[] = "event_name";
     21 const char kEventArgs[] = "event_args";
     22 const char kExt[] = "extension";
     23 
     24 class MockExtensionEventRouterForwarder : public ExtensionEventRouterForwarder {
     25  public:
     26   virtual ~MockExtensionEventRouterForwarder() {}
     27 
     28   MOCK_METHOD6(CallExtensionEventRouter,
     29       void(Profile*, const std::string&, const std::string&, const std::string&,
     30            Profile*, const GURL&));
     31 };
     32 
     33 }  // namespace
     34 
     35 class ExtensionEventRouterForwarderTest : public TestingBrowserProcessTest {
     36  protected:
     37   ExtensionEventRouterForwarderTest()
     38       : ui_thread_(BrowserThread::UI, &message_loop_),
     39         io_thread_(BrowserThread::IO) {
     40   }
     41 
     42   ~ExtensionEventRouterForwarderTest() {
     43   }
     44 
     45   virtual void SetUp() {
     46     // Inject a BrowserProcess with a ProfileManager.
     47     ASSERT_TRUE(io_thread_.Start());
     48 
     49     TestingBrowserProcess* browser_process = testing_browser_process_.get();
     50     browser_process->SetProfileManager(new ProfileManager);
     51 
     52     profile1_ = new TestingProfile();
     53     profile2_ = new TestingProfile();
     54 
     55     browser_process->profile_manager()->RegisterProfile(profile1_, true);
     56     browser_process->profile_manager()->RegisterProfile(profile2_, true);
     57   }
     58 
     59   TestingProfile* CreateIncognitoProfile(TestingProfile* base) {
     60     TestingProfile* incognito = new TestingProfile();
     61     incognito->set_incognito(true);
     62     base->SetOffTheRecordProfile(incognito);
     63     return incognito;
     64   }
     65 
     66   MessageLoopForUI message_loop_;
     67   BrowserThread ui_thread_;
     68   BrowserThread io_thread_;
     69   ui::SystemMonitor dummy;
     70   // Profiles are weak pointers, owned by ProfileManager in |browser_process_|.
     71   TestingProfile* profile1_;
     72   TestingProfile* profile2_;
     73 };
     74 
     75 TEST_F(ExtensionEventRouterForwarderTest, BroadcastRendererUI) {
     76   scoped_refptr<MockExtensionEventRouterForwarder> event_router(
     77       new MockExtensionEventRouterForwarder);
     78   GURL url;
     79   EXPECT_CALL(*event_router,
     80       CallExtensionEventRouter(
     81           profile1_, "", kEventName, kEventArgs, profile1_, url));
     82   EXPECT_CALL(*event_router,
     83       CallExtensionEventRouter(
     84           profile2_, "", kEventName, kEventArgs, profile2_, url));
     85   event_router->BroadcastEventToRenderers(kEventName, kEventArgs, url);
     86 }
     87 
     88 TEST_F(ExtensionEventRouterForwarderTest, BroadcastRendererUIIncognito) {
     89   scoped_refptr<MockExtensionEventRouterForwarder> event_router(
     90       new MockExtensionEventRouterForwarder);
     91   using ::testing::_;
     92   GURL url;
     93   Profile* incognito = CreateIncognitoProfile(profile1_);
     94   EXPECT_CALL(*event_router,
     95       CallExtensionEventRouter(
     96           profile1_, "", kEventName, kEventArgs, profile1_, url));
     97   EXPECT_CALL(*event_router,
     98       CallExtensionEventRouter(incognito, _, _, _, _, _)).Times(0);
     99   EXPECT_CALL(*event_router,
    100       CallExtensionEventRouter(
    101           profile2_, "", kEventName, kEventArgs, profile2_, url));
    102   event_router->BroadcastEventToRenderers(kEventName, kEventArgs, url);
    103 }
    104 
    105 // This is the canonical test for passing control flow from the IO thread
    106 // to the UI thread. Repeating this for all public functions of
    107 // ExtensionEventRouterForwarder would not increase coverage.
    108 TEST_F(ExtensionEventRouterForwarderTest, BroadcastRendererIO) {
    109   scoped_refptr<MockExtensionEventRouterForwarder> event_router(
    110       new MockExtensionEventRouterForwarder);
    111   GURL url;
    112   EXPECT_CALL(*event_router,
    113       CallExtensionEventRouter(
    114           profile1_, "", kEventName, kEventArgs, profile1_, url));
    115   EXPECT_CALL(*event_router,
    116       CallExtensionEventRouter(
    117           profile2_, "", kEventName, kEventArgs, profile2_, url));
    118   BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
    119       NewRunnableMethod(
    120           event_router.get(),
    121           &MockExtensionEventRouterForwarder::BroadcastEventToRenderers,
    122           std::string(kEventName), std::string(kEventArgs), url));
    123 
    124   // Wait for IO thread's message loop to be processed
    125   scoped_refptr<ThreadTestHelper> helper(
    126       new ThreadTestHelper(BrowserThread::IO));
    127   ASSERT_TRUE(helper->Run());
    128 
    129   MessageLoop::current()->RunAllPending();
    130 }
    131 
    132 TEST_F(ExtensionEventRouterForwarderTest, UnicastRendererUIRestricted) {
    133   scoped_refptr<MockExtensionEventRouterForwarder> event_router(
    134       new MockExtensionEventRouterForwarder);
    135   using ::testing::_;
    136   GURL url;
    137   EXPECT_CALL(*event_router,
    138       CallExtensionEventRouter(
    139           profile1_, "", kEventName, kEventArgs, profile1_, url));
    140   EXPECT_CALL(*event_router,
    141       CallExtensionEventRouter(profile2_, _, _, _, _, _)).Times(0);
    142   event_router->DispatchEventToRenderers(kEventName, kEventArgs,
    143                                          profile1_->GetRuntimeId(),
    144                                          true, url);
    145 }
    146 
    147 TEST_F(ExtensionEventRouterForwarderTest,
    148        UnicastRendererUIRestrictedIncognito1) {
    149   scoped_refptr<MockExtensionEventRouterForwarder> event_router(
    150       new MockExtensionEventRouterForwarder);
    151   Profile* incognito = CreateIncognitoProfile(profile1_);
    152   using ::testing::_;
    153   GURL url;
    154   EXPECT_CALL(*event_router,
    155       CallExtensionEventRouter(
    156           profile1_, "", kEventName, kEventArgs, profile1_, url));
    157   EXPECT_CALL(*event_router,
    158       CallExtensionEventRouter(incognito, _, _, _, _, _)).Times(0);
    159   EXPECT_CALL(*event_router,
    160       CallExtensionEventRouter(profile2_, _, _, _, _, _)).Times(0);
    161   event_router->DispatchEventToRenderers(kEventName, kEventArgs,
    162                                          profile1_->GetRuntimeId(),
    163                                          true, url);
    164 }
    165 
    166 TEST_F(ExtensionEventRouterForwarderTest,
    167        UnicastRendererUIRestrictedIncognito2) {
    168   scoped_refptr<MockExtensionEventRouterForwarder> event_router(
    169       new MockExtensionEventRouterForwarder);
    170   Profile* incognito = CreateIncognitoProfile(profile1_);
    171   using ::testing::_;
    172   GURL url;
    173   EXPECT_CALL(*event_router,
    174       CallExtensionEventRouter(profile1_, _, _, _, _, _)).Times(0);
    175   EXPECT_CALL(*event_router,
    176       CallExtensionEventRouter(
    177           incognito, "", kEventName, kEventArgs, incognito, url));
    178   EXPECT_CALL(*event_router,
    179       CallExtensionEventRouter(profile2_, _, _, _, _, _)).Times(0);
    180   event_router->DispatchEventToRenderers(kEventName, kEventArgs,
    181                                          incognito->GetRuntimeId(),
    182                                          true, url);
    183 }
    184 
    185 TEST_F(ExtensionEventRouterForwarderTest, UnicastRendererUIUnrestricted) {
    186   scoped_refptr<MockExtensionEventRouterForwarder> event_router(
    187       new MockExtensionEventRouterForwarder);
    188   using ::testing::_;
    189   GURL url;
    190   EXPECT_CALL(*event_router,
    191       CallExtensionEventRouter(
    192           profile1_, "", kEventName, kEventArgs, NULL, url));
    193   EXPECT_CALL(*event_router,
    194       CallExtensionEventRouter(profile2_, _, _, _, _, _)).Times(0);
    195   event_router->DispatchEventToRenderers(kEventName, kEventArgs,
    196                                          profile1_->GetRuntimeId(),
    197                                          false, url);
    198 }
    199 
    200 TEST_F(ExtensionEventRouterForwarderTest,
    201        UnicastRendererUIUnrestrictedIncognito) {
    202   scoped_refptr<MockExtensionEventRouterForwarder> event_router(
    203       new MockExtensionEventRouterForwarder);
    204   Profile* incognito = CreateIncognitoProfile(profile1_);
    205   using ::testing::_;
    206   GURL url;
    207   EXPECT_CALL(*event_router,
    208       CallExtensionEventRouter(
    209           profile1_, "", kEventName, kEventArgs, NULL, url));
    210   EXPECT_CALL(*event_router,
    211       CallExtensionEventRouter(incognito, _, _, _, _, _)).Times(0);
    212   EXPECT_CALL(*event_router,
    213       CallExtensionEventRouter(profile2_, _, _, _, _, _)).Times(0);
    214   event_router->DispatchEventToRenderers(kEventName, kEventArgs,
    215                                          profile1_->GetRuntimeId(),
    216                                          false, url);
    217 }
    218 
    219 TEST_F(ExtensionEventRouterForwarderTest, BroadcastExtensionUI) {
    220   scoped_refptr<MockExtensionEventRouterForwarder> event_router(
    221       new MockExtensionEventRouterForwarder);
    222   GURL url;
    223   EXPECT_CALL(*event_router,
    224       CallExtensionEventRouter(
    225           profile1_, kExt, kEventName, kEventArgs, profile1_, url));
    226   EXPECT_CALL(*event_router,
    227       CallExtensionEventRouter(
    228           profile2_, kExt, kEventName, kEventArgs, profile2_, url));
    229   event_router->BroadcastEventToExtension(kExt, kEventName, kEventArgs, url);
    230 }
    231 
    232 TEST_F(ExtensionEventRouterForwarderTest, UnicastExtensionUIRestricted) {
    233   scoped_refptr<MockExtensionEventRouterForwarder> event_router(
    234       new MockExtensionEventRouterForwarder);
    235   using ::testing::_;
    236   GURL url;
    237   EXPECT_CALL(*event_router,
    238       CallExtensionEventRouter(
    239           profile1_, kExt, kEventName, kEventArgs, profile1_, url));
    240   EXPECT_CALL(*event_router,
    241       CallExtensionEventRouter(profile2_, _, _, _, _, _)).Times(0);
    242   event_router->DispatchEventToExtension(kExt, kEventName, kEventArgs,
    243                                          profile1_->GetRuntimeId(),
    244                                          true, url);
    245 }
    246 
    247 TEST_F(ExtensionEventRouterForwarderTest, UnicastExtensionUIUnrestricted) {
    248   scoped_refptr<MockExtensionEventRouterForwarder> event_router(
    249       new MockExtensionEventRouterForwarder);
    250   using ::testing::_;
    251   GURL url;
    252   EXPECT_CALL(*event_router,
    253       CallExtensionEventRouter(
    254           profile1_, kExt, kEventName, kEventArgs, NULL, url));
    255   EXPECT_CALL(*event_router,
    256       CallExtensionEventRouter(profile2_, _, _, _, _, _)).Times(0);
    257   event_router->DispatchEventToExtension(kExt, kEventName, kEventArgs,
    258                                          profile1_->GetRuntimeId(),
    259                                          false, url);
    260 }
    261