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

Side by Side Diff: services/shell/tests/connect/connect_unittest.cc

Issue 1882423004: Move shell service to toplevel shell namespace (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 8 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
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stddef.h> 5 #include <stddef.h>
6 #include <stdint.h> 6 #include <stdint.h>
7 7
8 #include <memory>
8 #include <utility> 9 #include <utility>
9 10
10 #include "base/bind.h" 11 #include "base/bind.h"
11 #include "base/guid.h" 12 #include "base/guid.h"
12 #include "base/macros.h" 13 #include "base/macros.h"
13 #include "base/run_loop.h" 14 #include "base/run_loop.h"
14 #include "base/test/test_suite.h" 15 #include "base/test/test_suite.h"
15 #include "mojo/public/cpp/bindings/binding_set.h" 16 #include "mojo/public/cpp/bindings/binding_set.h"
16 #include "services/shell/public/cpp/names.h" 17 #include "services/shell/public/cpp/names.h"
17 #include "services/shell/public/cpp/shell_test.h" 18 #include "services/shell/public/cpp/shell_test.h"
18 #include "services/shell/public/interfaces/shell.mojom.h" 19 #include "services/shell/public/interfaces/shell.mojom.h"
19 #include "services/shell/tests/connect/connect_test.mojom.h" 20 #include "services/shell/tests/connect/connect_test.mojom.h"
20 21
21 // Tests that multiple applications can be packaged in a single Mojo application 22 // Tests that multiple applications can be packaged in a single Mojo application
22 // implementing ShellClientFactory; that these applications can be specified by 23 // implementing ShellClientFactory; that these applications can be specified by
23 // the package's manifest and are thus registered with the PackageManager. 24 // the package's manifest and are thus registered with the PackageManager.
24 25
25 namespace mojo {
26 namespace shell { 26 namespace shell {
27
27 namespace { 28 namespace {
29
28 const char kTestPackageName[] = "mojo:connect_test_package"; 30 const char kTestPackageName[] = "mojo:connect_test_package";
29 const char kTestAppName[] = "mojo:connect_test_app"; 31 const char kTestAppName[] = "mojo:connect_test_app";
30 const char kTestAppAName[] = "mojo:connect_test_a"; 32 const char kTestAppAName[] = "mojo:connect_test_a";
31 const char kTestAppBName[] = "mojo:connect_test_b"; 33 const char kTestAppBName[] = "mojo:connect_test_b";
32 const char kTestClassAppName[] = "mojo:connect_test_class_app"; 34 const char kTestClassAppName[] = "mojo:connect_test_class_app";
33 const char kTestSingletonAppName[] = "mojo:connect_test_singleton_app"; 35 const char kTestSingletonAppName[] = "mojo:connect_test_singleton_app";
34 const char kTestDriverName[] = "exe:connect_test_driver"; 36 const char kTestDriverName[] = "exe:connect_test_driver";
35 37
36 void ReceiveOneString(std::string* out_string, 38 void ReceiveOneString(std::string* out_string,
37 base::RunLoop* loop, 39 base::RunLoop* loop,
38 const String& in_string) { 40 const mojo::String& in_string) {
39 *out_string = in_string; 41 *out_string = in_string;
40 loop->Quit(); 42 loop->Quit();
41 } 43 }
42 44
43 void ReceiveTwoStrings(std::string* out_string_1, std::string* out_string_2, 45 void ReceiveTwoStrings(std::string* out_string_1,
46 std::string* out_string_2,
44 base::RunLoop* loop, 47 base::RunLoop* loop,
45 const String& in_string_1, const String& in_string_2) { 48 const mojo::String& in_string_1,
49 const mojo::String& in_string_2) {
46 *out_string_1 = in_string_1; 50 *out_string_1 = in_string_1;
47 *out_string_2 = in_string_2; 51 *out_string_2 = in_string_2;
48 loop->Quit(); 52 loop->Quit();
49 } 53 }
50 54
51 void ReceiveConnectionResult(mojom::ConnectResult* out_result, 55 void ReceiveConnectionResult(mojom::ConnectResult* out_result,
52 Identity* out_target, 56 Identity* out_target,
53 base::RunLoop* loop, 57 base::RunLoop* loop,
54 int32_t in_result, 58 int32_t in_result,
55 mojom::IdentityPtr in_identity) { 59 mojom::IdentityPtr in_identity) {
56 *out_result = static_cast<shell::mojom::ConnectResult>(in_result); 60 *out_result = static_cast<mojom::ConnectResult>(in_result);
57 *out_target = in_identity.To<Identity>(); 61 *out_target = in_identity.To<Identity>();
58 loop->Quit(); 62 loop->Quit();
59 } 63 }
60 64
61 void QuitLoop(base::RunLoop* loop) { 65 void QuitLoop(base::RunLoop* loop) {
62 loop->Quit(); 66 loop->Quit();
63 } 67 }
64 68
65 } // namespace 69 } // namespace
66 70
67 class ConnectTest : public mojo::test::ShellTest, 71 class ConnectTest : public test::ShellTest,
68 public InterfaceFactory<test::mojom::ExposedInterface>, 72 public InterfaceFactory<test::mojom::ExposedInterface>,
69 public test::mojom::ExposedInterface { 73 public test::mojom::ExposedInterface {
70 public: 74 public:
71 ConnectTest() : ShellTest("mojo:connect_unittests") {} 75 ConnectTest() : ShellTest("mojo:connect_unittests") {}
72 ~ConnectTest() override {} 76 ~ConnectTest() override {}
73 77
74 protected: 78 protected:
75 scoped_ptr<Connection> ConnectTo(Connector::ConnectParams* params) { 79 std::unique_ptr<Connection> ConnectTo(Connector::ConnectParams* params) {
76 scoped_ptr<Connection> connection = connector()->Connect(params); 80 std::unique_ptr<Connection> connection = connector()->Connect(params);
77 base::RunLoop loop; 81 base::RunLoop loop;
78 connection->AddConnectionCompletedClosure(base::Bind(&QuitLoop, &loop)); 82 connection->AddConnectionCompletedClosure(base::Bind(&QuitLoop, &loop));
79 loop.Run(); 83 loop.Run();
80 return connection; 84 return connection;
81 } 85 }
82 86
83 void set_ping_callback(const base::Closure& callback) { 87 void set_ping_callback(const base::Closure& callback) {
84 ping_callback_ = callback; 88 ping_callback_ = callback;
85 } 89 }
86 90
(...skipping 10 matching lines...) Expand all
97 connection_state_->connection_remote_name); 101 connection_state_->connection_remote_name);
98 EXPECT_EQ(connection_remote_userid, 102 EXPECT_EQ(connection_remote_userid,
99 connection_state_->connection_remote_userid); 103 connection_state_->connection_remote_userid);
100 EXPECT_EQ(connection_remote_id, connection_state_->connection_remote_id); 104 EXPECT_EQ(connection_remote_id, connection_state_->connection_remote_id);
101 EXPECT_EQ(initialize_local_name, connection_state_->initialize_local_name); 105 EXPECT_EQ(initialize_local_name, connection_state_->initialize_local_name);
102 EXPECT_EQ(initialize_id, connection_state_->initialize_id); 106 EXPECT_EQ(initialize_id, connection_state_->initialize_id);
103 EXPECT_EQ(initialize_userid, connection_state_->initialize_userid); 107 EXPECT_EQ(initialize_userid, connection_state_->initialize_userid);
104 } 108 }
105 109
106 private: 110 private:
107 // mojo::test::ShellTest: 111 // test::ShellTest:
108 void SetUp() override { 112 void SetUp() override {
109 mojo::test::ShellTest::SetUp(); 113 test::ShellTest::SetUp();
110 // We need to connect to the package first to force the shell to read the 114 // We need to connect to the package first to force the shell to read the
111 // package app's manifest and register aliases for the applications it 115 // package app's manifest and register aliases for the applications it
112 // provides. 116 // provides.
113 test::mojom::ConnectTestServicePtr root_service; 117 test::mojom::ConnectTestServicePtr root_service;
114 scoped_ptr<Connection> connection = connector()->Connect(kTestPackageName); 118 std::unique_ptr<Connection> connection =
119 connector()->Connect(kTestPackageName);
115 connection->GetInterface(&root_service); 120 connection->GetInterface(&root_service);
116 base::RunLoop run_loop; 121 base::RunLoop run_loop;
117 std::string root_name; 122 std::string root_name;
118 root_service->GetTitle( 123 root_service->GetTitle(
119 base::Bind(&ReceiveOneString, &root_name, &run_loop)); 124 base::Bind(&ReceiveOneString, &root_name, &run_loop));
120 run_loop.Run(); 125 run_loop.Run();
121 } 126 }
122 127
123 // InterfaceFactory<test::mojom::ExposedInterface>: 128 // InterfaceFactory<test::mojom::ExposedInterface>:
124 void Create(Connection* connection, 129 void Create(Connection* connection,
125 test::mojom::ExposedInterfaceRequest request) override { 130 test::mojom::ExposedInterfaceRequest request) override {
126 bindings_.AddBinding(this, std::move(request)); 131 bindings_.AddBinding(this, std::move(request));
127 } 132 }
133
128 void ConnectionAccepted(test::mojom::ConnectionStatePtr state) override { 134 void ConnectionAccepted(test::mojom::ConnectionStatePtr state) override {
129 connection_state_ = std::move(state); 135 connection_state_ = std::move(state);
130 ping_callback_.Run(); 136 ping_callback_.Run();
131 } 137 }
132 138
133 base::Closure ping_callback_; 139 base::Closure ping_callback_;
134 test::mojom::ConnectionStatePtr connection_state_; 140 test::mojom::ConnectionStatePtr connection_state_;
135 141
136 BindingSet<test::mojom::ExposedInterface> bindings_; 142 mojo::BindingSet<test::mojom::ExposedInterface> bindings_;
137 143
138 DISALLOW_COPY_AND_ASSIGN(ConnectTest); 144 DISALLOW_COPY_AND_ASSIGN(ConnectTest);
139 }; 145 };
140 146
141 // Ensure the connection was properly established and that a round trip 147 // Ensure the connection was properly established and that a round trip
142 // method call/response is completed. 148 // method call/response is completed.
143 TEST_F(ConnectTest, Connect) { 149 TEST_F(ConnectTest, Connect) {
144 scoped_ptr<Connection> connection = connector()->Connect(kTestAppName); 150 std::unique_ptr<Connection> connection = connector()->Connect(kTestAppName);
145 test::mojom::ConnectTestServicePtr service; 151 test::mojom::ConnectTestServicePtr service;
146 connection->GetInterface(&service); 152 connection->GetInterface(&service);
147 base::RunLoop run_loop; 153 base::RunLoop run_loop;
148 std::string title; 154 std::string title;
149 service->GetTitle(base::Bind(&ReceiveOneString, &title, &run_loop)); 155 service->GetTitle(base::Bind(&ReceiveOneString, &title, &run_loop));
150 run_loop.Run(); 156 run_loop.Run();
151 EXPECT_EQ("APP", title); 157 EXPECT_EQ("APP", title);
152 EXPECT_FALSE(connection->IsPending()); 158 EXPECT_FALSE(connection->IsPending());
153 EXPECT_NE(mojom::kInvalidInstanceID, connection->GetRemoteInstanceID()); 159 EXPECT_NE(mojom::kInvalidInstanceID, connection->GetRemoteInstanceID());
154 EXPECT_EQ(connection->GetRemoteIdentity().name(), kTestAppName); 160 EXPECT_EQ(connection->GetRemoteIdentity().name(), kTestAppName);
155 } 161 }
156 162
157 TEST_F(ConnectTest, Instances) { 163 TEST_F(ConnectTest, Instances) {
158 Connector::ConnectParams params_a( 164 Connector::ConnectParams params_a(
159 Identity(kTestAppName, mojom::kInheritUserID, "A")); 165 Identity(kTestAppName, mojom::kInheritUserID, "A"));
160 scoped_ptr<Connection> connection_a1 = ConnectTo(&params_a); 166 std::unique_ptr<Connection> connection_a1 = ConnectTo(&params_a);
161 scoped_ptr<Connection> connection_a2 = ConnectTo(&params_a); 167 std::unique_ptr<Connection> connection_a2 = ConnectTo(&params_a);
162 std::string instance_a1, instance_a2; 168 std::string instance_a1, instance_a2;
163 test::mojom::ConnectTestServicePtr service_a1; 169 test::mojom::ConnectTestServicePtr service_a1;
164 { 170 {
165 connection_a1->GetInterface(&service_a1); 171 connection_a1->GetInterface(&service_a1);
166 base::RunLoop loop; 172 base::RunLoop loop;
167 service_a1->GetInstance(base::Bind(&ReceiveOneString, &instance_a1, &loop)); 173 service_a1->GetInstance(base::Bind(&ReceiveOneString, &instance_a1, &loop));
168 loop.Run(); 174 loop.Run();
169 } 175 }
170 test::mojom::ConnectTestServicePtr service_a2; 176 test::mojom::ConnectTestServicePtr service_a2;
171 { 177 {
172 connection_a2->GetInterface(&service_a2); 178 connection_a2->GetInterface(&service_a2);
173 base::RunLoop loop; 179 base::RunLoop loop;
174 service_a2->GetInstance(base::Bind(&ReceiveOneString, &instance_a2, &loop)); 180 service_a2->GetInstance(base::Bind(&ReceiveOneString, &instance_a2, &loop));
175 loop.Run(); 181 loop.Run();
176 } 182 }
177 EXPECT_EQ(instance_a1, instance_a2); 183 EXPECT_EQ(instance_a1, instance_a2);
178 184
179 Connector::ConnectParams params_b( 185 Connector::ConnectParams params_b(
180 Identity(kTestAppName, mojom::kInheritUserID, "B")); 186 Identity(kTestAppName, mojom::kInheritUserID, "B"));
181 scoped_ptr<Connection> connection_b = ConnectTo(&params_b); 187 std::unique_ptr<Connection> connection_b = ConnectTo(&params_b);
182 std::string instance_b; 188 std::string instance_b;
183 test::mojom::ConnectTestServicePtr service_b; 189 test::mojom::ConnectTestServicePtr service_b;
184 { 190 {
185 connection_b->GetInterface(&service_b); 191 connection_b->GetInterface(&service_b);
186 base::RunLoop loop; 192 base::RunLoop loop;
187 service_b->GetInstance(base::Bind(&ReceiveOneString, &instance_b, &loop)); 193 service_b->GetInstance(base::Bind(&ReceiveOneString, &instance_b, &loop));
188 loop.Run(); 194 loop.Run();
189 } 195 }
190 196
191 EXPECT_NE(instance_a1, instance_b); 197 EXPECT_NE(instance_a1, instance_b);
192 } 198 }
193 199
194 // When both the unresolved and resolved instance names are their default 200 // When both the unresolved and resolved instance names are their default
195 // values, the instance name from the unresolved name must be used. 201 // values, the instance name from the unresolved name must be used.
196 // (The case where the instance names differ is covered by 202 // (The case where the instance names differ is covered by
197 // LifecycleTest.PackagedApp_CrashCrashesOtherProvidedApp). 203 // LifecycleTest.PackagedApp_CrashCrashesOtherProvidedApp).
198 TEST_F(ConnectTest, PreferUnresolvedDefaultInstanceName) { 204 TEST_F(ConnectTest, PreferUnresolvedDefaultInstanceName) {
199 // Connect to an app with no manifest-supplied instance name provided by a 205 // Connect to an app with no manifest-supplied instance name provided by a
200 // package, the instance name must be derived from the application instance 206 // package, the instance name must be derived from the application instance
201 // name, not the package. 207 // name, not the package.
202 scoped_ptr<Connection> connection = connector()->Connect(kTestAppName); 208 std::unique_ptr<Connection> connection = connector()->Connect(kTestAppName);
203 { 209 {
204 base::RunLoop loop; 210 base::RunLoop loop;
205 connection->AddConnectionCompletedClosure(base::Bind(&QuitLoop, &loop)); 211 connection->AddConnectionCompletedClosure(base::Bind(&QuitLoop, &loop));
206 loop.Run(); 212 loop.Run();
207 } 213 }
208 214
209 std::string instance; 215 std::string instance;
210 { 216 {
211 test::mojom::ConnectTestServicePtr service; 217 test::mojom::ConnectTestServicePtr service;
212 connection->GetInterface(&service); 218 connection->GetInterface(&service);
213 base::RunLoop loop; 219 base::RunLoop loop;
214 service->GetInstance(base::Bind(&ReceiveOneString, &instance, &loop)); 220 service->GetInstance(base::Bind(&ReceiveOneString, &instance, &loop));
215 loop.Run(); 221 loop.Run();
216 } 222 }
217 EXPECT_EQ(GetNamePath(kTestAppName), instance); 223 EXPECT_EQ(GetNamePath(kTestAppName), instance);
218 } 224 }
219 225
220 // BlockedInterface should not be exposed to this application because it is not 226 // BlockedInterface should not be exposed to this application because it is not
221 // in our CapabilityFilter whitelist. 227 // in our CapabilityFilter whitelist.
222 TEST_F(ConnectTest, BlockedInterface) { 228 TEST_F(ConnectTest, BlockedInterface) {
223 scoped_ptr<Connection> connection = connector()->Connect(kTestAppName); 229 std::unique_ptr<Connection> connection = connector()->Connect(kTestAppName);
224 base::RunLoop run_loop; 230 base::RunLoop run_loop;
225 test::mojom::BlockedInterfacePtr blocked; 231 test::mojom::BlockedInterfacePtr blocked;
226 connection->GetInterface(&blocked); 232 connection->GetInterface(&blocked);
227 blocked.set_connection_error_handler(base::Bind(&QuitLoop, &run_loop)); 233 blocked.set_connection_error_handler(base::Bind(&QuitLoop, &run_loop));
228 std::string title = "unchanged"; 234 std::string title = "unchanged";
229 blocked->GetTitleBlocked(base::Bind(&ReceiveOneString, &title, &run_loop)); 235 blocked->GetTitleBlocked(base::Bind(&ReceiveOneString, &title, &run_loop));
230 run_loop.Run(); 236 run_loop.Run();
231 EXPECT_EQ("unchanged", title); 237 EXPECT_EQ("unchanged", title);
232 } 238 }
233 239
234 // Connects to an app provided by a package. 240 // Connects to an app provided by a package.
235 TEST_F(ConnectTest, PackagedApp) { 241 TEST_F(ConnectTest, PackagedApp) {
236 scoped_ptr<Connection> connection = connector()->Connect(kTestAppAName); 242 std::unique_ptr<Connection> connection = connector()->Connect(kTestAppAName);
237 test::mojom::ConnectTestServicePtr service_a; 243 test::mojom::ConnectTestServicePtr service_a;
238 connection->GetInterface(&service_a); 244 connection->GetInterface(&service_a);
239 base::RunLoop run_loop; 245 base::RunLoop run_loop;
240 std::string a_name; 246 std::string a_name;
241 service_a->GetTitle(base::Bind(&ReceiveOneString, &a_name, &run_loop)); 247 service_a->GetTitle(base::Bind(&ReceiveOneString, &a_name, &run_loop));
242 run_loop.Run(); 248 run_loop.Run();
243 EXPECT_EQ("A", a_name); 249 EXPECT_EQ("A", a_name);
244 EXPECT_FALSE(connection->IsPending()); 250 EXPECT_FALSE(connection->IsPending());
245 EXPECT_NE(mojom::kInvalidInstanceID, connection->GetRemoteInstanceID()); 251 EXPECT_NE(mojom::kInvalidInstanceID, connection->GetRemoteInstanceID());
246 EXPECT_EQ(connection->GetRemoteIdentity().name(), kTestAppAName); 252 EXPECT_EQ(connection->GetRemoteIdentity().name(), kTestAppAName);
247 } 253 }
248 254
249 // Ask the target application to attempt to connect to a third application 255 // Ask the target application to attempt to connect to a third application
250 // provided by a package whose id is permitted by the primary target's 256 // provided by a package whose id is permitted by the primary target's
251 // CapabilityFilter but whose package is not. The connection should be 257 // CapabilityFilter but whose package is not. The connection should be
252 // allowed regardless of the target's CapabilityFilter with respect to the 258 // allowed regardless of the target's CapabilityFilter with respect to the
253 // package. 259 // package.
254 TEST_F(ConnectTest, BlockedPackage) { 260 TEST_F(ConnectTest, BlockedPackage) {
255 scoped_ptr<Connection> connection = connector()->Connect(kTestAppName); 261 std::unique_ptr<Connection> connection = connector()->Connect(kTestAppName);
256 test::mojom::StandaloneAppPtr standalone_app; 262 test::mojom::StandaloneAppPtr standalone_app;
257 connection->GetInterface(&standalone_app); 263 connection->GetInterface(&standalone_app);
258 base::RunLoop run_loop; 264 base::RunLoop run_loop;
259 std::string title; 265 std::string title;
260 standalone_app->ConnectToAllowedAppInBlockedPackage( 266 standalone_app->ConnectToAllowedAppInBlockedPackage(
261 base::Bind(&ReceiveOneString, &title, &run_loop)); 267 base::Bind(&ReceiveOneString, &title, &run_loop));
262 run_loop.Run(); 268 run_loop.Run();
263 EXPECT_EQ("A", title); 269 EXPECT_EQ("A", title);
264 } 270 }
265 271
266 // BlockedInterface should not be exposed to this application because it is not 272 // BlockedInterface should not be exposed to this application because it is not
267 // in our CapabilityFilter whitelist. 273 // in our CapabilityFilter whitelist.
268 TEST_F(ConnectTest, PackagedApp_BlockedInterface) { 274 TEST_F(ConnectTest, PackagedApp_BlockedInterface) {
269 scoped_ptr<Connection> connection = connector()->Connect(kTestAppAName); 275 std::unique_ptr<Connection> connection = connector()->Connect(kTestAppAName);
270 base::RunLoop run_loop; 276 base::RunLoop run_loop;
271 test::mojom::BlockedInterfacePtr blocked; 277 test::mojom::BlockedInterfacePtr blocked;
272 connection->GetInterface(&blocked); 278 connection->GetInterface(&blocked);
273 blocked.set_connection_error_handler(base::Bind(&QuitLoop, &run_loop)); 279 blocked.set_connection_error_handler(base::Bind(&QuitLoop, &run_loop));
274 run_loop.Run(); 280 run_loop.Run();
275 } 281 }
276 282
277 // Connection to another application provided by the same package, blocked 283 // Connection to another application provided by the same package, blocked
278 // because it's not in the capability filter whitelist. 284 // because it's not in the capability filter whitelist.
279 TEST_F(ConnectTest, BlockedPackagedApplication) { 285 TEST_F(ConnectTest, BlockedPackagedApplication) {
280 scoped_ptr<Connection> connection = connector()->Connect(kTestAppBName); 286 std::unique_ptr<Connection> connection = connector()->Connect(kTestAppBName);
281 test::mojom::ConnectTestServicePtr service_b; 287 test::mojom::ConnectTestServicePtr service_b;
282 connection->GetInterface(&service_b); 288 connection->GetInterface(&service_b);
283 base::RunLoop run_loop; 289 base::RunLoop run_loop;
284 connection->SetConnectionLostClosure(base::Bind(&QuitLoop, &run_loop)); 290 connection->SetConnectionLostClosure(base::Bind(&QuitLoop, &run_loop));
285 run_loop.Run(); 291 run_loop.Run();
286 EXPECT_FALSE(connection->IsPending()); 292 EXPECT_FALSE(connection->IsPending());
287 EXPECT_EQ(mojom::ConnectResult::ACCESS_DENIED, connection->GetResult()); 293 EXPECT_EQ(mojom::ConnectResult::ACCESS_DENIED, connection->GetResult());
288 EXPECT_EQ(mojom::kInvalidInstanceID, connection->GetRemoteInstanceID()); 294 EXPECT_EQ(mojom::kInvalidInstanceID, connection->GetRemoteInstanceID());
289 } 295 }
290 296
291 TEST_F(ConnectTest, CapabilityClasses) { 297 TEST_F(ConnectTest, CapabilityClasses) {
292 scoped_ptr<Connection> connection = connector()->Connect(kTestAppName); 298 std::unique_ptr<Connection> connection = connector()->Connect(kTestAppName);
293 test::mojom::StandaloneAppPtr standalone_app; 299 test::mojom::StandaloneAppPtr standalone_app;
294 connection->GetInterface(&standalone_app); 300 connection->GetInterface(&standalone_app);
295 std::string string1, string2; 301 std::string string1, string2;
296 base::RunLoop loop; 302 base::RunLoop loop;
297 standalone_app->ConnectToClassInterface( 303 standalone_app->ConnectToClassInterface(
298 base::Bind(&ReceiveTwoStrings, &string1, &string2, &loop)); 304 base::Bind(&ReceiveTwoStrings, &string1, &string2, &loop));
299 loop.Run(); 305 loop.Run();
300 EXPECT_EQ("PONG", string1); 306 EXPECT_EQ("PONG", string1);
301 EXPECT_EQ("CLASS APP", string2); 307 EXPECT_EQ("CLASS APP", string2);
302 } 308 }
303 309
304 TEST_F(ConnectTest, ConnectAsDifferentUser_Allowed) { 310 TEST_F(ConnectTest, ConnectAsDifferentUser_Allowed) {
305 scoped_ptr<Connection> connection = connector()->Connect(kTestAppName); 311 std::unique_ptr<Connection> connection = connector()->Connect(kTestAppName);
306 test::mojom::UserIdTestPtr user_id_test; 312 test::mojom::UserIdTestPtr user_id_test;
307 connection->GetInterface(&user_id_test); 313 connection->GetInterface(&user_id_test);
308 shell::mojom::ConnectResult result; 314 mojom::ConnectResult result;
309 Identity target(kTestClassAppName, base::GenerateGUID()); 315 Identity target(kTestClassAppName, base::GenerateGUID());
310 Identity result_identity; 316 Identity result_identity;
311 { 317 {
312 base::RunLoop loop; 318 base::RunLoop loop;
313 user_id_test->ConnectToClassAppAsDifferentUser( 319 user_id_test->ConnectToClassAppAsDifferentUser(
314 mojom::Identity::From(target), 320 mojom::Identity::From(target),
315 base::Bind(&ReceiveConnectionResult, &result, &result_identity, &loop)); 321 base::Bind(&ReceiveConnectionResult, &result, &result_identity, &loop));
316 loop.Run(); 322 loop.Run();
317 } 323 }
318 EXPECT_EQ(result, shell::mojom::ConnectResult::SUCCEEDED); 324 EXPECT_EQ(result, mojom::ConnectResult::SUCCEEDED);
319 EXPECT_EQ(target, result_identity); 325 EXPECT_EQ(target, result_identity);
320 } 326 }
321 327
322 TEST_F(ConnectTest, ConnectAsDifferentUser_Blocked) { 328 TEST_F(ConnectTest, ConnectAsDifferentUser_Blocked) {
323 scoped_ptr<Connection> connection = connector()->Connect(kTestAppAName); 329 std::unique_ptr<Connection> connection = connector()->Connect(kTestAppAName);
324 test::mojom::UserIdTestPtr user_id_test; 330 test::mojom::UserIdTestPtr user_id_test;
325 connection->GetInterface(&user_id_test); 331 connection->GetInterface(&user_id_test);
326 shell::mojom::ConnectResult result; 332 mojom::ConnectResult result;
327 Identity target(kTestClassAppName, base::GenerateGUID()); 333 Identity target(kTestClassAppName, base::GenerateGUID());
328 Identity result_identity; 334 Identity result_identity;
329 { 335 {
330 base::RunLoop loop; 336 base::RunLoop loop;
331 user_id_test->ConnectToClassAppAsDifferentUser( 337 user_id_test->ConnectToClassAppAsDifferentUser(
332 mojom::Identity::From(target), 338 mojom::Identity::From(target),
333 base::Bind(&ReceiveConnectionResult, &result, &result_identity, &loop)); 339 base::Bind(&ReceiveConnectionResult, &result, &result_identity, &loop));
334 loop.Run(); 340 loop.Run();
335 } 341 }
336 EXPECT_EQ(shell::mojom::ConnectResult::ACCESS_DENIED, result); 342 EXPECT_EQ(mojom::ConnectResult::ACCESS_DENIED, result);
337 EXPECT_FALSE(target == result_identity); 343 EXPECT_FALSE(target == result_identity);
338 } 344 }
339 345
340 // There are various other tests (shell, lifecycle) that test valid client 346 // There are various other tests (shell, lifecycle) that test valid client
341 // process specifications. This is the only one for blocking. 347 // process specifications. This is the only one for blocking.
342 TEST_F(ConnectTest, ConnectToClientProcess_Blocked) { 348 TEST_F(ConnectTest, ConnectToClientProcess_Blocked) {
343 scoped_ptr<Connection> connection = connector()->Connect(kTestDriverName); 349 std::unique_ptr<Connection> connection =
350 connector()->Connect(kTestDriverName);
344 test::mojom::ClientProcessTestPtr client_process_test; 351 test::mojom::ClientProcessTestPtr client_process_test;
345 connection->GetInterface(&client_process_test); 352 connection->GetInterface(&client_process_test);
346 shell::mojom::ConnectResult result; 353 mojom::ConnectResult result;
347 Identity result_identity; 354 Identity result_identity;
348 { 355 {
349 base::RunLoop loop; 356 base::RunLoop loop;
350 client_process_test->LaunchAndConnectToProcess( 357 client_process_test->LaunchAndConnectToProcess(
351 base::Bind(&ReceiveConnectionResult, &result, &result_identity, &loop)); 358 base::Bind(&ReceiveConnectionResult, &result, &result_identity, &loop));
352 loop.Run(); 359 loop.Run();
353 } 360 }
354 EXPECT_EQ(shell::mojom::ConnectResult::ACCESS_DENIED, result); 361 EXPECT_EQ(mojom::ConnectResult::ACCESS_DENIED, result);
355 } 362 }
356 363
357 // Verifies that a client with the "all_users" capability class can receive 364 // Verifies that a client with the "all_users" capability class can receive
358 // connections from clients run as other users. 365 // connections from clients run as other users.
359 TEST_F(ConnectTest, AllUsersSingleton) { 366 TEST_F(ConnectTest, AllUsersSingleton) {
360 // Connect to an instance with an explicitly different user_id. This supplied 367 // Connect to an instance with an explicitly different user_id. This supplied
361 // user id should be ignored by the shell (which will generate its own 368 // user id should be ignored by the shell (which will generate its own
362 // synthetic user id for all-user singleton instances). 369 // synthetic user id for all-user singleton instances).
363 const std::string singleton_userid = base::GenerateGUID(); 370 const std::string singleton_userid = base::GenerateGUID();
364 Connector::ConnectParams params( 371 Connector::ConnectParams params(
365 Identity(kTestSingletonAppName, singleton_userid)); 372 Identity(kTestSingletonAppName, singleton_userid));
366 scoped_ptr<Connection> connection = connector()->Connect(&params); 373 std::unique_ptr<Connection> connection = connector()->Connect(&params);
367 { 374 {
368 base::RunLoop loop; 375 base::RunLoop loop;
369 connection->AddConnectionCompletedClosure(base::Bind(&QuitLoop, &loop)); 376 connection->AddConnectionCompletedClosure(base::Bind(&QuitLoop, &loop));
370 loop.Run(); 377 loop.Run();
371 EXPECT_NE(connection->GetRemoteIdentity().user_id(), singleton_userid); 378 EXPECT_NE(connection->GetRemoteIdentity().user_id(), singleton_userid);
372 } 379 }
373 // This connects using the current client's user_id. It should be bound to the 380 // This connects using the current client's user_id. It should be bound to the
374 // same service started above, with the same shell-generated user id. 381 // same service started above, with the same shell-generated user id.
375 scoped_ptr<Connection> inherit_connection = 382 std::unique_ptr<Connection> inherit_connection =
376 connector()->Connect(kTestSingletonAppName); 383 connector()->Connect(kTestSingletonAppName);
377 { 384 {
378 base::RunLoop loop; 385 base::RunLoop loop;
379 inherit_connection->AddConnectionCompletedClosure( 386 inherit_connection->AddConnectionCompletedClosure(
380 base::Bind(&QuitLoop, &loop)); 387 base::Bind(&QuitLoop, &loop));
381 loop.Run(); 388 loop.Run();
382 EXPECT_EQ(inherit_connection->GetRemoteIdentity().user_id(), 389 EXPECT_EQ(inherit_connection->GetRemoteIdentity().user_id(),
383 connection->GetRemoteIdentity().user_id()); 390 connection->GetRemoteIdentity().user_id());
384 } 391 }
385 } 392 }
386 393
387 // Tests that we can expose an interface to targets on outbound connections. 394 // Tests that we can expose an interface to targets on outbound connections.
388 TEST_F(ConnectTest, LocalInterface) { 395 TEST_F(ConnectTest, LocalInterface) {
389 // Connect to a standalone application. 396 // Connect to a standalone application.
390 { 397 {
391 test::mojom::ConnectTestServicePtr service; 398 test::mojom::ConnectTestServicePtr service;
392 scoped_ptr<Connection> connection = connector()->Connect(kTestAppName); 399 std::unique_ptr<Connection> connection = connector()->Connect(kTestAppName);
393 connection->GetInterface(&service); 400 connection->GetInterface(&service);
394 connection->AddInterface<test::mojom::ExposedInterface>(this); 401 connection->AddInterface<test::mojom::ExposedInterface>(this);
395 402
396 uint32_t remote_id = shell::mojom::kInvalidInstanceID; 403 uint32_t remote_id = mojom::kInvalidInstanceID;
397 { 404 {
398 base::RunLoop run_loop; 405 base::RunLoop run_loop;
399 EXPECT_TRUE(connection->IsPending()); 406 EXPECT_TRUE(connection->IsPending());
400 EXPECT_EQ(mojom::kInvalidInstanceID, connection->GetRemoteInstanceID()); 407 EXPECT_EQ(mojom::kInvalidInstanceID, connection->GetRemoteInstanceID());
401 connection->AddConnectionCompletedClosure( 408 connection->AddConnectionCompletedClosure(
402 base::Bind(&QuitLoop, &run_loop)); 409 base::Bind(&QuitLoop, &run_loop));
403 run_loop.Run(); 410 run_loop.Run();
404 EXPECT_FALSE(connection->IsPending()); 411 EXPECT_FALSE(connection->IsPending());
405 remote_id = connection->GetRemoteInstanceID(); 412 remote_id = connection->GetRemoteInstanceID();
406 EXPECT_NE(mojom::kInvalidInstanceID, remote_id); 413 EXPECT_NE(mojom::kInvalidInstanceID, remote_id);
407 } 414 }
408 415
409 { 416 {
410 base::RunLoop run_loop; 417 base::RunLoop run_loop;
411 set_ping_callback(base::Bind(&QuitLoop, &run_loop)); 418 set_ping_callback(base::Bind(&QuitLoop, &run_loop));
412 run_loop.Run(); 419 run_loop.Run();
413 CompareConnectionState( 420 CompareConnectionState(
414 kTestAppName, test_name(), test_userid(), test_instance_id(), 421 kTestAppName, test_name(), test_userid(), test_instance_id(),
415 kTestAppName, connection->GetRemoteIdentity().user_id(), remote_id); 422 kTestAppName, connection->GetRemoteIdentity().user_id(), remote_id);
416 } 423 }
417 } 424 }
418 425
419 // Connect to an application provided by a package. 426 // Connect to an application provided by a package.
420 { 427 {
421 test::mojom::ConnectTestServicePtr service_a; 428 test::mojom::ConnectTestServicePtr service_a;
422 scoped_ptr<Connection> connection = connector()->Connect(kTestAppAName); 429 std::unique_ptr<Connection> connection =
430 connector()->Connect(kTestAppAName);
423 connection->GetInterface(&service_a); 431 connection->GetInterface(&service_a);
424 connection->AddInterface<test::mojom::ExposedInterface>(this); 432 connection->AddInterface<test::mojom::ExposedInterface>(this);
425 433
426 uint32_t remote_id = shell::mojom::kInvalidInstanceID; 434 uint32_t remote_id = mojom::kInvalidInstanceID;
427 { 435 {
428 base::RunLoop run_loop; 436 base::RunLoop run_loop;
429 EXPECT_TRUE(connection->IsPending()); 437 EXPECT_TRUE(connection->IsPending());
430 EXPECT_EQ(mojom::kInvalidInstanceID, connection->GetRemoteInstanceID()); 438 EXPECT_EQ(mojom::kInvalidInstanceID, connection->GetRemoteInstanceID());
431 connection->AddConnectionCompletedClosure( 439 connection->AddConnectionCompletedClosure(
432 base::Bind(&QuitLoop, &run_loop)); 440 base::Bind(&QuitLoop, &run_loop));
433 run_loop.Run(); 441 run_loop.Run();
434 EXPECT_FALSE(connection->IsPending()); 442 EXPECT_FALSE(connection->IsPending());
435 remote_id = connection->GetRemoteInstanceID(); 443 remote_id = connection->GetRemoteInstanceID();
436 EXPECT_NE(mojom::kInvalidInstanceID, remote_id); 444 EXPECT_NE(mojom::kInvalidInstanceID, remote_id);
437 } 445 }
438 446
439 { 447 {
440 base::RunLoop run_loop; 448 base::RunLoop run_loop;
441 set_ping_callback(base::Bind(&QuitLoop, &run_loop)); 449 set_ping_callback(base::Bind(&QuitLoop, &run_loop));
442 run_loop.Run(); 450 run_loop.Run();
443 CompareConnectionState( 451 CompareConnectionState(
444 kTestAppAName, test_name(), test_userid(), test_instance_id(), 452 kTestAppAName, test_name(), test_userid(), test_instance_id(),
445 kTestAppAName, connection->GetRemoteIdentity().user_id(), remote_id); 453 kTestAppAName, connection->GetRemoteIdentity().user_id(), remote_id);
446 } 454 }
447 455
448 } 456 }
449 } 457 }
450 458
451 } // namespace shell 459 } // namespace shell
452 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698