• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 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 "base/run_loop.h"
6 #include "chrome/browser/extensions/api/gcm/gcm_api.h"
7 #include "chrome/browser/extensions/extension_apitest.h"
8 #include "chrome/browser/profiles/profile.h"
9 #include "chrome/browser/services/gcm/fake_gcm_profile_service.h"
10 #include "chrome/browser/services/gcm/gcm_profile_service_factory.h"
11 #include "chrome/test/base/ui_test_utils.h"
12 
13 namespace {
14 
15 const char kFunctionsTestExtension[] = "gcm/functions";
16 const char kEventsExtension[] = "gcm/events";
17 
18 }  // namespace
19 
20 namespace extensions {
21 
22 class GcmApiTest : public ExtensionApiTest {
23  public:
GcmApiTest()24   GcmApiTest() : fake_gcm_profile_service_(NULL) {}
25 
26  protected:
27   void SetUpFakeService(bool collect);
28 
29   const Extension* LoadTestExtension(const std::string& extension_path,
30                                      const std::string& page_name);
31 
32   void WaitUntilIdle();
33 
34   gcm::FakeGCMProfileService* service() const;
35 
36   gcm::FakeGCMProfileService* fake_gcm_profile_service_;
37 };
38 
SetUpFakeService(bool collect)39 void GcmApiTest::SetUpFakeService(bool collect) {
40   gcm::GCMProfileServiceFactory::GetInstance()->SetTestingFactory(
41       profile(), &gcm::FakeGCMProfileService::Build);
42 
43   fake_gcm_profile_service_ = static_cast<gcm::FakeGCMProfileService*>(
44       gcm::GCMProfileServiceFactory::GetInstance()->GetForProfile(profile()));
45   fake_gcm_profile_service_->set_collect(collect);
46   gcm::FakeGCMProfileService::EnableGCMForTesting();
47 }
48 
WaitUntilIdle()49 void GcmApiTest::WaitUntilIdle() {
50   base::RunLoop run_loop;
51   run_loop.RunUntilIdle();
52 }
53 
service() const54 gcm::FakeGCMProfileService* GcmApiTest::service() const {
55   return fake_gcm_profile_service_;
56 }
57 
LoadTestExtension(const std::string & extension_path,const std::string & page_name)58 const Extension* GcmApiTest::LoadTestExtension(
59     const std::string& extension_path,
60     const std::string& page_name) {
61   const Extension* extension =
62       LoadExtension(test_data_dir_.AppendASCII(extension_path));
63   if (extension) {
64     ui_test_utils::NavigateToURL(
65         browser(), extension->GetResourceURL(page_name));
66   }
67   return extension;
68 }
69 
70 // http://crbug.com/177163 and http://crbug.com/324982
71 #if defined(OS_WIN)
72 #define MAYBE_RegisterValidation DISABLED_RegisterValidation
73 #else
74 #define MAYBE_RegisterValidation RegisterValidation
75 #endif
IN_PROC_BROWSER_TEST_F(GcmApiTest,MAYBE_RegisterValidation)76 IN_PROC_BROWSER_TEST_F(GcmApiTest, MAYBE_RegisterValidation) {
77   SetUpFakeService(false);
78   EXPECT_TRUE(RunExtensionSubtest(kFunctionsTestExtension,
79                                   "register_validation.html"));
80 }
81 
82 // http://crbug.com/177163 and http://crbug.com/324982
83 #if defined(OS_WIN)
84 #define MAYBE_Register DISABLED_Register
85 #else
86 #define MAYBE_Register Register
87 #endif
IN_PROC_BROWSER_TEST_F(GcmApiTest,MAYBE_Register)88 IN_PROC_BROWSER_TEST_F(GcmApiTest, MAYBE_Register) {
89   SetUpFakeService(true);
90   const extensions::Extension* extension =
91       LoadTestExtension(kFunctionsTestExtension, "register.html");
92   ASSERT_TRUE(extension);
93 
94   WaitUntilIdle();
95 
96   EXPECT_EQ(extension->id(), service()->last_registered_app_id());
97   // SHA1 of the public key provided in manifest.json.
98   EXPECT_EQ("26469186F238EE08FA71C38311C6990F61D40DCA",
99             service()->last_registered_cert());
100   const std::vector<std::string>& sender_ids =
101       service()->last_registered_sender_ids();
102   EXPECT_TRUE(std::find(sender_ids.begin(), sender_ids.end(), "Sender1") !=
103                   sender_ids.end());
104   EXPECT_TRUE(std::find(sender_ids.begin(), sender_ids.end(), "Sender2") !=
105                   sender_ids.end());
106 }
107 
108 // http://crbug.com/177163 and http://crbug.com/324982
109 #if defined(OS_WIN)
110 #define MAYBE_SendValidation DISABLED_SendValidation
111 #else
112 #define MAYBE_SendValidation SendValidation
113 #endif
IN_PROC_BROWSER_TEST_F(GcmApiTest,MAYBE_SendValidation)114 IN_PROC_BROWSER_TEST_F(GcmApiTest, MAYBE_SendValidation) {
115   SetUpFakeService(false);
116   EXPECT_TRUE(RunExtensionSubtest(kFunctionsTestExtension, "send.html"));
117 }
118 
119 // http://crbug.com/177163 and http://crbug.com/324982
120 #if defined(OS_WIN)
121 #define MAYBE_SendMessageData DISABLED_SendMessageData
122 #else
123 #define MAYBE_SendMessageData SendMessageData
124 #endif
IN_PROC_BROWSER_TEST_F(GcmApiTest,MAYBE_SendMessageData)125 IN_PROC_BROWSER_TEST_F(GcmApiTest, MAYBE_SendMessageData) {
126   SetUpFakeService(true);
127   const extensions::Extension* extension =
128       LoadTestExtension(kFunctionsTestExtension, "send_message_data.html");
129   ASSERT_TRUE(extension);
130 
131   WaitUntilIdle();
132 
133   EXPECT_EQ("destination-id", service()->last_receiver_id());
134   const gcm::GCMClient::OutgoingMessage& message =
135       service()->last_sent_message();
136   gcm::GCMClient::MessageData::const_iterator iter;
137 
138   EXPECT_TRUE((iter = message.data.find("key1")) != message.data.end());
139   EXPECT_EQ("value1", iter->second);
140 
141   EXPECT_TRUE((iter = message.data.find("key2")) != message.data.end());
142   EXPECT_EQ("value2", iter->second);
143 }
144 
145 // http://crbug.com/177163 and http://crbug/324982
146 #if defined(OS_WIN) && !defined(NDEBUG)
147 #define MAYBE_OnMessagesDeleted DISABLED_OnMessagesDeleted
148 #else
149 #define MAYBE_OnMessagesDeleted OnMessagesDeleted
150 #endif
IN_PROC_BROWSER_TEST_F(GcmApiTest,MAYBE_OnMessagesDeleted)151 IN_PROC_BROWSER_TEST_F(GcmApiTest, MAYBE_OnMessagesDeleted) {
152   ResultCatcher catcher;
153   catcher.RestrictToProfile(profile());
154 
155   const extensions::Extension* extension =
156       LoadTestExtension(kEventsExtension, "on_messages_deleted.html");
157   ASSERT_TRUE(extension);
158 
159   GcmJsEventRouter router(profile());
160   router.OnMessagesDeleted(extension->id());
161   EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
162 }
163 
164 // http://crbug.com/177163 and http://crbug/324982
165 #if defined(OS_WIN) && !defined(NDEBUG)
166 #define MAYBE_OnMessage DISABLED_OnMessage
167 #else
168 #define MAYBE_OnMessage OnMessage
169 #endif
IN_PROC_BROWSER_TEST_F(GcmApiTest,MAYBE_OnMessage)170 IN_PROC_BROWSER_TEST_F(GcmApiTest, MAYBE_OnMessage) {
171   ResultCatcher catcher;
172   catcher.RestrictToProfile(profile());
173 
174   const extensions::Extension* extension =
175       LoadTestExtension(kEventsExtension, "on_message.html");
176   ASSERT_TRUE(extension);
177 
178   GcmJsEventRouter router(profile());
179 
180   gcm::GCMClient::IncomingMessage message;
181   message.data["property1"] = "value1";
182   message.data["property2"] = "value2";
183   router.OnMessage(extension->id(), message);
184 
185   EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
186 }
187 
188 // http://crbug.com/177163 and http://crbug/324982
189 #if defined(OS_WIN) && !defined(NDEBUG)
190 #define MAYBE_OnSendError DISABLED_OnSendError
191 #else
192 #define MAYBE_OnSendError OnSendError
193 #endif
IN_PROC_BROWSER_TEST_F(GcmApiTest,MAYBE_OnSendError)194 IN_PROC_BROWSER_TEST_F(GcmApiTest, MAYBE_OnSendError) {
195   ResultCatcher catcher;
196   catcher.RestrictToProfile(profile());
197 
198   const extensions::Extension* extension =
199       LoadTestExtension(kEventsExtension, "on_send_error.html");
200   ASSERT_TRUE(extension);
201 
202   GcmJsEventRouter router(profile());
203   router.OnSendError(extension->id(), "error_message_1",
204       gcm::GCMClient::ASYNC_OPERATION_PENDING);
205   router.OnSendError(extension->id(), "error_message_2",
206       gcm::GCMClient::SERVER_ERROR);
207   router.OnSendError(extension->id(), "error_message_3",
208       gcm::GCMClient::NETWORK_ERROR);
209   router.OnSendError(extension->id(), "error_message_4",
210       gcm::GCMClient::UNKNOWN_ERROR);
211   router.OnSendError(extension->id(), "error_message_5",
212       gcm::GCMClient::TTL_EXCEEDED);
213 
214   EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
215 }
216 
217 }  // namespace extensions
218