OLD | NEW |
---|---|
(Empty) | |
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/json/json_writer.h" | |
6 #include "base/path_service.h" | |
7 #include "base/values.h" | |
8 #include "chrome/browser/extensions/api/copresence/copresence_api.h" | |
9 #include "chrome/browser/extensions/extension_apitest.h" | |
10 #include "chrome/browser/extensions/extension_function_test_utils.h" | |
11 #include "chrome/browser/profiles/profile_manager.h" | |
12 #include "chrome/common/chrome_content_client.h" | |
13 #include "chrome/common/extensions/chrome_extensions_client.h" | |
14 #include "chrome/test/base/testing_browser_process.h" | |
15 #include "components/copresence/proto/data.pb.h" | |
16 #include "components/copresence/proto/rpcs.pb.h" | |
17 #include "components/copresence/public/copresence_manager.h" | |
18 #include "content/common/url_schemes.h" | |
19 #include "content/public/common/content_client.h" | |
20 #include "ui/base/resource/resource_bundle.h" | |
21 | |
22 using base::ListValue; | |
23 using copresence::BROADCAST_ONLY; | |
24 using copresence::CopresenceManager; | |
25 using copresence::CopresenceManagerDelegate; | |
26 using copresence::FAIL; | |
27 using copresence::PublishedMessage; | |
28 using copresence::ReportRequest; | |
29 using copresence::SCAN_ONLY; | |
30 using copresence::Subscription; | |
31 using google::protobuf::RepeatedPtrField; | |
32 namespace test_utils = extension_function_test_utils; | |
33 | |
34 const char kExtensionId[] = "my extension"; | |
35 | |
36 namespace extensions { | |
37 | |
38 using api::copresence::Message; | |
39 using api::copresence::Operation; | |
40 using api::copresence::PublishOperation; | |
41 using api::copresence::Strategy; | |
42 using api::copresence::SubscribeOperation; | |
43 using api::copresence::UnpublishOperation; | |
44 using api::copresence::UnsubscribeOperation; | |
45 | |
46 | |
47 PublishOperation* CreatePublish(const std::string& id) { | |
48 PublishOperation* publish = new PublishOperation; | |
49 | |
50 publish->id = id; | |
51 publish->time_to_live_millis.reset(new int(1000)); | |
52 publish->message.type = "joke"; | |
53 publish->message.payload = "Knock Knock"; | |
54 | |
55 return publish; | |
56 } | |
57 | |
58 SubscribeOperation* CreateSubscribe(const std::string& id) { | |
59 SubscribeOperation* subscribe = new SubscribeOperation; | |
60 | |
61 subscribe->id = id; | |
62 subscribe->time_to_live_millis.reset(new int(1000)); | |
63 subscribe->filter.type = "joke"; | |
64 | |
65 return subscribe; | |
66 } | |
67 | |
68 template <typename T> | |
69 bool GetOnly(const RepeatedPtrField<T>& things, T* out) { | |
70 if (things.size() != 1) | |
71 return false; | |
72 | |
73 *out = things.Get(0); | |
74 return true; | |
75 } | |
76 | |
77 class MockCopresenceManager : public CopresenceManager { | |
78 public: | |
79 explicit MockCopresenceManager(CopresenceManagerDelegate* delegate) | |
80 : delegate_(delegate) {} | |
81 virtual ~MockCopresenceManager() {} | |
82 | |
83 virtual void ExecuteReportRequest( | |
84 ReportRequest request, | |
85 const std::string& app_id, | |
86 const copresence::StatusCallback& status_callback) OVERRIDE { | |
87 request_ = request; | |
88 app_id_ = app_id; | |
89 status_callback.Run(copresence::SUCCESS); | |
90 } | |
91 | |
92 CopresenceManagerDelegate* delegate_; | |
93 | |
94 ReportRequest request_; | |
95 std::string app_id_; | |
96 }; | |
97 | |
98 class CopresenceApiTest : public ExtensionApiTest { | |
99 public: | |
100 CopresenceApiTest() { | |
101 TestingBrowserProcess::CreateInstance(); | |
102 CHECK(temp_dir_.CreateUniqueTempDir()); | |
103 TestingBrowserProcess::GetGlobal()->SetProfileManager( | |
104 new ProfileManager(temp_dir_.path())); | |
105 | |
106 ExtensionsClient::Set(ChromeExtensionsClient::GetInstance()); | |
107 content::SetContentClient(&content_client_); | |
108 content::RegisterContentSchemes(false); | |
109 | |
110 base::FilePath extensions_shell_and_test_pak_path; | |
111 CHECK(PathService::Get(base::DIR_MODULE, | |
112 &extensions_shell_and_test_pak_path)); | |
113 ui::ResourceBundle::InitSharedInstanceWithPakPath( | |
114 extensions_shell_and_test_pak_path.AppendASCII( | |
115 "extensions_shell_and_test.pak")); | |
116 | |
117 test_extension_ = test_utils::CreateEmptyExtension(kExtensionId); | |
118 | |
119 CopresenceService* service = | |
120 CopresenceService::GetFactoryInstance()->Get(profile()); | |
xiyuan
2014/08/15 20:48:35
You cannot do this in test's ctor. It is way too e
Charlie
2014/08/15 21:25:38
Thanks Xiyuan! That was why I had a lot of extra i
| |
121 copresence_manager_ = new MockCopresenceManager(service); | |
122 service->set_manager_for_testing( | |
123 make_scoped_ptr<CopresenceManager>(copresence_manager_)); | |
124 } | |
125 | |
126 virtual ~CopresenceApiTest() {} | |
127 | |
128 // Takes ownership of the operation_list. | |
129 void ExecuteOperations(ListValue* operation_list, bool expect_error) const { | |
130 ListValue args_list; | |
131 std::string json_args; | |
132 args_list.Append(operation_list); | |
133 base::JSONWriter::Write(&args_list, &json_args); | |
134 | |
135 scoped_refptr<UIThreadExtensionFunction> function = | |
136 new CopresenceExecuteFunction; | |
137 function->set_extension(test_extension_.get()); | |
138 //function->set_browser_context(profile()); | |
139 if (expect_error) { | |
140 test_utils::RunFunctionAndReturnError( | |
141 function.get(), json_args, browser()); | |
142 } else { | |
143 test_utils::RunFunction( | |
144 function.get(), json_args, browser(), test_utils::NONE); | |
145 } | |
146 } | |
147 | |
148 void ExecuteOperation(scoped_ptr<Operation> operation, bool expect_error) | |
149 const { | |
150 ListValue* operation_list = new ListValue; | |
151 operation_list->Append(operation->ToValue().release()); | |
152 ExecuteOperations(operation_list, expect_error); | |
153 } | |
154 | |
155 const ReportRequest& request_sent() const { | |
156 return copresence_manager_->request_; | |
157 } | |
158 | |
159 const std::string& app_id_sent() const { | |
160 return copresence_manager_->app_id_; | |
161 } | |
162 | |
163 void clear_app_id() { | |
164 copresence_manager_->app_id_ = ""; | |
165 } | |
166 | |
167 CopresenceManagerDelegate* delegate() { | |
168 return copresence_manager_->delegate_; | |
169 } | |
170 | |
171 protected: | |
172 scoped_refptr<Extension> test_extension_; | |
173 MockCopresenceManager* copresence_manager_; | |
174 | |
175 private: | |
176 ChromeContentClient content_client_; | |
177 base::ScopedTempDir temp_dir_; | |
178 }; | |
179 | |
180 IN_PROC_BROWSER_TEST_F(CopresenceApiTest, Publish) { | |
181 scoped_ptr<PublishOperation> publish(CreatePublish("pub")); | |
182 publish->strategies.reset(new Strategy); | |
183 publish->strategies->only_broadcast.reset(new bool(true)); // Default | |
184 | |
185 scoped_ptr<Operation> operation(new Operation); | |
186 operation->publish = publish.Pass(); | |
187 | |
188 clear_app_id(); | |
189 ExecuteOperation(operation.Pass(), false); | |
190 EXPECT_EQ(kExtensionId, app_id_sent()); | |
191 | |
192 PublishedMessage message; | |
193 ASSERT_TRUE(GetOnly( | |
194 request_sent().manage_messages_request().message_to_publish(), &message)); | |
195 EXPECT_EQ("pub", message.id()); | |
196 EXPECT_EQ(1000, message.access_policy().ttl_millis()); | |
197 EXPECT_EQ(copresence::NO_ACL_CHECK, message.access_policy().acl().acl_type()); | |
198 EXPECT_EQ("joke", message.message().type().type()); | |
199 EXPECT_EQ("Knock Knock!", message.message().payload()); | |
200 EXPECT_EQ(BROADCAST_ONLY, | |
201 message.token_exchange_strategy().broadcast_scan_configuration()); | |
202 } | |
203 | |
204 IN_PROC_BROWSER_TEST_F(CopresenceApiTest, Subscribe) { | |
205 scoped_ptr<SubscribeOperation> subscribe(CreateSubscribe("sub")); | |
206 subscribe->strategies.reset(new Strategy); | |
207 subscribe->strategies->only_broadcast.reset(new bool(true)); // Not default | |
208 | |
209 scoped_ptr<Operation> operation(new Operation); | |
210 operation->subscribe = subscribe.Pass(); | |
211 | |
212 clear_app_id(); | |
213 ExecuteOperation(operation.Pass(), false); | |
214 EXPECT_EQ(kExtensionId, app_id_sent()); | |
215 | |
216 Subscription subscription; | |
217 ASSERT_TRUE(GetOnly( | |
218 request_sent().manage_subscriptions_request().subscription(), | |
219 &subscription)); | |
220 EXPECT_EQ("sub", subscription.id()); | |
221 EXPECT_EQ(1000, subscription.ttl_millis()); | |
222 EXPECT_EQ("joke", subscription.message_type().type()); | |
223 copresence::BroadcastScanConfiguration strategy = | |
224 subscription.token_exchange_strategy().broadcast_scan_configuration(); | |
225 EXPECT_EQ(BROADCAST_ONLY, strategy); | |
226 } | |
227 | |
228 IN_PROC_BROWSER_TEST_F(CopresenceApiTest, DefaultStrategies) { | |
229 scoped_ptr<Operation> publishOperation; | |
230 publishOperation->publish.reset(CreatePublish("pub2")); | |
231 | |
232 scoped_ptr<Operation> subscribeOperation; | |
233 subscribeOperation->subscribe.reset(CreateSubscribe("sub2")); | |
234 | |
235 ListValue* operation_list = new ListValue; | |
236 operation_list->Append(publishOperation->ToValue().release()); | |
237 operation_list->Append(subscribeOperation->ToValue().release()); | |
238 ExecuteOperations(operation_list, false); | |
239 | |
240 EXPECT_EQ(BROADCAST_ONLY, | |
241 request_sent().manage_messages_request().message_to_publish(0) | |
242 .token_exchange_strategy().broadcast_scan_configuration()); | |
243 EXPECT_EQ(SCAN_ONLY, | |
244 request_sent().manage_subscriptions_request().subscription(0) | |
245 .token_exchange_strategy().broadcast_scan_configuration()); | |
246 } | |
247 | |
248 IN_PROC_BROWSER_TEST_F(CopresenceApiTest, UnPubSub) { | |
249 scoped_ptr<Operation> unpublishOperation(new Operation); | |
250 unpublishOperation->unpublish.reset(new UnpublishOperation); | |
251 unpublishOperation->unpublish->unpublish_id = "pub"; | |
252 | |
253 scoped_ptr<Operation> unsubscribeOperation(new Operation); | |
254 unsubscribeOperation->unsubscribe.reset(new UnsubscribeOperation); | |
255 unsubscribeOperation->unsubscribe->unsubscribe_id = "sub"; | |
256 | |
257 ListValue* operation_list = new ListValue; | |
258 operation_list->Append(unpublishOperation->ToValue().release()); | |
259 operation_list->Append(unsubscribeOperation->ToValue().release()); | |
260 ExecuteOperations(operation_list, false); | |
261 | |
262 std::string unpublish_id; | |
263 ASSERT_TRUE(GetOnly( | |
264 request_sent().manage_messages_request().id_to_unpublish(), | |
265 &unpublish_id)); | |
266 EXPECT_EQ("pub", unpublish_id); | |
267 | |
268 std::string unsubscribe_id; | |
269 ASSERT_TRUE(GetOnly( | |
270 request_sent().manage_subscriptions_request().id_to_unsubscribe(), | |
271 &unsubscribe_id)); | |
272 EXPECT_EQ("sub", unsubscribe_id); | |
273 } | |
274 | |
275 IN_PROC_BROWSER_TEST_F(CopresenceApiTest, BadId) { | |
276 scoped_ptr<Operation> unpublishOperation(new Operation); | |
277 unpublishOperation->unpublish.reset(new UnpublishOperation); | |
278 unpublishOperation->unpublish->unpublish_id = "invalid id"; | |
279 | |
280 ExecuteOperation(unpublishOperation.Pass(), true); | |
281 } | |
282 | |
283 IN_PROC_BROWSER_TEST_F(CopresenceApiTest, MultipleOperations) { | |
284 scoped_ptr<Operation> multiOperation; | |
285 multiOperation->publish.reset(CreatePublish("pub3")); | |
286 multiOperation->subscribe.reset(CreateSubscribe("sub3")); | |
287 | |
288 ExecuteOperation(multiOperation.Pass(), true); | |
289 } | |
290 | |
291 } // namespace extensions | |
OLD | NEW |