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

Side by Side Diff: mojo/edk/system/multiprocess_message_pipe_unittest.cc

Issue 2227553002: Support mojo connections between unrelated peer processes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 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 | « mojo/edk/system/core.cc ('k') | mojo/edk/system/node_channel.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 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 #include <stdio.h> 7 #include <stdio.h>
8 #include <string.h> 8 #include <string.h>
9 9
10 #include <string> 10 #include <string>
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 return p; 61 return p;
62 } 62 }
63 63
64 void Exit() { WriteMessage(h_, "exit"); } 64 void Exit() { WriteMessage(h_, "exit"); }
65 65
66 private: 66 private:
67 MojoHandle h_; 67 MojoHandle h_;
68 }; 68 };
69 }; 69 };
70 70
71 class MultiprocessMessagePipeTestWithPeerSupport
72 : public MultiprocessMessagePipeTest,
73 public testing::WithParamInterface<test::MojoTestBase::LaunchType> {
74 protected:
75 void SetUp() override {
76 test::MojoTestBase::SetUp();
77 set_launch_type(GetParam());
78 }
79 };
80
71 // For each message received, sends a reply message with the same contents 81 // For each message received, sends a reply message with the same contents
72 // repeated twice, until the other end is closed or it receives "quitquitquit" 82 // repeated twice, until the other end is closed or it receives "quitquitquit"
73 // (which it doesn't reply to). It'll return the number of messages received, 83 // (which it doesn't reply to). It'll return the number of messages received,
74 // not including any "quitquitquit" message, modulo 100. 84 // not including any "quitquitquit" message, modulo 100.
75 DEFINE_TEST_CLIENT_WITH_PIPE(EchoEcho, MultiprocessMessagePipeTest, h) { 85 DEFINE_TEST_CLIENT_WITH_PIPE(EchoEcho, MultiprocessMessagePipeTest, h) {
76 const std::string quitquitquit("quitquitquit"); 86 const std::string quitquitquit("quitquitquit");
77 int rv = 0; 87 int rv = 0;
78 for (;; rv = (rv + 1) % 100) { 88 for (;; rv = (rv + 1) % 100) {
79 // Wait for our end of the message pipe to be readable. 89 // Wait for our end of the message pipe to be readable.
80 HandleSignalsState hss; 90 HandleSignalsState hss;
(...skipping 28 matching lines...) Expand all
109 std::string write_buffer = read_buffer + read_buffer; 119 std::string write_buffer = read_buffer + read_buffer;
110 CHECK_EQ(MojoWriteMessage(h, write_buffer.data(), 120 CHECK_EQ(MojoWriteMessage(h, write_buffer.data(),
111 static_cast<uint32_t>(write_buffer.size()), 121 static_cast<uint32_t>(write_buffer.size()),
112 nullptr, 0u, MOJO_WRITE_MESSAGE_FLAG_NONE), 122 nullptr, 0u, MOJO_WRITE_MESSAGE_FLAG_NONE),
113 MOJO_RESULT_OK); 123 MOJO_RESULT_OK);
114 } 124 }
115 125
116 return rv; 126 return rv;
117 } 127 }
118 128
119 TEST_F(MultiprocessMessagePipeTest, Basic) { 129 TEST_P(MultiprocessMessagePipeTestWithPeerSupport, Basic) {
120 RUN_CHILD_ON_PIPE(EchoEcho, h) 130 RUN_CHILD_ON_PIPE(EchoEcho, h)
121 std::string hello("hello"); 131 std::string hello("hello");
122 ASSERT_EQ(MOJO_RESULT_OK, 132 ASSERT_EQ(MOJO_RESULT_OK,
123 MojoWriteMessage(h, hello.data(), 133 MojoWriteMessage(h, hello.data(),
124 static_cast<uint32_t>(hello.size()), nullptr, 0u, 134 static_cast<uint32_t>(hello.size()), nullptr, 0u,
125 MOJO_WRITE_MESSAGE_FLAG_NONE)); 135 MOJO_WRITE_MESSAGE_FLAG_NONE));
126 136
127 HandleSignalsState hss; 137 HandleSignalsState hss;
128 ASSERT_EQ(MOJO_RESULT_OK, 138 ASSERT_EQ(MOJO_RESULT_OK,
129 MojoWait(h, MOJO_HANDLE_SIGNAL_READABLE, 139 MojoWait(h, MOJO_HANDLE_SIGNAL_READABLE,
(...skipping 15 matching lines...) Expand all
145 ASSERT_EQ(hello + hello, read_buffer); 155 ASSERT_EQ(hello + hello, read_buffer);
146 156
147 std::string quitquitquit("quitquitquit"); 157 std::string quitquitquit("quitquitquit");
148 CHECK_EQ(MojoWriteMessage(h, quitquitquit.data(), 158 CHECK_EQ(MojoWriteMessage(h, quitquitquit.data(),
149 static_cast<uint32_t>(quitquitquit.size()), 159 static_cast<uint32_t>(quitquitquit.size()),
150 nullptr, 0u, MOJO_WRITE_MESSAGE_FLAG_NONE), 160 nullptr, 0u, MOJO_WRITE_MESSAGE_FLAG_NONE),
151 MOJO_RESULT_OK); 161 MOJO_RESULT_OK);
152 END_CHILD_AND_EXPECT_EXIT_CODE(1 % 100); 162 END_CHILD_AND_EXPECT_EXIT_CODE(1 % 100);
153 } 163 }
154 164
155 TEST_F(MultiprocessMessagePipeTest, QueueMessages) { 165 TEST_P(MultiprocessMessagePipeTestWithPeerSupport, QueueMessages) {
156 static const size_t kNumMessages = 1001; 166 static const size_t kNumMessages = 1001;
157 RUN_CHILD_ON_PIPE(EchoEcho, h) 167 RUN_CHILD_ON_PIPE(EchoEcho, h)
158 for (size_t i = 0; i < kNumMessages; i++) { 168 for (size_t i = 0; i < kNumMessages; i++) {
159 std::string write_buffer(i, 'A' + (i % 26)); 169 std::string write_buffer(i, 'A' + (i % 26));
160 ASSERT_EQ(MOJO_RESULT_OK, 170 ASSERT_EQ(MOJO_RESULT_OK,
161 MojoWriteMessage(h, write_buffer.data(), 171 MojoWriteMessage(h, write_buffer.data(),
162 static_cast<uint32_t>(write_buffer.size()), 172 static_cast<uint32_t>(write_buffer.size()),
163 nullptr, 0u, MOJO_WRITE_MESSAGE_FLAG_NONE)); 173 nullptr, 0u, MOJO_WRITE_MESSAGE_FLAG_NONE));
164 } 174 }
165 175
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after
502 // Now write some data into the message pipe. 512 // Now write some data into the message pipe.
503 std::string write_buffer = "world"; 513 std::string write_buffer = "world";
504 CHECK_EQ(MojoWriteMessage(handles[0], write_buffer.data(), 514 CHECK_EQ(MojoWriteMessage(handles[0], write_buffer.data(),
505 static_cast<uint32_t>(write_buffer.size()), nullptr, 515 static_cast<uint32_t>(write_buffer.size()), nullptr,
506 0u, MOJO_WRITE_MESSAGE_FLAG_NONE), 516 0u, MOJO_WRITE_MESSAGE_FLAG_NONE),
507 MOJO_RESULT_OK); 517 MOJO_RESULT_OK);
508 MojoClose(handles[0]); 518 MojoClose(handles[0]);
509 return 0; 519 return 0;
510 } 520 }
511 521
512 TEST_F(MultiprocessMessagePipeTest, MessagePipePassing) { 522 TEST_P(MultiprocessMessagePipeTestWithPeerSupport, MessagePipePassing) {
513 RUN_CHILD_ON_PIPE(CheckMessagePipe, h) 523 RUN_CHILD_ON_PIPE(CheckMessagePipe, h)
514 MojoCreateSharedBufferOptions options; 524 MojoCreateSharedBufferOptions options;
515 options.struct_size = sizeof(options); 525 options.struct_size = sizeof(options);
516 options.flags = MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE; 526 options.flags = MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE;
517 527
518 MojoHandle mp1, mp2; 528 MojoHandle mp1, mp2;
519 ASSERT_EQ(MOJO_RESULT_OK, 529 ASSERT_EQ(MOJO_RESULT_OK,
520 MojoCreateMessagePipe(nullptr, &mp1, &mp2)); 530 MojoCreateMessagePipe(nullptr, &mp1, &mp2));
521 531
522 // Write a string into one end of the new message pipe and send the other 532 // Write a string into one end of the new message pipe and send the other
(...skipping 21 matching lines...) Expand all
544 &read_buffer_size, nullptr, 554 &read_buffer_size, nullptr,
545 0, MOJO_READ_MESSAGE_FLAG_NONE), 555 0, MOJO_READ_MESSAGE_FLAG_NONE),
546 MOJO_RESULT_OK); 556 MOJO_RESULT_OK);
547 read_buffer.resize(read_buffer_size); 557 read_buffer.resize(read_buffer_size);
548 CHECK_EQ(read_buffer, std::string("world")); 558 CHECK_EQ(read_buffer, std::string("world"));
549 559
550 MojoClose(mp1); 560 MojoClose(mp1);
551 END_CHILD() 561 END_CHILD()
552 } 562 }
553 563
554 TEST_F(MultiprocessMessagePipeTest, MessagePipeTwoPassing) { 564 TEST_P(MultiprocessMessagePipeTestWithPeerSupport, MessagePipeTwoPassing) {
555 RUN_CHILD_ON_PIPE(CheckMessagePipe, h) 565 RUN_CHILD_ON_PIPE(CheckMessagePipe, h)
556 MojoHandle mp1, mp2; 566 MojoHandle mp1, mp2;
557 ASSERT_EQ(MOJO_RESULT_OK, 567 ASSERT_EQ(MOJO_RESULT_OK,
558 MojoCreateMessagePipe(nullptr, &mp2, &mp1)); 568 MojoCreateMessagePipe(nullptr, &mp2, &mp1));
559 569
560 // Write a string into one end of the new message pipe and send the other 570 // Write a string into one end of the new message pipe and send the other
561 // end. 571 // end.
562 const std::string hello("hello"); 572 const std::string hello("hello");
563 ASSERT_EQ(MOJO_RESULT_OK, 573 ASSERT_EQ(MOJO_RESULT_OK,
564 MojoWriteMessage(mp1, &hello[0], 574 MojoWriteMessage(mp1, &hello[0],
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
674 &read_buffer_size, nullptr, 684 &read_buffer_size, nullptr,
675 0, MOJO_READ_MESSAGE_FLAG_NONE), 685 0, MOJO_READ_MESSAGE_FLAG_NONE),
676 MOJO_RESULT_OK); 686 MOJO_RESULT_OK);
677 read_buffer.resize(read_buffer_size); 687 read_buffer.resize(read_buffer_size);
678 CHECK_EQ(read_buffer, std::string("world")); 688 CHECK_EQ(read_buffer, std::string("world"));
679 689
680 MojoClose(mp1); 690 MojoClose(mp1);
681 END_CHILD(); 691 END_CHILD();
682 } 692 }
683 693
684 TEST_F(MultiprocessMessagePipeTest, CreateMessagePipe) { 694 TEST_P(MultiprocessMessagePipeTestWithPeerSupport, CreateMessagePipe) {
685 MojoHandle p0, p1; 695 MojoHandle p0, p1;
686 CreateMessagePipe(&p0, &p1); 696 CreateMessagePipe(&p0, &p1);
687 VerifyTransmission(p0, p1, "hey man"); 697 VerifyTransmission(p0, p1, "hey man");
688 VerifyTransmission(p1, p0, "slow down"); 698 VerifyTransmission(p1, p0, "slow down");
689 VerifyTransmission(p0, p1, std::string(10 * 1024 * 1024, 'a')); 699 VerifyTransmission(p0, p1, std::string(10 * 1024 * 1024, 'a'));
690 VerifyTransmission(p1, p0, std::string(10 * 1024 * 1024, 'e')); 700 VerifyTransmission(p1, p0, std::string(10 * 1024 * 1024, 'e'));
691 701
692 CloseHandle(p0); 702 CloseHandle(p0);
693 CloseHandle(p1); 703 CloseHandle(p1);
694 } 704 }
695 705
696 TEST_F(MultiprocessMessagePipeTest, PassMessagePipeLocal) { 706 TEST_P(MultiprocessMessagePipeTestWithPeerSupport, PassMessagePipeLocal) {
697 MojoHandle p0, p1; 707 MojoHandle p0, p1;
698 CreateMessagePipe(&p0, &p1); 708 CreateMessagePipe(&p0, &p1);
699 VerifyTransmission(p0, p1, "testing testing"); 709 VerifyTransmission(p0, p1, "testing testing");
700 VerifyTransmission(p1, p0, "one two three"); 710 VerifyTransmission(p1, p0, "one two three");
701 711
702 MojoHandle p2, p3; 712 MojoHandle p2, p3;
703 713
704 CreateMessagePipe(&p2, &p3); 714 CreateMessagePipe(&p2, &p3);
705 VerifyTransmission(p2, p3, "testing testing"); 715 VerifyTransmission(p2, p3, "testing testing");
706 VerifyTransmission(p3, p2, "one two three"); 716 VerifyTransmission(p3, p2, "one two three");
(...skipping 19 matching lines...) Expand all
726 h) { 736 h) {
727 for (;;) { 737 for (;;) {
728 std::string message = ReadMessage(h); 738 std::string message = ReadMessage(h);
729 if (message == "exit") 739 if (message == "exit")
730 break; 740 break;
731 WriteMessage(h, message); 741 WriteMessage(h, message);
732 } 742 }
733 return 0; 743 return 0;
734 } 744 }
735 745
736 TEST_F(MultiprocessMessagePipeTest, MultiprocessChannelPipe) { 746 TEST_P(MultiprocessMessagePipeTestWithPeerSupport, MultiprocessChannelPipe) {
737 RUN_CHILD_ON_PIPE(ChannelEchoClient, h) 747 RUN_CHILD_ON_PIPE(ChannelEchoClient, h)
738 VerifyEcho(h, "in an interstellar burst"); 748 VerifyEcho(h, "in an interstellar burst");
739 VerifyEcho(h, "i am back to save the universe"); 749 VerifyEcho(h, "i am back to save the universe");
740 VerifyEcho(h, std::string(10 * 1024 * 1024, 'o')); 750 VerifyEcho(h, std::string(10 * 1024 * 1024, 'o'));
741 751
742 WriteMessage(h, "exit"); 752 WriteMessage(h, "exit");
743 END_CHILD() 753 END_CHILD()
744 } 754 }
745 755
746 // Receives a pipe handle from the primordial channel and echos on it until 756 // Receives a pipe handle from the primordial channel and echos on it until
747 // "exit". Used to test simple pipe transfer across processes via channels. 757 // "exit". Used to test simple pipe transfer across processes via channels.
748 DEFINE_TEST_CLIENT_WITH_PIPE(EchoServiceClient, MultiprocessMessagePipeTest, 758 DEFINE_TEST_CLIENT_WITH_PIPE(EchoServiceClient, MultiprocessMessagePipeTest,
749 h) { 759 h) {
750 MojoHandle p; 760 MojoHandle p;
751 ReadMessageWithHandles(h, &p, 1); 761 ReadMessageWithHandles(h, &p, 1);
752 for (;;) { 762 for (;;) {
753 std::string message = ReadMessage(p); 763 std::string message = ReadMessage(p);
754 if (message == "exit") 764 if (message == "exit")
755 break; 765 break;
756 WriteMessage(p, message); 766 WriteMessage(p, message);
757 } 767 }
758 return 0; 768 return 0;
759 } 769 }
760 770
761 TEST_F(MultiprocessMessagePipeTest, PassMessagePipeCrossProcess) { 771 TEST_P(MultiprocessMessagePipeTestWithPeerSupport,
772 PassMessagePipeCrossProcess) {
762 MojoHandle p0, p1; 773 MojoHandle p0, p1;
763 CreateMessagePipe(&p0, &p1); 774 CreateMessagePipe(&p0, &p1);
764 RUN_CHILD_ON_PIPE(EchoServiceClient, h) 775 RUN_CHILD_ON_PIPE(EchoServiceClient, h)
765 776
766 // Pass one end of the pipe to the other process. 777 // Pass one end of the pipe to the other process.
767 WriteMessageWithHandles(h, "here take this", &p1, 1); 778 WriteMessageWithHandles(h, "here take this", &p1, 1);
768 779
769 VerifyEcho(p0, "and you may ask yourself"); 780 VerifyEcho(p0, "and you may ask yourself");
770 VerifyEcho(p0, "where does that highway go?"); 781 VerifyEcho(p0, "where does that highway go?");
771 VerifyEcho(p0, std::string(20 * 1024 * 1024, 'i')); 782 VerifyEcho(p0, std::string(20 * 1024 * 1024, 'i'));
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
808 WriteMessage(handles[index], ReadMessage(handles[index])); 819 WriteMessage(handles[index], ReadMessage(handles[index]));
809 } 820 }
810 } 821 }
811 822
812 for (size_t i = 1; i < handles.size(); ++i) 823 for (size_t i = 1; i < handles.size(); ++i)
813 CloseHandle(handles[i]); 824 CloseHandle(handles[i]);
814 825
815 return 0; 826 return 0;
816 } 827 }
817 828
818 TEST_F(MultiprocessMessagePipeTest, PassMoarMessagePipesCrossProcess) { 829 TEST_P(MultiprocessMessagePipeTestWithPeerSupport,
830 PassMoarMessagePipesCrossProcess) {
819 MojoHandle echo_factory_proxy, echo_factory_request; 831 MojoHandle echo_factory_proxy, echo_factory_request;
820 CreateMessagePipe(&echo_factory_proxy, &echo_factory_request); 832 CreateMessagePipe(&echo_factory_proxy, &echo_factory_request);
821 833
822 MojoHandle echo_proxy_a, echo_request_a; 834 MojoHandle echo_proxy_a, echo_request_a;
823 CreateMessagePipe(&echo_proxy_a, &echo_request_a); 835 CreateMessagePipe(&echo_proxy_a, &echo_request_a);
824 836
825 MojoHandle echo_proxy_b, echo_request_b; 837 MojoHandle echo_proxy_b, echo_request_b;
826 CreateMessagePipe(&echo_proxy_b, &echo_request_b); 838 CreateMessagePipe(&echo_proxy_b, &echo_request_b);
827 839
828 MojoHandle echo_proxy_c, echo_request_c; 840 MojoHandle echo_proxy_c, echo_request_c;
(...skipping 24 matching lines...) Expand all
853 865
854 WriteMessage(h, "exit"); 866 WriteMessage(h, "exit");
855 END_CHILD() 867 END_CHILD()
856 868
857 CloseHandle(echo_factory_proxy); 869 CloseHandle(echo_factory_proxy);
858 CloseHandle(echo_proxy_a); 870 CloseHandle(echo_proxy_a);
859 CloseHandle(echo_proxy_b); 871 CloseHandle(echo_proxy_b);
860 CloseHandle(echo_proxy_c); 872 CloseHandle(echo_proxy_c);
861 } 873 }
862 874
863 TEST_F(MultiprocessMessagePipeTest, ChannelPipesWithMultipleChildren) { 875 TEST_P(MultiprocessMessagePipeTestWithPeerSupport,
876 ChannelPipesWithMultipleChildren) {
864 RUN_CHILD_ON_PIPE(ChannelEchoClient, a) 877 RUN_CHILD_ON_PIPE(ChannelEchoClient, a)
865 RUN_CHILD_ON_PIPE(ChannelEchoClient, b) 878 RUN_CHILD_ON_PIPE(ChannelEchoClient, b)
866 VerifyEcho(a, "hello child 0"); 879 VerifyEcho(a, "hello child 0");
867 VerifyEcho(b, "hello child 1"); 880 VerifyEcho(b, "hello child 1");
868 881
869 WriteMessage(a, "exit"); 882 WriteMessage(a, "exit");
870 WriteMessage(b, "exit"); 883 WriteMessage(b, "exit");
871 END_CHILD() 884 END_CHILD()
872 END_CHILD() 885 END_CHILD()
873 } 886 }
874 887
875 // Reads and turns a pipe handle some number of times to create lots of 888 // Reads and turns a pipe handle some number of times to create lots of
876 // transient proxies. 889 // transient proxies.
877 DEFINE_TEST_CLIENT_TEST_WITH_PIPE(PingPongPipeClient, 890 DEFINE_TEST_CLIENT_TEST_WITH_PIPE(PingPongPipeClient,
878 MultiprocessMessagePipeTest, h) { 891 MultiprocessMessagePipeTest, h) {
879 const size_t kNumBounces = 50; 892 const size_t kNumBounces = 50;
880 MojoHandle p0, p1; 893 MojoHandle p0, p1;
881 ReadMessageWithHandles(h, &p0, 1); 894 ReadMessageWithHandles(h, &p0, 1);
882 ReadMessageWithHandles(h, &p1, 1); 895 ReadMessageWithHandles(h, &p1, 1);
883 for (size_t i = 0; i < kNumBounces; ++i) { 896 for (size_t i = 0; i < kNumBounces; ++i) {
884 WriteMessageWithHandles(h, "", &p1, 1); 897 WriteMessageWithHandles(h, "", &p1, 1);
885 ReadMessageWithHandles(h, &p1, 1); 898 ReadMessageWithHandles(h, &p1, 1);
886 } 899 }
887 WriteMessageWithHandles(h, "", &p0, 1); 900 WriteMessageWithHandles(h, "", &p0, 1);
888 WriteMessage(p1, "bye"); 901 WriteMessage(p1, "bye");
889 MojoClose(p1); 902 MojoClose(p1);
890 EXPECT_EQ("quit", ReadMessage(h)); 903 EXPECT_EQ("quit", ReadMessage(h));
891 } 904 }
892 905
893 TEST_F(MultiprocessMessagePipeTest, PingPongPipe) { 906 TEST_P(MultiprocessMessagePipeTestWithPeerSupport, PingPongPipe) {
894 MojoHandle p0, p1; 907 MojoHandle p0, p1;
895 CreateMessagePipe(&p0, &p1); 908 CreateMessagePipe(&p0, &p1);
896 909
897 RUN_CHILD_ON_PIPE(PingPongPipeClient, h) 910 RUN_CHILD_ON_PIPE(PingPongPipeClient, h)
898 const size_t kNumBounces = 50; 911 const size_t kNumBounces = 50;
899 WriteMessageWithHandles(h, "", &p0, 1); 912 WriteMessageWithHandles(h, "", &p0, 1);
900 WriteMessageWithHandles(h, "", &p1, 1); 913 WriteMessageWithHandles(h, "", &p1, 1);
901 for (size_t i = 0; i < kNumBounces; ++i) { 914 for (size_t i = 0; i < kNumBounces; ++i) {
902 ReadMessageWithHandles(h, &p1, 1); 915 ReadMessageWithHandles(h, &p1, 1);
903 WriteMessageWithHandles(h, "", &p1, 1); 916 WriteMessageWithHandles(h, "", &p1, 1);
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
1089 END_CHILD() 1102 END_CHILD()
1090 END_CHILD() 1103 END_CHILD()
1091 END_CHILD() 1104 END_CHILD()
1092 } 1105 }
1093 1106
1094 DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ReceivePipeWithClosedPeer, 1107 DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ReceivePipeWithClosedPeer,
1095 MultiprocessMessagePipeTest, h) { 1108 MultiprocessMessagePipeTest, h) {
1096 MojoHandle p; 1109 MojoHandle p;
1097 EXPECT_EQ("foo", ReadMessageWithHandles(h, &p, 1)); 1110 EXPECT_EQ("foo", ReadMessageWithHandles(h, &p, 1));
1098 1111
1099 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(p, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1112 auto result = MojoWait(p, MOJO_HANDLE_SIGNAL_PEER_CLOSED,
1100 MOJO_DEADLINE_INDEFINITE, nullptr)); 1113 MOJO_DEADLINE_INDEFINITE, nullptr);
1114 EXPECT_EQ(MOJO_RESULT_OK, result);
1101 } 1115 }
1102 1116
1103 TEST_F(MultiprocessMessagePipeTest, SendPipeThenClosePeer) { 1117 TEST_P(MultiprocessMessagePipeTestWithPeerSupport, SendPipeThenClosePeer) {
1104 RUN_CHILD_ON_PIPE(ReceivePipeWithClosedPeer, h) 1118 RUN_CHILD_ON_PIPE(ReceivePipeWithClosedPeer, h)
1105 MojoHandle a, b; 1119 MojoHandle a, b;
1106 CreateMessagePipe(&a, &b); 1120 CreateMessagePipe(&a, &b);
1107 1121
1108 // Send |a| and immediately close |b|. The child should observe closure. 1122 // Send |a| and immediately close |b|. The child should observe closure.
1109 WriteMessageWithHandles(h, "foo", &a, 1); 1123 WriteMessageWithHandles(h, "foo", &a, 1);
1110 MojoClose(b); 1124 MojoClose(b);
1111 END_CHILD() 1125 END_CHILD()
1112 } 1126 }
1113 1127
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1169 EXPECT_EQ("c2a plz", 1183 EXPECT_EQ("c2a plz",
1170 ReadMessageWithHandles(kid_a, &application_request, 1)); 1184 ReadMessageWithHandles(kid_a, &application_request, 1));
1171 1185
1172 WriteMessageWithHandles(kid_b, "c2a", &application_request, 1); 1186 WriteMessageWithHandles(kid_b, "c2a", &application_request, 1);
1173 END_CHILD() 1187 END_CHILD()
1174 1188
1175 WriteMessage(kid_a, "quit"); 1189 WriteMessage(kid_a, "quit");
1176 END_CHILD() 1190 END_CHILD()
1177 } 1191 }
1178 1192
1179 1193 TEST_P(MultiprocessMessagePipeTestWithPeerSupport, SendClosePeerSend) {
1180 TEST_F(MultiprocessMessagePipeTest, SendClosePeerSend) {
1181 MojoHandle a, b; 1194 MojoHandle a, b;
1182 CreateMessagePipe(&a, &b); 1195 CreateMessagePipe(&a, &b);
1183 1196
1184 MojoHandle c, d; 1197 MojoHandle c, d;
1185 CreateMessagePipe(&c, &d); 1198 CreateMessagePipe(&c, &d);
1186 1199
1187 // Send |a| over |c|, immediately close |b|, then send |a| back over |d|. 1200 // Send |a| over |c|, immediately close |b|, then send |a| back over |d|.
1188 WriteMessageWithHandles(c, "foo", &a, 1); 1201 WriteMessageWithHandles(c, "foo", &a, 1);
1189 EXPECT_EQ("foo", ReadMessageWithHandles(d, &a, 1)); 1202 EXPECT_EQ("foo", ReadMessageWithHandles(d, &a, 1));
1190 WriteMessageWithHandles(d, "bar", &a, 1); 1203 WriteMessageWithHandles(d, "bar", &a, 1);
(...skipping 22 matching lines...) Expand all
1213 // the parent, just for some extra proxying goodness. 1226 // the parent, just for some extra proxying goodness.
1214 WriteMessageWithHandles(c, "foo", &pipe[1], 1); 1227 WriteMessageWithHandles(c, "foo", &pipe[1], 1);
1215 EXPECT_EQ("foo", ReadMessageWithHandles(d, &pipe[1], 1)); 1228 EXPECT_EQ("foo", ReadMessageWithHandles(d, &pipe[1], 1));
1216 1229
1217 // And finally pass it back to the parent. 1230 // And finally pass it back to the parent.
1218 WriteMessageWithHandles(h, "bar", &pipe[1], 1); 1231 WriteMessageWithHandles(h, "bar", &pipe[1], 1);
1219 1232
1220 EXPECT_EQ("quit", ReadMessage(h)); 1233 EXPECT_EQ("quit", ReadMessage(h));
1221 } 1234 }
1222 1235
1223 TEST_F(MultiprocessMessagePipeTest, WriteCloseSendPeer) { 1236 TEST_P(MultiprocessMessagePipeTestWithPeerSupport, WriteCloseSendPeer) {
1224 MojoHandle pipe[2]; 1237 MojoHandle pipe[2];
1225 CreateMessagePipe(&pipe[0], &pipe[1]); 1238 CreateMessagePipe(&pipe[0], &pipe[1]);
1226 1239
1227 RUN_CHILD_ON_PIPE(WriteCloseSendPeerClient, h) 1240 RUN_CHILD_ON_PIPE(WriteCloseSendPeerClient, h)
1228 // Pass the pipe to the child. 1241 // Pass the pipe to the child.
1229 WriteMessageWithHandles(h, "foo", pipe, 2); 1242 WriteMessageWithHandles(h, "foo", pipe, 2);
1230 1243
1231 // Read back an endpoint which should have messages on it. 1244 // Read back an endpoint which should have messages on it.
1232 MojoHandle p; 1245 MojoHandle p;
1233 EXPECT_EQ("bar", ReadMessageWithHandles(h, &p, 1)); 1246 EXPECT_EQ("bar", ReadMessageWithHandles(h, &p, 1));
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
1338 WriteMessage(child2, "bye"); 1351 WriteMessage(child2, "bye");
1339 END_CHILD(); 1352 END_CHILD();
1340 1353
1341 WriteMessage(child1, "bye"); 1354 WriteMessage(child1, "bye");
1342 END_CHILD() 1355 END_CHILD()
1343 1356
1344 // The error messages should match the processes which triggered them. 1357 // The error messages should match the processes which triggered them.
1345 EXPECT_NE(std::string::npos, first_process_error.find(kFirstErrorMessage)); 1358 EXPECT_NE(std::string::npos, first_process_error.find(kFirstErrorMessage));
1346 EXPECT_NE(std::string::npos, second_process_error.find(kSecondErrorMessage)); 1359 EXPECT_NE(std::string::npos, second_process_error.find(kSecondErrorMessage));
1347 } 1360 }
1348 1361 INSTANTIATE_TEST_CASE_P(,
1362 MultiprocessMessagePipeTestWithPeerSupport,
1363 testing::Values(test::MojoTestBase::LaunchType::CHILD,
1364 test::MojoTestBase::LaunchType::PEER));
1349 } // namespace 1365 } // namespace
1350 } // namespace edk 1366 } // namespace edk
1351 } // namespace mojo 1367 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/core.cc ('k') | mojo/edk/system/node_channel.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698