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

Side by Side Diff: mojo/public/c/tests/system/message_pipe_unittest.cc

Issue 2250183003: Make the fuchsia mojo/public repo the source of truth. (Closed) Base URL: https://github.com/domokit/mojo.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
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 // This file tests the C message pipe API (the functions declared in
6 // mojo/public/c/include/mojo/system/message_pipe.h).
7
8 #include <mojo/system/message_pipe.h>
9
10 #include <mojo/result.h>
11 #include <mojo/system/buffer.h>
12 #include <mojo/system/handle.h>
13 #include <mojo/system/wait.h>
14
15 #include "gtest/gtest.h"
16
17 namespace {
18
19 const MojoHandleRights kDefaultMessagePipeHandleRights =
20 MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_READ |
21 MOJO_HANDLE_RIGHT_WRITE | MOJO_HANDLE_RIGHT_GET_OPTIONS |
22 MOJO_HANDLE_RIGHT_SET_OPTIONS;
23
24 TEST(MessagePipeTest, InvalidHandle) {
25 char buffer[10] = {};
26 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
27 MojoWriteMessage(MOJO_HANDLE_INVALID, buffer, 0u, nullptr, 0u,
28 MOJO_WRITE_MESSAGE_FLAG_NONE));
29 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer));
30 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
31 MojoReadMessage(MOJO_HANDLE_INVALID, buffer, &buffer_size, nullptr,
32 nullptr, MOJO_READ_MESSAGE_FLAG_NONE));
33 }
34
35 TEST(MessagePipeTest, Basic) {
36 MojoHandle h0 = MOJO_HANDLE_INVALID;
37 MojoHandle h1 = MOJO_HANDLE_INVALID;
38 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &h0, &h1));
39 EXPECT_NE(h0, MOJO_HANDLE_INVALID);
40 EXPECT_NE(h1, MOJO_HANDLE_INVALID);
41 EXPECT_NE(h0, h1);
42
43 // Both handles should have the correct rights.
44 MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE;
45 EXPECT_EQ(MOJO_RESULT_OK, MojoGetRights(h0, &rights));
46 EXPECT_EQ(kDefaultMessagePipeHandleRights, rights);
47 rights = MOJO_HANDLE_RIGHT_NONE;
48 EXPECT_EQ(MOJO_RESULT_OK, MojoGetRights(h1, &rights));
49 EXPECT_EQ(kDefaultMessagePipeHandleRights, rights);
50
51 // Shouldn't be able to duplicate either handle (just test "with reduced
52 // rights" on one, and without on the other).
53 MojoHandle handle_denied = MOJO_HANDLE_INVALID;
54 EXPECT_EQ(MOJO_RESULT_PERMISSION_DENIED,
55 MojoDuplicateHandleWithReducedRights(
56 h0, MOJO_HANDLE_RIGHT_DUPLICATE, &handle_denied));
57 EXPECT_EQ(MOJO_HANDLE_INVALID, handle_denied);
58 handle_denied = MOJO_HANDLE_INVALID;
59 EXPECT_EQ(MOJO_RESULT_PERMISSION_DENIED,
60 MojoDuplicateHandle(h1, &handle_denied));
61 EXPECT_EQ(MOJO_HANDLE_INVALID, handle_denied);
62
63 // Shouldn't be readable, we haven't written anything.
64 MojoHandleSignalsState state;
65 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
66 MojoWait(h0, MOJO_HANDLE_SIGNAL_READABLE, 0, &state));
67 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals);
68 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
69 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
70 state.satisfiable_signals);
71
72 // Should be writable.
73 EXPECT_EQ(MOJO_RESULT_OK,
74 MojoWait(h0, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &state));
75 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals);
76 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
77 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
78 state.satisfiable_signals);
79
80 // Last parameter is optional.
81 EXPECT_EQ(MOJO_RESULT_OK,
82 MojoWait(h0, MOJO_HANDLE_SIGNAL_WRITABLE, 0, nullptr));
83
84 // Try to read.
85 char buffer[10] = {};
86 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer));
87 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
88 MojoReadMessage(h0, buffer, &buffer_size, nullptr, nullptr,
89 MOJO_READ_MESSAGE_FLAG_NONE));
90
91 // Write to |h1|.
92 static const char kHello[] = "hello";
93 buffer_size = static_cast<uint32_t>(sizeof(kHello));
94 EXPECT_EQ(MOJO_RESULT_OK, MojoWriteMessage(h1, kHello, buffer_size, nullptr,
95 0, MOJO_WRITE_MESSAGE_FLAG_NONE));
96
97 // |h0| should be readable.
98 MojoHandleSignals sig = MOJO_HANDLE_SIGNAL_READABLE;
99 MojoHandleSignalsState states[1] = {};
100 uint32_t result_index = 1;
101 EXPECT_EQ(MOJO_RESULT_OK, MojoWaitMany(&h0, &sig, 1, MOJO_DEADLINE_INDEFINITE,
102 &result_index, states));
103 EXPECT_EQ(0u, result_index);
104 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
105 states[0].satisfied_signals);
106 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
107 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
108 states[0].satisfiable_signals);
109
110 // Read from |h0|.
111 buffer_size = static_cast<uint32_t>(sizeof(buffer));
112 EXPECT_EQ(MOJO_RESULT_OK,
113 MojoReadMessage(h0, buffer, &buffer_size, nullptr, nullptr,
114 MOJO_READ_MESSAGE_FLAG_NONE));
115 EXPECT_EQ(static_cast<uint32_t>(sizeof(kHello)), buffer_size);
116 EXPECT_STREQ(kHello, buffer);
117
118 // |h0| should no longer be readable.
119 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
120 MojoWait(h0, MOJO_HANDLE_SIGNAL_READABLE, 10, &state));
121 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals);
122 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
123 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
124 state.satisfiable_signals);
125
126 // Close |h0|.
127 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h0));
128
129 // |h1| should no longer be readable or writable.
130 EXPECT_EQ(
131 MOJO_RESULT_FAILED_PRECONDITION,
132 MojoWait(h1, MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
133 1000, &state));
134 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfied_signals);
135 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfiable_signals);
136
137 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h1));
138 }
139
140 TEST(MessagePipeTest, ChecksTransferRight) {
141 MojoHandle h0 = MOJO_HANDLE_INVALID;
142 MojoHandle h1 = MOJO_HANDLE_INVALID;
143 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &h0, &h1));
144
145 // Create a shared buffer (which is transferrable and duplicatable).
146 MojoHandle h_transferrable = MOJO_HANDLE_INVALID;
147 EXPECT_EQ(MOJO_RESULT_OK,
148 MojoCreateSharedBuffer(nullptr, 100, &h_transferrable));
149
150 // Make a non-transferrable duplicate handle.
151 MojoHandle h_not_transferrable = MOJO_HANDLE_INVALID;
152 EXPECT_EQ(MOJO_RESULT_OK, MojoDuplicateHandleWithReducedRights(
153 h_transferrable, MOJO_HANDLE_RIGHT_TRANSFER,
154 &h_not_transferrable));
155
156 // |h_transferrable| can be transferred.
157 EXPECT_EQ(MOJO_RESULT_OK, MojoWriteMessage(h0, nullptr, 0u, &h_transferrable,
158 1u, MOJO_WRITE_MESSAGE_FLAG_NONE));
159
160 // |h_not_transferrable| can be transferred.
161 EXPECT_EQ(MOJO_RESULT_PERMISSION_DENIED,
162 MojoWriteMessage(h0, nullptr, 0u, &h_not_transferrable, 1u,
163 MOJO_WRITE_MESSAGE_FLAG_NONE));
164
165 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h0));
166 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h1));
167 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h_not_transferrable));
168 }
169
170 // TODO(vtl): Add multi-threaded tests.
171
172 } // namespace
OLDNEW
« no previous file with comments | « mojo/public/c/tests/system/message_pipe_perftest.cc ('k') | mojo/public/c/tests/system/perftest_utils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698