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

Side by Side Diff: mojo/service_manager/service_manager_unittest.cc

Issue 415803005: Load apps on separate threads in service_manager_unittests (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 5 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "base/at_exit.h" 5 #include "base/at_exit.h"
6 #include "base/bind.h" 6 #include "base/bind.h"
7 #include "base/message_loop/message_loop.h" 7 #include "base/message_loop/message_loop.h"
8 #include "mojo/public/cpp/application/application_connection.h" 8 #include "mojo/public/cpp/application/application_connection.h"
9 #include "mojo/public/cpp/application/application_delegate.h" 9 #include "mojo/public/cpp/application/application_delegate.h"
10 #include "mojo/public/cpp/application/application_impl.h" 10 #include "mojo/public/cpp/application/application_impl.h"
11 #include "mojo/public/cpp/application/interface_factory.h" 11 #include "mojo/public/cpp/application/interface_factory.h"
12 #include "mojo/public/interfaces/service_provider/service_provider.mojom.h" 12 #include "mojo/public/interfaces/service_provider/service_provider.mojom.h"
13 #include "mojo/service_manager/background_service_loader.h"
13 #include "mojo/service_manager/service_loader.h" 14 #include "mojo/service_manager/service_loader.h"
14 #include "mojo/service_manager/service_manager.h" 15 #include "mojo/service_manager/service_manager.h"
15 #include "mojo/service_manager/test.mojom.h" 16 #include "mojo/service_manager/test.mojom.h"
16 #include "testing/gtest/include/gtest/gtest.h" 17 #include "testing/gtest/include/gtest/gtest.h"
17 18
18 namespace mojo { 19 namespace mojo {
19 namespace { 20 namespace {
20 21
21 const char kTestURLString[] = "test:testService"; 22 const char kTestURLString[] = "test:testService";
22 const char kTestAURLString[] = "test:TestA"; 23 const char kTestAURLString[] = "test:TestA";
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 InterfaceRequest<TestService> request) OVERRIDE { 142 InterfaceRequest<TestService> request) OVERRIDE {
142 BindToRequest(new TestServiceImpl(context_), &request); 143 BindToRequest(new TestServiceImpl(context_), &request);
143 } 144 }
144 145
145 scoped_ptr<ApplicationImpl> test_app_; 146 scoped_ptr<ApplicationImpl> test_app_;
146 TestContext* context_; 147 TestContext* context_;
147 int num_loads_; 148 int num_loads_;
148 DISALLOW_COPY_AND_ASSIGN(TestServiceLoader); 149 DISALLOW_COPY_AND_ASSIGN(TestServiceLoader);
149 }; 150 };
150 151
151 struct TesterContext { 152 class TesterContext {
152 TesterContext() 153 public:
153 : num_b_calls(0), 154 explicit TesterContext(base::MessageLoop* loop)
154 num_c_calls(0), 155 : num_b_calls_(0),
155 num_a_deletes(0), 156 num_c_calls_(0),
156 num_b_deletes(0), 157 num_a_deletes_(0),
157 num_c_deletes(0), 158 num_b_deletes_(0),
158 tester_called_quit(false), 159 num_c_deletes_(0),
159 a_called_quit(false) {} 160 tester_called_quit_(false),
160 int num_b_calls; 161 a_called_quit_(false),
161 int num_c_calls; 162 loop_(loop) {}
162 int num_a_deletes; 163
163 int num_b_deletes; 164 void IncrementNumBCalls() {
164 int num_c_deletes; 165 base::AutoLock lock(lock_);
165 bool tester_called_quit; 166 num_b_calls_++;
166 bool a_called_quit; 167 }
168
169 void IncrementNumCCalls() {
170 base::AutoLock lock(lock_);
171 num_c_calls_++;
172 }
173
174 void IncrementNumADeletes() {
175 base::AutoLock lock(lock_);
176 num_a_deletes_++;
177 }
178
179 void IncrementNumBDeletes() {
180 base::AutoLock lock(lock_);
181 num_b_deletes_++;
182 }
183
184 void IncrementNumCDeletes() {
185 base::AutoLock lock(lock_);
186 num_c_deletes_++;
187 }
188
189 void set_tester_called_quit() {
190 base::AutoLock lock(lock_);
191 tester_called_quit_ = true;
192 }
193
194 void set_a_called_quit() {
195 base::AutoLock lock(lock_);
196 a_called_quit_ = true;
197 }
198
199 int num_b_calls() {
200 base::AutoLock lock(lock_);
201 return num_b_calls_;
202 }
203 int num_c_calls() {
204 base::AutoLock lock(lock_);
205 return num_c_calls_;
206 }
207 int num_a_deletes() {
208 base::AutoLock lock(lock_);
209 return num_a_deletes_;
210 }
211 int num_b_deletes() {
212 base::AutoLock lock(lock_);
213 return num_b_deletes_;
214 }
215 int num_c_deletes() {
216 base::AutoLock lock(lock_);
217 return num_c_deletes_;
218 }
219 bool tester_called_quit() {
220 base::AutoLock lock(lock_);
221 return tester_called_quit_;
222 }
223 bool a_called_quit() {
224 base::AutoLock lock(lock_);
225 return a_called_quit_;
226 }
227
228 void QuitSoon() {
229 loop_->PostTask(FROM_HERE, base::MessageLoop::QuitWhenIdleClosure());
230 }
231
232 private:
233 // lock_ protects all members except for loop_ which must be unchanged for the
234 // lifetime of this class.
235 base::Lock lock_;
236 int num_b_calls_;
237 int num_c_calls_;
238 int num_a_deletes_;
239 int num_b_deletes_;
240 int num_c_deletes_;
241 bool tester_called_quit_;
242 bool a_called_quit_;
243
244 base::MessageLoop* loop_;
167 }; 245 };
168 246
169 // Used to test that the requestor url will be correctly passed. 247 // Used to test that the requestor url will be correctly passed.
170 class TestAImpl : public InterfaceImpl<TestA> { 248 class TestAImpl : public InterfaceImpl<TestA> {
171 public: 249 public:
172 TestAImpl(ApplicationConnection* connection, TesterContext* test_context) 250 TestAImpl(ApplicationConnection* connection, TesterContext* test_context)
173 : test_context_(test_context) { 251 : test_context_(test_context) {
174 connection->ConnectToApplication(kTestBURLString)->ConnectToService(&b_); 252 connection->ConnectToApplication(kTestBURLString)->ConnectToService(&b_);
175 } 253 }
176 virtual ~TestAImpl() { test_context_->num_a_deletes++; } 254 virtual ~TestAImpl() { test_context_->IncrementNumADeletes(); }
177 255
178 private: 256 private:
179 virtual void CallB() OVERRIDE { 257 virtual void CallB() OVERRIDE {
180 b_->B(base::Bind(&TestAImpl::Quit, base::Unretained(this))); 258 b_->B(base::Bind(&TestAImpl::Quit, base::Unretained(this)));
181 } 259 }
182 260
183 virtual void CallCFromB() OVERRIDE { 261 virtual void CallCFromB() OVERRIDE {
184 b_->CallC(base::Bind(&TestAImpl::Quit, base::Unretained(this))); 262 b_->CallC(base::Bind(&TestAImpl::Quit, base::Unretained(this)));
185 } 263 }
186 264
187 void Quit() { 265 void Quit() {
188 test_context_->a_called_quit = true; 266 test_context_->set_a_called_quit();
189 base::MessageLoop::current()->Quit(); 267 test_context_->QuitSoon();
190 } 268 }
191 269
192 TesterContext* test_context_; 270 TesterContext* test_context_;
193 TestBPtr b_; 271 TestBPtr b_;
194 }; 272 };
195 273
196 class TestBImpl : public InterfaceImpl<TestB> { 274 class TestBImpl : public InterfaceImpl<TestB> {
197 public: 275 public:
198 TestBImpl(ApplicationConnection* connection, TesterContext* test_context) 276 TestBImpl(ApplicationConnection* connection, TesterContext* test_context)
199 : test_context_(test_context) { 277 : test_context_(test_context) {
200 connection->ConnectToService(&c_); 278 connection->ConnectToService(&c_);
201 } 279 }
202 280
203 virtual ~TestBImpl() { 281 virtual ~TestBImpl() {
204 test_context_->num_b_deletes++; 282 test_context_->IncrementNumBDeletes();
205 if (!base::MessageLoop::current()->is_running()) 283 test_context_->QuitSoon();
206 return;
207 base::MessageLoop::current()->Quit();
208 } 284 }
209 285
210 private: 286 private:
211 virtual void B(const mojo::Callback<void()>& callback) OVERRIDE { 287 virtual void B(const mojo::Callback<void()>& callback) OVERRIDE {
212 ++test_context_->num_b_calls; 288 test_context_->IncrementNumBCalls();
213 callback.Run(); 289 callback.Run();
214 } 290 }
215 291
216 virtual void CallC(const mojo::Callback<void()>& callback) OVERRIDE { 292 virtual void CallC(const mojo::Callback<void()>& callback) OVERRIDE {
217 ++test_context_->num_b_calls; 293 test_context_->IncrementNumBCalls();
218 c_->C(callback); 294 c_->C(callback);
219 } 295 }
220 296
221 TesterContext* test_context_; 297 TesterContext* test_context_;
222 TestCPtr c_; 298 TestCPtr c_;
223 }; 299 };
224 300
225 class TestCImpl : public InterfaceImpl<TestC> { 301 class TestCImpl : public InterfaceImpl<TestC> {
226 public: 302 public:
227 TestCImpl(ApplicationConnection* connection, TesterContext* test_context) 303 TestCImpl(ApplicationConnection* connection, TesterContext* test_context)
228 : test_context_(test_context) {} 304 : test_context_(test_context) {}
229 305
230 virtual ~TestCImpl() { test_context_->num_c_deletes++; } 306 virtual ~TestCImpl() { test_context_->IncrementNumCDeletes(); }
231 307
232 private: 308 private:
233 virtual void C(const mojo::Callback<void()>& callback) OVERRIDE { 309 virtual void C(const mojo::Callback<void()>& callback) OVERRIDE {
234 ++test_context_->num_c_calls; 310 test_context_->IncrementNumCCalls();
235 callback.Run(); 311 callback.Run();
236 } 312 }
237 TesterContext* test_context_; 313 TesterContext* test_context_;
238 }; 314 };
239 315
240 class Tester : public ApplicationDelegate, 316 class Tester : public ApplicationDelegate,
241 public ServiceLoader, 317 public ServiceLoader,
242 public InterfaceFactory<TestA>, 318 public InterfaceFactory<TestA>,
243 public InterfaceFactory<TestB>, 319 public InterfaceFactory<TestB>,
244 public InterfaceFactory<TestC> { 320 public InterfaceFactory<TestC> {
(...skipping 11 matching lines...) Expand all
256 app_.reset(new ApplicationImpl(this, shell_handle.Pass())); 332 app_.reset(new ApplicationImpl(this, shell_handle.Pass()));
257 } 333 }
258 334
259 virtual void OnServiceError(ServiceManager* manager, 335 virtual void OnServiceError(ServiceManager* manager,
260 const GURL& url) OVERRIDE {} 336 const GURL& url) OVERRIDE {}
261 337
262 virtual bool ConfigureIncomingConnection( 338 virtual bool ConfigureIncomingConnection(
263 ApplicationConnection* connection) OVERRIDE { 339 ApplicationConnection* connection) OVERRIDE {
264 if (!requestor_url_.empty() && 340 if (!requestor_url_.empty() &&
265 requestor_url_ != connection->GetRemoteApplicationURL()) { 341 requestor_url_ != connection->GetRemoteApplicationURL()) {
266 context_->tester_called_quit = true; 342 context_->set_tester_called_quit();
267 base::MessageLoop::current()->Quit(); 343 context_->QuitSoon();
268 return false; 344 return false;
269 } 345 }
270 // If we're coming from A, then add B, otherwise A. 346 // If we're coming from A, then add B, otherwise A.
271 if (connection->GetRemoteApplicationURL() == kTestAURLString) 347 if (connection->GetRemoteApplicationURL() == kTestAURLString)
272 connection->AddService<TestB>(this); 348 connection->AddService<TestB>(this);
273 else 349 else
274 connection->AddService<TestA>(this); 350 connection->AddService<TestA>(this);
275 return true; 351 return true;
276 } 352 }
277 353
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
327 private: 403 private:
328 int call_count_; 404 int call_count_;
329 GURL url_; 405 GURL url_;
330 DISALLOW_COPY_AND_ASSIGN(TestServiceInterceptor); 406 DISALLOW_COPY_AND_ASSIGN(TestServiceInterceptor);
331 }; 407 };
332 408
333 } // namespace 409 } // namespace
334 410
335 class ServiceManagerTest : public testing::Test { 411 class ServiceManagerTest : public testing::Test {
336 public: 412 public:
337 ServiceManagerTest() {} 413 ServiceManagerTest() : tester_context_(&loop_) {}
338 414
339 virtual ~ServiceManagerTest() {} 415 virtual ~ServiceManagerTest() {}
340 416
341 virtual void SetUp() OVERRIDE { 417 virtual void SetUp() OVERRIDE {
342 service_manager_.reset(new ServiceManager); 418 service_manager_.reset(new ServiceManager);
343 TestServiceLoader* default_loader = new TestServiceLoader; 419 TestServiceLoader* default_loader = new TestServiceLoader;
344 default_loader->set_context(&context_); 420 default_loader->set_context(&context_);
345 service_manager_->set_default_loader( 421 service_manager_->set_default_loader(
346 scoped_ptr<ServiceLoader>(default_loader)); 422 scoped_ptr<ServiceLoader>(default_loader));
347 423
348 TestServicePtr service_proxy; 424 TestServicePtr service_proxy;
349 service_manager_->ConnectToService(GURL(kTestURLString), &service_proxy); 425 service_manager_->ConnectToService(GURL(kTestURLString), &service_proxy);
350 test_client_.reset(new TestClientImpl(service_proxy.Pass())); 426 test_client_.reset(new TestClientImpl(service_proxy.Pass()));
351 } 427 }
352 428
353 virtual void TearDown() OVERRIDE { 429 virtual void TearDown() OVERRIDE {
354 test_client_.reset(NULL); 430 test_client_.reset(NULL);
355 service_manager_.reset(NULL); 431 service_manager_.reset(NULL);
356 } 432 }
357 433
434 void AddLoaderForURL(const GURL& url, const std::string& requestor_url) {
435 scoped_ptr<ServiceLoader> real_loader(
436 new Tester(&tester_context_, requestor_url));
437 service_manager_->SetLoaderForURL(
438 scoped_ptr<ServiceLoader>(new BackgroundServiceLoader(
439 real_loader.Pass(), "", base::MessageLoop::TYPE_DEFAULT)),
440 url);
441 }
442
358 bool HasFactoryForTestURL() { 443 bool HasFactoryForTestURL() {
359 ServiceManager::TestAPI manager_test_api(service_manager_.get()); 444 ServiceManager::TestAPI manager_test_api(service_manager_.get());
360 return manager_test_api.HasFactoryForURL(GURL(kTestURLString)); 445 return manager_test_api.HasFactoryForURL(GURL(kTestURLString));
361 } 446 }
362 447
363 protected: 448 protected:
364 base::ShadowingAtExitManager at_exit_; 449 base::ShadowingAtExitManager at_exit_;
450 TesterContext tester_context_;
451 TestContext context_;
365 base::MessageLoop loop_; 452 base::MessageLoop loop_;
366 TestContext context_;
367 scoped_ptr<TestClientImpl> test_client_; 453 scoped_ptr<TestClientImpl> test_client_;
368 scoped_ptr<ServiceManager> service_manager_; 454 scoped_ptr<ServiceManager> service_manager_;
369 DISALLOW_COPY_AND_ASSIGN(ServiceManagerTest); 455 DISALLOW_COPY_AND_ASSIGN(ServiceManagerTest);
370 }; 456 };
371 457
372 TEST_F(ServiceManagerTest, Basic) { 458 TEST_F(ServiceManagerTest, Basic) {
373 test_client_->Test("test"); 459 test_client_->Test("test");
374 loop_.Run(); 460 loop_.Run();
375 EXPECT_EQ(std::string("test"), context_.last_test_string); 461 EXPECT_EQ(std::string("test"), context_.last_test_string);
376 } 462 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 } 495 }
410 EXPECT_EQ(5, context_.num_loader_deletes); 496 EXPECT_EQ(5, context_.num_loader_deletes);
411 } 497 }
412 498
413 // Confirm that both urls and schemes can have their loaders explicitly set. 499 // Confirm that both urls and schemes can have their loaders explicitly set.
414 TEST_F(ServiceManagerTest, SetLoaders) { 500 TEST_F(ServiceManagerTest, SetLoaders) {
415 ServiceManager sm; 501 ServiceManager sm;
416 TestServiceLoader* default_loader = new TestServiceLoader; 502 TestServiceLoader* default_loader = new TestServiceLoader;
417 TestServiceLoader* url_loader = new TestServiceLoader; 503 TestServiceLoader* url_loader = new TestServiceLoader;
418 TestServiceLoader* scheme_loader = new TestServiceLoader; 504 TestServiceLoader* scheme_loader = new TestServiceLoader;
419 sm.set_default_loader(scoped_ptr<ServiceLoader>(default_loader)); 505 service_manager_->set_default_loader(
420 sm.SetLoaderForURL(scoped_ptr<ServiceLoader>(url_loader), GURL("test:test1")); 506 scoped_ptr<ServiceLoader>(default_loader));
421 sm.SetLoaderForScheme(scoped_ptr<ServiceLoader>(scheme_loader), "test"); 507 service_manager_->SetLoaderForURL(scoped_ptr<ServiceLoader>(url_loader),
508 GURL("test:test1"));
509 service_manager_->SetLoaderForScheme(scoped_ptr<ServiceLoader>(scheme_loader),
510 "test");
422 511
423 // test::test1 should go to url_loader. 512 // test::test1 should go to url_loader.
424 TestServicePtr test_service; 513 TestServicePtr test_service;
425 sm.ConnectToService(GURL("test:test1"), &test_service); 514 service_manager_->ConnectToService(GURL("test:test1"), &test_service);
426 EXPECT_EQ(1, url_loader->num_loads()); 515 EXPECT_EQ(1, url_loader->num_loads());
427 EXPECT_EQ(0, scheme_loader->num_loads()); 516 EXPECT_EQ(0, scheme_loader->num_loads());
428 EXPECT_EQ(0, default_loader->num_loads()); 517 EXPECT_EQ(0, default_loader->num_loads());
429 518
430 // test::test2 should go to scheme loader. 519 // test::test2 should go to scheme loader.
431 sm.ConnectToService(GURL("test:test2"), &test_service); 520 service_manager_->ConnectToService(GURL("test:test2"), &test_service);
432 EXPECT_EQ(1, url_loader->num_loads()); 521 EXPECT_EQ(1, url_loader->num_loads());
433 EXPECT_EQ(1, scheme_loader->num_loads()); 522 EXPECT_EQ(1, scheme_loader->num_loads());
434 EXPECT_EQ(0, default_loader->num_loads()); 523 EXPECT_EQ(0, default_loader->num_loads());
435 524
436 // http::test1 should go to default loader. 525 // http::test1 should go to default loader.
437 sm.ConnectToService(GURL("http:test1"), &test_service); 526 service_manager_->ConnectToService(GURL("http:test1"), &test_service);
438 EXPECT_EQ(1, url_loader->num_loads()); 527 EXPECT_EQ(1, url_loader->num_loads());
439 EXPECT_EQ(1, scheme_loader->num_loads()); 528 EXPECT_EQ(1, scheme_loader->num_loads());
440 EXPECT_EQ(1, default_loader->num_loads()); 529 EXPECT_EQ(1, default_loader->num_loads());
441 } 530 }
442 531
443 // Confirm that the url of a service is correctly passed to another service that 532 // Confirm that the url of a service is correctly passed to another service that
444 // it loads. 533 // it loads.
445 // http://crbug.com/396300 534 TEST_F(ServiceManagerTest, ACallB) {
446 TEST_F(ServiceManagerTest, DISABLED_ACallB) {
447 TesterContext context;
448 ServiceManager sm;
449
450 // Any url can load a. 535 // Any url can load a.
451 sm.SetLoaderForURL( 536 AddLoaderForURL(GURL(kTestAURLString), std::string());
452 scoped_ptr<ServiceLoader>(new Tester(&context, std::string())),
453 GURL(kTestAURLString));
454 537
455 // Only a can load b. 538 // Only a can load b.
456 sm.SetLoaderForURL( 539 AddLoaderForURL(GURL(kTestBURLString), kTestAURLString);
457 scoped_ptr<ServiceLoader>(
458 new Tester(&context, kTestAURLString)),
459 GURL(kTestBURLString));
460 540
461 TestAPtr a; 541 TestAPtr a;
462 sm.ConnectToService(GURL(kTestAURLString), &a); 542 service_manager_->ConnectToService(GURL(kTestAURLString), &a);
463 a->CallB(); 543 a->CallB();
464 loop_.Run(); 544 loop_.Run();
465 EXPECT_EQ(1, context.num_b_calls); 545 EXPECT_EQ(1, tester_context_.num_b_calls());
466 EXPECT_TRUE(context.a_called_quit); 546 EXPECT_TRUE(tester_context_.a_called_quit());
467 } 547 }
468 548
469 // A calls B which calls C. 549 // A calls B which calls C.
470 // http://crbug.com/396300 550 TEST_F(ServiceManagerTest, BCallC) {
471 TEST_F(ServiceManagerTest, DISABLED_BCallC) {
472 TesterContext context;
473 ServiceManager sm;
474
475 // Any url can load a. 551 // Any url can load a.
476 sm.SetLoaderForURL( 552 AddLoaderForURL(GURL(kTestAURLString), std::string());
477 scoped_ptr<ServiceLoader>(new Tester(&context, std::string())),
478 GURL(kTestAURLString));
479 553
480 // Only a can load b. 554 // Only a can load b.
481 sm.SetLoaderForURL( 555 AddLoaderForURL(GURL(kTestBURLString), kTestAURLString);
482 scoped_ptr<ServiceLoader>(
483 new Tester(&context, kTestAURLString)),
484 GURL(kTestBURLString));
485 556
486 TestAPtr a; 557 TestAPtr a;
487 sm.ConnectToService(GURL(kTestAURLString), &a); 558 service_manager_->ConnectToService(GURL(kTestAURLString), &a);
488 a->CallCFromB(); 559 a->CallCFromB();
489 loop_.Run(); 560 loop_.Run();
490 561
491 EXPECT_EQ(1, context.num_b_calls); 562 EXPECT_EQ(1, tester_context_.num_b_calls());
492 EXPECT_EQ(1, context.num_c_calls); 563 EXPECT_EQ(1, tester_context_.num_c_calls());
493 EXPECT_TRUE(context.a_called_quit); 564 EXPECT_TRUE(tester_context_.a_called_quit());
494 } 565 }
495 566
496 // Confirm that a service impl will be deleted if the app that connected to 567 // Confirm that a service impl will be deleted if the app that connected to
497 // it goes away. 568 // it goes away.
498 // http://crbug.com/396300 569 TEST_F(ServiceManagerTest, BDeleted) {
499 TEST_F(ServiceManagerTest, DISABLED_BDeleted) { 570 AddLoaderForURL(GURL(kTestAURLString), std::string());
500 TesterContext context; 571 AddLoaderForURL(GURL(kTestBURLString), std::string());
501 ServiceManager sm;
502
503 sm.SetLoaderForURL(
504 scoped_ptr<ServiceLoader>(new Tester(&context, std::string())),
505 GURL(kTestAURLString));
506
507 sm.SetLoaderForURL(
508 scoped_ptr<ServiceLoader>( new Tester(&context, std::string())),
509 GURL(kTestBURLString));
510 572
511 TestAPtr a; 573 TestAPtr a;
512 sm.ConnectToService(GURL(kTestAURLString), &a); 574 service_manager_->ConnectToService(GURL(kTestAURLString), &a);
513 575
514 a->CallB(); 576 a->CallB();
515 loop_.Run(); 577 loop_.Run();
516 578
517 // Kills the a app. 579 // Kills the a app.
518 sm.SetLoaderForURL(scoped_ptr<ServiceLoader>(), GURL(kTestAURLString)); 580 service_manager_->SetLoaderForURL(scoped_ptr<ServiceLoader>(),
581 GURL(kTestAURLString));
519 loop_.Run(); 582 loop_.Run();
520 EXPECT_EQ(1, context.num_b_deletes); 583
584 EXPECT_EQ(1, tester_context_.num_b_deletes());
521 } 585 }
522 586
523 // Confirm that the url of a service is correctly passed to another service that 587 // Confirm that the url of a service is correctly passed to another service that
524 // it loads, and that it can be rejected. 588 // it loads, and that it can be rejected.
525 // http://crbug.com/396300 589 TEST_F(ServiceManagerTest, ANoLoadB) {
526 TEST_F(ServiceManagerTest, DISABLED_ANoLoadB) {
527 TesterContext context;
528 ServiceManager sm;
529
530 // Any url can load a. 590 // Any url can load a.
531 sm.SetLoaderForURL( 591 AddLoaderForURL(GURL(kTestAURLString), std::string());
532 scoped_ptr<ServiceLoader>(new Tester(&context, std::string())),
533 GURL(kTestAURLString));
534 592
535 // Only c can load b, so this will fail. 593 // Only c can load b, so this will fail.
536 sm.SetLoaderForURL( 594 AddLoaderForURL(GURL(kTestBURLString), "test:TestC");
537 scoped_ptr<ServiceLoader>(new Tester(&context, "test:TestC")),
538 GURL(kTestBURLString));
539 595
540 TestAPtr a; 596 TestAPtr a;
541 sm.ConnectToService(GURL(kTestAURLString), &a); 597 service_manager_->ConnectToService(GURL(kTestAURLString), &a);
542 a->CallB(); 598 a->CallB();
543 loop_.Run(); 599 loop_.Run();
544 EXPECT_EQ(0, context.num_b_calls); 600 EXPECT_EQ(0, tester_context_.num_b_calls());
545 EXPECT_TRUE(context.tester_called_quit); 601 EXPECT_TRUE(tester_context_.tester_called_quit());
546 } 602 }
547 603
548 TEST_F(ServiceManagerTest, NoServiceNoLoad) { 604 TEST_F(ServiceManagerTest, NoServiceNoLoad) {
549 TesterContext context; 605 AddLoaderForURL(GURL(kTestAURLString), std::string());
550 ServiceManager sm;
551
552 sm.SetLoaderForURL(
553 scoped_ptr<ServiceLoader>(new Tester(&context, std::string())),
554 GURL(kTestAURLString));
555 606
556 // There is no TestC service implementation registered with ServiceManager, 607 // There is no TestC service implementation registered with ServiceManager,
557 // so this cannot succeed (but also shouldn't crash). 608 // so this cannot succeed (but also shouldn't crash).
558 TestCPtr c; 609 TestCPtr c;
559 sm.ConnectToService(GURL(kTestAURLString), &c); 610 service_manager_->ConnectToService(GURL(kTestAURLString), &c);
560 QuitMessageLoopErrorHandler quitter; 611 QuitMessageLoopErrorHandler quitter;
561 c.set_error_handler(&quitter); 612 c.set_error_handler(&quitter);
562 613
563 loop_.Run(); 614 loop_.Run();
564 EXPECT_TRUE(c.encountered_error()); 615 EXPECT_TRUE(c.encountered_error());
565 } 616 }
566 617
567 TEST_F(ServiceManagerTest, Interceptor) { 618 TEST_F(ServiceManagerTest, Interceptor) {
568 ServiceManager sm;
569 TestServiceInterceptor interceptor; 619 TestServiceInterceptor interceptor;
570 TestServiceLoader* default_loader = new TestServiceLoader; 620 TestServiceLoader* default_loader = new TestServiceLoader;
571 sm.set_default_loader(scoped_ptr<ServiceLoader>(default_loader)); 621 service_manager_->set_default_loader(
572 sm.SetInterceptor(&interceptor); 622 scoped_ptr<ServiceLoader>(default_loader));
623 service_manager_->SetInterceptor(&interceptor);
573 624
574 std::string url("test:test3"); 625 std::string url("test:test3");
575 TestServicePtr test_service; 626 TestServicePtr test_service;
576 sm.ConnectToService(GURL(url), &test_service); 627 service_manager_->ConnectToService(GURL(url), &test_service);
577 628
578 EXPECT_EQ(1, interceptor.call_count()); 629 EXPECT_EQ(1, interceptor.call_count());
579 EXPECT_EQ(url, interceptor.url_spec()); 630 EXPECT_EQ(url, interceptor.url_spec());
580 EXPECT_EQ(1, default_loader->num_loads()); 631 EXPECT_EQ(1, default_loader->num_loads());
581 } 632 }
582 633
583 } // namespace mojo 634 } // namespace mojo
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698