| OLD | NEW |
| 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 <stdio.h> | 5 #include <stdio.h> |
| 6 #include <stdlib.h> | 6 #include <stdlib.h> |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include <map> | 9 #include <map> |
| 10 #include <queue> | 10 #include <queue> |
| 11 #include <sstream> | 11 #include <sstream> |
| 12 | 12 |
| 13 #include "base/logging.h" | 13 #include "base/logging.h" |
| 14 #include "base/rand_util.h" | 14 #include "base/rand_util.h" |
| 15 #include "mojo/edk/system/ports/event.h" |
| 15 #include "mojo/edk/system/ports/node.h" | 16 #include "mojo/edk/system/ports/node.h" |
| 16 #include "mojo/edk/system/ports/node_delegate.h" | 17 #include "mojo/edk/system/ports/node_delegate.h" |
| 17 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
| 18 | 19 |
| 19 namespace mojo { | 20 namespace mojo { |
| 20 namespace edk { | 21 namespace edk { |
| 21 namespace ports { | 22 namespace ports { |
| 22 namespace test { | 23 namespace test { |
| 23 | 24 |
| 24 namespace { | 25 namespace { |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 task_queue.pop(); | 108 task_queue.pop(); |
| 108 | 109 |
| 109 Node* node = GetNode(task->node_name); | 110 Node* node = GetNode(task->node_name); |
| 110 if (node) | 111 if (node) |
| 111 node->AcceptMessage(std::move(task->message)); | 112 node->AcceptMessage(std::move(task->message)); |
| 112 | 113 |
| 113 delete task; | 114 delete task; |
| 114 } | 115 } |
| 115 } | 116 } |
| 116 | 117 |
| 118 void PumpUntilTask(EventType type) { |
| 119 while (!task_queue.empty()) { |
| 120 Task* task = task_queue.top(); |
| 121 |
| 122 const EventHeader* header = GetEventHeader(*task->message); |
| 123 if (header->type == type) |
| 124 return; |
| 125 |
| 126 task_queue.pop(); |
| 127 |
| 128 Node* node = GetNode(task->node_name); |
| 129 if (node) |
| 130 node->AcceptMessage(std::move(task->message)); |
| 131 |
| 132 delete task; |
| 133 } |
| 134 } |
| 135 |
| 117 void DiscardPendingTasks() { | 136 void DiscardPendingTasks() { |
| 118 while (!task_queue.empty()) { | 137 while (!task_queue.empty()) { |
| 119 Task* task = task_queue.top(); | 138 Task* task = task_queue.top(); |
| 120 task_queue.pop(); | 139 task_queue.pop(); |
| 121 delete task; | 140 delete task; |
| 122 } | 141 } |
| 123 } | 142 } |
| 124 | 143 |
| 125 int SendStringMessage(Node* node, const PortRef& port, const std::string& s) { | 144 int SendStringMessage(Node* node, const PortRef& port, const std::string& s) { |
| 126 size_t size = s.size() + 1; | 145 size_t size = s.size() + 1; |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 return; | 212 return; |
| 194 } | 213 } |
| 195 DVLOG(1) << "ForwardMessage from node " | 214 DVLOG(1) << "ForwardMessage from node " |
| 196 << node_name_ << " to " << node_name; | 215 << node_name_ << " to " << node_name; |
| 197 task_queue.push(new Task(node_name, std::move(message))); | 216 task_queue.push(new Task(node_name, std::move(message))); |
| 198 } | 217 } |
| 199 | 218 |
| 200 void BroadcastMessage(ScopedMessage message) override { | 219 void BroadcastMessage(ScopedMessage message) override { |
| 201 for (size_t i = 0; i < kMaxNodes; ++i) { | 220 for (size_t i = 0; i < kMaxNodes; ++i) { |
| 202 Node* node = node_map[i]; | 221 Node* node = node_map[i]; |
| 203 if (node) { | 222 // Broadcast doesn't deliver to the local node. |
| 223 if (node && node != GetNode(node_name_)) { |
| 204 // NOTE: We only need to support broadcast of events, which have no | 224 // NOTE: We only need to support broadcast of events, which have no |
| 205 // payload or ports bytes. | 225 // payload or ports bytes. |
| 206 ScopedMessage new_message( | 226 ScopedMessage new_message( |
| 207 new TestMessage(message->num_header_bytes(), 0, 0)); | 227 new TestMessage(message->num_header_bytes(), 0, 0)); |
| 208 memcpy(new_message->mutable_header_bytes(), message->header_bytes(), | 228 memcpy(new_message->mutable_header_bytes(), message->header_bytes(), |
| 209 message->num_header_bytes()); | 229 message->num_header_bytes()); |
| 210 node->AcceptMessage(std::move(new_message)); | 230 node->AcceptMessage(std::move(new_message)); |
| 211 } | 231 } |
| 212 } | 232 } |
| 213 } | 233 } |
| (...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 542 | 562 |
| 543 EXPECT_EQ(OK, node0.ClosePort(A)); | 563 EXPECT_EQ(OK, node0.ClosePort(A)); |
| 544 EXPECT_EQ(OK, node1.ClosePort(B)); | 564 EXPECT_EQ(OK, node1.ClosePort(B)); |
| 545 EXPECT_EQ(OK, node1.ClosePort(C)); | 565 EXPECT_EQ(OK, node1.ClosePort(C)); |
| 546 EXPECT_EQ(OK, node0.ClosePort(E)); | 566 EXPECT_EQ(OK, node0.ClosePort(E)); |
| 547 | 567 |
| 548 EXPECT_TRUE(node0.CanShutdownCleanly(false)); | 568 EXPECT_TRUE(node0.CanShutdownCleanly(false)); |
| 549 EXPECT_TRUE(node1.CanShutdownCleanly(false)); | 569 EXPECT_TRUE(node1.CanShutdownCleanly(false)); |
| 550 } | 570 } |
| 551 | 571 |
| 572 TEST_F(PortsTest, LostConnectionToNodeWithLocalProxy) { |
| 573 // Tests that a proxy gets cleaned up when its direct peer lives on a lost |
| 574 // node and it's predecessor lives on the same node. |
| 575 |
| 576 NodeName node0_name(0, 1); |
| 577 TestNodeDelegate node0_delegate(node0_name); |
| 578 Node node0(node0_name, &node0_delegate); |
| 579 node_map[0] = &node0; |
| 580 |
| 581 NodeName node1_name(1, 1); |
| 582 TestNodeDelegate node1_delegate(node1_name); |
| 583 Node node1(node1_name, &node1_delegate); |
| 584 node_map[1] = &node1; |
| 585 |
| 586 node1_delegate.set_save_messages(true); |
| 587 |
| 588 // Create A-B spanning nodes 0 and 1. |
| 589 PortRef A, B; |
| 590 EXPECT_EQ(OK, node0.CreateUninitializedPort(&A)); |
| 591 EXPECT_EQ(OK, node1.CreateUninitializedPort(&B)); |
| 592 EXPECT_EQ(OK, node0.InitializePort(A, node1_name, B.name())); |
| 593 EXPECT_EQ(OK, node1.InitializePort(B, node0_name, A.name())); |
| 594 |
| 595 // Create C-D and send D over A to node 1. |
| 596 PortRef C, D; |
| 597 EXPECT_EQ(OK, node0.CreatePortPair(&C, &D)); |
| 598 EXPECT_EQ(OK, SendStringMessageWithPort(&node0, A, ".", D)); |
| 599 |
| 600 // Pump tasks until the start of port collapse for port D, which should become |
| 601 // a proxy. |
| 602 PumpUntilTask(EventType::kObserveProxy); |
| 603 |
| 604 ScopedMessage message; |
| 605 ASSERT_TRUE(node1_delegate.GetSavedMessage(&message)); |
| 606 ASSERT_EQ(1u, message->num_ports()); |
| 607 |
| 608 PortRef E; |
| 609 EXPECT_EQ(OK, node1.GetPort(message->ports()[0], &E)); |
| 610 |
| 611 EXPECT_EQ(OK, node0.LostConnectionToNode(node1_name)); |
| 612 PumpTasks(); |
| 613 |
| 614 // Port C should have detected peer closure. |
| 615 PortStatus status; |
| 616 EXPECT_EQ(OK, node0.GetStatus(C, &status)); |
| 617 EXPECT_TRUE(status.peer_closed); |
| 618 |
| 619 EXPECT_EQ(OK, node0.ClosePort(A)); |
| 620 EXPECT_EQ(OK, node1.ClosePort(B)); |
| 621 EXPECT_EQ(OK, node0.ClosePort(C)); |
| 622 EXPECT_EQ(OK, node1.ClosePort(E)); |
| 623 |
| 624 EXPECT_TRUE(node0.CanShutdownCleanly(false)); |
| 625 EXPECT_TRUE(node1.CanShutdownCleanly(false)); |
| 626 } |
| 627 |
| 552 TEST_F(PortsTest, GetMessage1) { | 628 TEST_F(PortsTest, GetMessage1) { |
| 553 NodeName node0_name(0, 1); | 629 NodeName node0_name(0, 1); |
| 554 TestNodeDelegate node0_delegate(node0_name); | 630 TestNodeDelegate node0_delegate(node0_name); |
| 555 Node node0(node0_name, &node0_delegate); | 631 Node node0(node0_name, &node0_delegate); |
| 556 node_map[0] = &node0; | 632 node_map[0] = &node0; |
| 557 | 633 |
| 558 PortRef a0, a1; | 634 PortRef a0, a1; |
| 559 EXPECT_EQ(OK, node0.CreatePortPair(&a0, &a1)); | 635 EXPECT_EQ(OK, node0.CreatePortPair(&a0, &a1)); |
| 560 | 636 |
| 561 ScopedMessage message; | 637 ScopedMessage message; |
| (...skipping 872 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1434 | 1510 |
| 1435 // Expect everything to have gone away. | 1511 // Expect everything to have gone away. |
| 1436 EXPECT_TRUE(node0.CanShutdownCleanly(false)); | 1512 EXPECT_TRUE(node0.CanShutdownCleanly(false)); |
| 1437 EXPECT_TRUE(node1.CanShutdownCleanly(false)); | 1513 EXPECT_TRUE(node1.CanShutdownCleanly(false)); |
| 1438 } | 1514 } |
| 1439 | 1515 |
| 1440 } // namespace test | 1516 } // namespace test |
| 1441 } // namespace ports | 1517 } // namespace ports |
| 1442 } // namespace edk | 1518 } // namespace edk |
| 1443 } // namespace mojo | 1519 } // namespace mojo |
| OLD | NEW |