Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / gcm / gcm_apitest.cc
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/prefs/pref_service.h"
6 #include "base/run_loop.h"
7 #include "chrome/browser/extensions/api/gcm/gcm_api.h"
8 #include "chrome/browser/extensions/extension_apitest.h"
9 #include "chrome/browser/extensions/extension_gcm_app_handler.h"
10 #include "chrome/browser/profiles/profile.h"
11 #include "chrome/browser/services/gcm/fake_gcm_profile_service.h"
12 #include "chrome/browser/services/gcm/gcm_client_factory.h"
13 #include "chrome/browser/services/gcm/gcm_profile_service_factory.h"
14 #include "chrome/common/chrome_switches.h"
15 #include "chrome/common/pref_names.h"
16 #include "chrome/test/base/ui_test_utils.h"
17
18 namespace {
19
20 const char kEventsExtension[] = "gcm/events";
21
22 gcm::GCMClient::SendErrorDetails CreateErrorDetails(
23     const std::string& message_id,
24     const gcm::GCMClient::Result result,
25     const std::string& total_messages) {
26   gcm::GCMClient::SendErrorDetails error;
27   error.message_id = message_id;
28   error.result = result;
29   error.additional_data["expectedMessageId"] = message_id;
30   switch (result) {
31     case gcm::GCMClient::ASYNC_OPERATION_PENDING:
32       error.additional_data["expectedErrorMessage"] =
33           "Asynchronous operation is pending.";
34       break;
35     case gcm::GCMClient::SERVER_ERROR:
36       error.additional_data["expectedErrorMessage"] = "Server error occurred.";
37       break;
38     case gcm::GCMClient::NETWORK_ERROR:
39       error.additional_data["expectedErrorMessage"] = "Network error occurred.";
40       break;
41     case gcm::GCMClient::TTL_EXCEEDED:
42       error.additional_data["expectedErrorMessage"] = "Time-to-live exceeded.";
43       break;
44     case gcm::GCMClient::UNKNOWN_ERROR:
45     default:  // Default case is the same as UNKNOWN_ERROR
46       error.additional_data["expectedErrorMessage"] = "Unknown error occurred.";
47       break;
48   }
49   error.additional_data["totalMessages"] = total_messages;
50   return error;
51 }
52
53 }  // namespace
54
55 namespace extensions {
56
57 class GcmApiTest : public ExtensionApiTest {
58  public:
59   GcmApiTest() : fake_gcm_profile_service_(NULL) {}
60
61  protected:
62   virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE;
63   virtual void SetUpOnMainThread() OVERRIDE;
64
65   void StartCollecting();
66
67   const Extension* LoadTestExtension(const std::string& extension_path,
68                                      const std::string& page_name);
69   gcm::FakeGCMProfileService* service() const;
70
71  private:
72   gcm::FakeGCMProfileService* fake_gcm_profile_service_;
73 };
74
75 void GcmApiTest::SetUpCommandLine(CommandLine* command_line) {
76   // We now always create the GCMProfileService instance in
77   // ProfileSyncServiceFactory that is called when a profile is being
78   // initialized. In order to prevent it from being created, we add the switch
79   // to disable the sync logic.
80   command_line->AppendSwitch(switches::kDisableSync);
81
82   ExtensionApiTest::SetUpCommandLine(command_line);
83 }
84
85 void GcmApiTest::SetUpOnMainThread() {
86   // Enable GCM such that tests could be run on all channels.
87   browser()->profile()->GetPrefs()->SetBoolean(prefs::kGCMChannelEnabled, true);
88
89   gcm::GCMProfileServiceFactory::GetInstance()->SetTestingFactory(
90       browser()->profile(), &gcm::FakeGCMProfileService::Build);
91   fake_gcm_profile_service_ = static_cast<gcm::FakeGCMProfileService*>(
92       gcm::GCMProfileServiceFactory::GetInstance()->GetForProfile(
93           browser()->profile()));
94
95   ExtensionApiTest::SetUpOnMainThread();
96 }
97
98 void GcmApiTest::StartCollecting() {
99   service()->set_collect(true);
100 }
101
102 gcm::FakeGCMProfileService* GcmApiTest::service() const {
103   return fake_gcm_profile_service_;
104 }
105
106 const Extension* GcmApiTest::LoadTestExtension(
107     const std::string& extension_path,
108     const std::string& page_name) {
109   const Extension* extension =
110       LoadExtension(test_data_dir_.AppendASCII(extension_path));
111   if (extension) {
112     ui_test_utils::NavigateToURL(
113         browser(), extension->GetResourceURL(page_name));
114   }
115   return extension;
116 }
117
118 IN_PROC_BROWSER_TEST_F(GcmApiTest, RegisterValidation) {
119   ASSERT_TRUE(RunExtensionTest("gcm/functions/register_validation"));
120 }
121
122 IN_PROC_BROWSER_TEST_F(GcmApiTest, Register) {
123   StartCollecting();
124   ASSERT_TRUE(RunExtensionTest("gcm/functions/register"));
125
126   const std::vector<std::string>& sender_ids =
127       service()->last_registered_sender_ids();
128   EXPECT_TRUE(std::find(sender_ids.begin(), sender_ids.end(), "Sender1") !=
129                   sender_ids.end());
130   EXPECT_TRUE(std::find(sender_ids.begin(), sender_ids.end(), "Sender2") !=
131                   sender_ids.end());
132 }
133
134 IN_PROC_BROWSER_TEST_F(GcmApiTest, Unregister) {
135   service()->AddExpectedUnregisterResponse(gcm::GCMClient::SUCCESS);
136   service()->AddExpectedUnregisterResponse(gcm::GCMClient::SERVER_ERROR);
137
138   ASSERT_TRUE(RunExtensionTest("gcm/functions/unregister"));
139 }
140
141 IN_PROC_BROWSER_TEST_F(GcmApiTest, SendValidation) {
142   ASSERT_TRUE(RunExtensionTest("gcm/functions/send"));
143 }
144
145 IN_PROC_BROWSER_TEST_F(GcmApiTest, SendMessageData) {
146   StartCollecting();
147   ASSERT_TRUE(RunExtensionTest("gcm/functions/send_message_data"));
148
149   EXPECT_EQ("destination-id", service()->last_receiver_id());
150   const gcm::GCMClient::OutgoingMessage& message =
151       service()->last_sent_message();
152   gcm::GCMClient::MessageData::const_iterator iter;
153
154   EXPECT_EQ(100, message.time_to_live);
155
156   EXPECT_TRUE((iter = message.data.find("key1")) != message.data.end());
157   EXPECT_EQ("value1", iter->second);
158
159   EXPECT_TRUE((iter = message.data.find("key2")) != message.data.end());
160   EXPECT_EQ("value2", iter->second);
161 }
162
163 IN_PROC_BROWSER_TEST_F(GcmApiTest, SendMessageDefaultTTL) {
164   StartCollecting();
165   ASSERT_TRUE(RunExtensionTest("gcm/functions/send_message_default_ttl"));
166
167   EXPECT_EQ("destination-id", service()->last_receiver_id());
168   const gcm::GCMClient::OutgoingMessage& message =
169       service()->last_sent_message();
170   gcm::GCMClient::MessageData::const_iterator iter;
171
172   EXPECT_EQ(2419200, message.time_to_live);
173 }
174
175 IN_PROC_BROWSER_TEST_F(GcmApiTest, OnMessagesDeleted) {
176   ResultCatcher catcher;
177   catcher.RestrictToProfile(profile());
178
179   const extensions::Extension* extension =
180       LoadTestExtension(kEventsExtension, "on_messages_deleted.html");
181   ASSERT_TRUE(extension);
182
183   extensions::ExtensionGCMAppHandler app_handler(profile());
184   app_handler.OnMessagesDeleted(extension->id());
185   EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
186 }
187
188 IN_PROC_BROWSER_TEST_F(GcmApiTest, OnMessage) {
189   ResultCatcher catcher;
190   catcher.RestrictToProfile(profile());
191
192   const extensions::Extension* extension =
193       LoadTestExtension(kEventsExtension, "on_message.html");
194   ASSERT_TRUE(extension);
195
196   extensions::ExtensionGCMAppHandler app_handler(profile());
197
198   gcm::GCMClient::IncomingMessage message;
199   message.data["property1"] = "value1";
200   message.data["property2"] = "value2";
201   // First message is sent without a collapse key.
202   app_handler.OnMessage(extension->id(), message);
203
204   // Second message carries the same data and a collapse key.
205   message.collapse_key = "collapseKeyValue";
206   app_handler.OnMessage(extension->id(), message);
207
208   EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
209 }
210
211 IN_PROC_BROWSER_TEST_F(GcmApiTest, OnSendError) {
212   ResultCatcher catcher;
213   catcher.RestrictToProfile(profile());
214
215   const extensions::Extension* extension =
216       LoadTestExtension(kEventsExtension, "on_send_error.html");
217   ASSERT_TRUE(extension);
218
219   std::string total_expected_messages = "5";
220   extensions::ExtensionGCMAppHandler app_handler(profile());
221   app_handler.OnSendError(
222       extension->id(),
223       CreateErrorDetails("error_message_1",
224                          gcm::GCMClient::ASYNC_OPERATION_PENDING,
225                          total_expected_messages));
226   app_handler.OnSendError(
227       extension->id(),
228       CreateErrorDetails("error_message_2",
229                          gcm::GCMClient::SERVER_ERROR,
230                          total_expected_messages));
231   app_handler.OnSendError(
232       extension->id(),
233       CreateErrorDetails("error_message_3",
234                          gcm::GCMClient::NETWORK_ERROR,
235                          total_expected_messages));
236   app_handler.OnSendError(
237       extension->id(),
238       CreateErrorDetails("error_message_4",
239                          gcm::GCMClient::UNKNOWN_ERROR,
240                          total_expected_messages));
241   app_handler.OnSendError(
242       extension->id(),
243       CreateErrorDetails("error_message_5",
244                          gcm::GCMClient::TTL_EXCEEDED,
245                          total_expected_messages));
246
247   EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
248 }
249
250 IN_PROC_BROWSER_TEST_F(GcmApiTest, Incognito) {
251   ResultCatcher catcher;
252   catcher.RestrictToProfile(profile());
253   ResultCatcher incognito_catcher;
254   incognito_catcher.RestrictToProfile(profile()->GetOffTheRecordProfile());
255
256   ASSERT_TRUE(RunExtensionTestIncognito("gcm/functions/incognito"));
257
258   EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
259   EXPECT_TRUE(incognito_catcher.GetNextResult()) << incognito_catcher.message();
260 }
261
262 }  // namespace extensions