OLD | NEW |
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 <string> | 5 #include <string> |
6 #include <vector> | 6 #include <vector> |
7 | 7 |
8 #include "base/auto_reset.h" | 8 #include "base/auto_reset.h" |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 15 matching lines...) Expand all Loading... |
26 #include "mojo/shell/shell_test_helper.h" | 26 #include "mojo/shell/shell_test_helper.h" |
27 #include "testing/gtest/include/gtest/gtest.h" | 27 #include "testing/gtest/include/gtest/gtest.h" |
28 #include "ui/gfx/geometry/rect.h" | 28 #include "ui/gfx/geometry/rect.h" |
29 | 29 |
30 namespace mojo { | 30 namespace mojo { |
31 namespace view_manager { | 31 namespace view_manager { |
32 namespace service { | 32 namespace service { |
33 | 33 |
34 namespace { | 34 namespace { |
35 | 35 |
36 // TODO(sky): clean this up. Should be moved to the single place its used. | |
37 base::RunLoop* current_run_loop = NULL; | |
38 | |
39 const char kTestServiceURL[] = "mojo:test_url"; | 36 const char kTestServiceURL[] = "mojo:test_url"; |
40 | 37 |
41 void INodesToTestNodes(const Array<INodePtr>& data, | |
42 std::vector<TestNode>* test_nodes) { | |
43 for (size_t i = 0; i < data.size(); ++i) { | |
44 TestNode node; | |
45 node.parent_id = data[i]->parent_id; | |
46 node.node_id = data[i]->node_id; | |
47 node.view_id = data[i]->view_id; | |
48 test_nodes->push_back(node); | |
49 } | |
50 } | |
51 | |
52 // ViewManagerProxy is a proxy to an IViewManager. It handles invoking | 38 // ViewManagerProxy is a proxy to an IViewManager. It handles invoking |
53 // IViewManager functions on the right thread in a synchronous manner (each | 39 // IViewManager functions on the right thread in a synchronous manner (each |
54 // IViewManager cover function blocks until the response from the IViewManager | 40 // IViewManager cover function blocks until the response from the IViewManager |
55 // is returned). In addition it tracks the set of IViewManagerClient messages | 41 // is returned). In addition it tracks the set of IViewManagerClient messages |
56 // received by way of a vector of Changes. Use DoRunLoopUntilChangesCount() to | 42 // received by way of a vector of Changes. Use DoRunLoopUntilChangesCount() to |
57 // wait for a certain number of messages to be received. | 43 // wait for a certain number of messages to be received. |
58 class ViewManagerProxy : public TestChangeTracker::Delegate { | 44 class ViewManagerProxy : public TestChangeTracker::Delegate { |
59 public: | 45 public: |
60 ViewManagerProxy(TestChangeTracker* tracker, base::MessageLoop* loop) | 46 ViewManagerProxy(TestChangeTracker* tracker, base::MessageLoop* loop) |
61 : tracker_(tracker), | 47 : tracker_(tracker), |
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
478 const GURL& url) OVERRIDE { | 464 const GURL& url) OVERRIDE { |
479 } | 465 } |
480 | 466 |
481 private: | 467 private: |
482 base::MessageLoop* initial_loop_; | 468 base::MessageLoop* initial_loop_; |
483 ScopedVector<Application> apps_; | 469 ScopedVector<Application> apps_; |
484 | 470 |
485 DISALLOW_COPY_AND_ASSIGN(ConnectServiceLoader); | 471 DISALLOW_COPY_AND_ASSIGN(ConnectServiceLoader); |
486 }; | 472 }; |
487 | 473 |
488 // Sets |current_run_loop| and runs it. It is expected that someone else quits | |
489 // the loop. | |
490 void DoRunLoop() { | |
491 DCHECK(!current_run_loop); | |
492 | |
493 base::RunLoop run_loop; | |
494 current_run_loop = &run_loop; | |
495 current_run_loop->Run(); | |
496 current_run_loop = NULL; | |
497 } | |
498 | |
499 // Boolean callback. Sets |result_cache| to the value of |result| and quits | |
500 // the run loop. | |
501 void BooleanCallback(bool* result_cache, bool result) { | |
502 *result_cache = result; | |
503 current_run_loop->Quit(); | |
504 } | |
505 | |
506 // Creates an id used for transport from the specified parameters. | 474 // Creates an id used for transport from the specified parameters. |
507 TransportNodeId BuildNodeId(TransportConnectionId connection_id, | 475 TransportNodeId BuildNodeId(TransportConnectionId connection_id, |
508 TransportConnectionSpecificNodeId node_id) { | 476 TransportConnectionSpecificNodeId node_id) { |
509 return (connection_id << 16) | node_id; | 477 return (connection_id << 16) | node_id; |
510 } | 478 } |
511 | 479 |
512 // Creates an id used for transport from the specified parameters. | 480 // Creates an id used for transport from the specified parameters. |
513 TransportViewId BuildViewId(TransportConnectionId connection_id, | 481 TransportViewId BuildViewId(TransportConnectionId connection_id, |
514 TransportConnectionSpecificViewId view_id) { | 482 TransportConnectionSpecificViewId view_id) { |
515 return (connection_id << 16) | view_id; | 483 return (connection_id << 16) | view_id; |
516 } | 484 } |
517 | 485 |
| 486 // Callback from ViewManagerInitConnect(). |result| is the result of the |
| 487 // Connect() call and |run_loop| the nested RunLoop. |
| 488 void ViewManagerInitConnectCallback(bool* result_cache, |
| 489 base::RunLoop* run_loop, |
| 490 bool result) { |
| 491 *result_cache = result; |
| 492 run_loop->Quit(); |
| 493 } |
| 494 |
518 // Resposible for establishing connection to the viewmanager. Blocks until get | 495 // Resposible for establishing connection to the viewmanager. Blocks until get |
519 // back result. | 496 // back result. |
520 bool ViewManagerInitConnect(IViewManagerInit* view_manager_init, | 497 bool ViewManagerInitConnect(IViewManagerInit* view_manager_init, |
521 const std::string& url) { | 498 const std::string& url) { |
522 bool result = false; | 499 bool result = false; |
523 view_manager_init->Connect(url, base::Bind(&BooleanCallback, &result)); | 500 base::RunLoop run_loop; |
524 DoRunLoop(); | 501 view_manager_init->Connect(url, |
| 502 base::Bind(&ViewManagerInitConnectCallback, |
| 503 &result, &run_loop)); |
| 504 run_loop.Run(); |
525 return result; | 505 return result; |
526 } | 506 } |
527 | 507 |
528 } // namespace | 508 } // namespace |
529 | 509 |
530 typedef std::vector<std::string> Changes; | 510 typedef std::vector<std::string> Changes; |
531 | 511 |
532 class ViewManagerConnectionTest : public testing::Test { | 512 class ViewManagerConnectionTest : public testing::Test { |
533 public: | 513 public: |
534 ViewManagerConnectionTest() : connection_(NULL), connection2_(NULL) {} | 514 ViewManagerConnectionTest() : connection_(NULL), connection2_(NULL) {} |
(...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1347 // TODO(sky): add coverage of test that destroys connections and ensures other | 1327 // TODO(sky): add coverage of test that destroys connections and ensures other |
1348 // connections get deletion notification (or advanced server id). | 1328 // connections get deletion notification (or advanced server id). |
1349 | 1329 |
1350 // TODO(sky): need to better track changes to initial connection. For example, | 1330 // TODO(sky): need to better track changes to initial connection. For example, |
1351 // that SetBounsdNodes/AddNode and the like don't result in messages to the | 1331 // that SetBounsdNodes/AddNode and the like don't result in messages to the |
1352 // originating connection. | 1332 // originating connection. |
1353 | 1333 |
1354 } // namespace service | 1334 } // namespace service |
1355 } // namespace view_manager | 1335 } // namespace view_manager |
1356 } // namespace mojo | 1336 } // namespace mojo |
OLD | NEW |