Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(86)

Side by Side Diff: chrome/browser/extensions/api/copresence/copresence_apitest.cc

Issue 441103002: Tests for the Copresence API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@api
Patch Set: Rewrite Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/extensions/api/copresence/copresence_api.cc ('k') | chrome/chrome_tests.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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
OLDNEW
« no previous file with comments | « chrome/browser/extensions/api/copresence/copresence_api.cc ('k') | chrome/chrome_tests.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698