OLD | NEW |
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 "mojo/public/system/core_cpp.h" | 5 #include "mojo/public/system/core_cpp.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 | 8 |
9 #include "mojo/public/system/macros.h" | 9 #include "mojo/public/system/macros.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
11 | 11 |
12 namespace mojo { | 12 namespace mojo { |
13 namespace { | 13 namespace { |
14 | 14 |
15 TEST(CoreCppTest, GetTimeTicksNow) { | 15 TEST(CoreCppTest, GetTimeTicksNow) { |
16 const MojoTimeTicks start = GetTimeTicksNow(); | 16 const MojoTimeTicks start = GetTimeTicksNow(); |
17 EXPECT_NE(static_cast<MojoTimeTicks>(0), start) | 17 EXPECT_NE(static_cast<MojoTimeTicks>(0), start) |
18 << "GetTimeTicksNow should return nonzero value"; | 18 << "GetTimeTicksNow should return nonzero value"; |
19 } | 19 } |
20 | 20 |
21 TEST(CoreCppTest, Basic) { | 21 TEST(CoreCppTest, Basic) { |
22 // Basic |Handle| implementation: | 22 // Basic |Handle| implementation: |
23 { | 23 { |
24 EXPECT_EQ(MOJO_HANDLE_INVALID, kInvalidHandleValue); | 24 EXPECT_EQ(MOJO_HANDLE_INVALID, kInvalidHandleValue); |
25 | 25 |
26 Handle h_0; | 26 Handle h0; |
27 EXPECT_EQ(kInvalidHandleValue, h_0.value()); | 27 EXPECT_EQ(kInvalidHandleValue, h0.value()); |
28 EXPECT_EQ(kInvalidHandleValue, *h_0.mutable_value()); | 28 EXPECT_EQ(kInvalidHandleValue, *h0.mutable_value()); |
29 EXPECT_FALSE(h_0.is_valid()); | 29 EXPECT_FALSE(h0.is_valid()); |
30 | 30 |
31 Handle h_1(static_cast<MojoHandle>(123)); | 31 Handle h1(static_cast<MojoHandle>(123)); |
32 EXPECT_EQ(static_cast<MojoHandle>(123), h_1.value()); | 32 EXPECT_EQ(static_cast<MojoHandle>(123), h1.value()); |
33 EXPECT_EQ(static_cast<MojoHandle>(123), *h_1.mutable_value()); | 33 EXPECT_EQ(static_cast<MojoHandle>(123), *h1.mutable_value()); |
34 EXPECT_TRUE(h_1.is_valid()); | 34 EXPECT_TRUE(h1.is_valid()); |
35 *h_1.mutable_value() = static_cast<MojoHandle>(456); | 35 *h1.mutable_value() = static_cast<MojoHandle>(456); |
36 EXPECT_EQ(static_cast<MojoHandle>(456), h_1.value()); | 36 EXPECT_EQ(static_cast<MojoHandle>(456), h1.value()); |
37 EXPECT_TRUE(h_1.is_valid()); | 37 EXPECT_TRUE(h1.is_valid()); |
38 | 38 |
39 h_1.swap(h_0); | 39 h1.swap(h0); |
40 EXPECT_EQ(static_cast<MojoHandle>(456), h_0.value()); | 40 EXPECT_EQ(static_cast<MojoHandle>(456), h0.value()); |
41 EXPECT_TRUE(h_0.is_valid()); | 41 EXPECT_TRUE(h0.is_valid()); |
42 EXPECT_FALSE(h_1.is_valid()); | 42 EXPECT_FALSE(h1.is_valid()); |
43 | 43 |
44 h_1.set_value(static_cast<MojoHandle>(789)); | 44 h1.set_value(static_cast<MojoHandle>(789)); |
45 h_0.swap(h_1); | 45 h0.swap(h1); |
46 EXPECT_EQ(static_cast<MojoHandle>(789), h_0.value()); | 46 EXPECT_EQ(static_cast<MojoHandle>(789), h0.value()); |
47 EXPECT_TRUE(h_0.is_valid()); | 47 EXPECT_TRUE(h0.is_valid()); |
48 EXPECT_EQ(static_cast<MojoHandle>(456), h_1.value()); | 48 EXPECT_EQ(static_cast<MojoHandle>(456), h1.value()); |
49 EXPECT_TRUE(h_1.is_valid()); | 49 EXPECT_TRUE(h1.is_valid()); |
50 | 50 |
51 // Make sure copy constructor works. | 51 // Make sure copy constructor works. |
52 Handle h_2(h_0); | 52 Handle h2(h0); |
53 EXPECT_EQ(static_cast<MojoHandle>(789), h_2.value()); | 53 EXPECT_EQ(static_cast<MojoHandle>(789), h2.value()); |
54 // And assignment. | 54 // And assignment. |
55 h_2 = h_1; | 55 h2 = h1; |
56 EXPECT_EQ(static_cast<MojoHandle>(456), h_2.value()); | 56 EXPECT_EQ(static_cast<MojoHandle>(456), h2.value()); |
57 | 57 |
58 // Make sure that we can put |Handle|s into |std::map|s. | 58 // Make sure that we can put |Handle|s into |std::map|s. |
59 h_0 = Handle(static_cast<MojoHandle>(987)); | 59 h0 = Handle(static_cast<MojoHandle>(987)); |
60 h_1 = Handle(static_cast<MojoHandle>(654)); | 60 h1 = Handle(static_cast<MojoHandle>(654)); |
61 h_2 = Handle(static_cast<MojoHandle>(321)); | 61 h2 = Handle(static_cast<MojoHandle>(321)); |
62 Handle h_3; | 62 Handle h3; |
63 std::map<Handle, int> handle_to_int; | 63 std::map<Handle, int> handle_to_int; |
64 handle_to_int[h_0] = 0; | 64 handle_to_int[h0] = 0; |
65 handle_to_int[h_1] = 1; | 65 handle_to_int[h1] = 1; |
66 handle_to_int[h_2] = 2; | 66 handle_to_int[h2] = 2; |
67 handle_to_int[h_3] = 3; | 67 handle_to_int[h3] = 3; |
68 | 68 |
69 EXPECT_EQ(4u, handle_to_int.size()); | 69 EXPECT_EQ(4u, handle_to_int.size()); |
70 EXPECT_FALSE(handle_to_int.find(h_0) == handle_to_int.end()); | 70 EXPECT_FALSE(handle_to_int.find(h0) == handle_to_int.end()); |
71 EXPECT_EQ(0, handle_to_int[h_0]); | 71 EXPECT_EQ(0, handle_to_int[h0]); |
72 EXPECT_FALSE(handle_to_int.find(h_1) == handle_to_int.end()); | 72 EXPECT_FALSE(handle_to_int.find(h1) == handle_to_int.end()); |
73 EXPECT_EQ(1, handle_to_int[h_1]); | 73 EXPECT_EQ(1, handle_to_int[h1]); |
74 EXPECT_FALSE(handle_to_int.find(h_2) == handle_to_int.end()); | 74 EXPECT_FALSE(handle_to_int.find(h2) == handle_to_int.end()); |
75 EXPECT_EQ(2, handle_to_int[h_2]); | 75 EXPECT_EQ(2, handle_to_int[h2]); |
76 EXPECT_FALSE(handle_to_int.find(h_3) == handle_to_int.end()); | 76 EXPECT_FALSE(handle_to_int.find(h3) == handle_to_int.end()); |
77 EXPECT_EQ(3, handle_to_int[h_3]); | 77 EXPECT_EQ(3, handle_to_int[h3]); |
78 EXPECT_TRUE(handle_to_int.find(Handle(static_cast<MojoHandle>(13579))) == | 78 EXPECT_TRUE(handle_to_int.find(Handle(static_cast<MojoHandle>(13579))) == |
79 handle_to_int.end()); | 79 handle_to_int.end()); |
80 | 80 |
81 // TODO(vtl): With C++11, support |std::unordered_map|s, etc. (Or figure out | 81 // TODO(vtl): With C++11, support |std::unordered_map|s, etc. (Or figure out |
82 // how to support the variations of |hash_map|.) | 82 // how to support the variations of |hash_map|.) |
83 } | 83 } |
84 | 84 |
85 // |Handle|/|ScopedHandle| functions: | 85 // |Handle|/|ScopedHandle| functions: |
86 { | 86 { |
87 ScopedHandle h; | 87 ScopedHandle h; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
126 NULL, NULL, | 126 NULL, NULL, |
127 MOJO_READ_MESSAGE_FLAG_NONE)); | 127 MOJO_READ_MESSAGE_FLAG_NONE)); |
128 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 128 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
129 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 129 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
130 ReadMessageRaw(h_invalid, | 130 ReadMessageRaw(h_invalid, |
131 buffer, &buffer_size, | 131 buffer, &buffer_size, |
132 NULL, NULL, | 132 NULL, NULL, |
133 MOJO_READ_MESSAGE_FLAG_NONE)); | 133 MOJO_READ_MESSAGE_FLAG_NONE)); |
134 | 134 |
135 // Basic tests of waiting and closing. | 135 // Basic tests of waiting and closing. |
136 MojoHandle hv_0 = kInvalidHandleValue; | 136 MojoHandle hv0 = kInvalidHandleValue; |
137 { | 137 { |
138 ScopedMessagePipeHandle h_0; | 138 ScopedMessagePipeHandle h0; |
139 ScopedMessagePipeHandle h_1; | 139 ScopedMessagePipeHandle h1; |
140 EXPECT_FALSE(h_0.get().is_valid()); | 140 EXPECT_FALSE(h0.get().is_valid()); |
141 EXPECT_FALSE(h_1.get().is_valid()); | 141 EXPECT_FALSE(h1.get().is_valid()); |
142 | 142 |
143 CreateMessagePipe(&h_0, &h_1); | 143 CreateMessagePipe(&h0, &h1); |
144 EXPECT_TRUE(h_0.get().is_valid()); | 144 EXPECT_TRUE(h0.get().is_valid()); |
145 EXPECT_TRUE(h_1.get().is_valid()); | 145 EXPECT_TRUE(h1.get().is_valid()); |
146 EXPECT_NE(h_0.get().value(), h_1.get().value()); | 146 EXPECT_NE(h0.get().value(), h1.get().value()); |
147 // Save the handle values, so we can check that things got closed | 147 // Save the handle values, so we can check that things got closed |
148 // correctly. | 148 // correctly. |
149 hv_0 = h_0.get().value(); | 149 hv0 = h0.get().value(); |
150 MojoHandle hv_1 = h_1.get().value(); | 150 MojoHandle hv1 = h1.get().value(); |
151 | 151 |
152 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, | 152 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
153 Wait(h_0.get(), MOJO_WAIT_FLAG_READABLE, 0)); | 153 Wait(h0.get(), MOJO_WAIT_FLAG_READABLE, 0)); |
154 std::vector<Handle> wh; | 154 std::vector<Handle> wh; |
155 wh.push_back(h_0.get()); | 155 wh.push_back(h0.get()); |
156 wh.push_back(h_1.get()); | 156 wh.push_back(h1.get()); |
157 std::vector<MojoWaitFlags> wf; | 157 std::vector<MojoWaitFlags> wf; |
158 wf.push_back(MOJO_WAIT_FLAG_READABLE); | 158 wf.push_back(MOJO_WAIT_FLAG_READABLE); |
159 wf.push_back(MOJO_WAIT_FLAG_WRITABLE); | 159 wf.push_back(MOJO_WAIT_FLAG_WRITABLE); |
160 EXPECT_EQ(1, WaitMany(wh, wf, 1000)); | 160 EXPECT_EQ(1, WaitMany(wh, wf, 1000)); |
161 | 161 |
162 // Test closing |h_1| explicitly. | 162 // Test closing |h1| explicitly. |
163 Close(h_1.Pass()); | 163 Close(h1.Pass()); |
164 EXPECT_FALSE(h_1.get().is_valid()); | 164 EXPECT_FALSE(h1.get().is_valid()); |
165 | 165 |
166 // Make sure |h_1| is closed. | 166 // Make sure |h1| is closed. |
167 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 167 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
168 MojoWait(hv_1, | 168 MojoWait(hv1, MOJO_WAIT_FLAG_EVERYTHING, |
169 MOJO_WAIT_FLAG_EVERYTHING, | |
170 MOJO_DEADLINE_INDEFINITE)); | 169 MOJO_DEADLINE_INDEFINITE)); |
171 | 170 |
172 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 171 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
173 Wait(h_0.get(), MOJO_WAIT_FLAG_READABLE, | 172 Wait(h0.get(), MOJO_WAIT_FLAG_READABLE, |
174 MOJO_DEADLINE_INDEFINITE)); | 173 MOJO_DEADLINE_INDEFINITE)); |
175 } | 174 } |
176 // |hv_0| should have been closed when |h_0| went out of scope, so this | 175 // |hv0| should have been closed when |h0| went out of scope, so this close |
177 // close should fail. | 176 // should fail. |
178 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(hv_0)); | 177 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(hv0)); |
179 | 178 |
180 // Actually test writing/reading messages. | 179 // Actually test writing/reading messages. |
181 { | 180 { |
182 ScopedMessagePipeHandle h_0; | 181 ScopedMessagePipeHandle h0; |
183 ScopedMessagePipeHandle h_1; | 182 ScopedMessagePipeHandle h1; |
184 CreateMessagePipe(&h_0, &h_1); | 183 CreateMessagePipe(&h0, &h1); |
185 | 184 |
186 const char kHello[] = "hello"; | 185 const char kHello[] = "hello"; |
187 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); | 186 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); |
188 EXPECT_EQ(MOJO_RESULT_OK, | 187 EXPECT_EQ(MOJO_RESULT_OK, |
189 WriteMessageRaw(h_0.get(), | 188 WriteMessageRaw(h0.get(), |
190 kHello, kHelloSize, | 189 kHello, kHelloSize, |
191 NULL, 0, | 190 NULL, 0, |
192 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 191 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
193 EXPECT_EQ(MOJO_RESULT_OK, | 192 EXPECT_EQ(MOJO_RESULT_OK, |
194 Wait(h_1.get(), MOJO_WAIT_FLAG_READABLE, | 193 Wait(h1.get(), MOJO_WAIT_FLAG_READABLE, |
195 MOJO_DEADLINE_INDEFINITE)); | 194 MOJO_DEADLINE_INDEFINITE)); |
196 char buffer[10] = { 0 }; | 195 char buffer[10] = { 0 }; |
197 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 196 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
198 EXPECT_EQ(MOJO_RESULT_OK, | 197 EXPECT_EQ(MOJO_RESULT_OK, |
199 ReadMessageRaw(h_1.get(), | 198 ReadMessageRaw(h1.get(), |
200 buffer, &buffer_size, | 199 buffer, &buffer_size, |
201 NULL, NULL, | 200 NULL, NULL, |
202 MOJO_READ_MESSAGE_FLAG_NONE)); | 201 MOJO_READ_MESSAGE_FLAG_NONE)); |
203 EXPECT_EQ(kHelloSize, buffer_size); | 202 EXPECT_EQ(kHelloSize, buffer_size); |
204 EXPECT_STREQ(kHello, buffer); | 203 EXPECT_STREQ(kHello, buffer); |
205 | 204 |
206 // Send a handle over the previously-establish |MessagePipe|. | 205 // Send a handle over the previously-establish |MessagePipe|. |
207 ScopedMessagePipeHandle h_2; | 206 ScopedMessagePipeHandle h2; |
208 ScopedMessagePipeHandle h_3; | 207 ScopedMessagePipeHandle h3; |
209 CreateMessagePipe(&h_2, &h_3); | 208 CreateMessagePipe(&h2, &h3); |
210 | 209 |
211 // Write a message to |h_2|, before we send |h_3|. | 210 // Write a message to |h2|, before we send |h3|. |
212 const char kWorld[] = "world!"; | 211 const char kWorld[] = "world!"; |
213 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); | 212 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); |
214 EXPECT_EQ(MOJO_RESULT_OK, | 213 EXPECT_EQ(MOJO_RESULT_OK, |
215 WriteMessageRaw(h_2.get(), | 214 WriteMessageRaw(h2.get(), |
216 kWorld, kWorldSize, | 215 kWorld, kWorldSize, |
217 NULL, 0, | 216 NULL, 0, |
218 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 217 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
219 | 218 |
220 // Send |h_3| over |h_1| to |h_0|. | 219 // Send |h3| over |h1| to |h0|. |
221 MojoHandle handles[5]; | 220 MojoHandle handles[5]; |
222 handles[0] = h_3.release().value(); | 221 handles[0] = h3.release().value(); |
223 EXPECT_NE(kInvalidHandleValue, handles[0]); | 222 EXPECT_NE(kInvalidHandleValue, handles[0]); |
224 EXPECT_FALSE(h_3.get().is_valid()); | 223 EXPECT_FALSE(h3.get().is_valid()); |
225 uint32_t handles_count = 1; | 224 uint32_t handles_count = 1; |
226 EXPECT_EQ(MOJO_RESULT_OK, | 225 EXPECT_EQ(MOJO_RESULT_OK, |
227 WriteMessageRaw(h_1.get(), | 226 WriteMessageRaw(h1.get(), |
228 kHello, kHelloSize, | 227 kHello, kHelloSize, |
229 handles, handles_count, | 228 handles, handles_count, |
230 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 229 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
231 // |handles[0]| should actually be invalid now. | 230 // |handles[0]| should actually be invalid now. |
232 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(handles[0])); | 231 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(handles[0])); |
233 | 232 |
234 // Read "hello" and the sent handle. | 233 // Read "hello" and the sent handle. |
235 EXPECT_EQ(MOJO_RESULT_OK, | 234 EXPECT_EQ(MOJO_RESULT_OK, |
236 Wait(h_0.get(), MOJO_WAIT_FLAG_READABLE, | 235 Wait(h0.get(), MOJO_WAIT_FLAG_READABLE, |
237 MOJO_DEADLINE_INDEFINITE)); | 236 MOJO_DEADLINE_INDEFINITE)); |
238 memset(buffer, 0, sizeof(buffer)); | 237 memset(buffer, 0, sizeof(buffer)); |
239 buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 238 buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
240 for (size_t i = 0; i < MOJO_ARRAYSIZE(handles); i++) | 239 for (size_t i = 0; i < MOJO_ARRAYSIZE(handles); i++) |
241 handles[i] = kInvalidHandleValue; | 240 handles[i] = kInvalidHandleValue; |
242 handles_count = static_cast<uint32_t>(MOJO_ARRAYSIZE(handles)); | 241 handles_count = static_cast<uint32_t>(MOJO_ARRAYSIZE(handles)); |
243 EXPECT_EQ(MOJO_RESULT_OK, | 242 EXPECT_EQ(MOJO_RESULT_OK, |
244 ReadMessageRaw(h_0.get(), | 243 ReadMessageRaw(h0.get(), |
245 buffer, &buffer_size, | 244 buffer, &buffer_size, |
246 handles, &handles_count, | 245 handles, &handles_count, |
247 MOJO_READ_MESSAGE_FLAG_NONE)); | 246 MOJO_READ_MESSAGE_FLAG_NONE)); |
248 EXPECT_EQ(kHelloSize, buffer_size); | 247 EXPECT_EQ(kHelloSize, buffer_size); |
249 EXPECT_STREQ(kHello, buffer); | 248 EXPECT_STREQ(kHello, buffer); |
250 EXPECT_EQ(1u, handles_count); | 249 EXPECT_EQ(1u, handles_count); |
251 EXPECT_NE(kInvalidHandleValue, handles[0]); | 250 EXPECT_NE(kInvalidHandleValue, handles[0]); |
252 | 251 |
253 // Read from the sent/received handle. | 252 // Read from the sent/received handle. |
254 h_3.reset(MessagePipeHandle(handles[0])); | 253 h3.reset(MessagePipeHandle(handles[0])); |
255 // Save |handles[0]| to check that it gets properly closed. | 254 // Save |handles[0]| to check that it gets properly closed. |
256 hv_0 = handles[0]; | 255 hv0 = handles[0]; |
257 EXPECT_EQ(MOJO_RESULT_OK, | 256 EXPECT_EQ(MOJO_RESULT_OK, |
258 Wait(h_3.get(), MOJO_WAIT_FLAG_READABLE, | 257 Wait(h3.get(), MOJO_WAIT_FLAG_READABLE, |
259 MOJO_DEADLINE_INDEFINITE)); | 258 MOJO_DEADLINE_INDEFINITE)); |
260 memset(buffer, 0, sizeof(buffer)); | 259 memset(buffer, 0, sizeof(buffer)); |
261 buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 260 buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
262 for (size_t i = 0; i < MOJO_ARRAYSIZE(handles); i++) | 261 for (size_t i = 0; i < MOJO_ARRAYSIZE(handles); i++) |
263 handles[i] = kInvalidHandleValue; | 262 handles[i] = kInvalidHandleValue; |
264 handles_count = static_cast<uint32_t>(MOJO_ARRAYSIZE(handles)); | 263 handles_count = static_cast<uint32_t>(MOJO_ARRAYSIZE(handles)); |
265 EXPECT_EQ(MOJO_RESULT_OK, | 264 EXPECT_EQ(MOJO_RESULT_OK, |
266 ReadMessageRaw(h_3.get(), | 265 ReadMessageRaw(h3.get(), |
267 buffer, &buffer_size, | 266 buffer, &buffer_size, |
268 handles, &handles_count, | 267 handles, &handles_count, |
269 MOJO_READ_MESSAGE_FLAG_NONE)); | 268 MOJO_READ_MESSAGE_FLAG_NONE)); |
270 EXPECT_EQ(kWorldSize, buffer_size); | 269 EXPECT_EQ(kWorldSize, buffer_size); |
271 EXPECT_STREQ(kWorld, buffer); | 270 EXPECT_STREQ(kWorld, buffer); |
272 EXPECT_EQ(0u, handles_count); | 271 EXPECT_EQ(0u, handles_count); |
273 } | 272 } |
274 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(hv_0)); | 273 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(hv0)); |
275 } | 274 } |
276 | 275 |
277 // TODO(vtl): Test |CloseRaw()|. | 276 // TODO(vtl): Test |CloseRaw()|. |
278 // TODO(vtl): Test |reset()| more thoroughly? | 277 // TODO(vtl): Test |reset()| more thoroughly? |
279 } | 278 } |
280 | 279 |
281 TEST(CoreCppTest, TearDownWithMessagesEnqueued) { | 280 TEST(CoreCppTest, TearDownWithMessagesEnqueued) { |
282 // Tear down a |MessagePipe| which still has a message enqueued, with the | 281 // Tear down a |MessagePipe| which still has a message enqueued, with the |
283 // message also having a valid |MessagePipe| handle. | 282 // message also having a valid |MessagePipe| handle. |
284 { | 283 { |
285 ScopedMessagePipeHandle h_0; | 284 ScopedMessagePipeHandle h0; |
286 ScopedMessagePipeHandle h_1; | 285 ScopedMessagePipeHandle h1; |
287 CreateMessagePipe(&h_0, &h_1); | 286 CreateMessagePipe(&h0, &h1); |
288 | 287 |
289 // Send a handle over the previously-establish |MessagePipe|. | 288 // Send a handle over the previously-establish |MessagePipe|. |
290 ScopedMessagePipeHandle h_2; | 289 ScopedMessagePipeHandle h2; |
291 ScopedMessagePipeHandle h_3; | 290 ScopedMessagePipeHandle h3; |
292 CreateMessagePipe(&h_2, &h_3); | 291 CreateMessagePipe(&h2, &h3); |
293 | 292 |
294 // Write a message to |h_2|, before we send |h_3|. | 293 // Write a message to |h2|, before we send |h3|. |
295 const char kWorld[] = "world!"; | 294 const char kWorld[] = "world!"; |
296 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); | 295 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); |
297 EXPECT_EQ(MOJO_RESULT_OK, | 296 EXPECT_EQ(MOJO_RESULT_OK, |
298 WriteMessageRaw(h_2.get(), | 297 WriteMessageRaw(h2.get(), |
299 kWorld, kWorldSize, | 298 kWorld, kWorldSize, |
300 NULL, 0, | 299 NULL, 0, |
301 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 300 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
302 // And also a message to |h_3|. | 301 // And also a message to |h3|. |
303 EXPECT_EQ(MOJO_RESULT_OK, | 302 EXPECT_EQ(MOJO_RESULT_OK, |
304 WriteMessageRaw(h_3.get(), | 303 WriteMessageRaw(h3.get(), |
305 kWorld, kWorldSize, | 304 kWorld, kWorldSize, |
306 NULL, 0, | 305 NULL, 0, |
307 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 306 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
308 | 307 |
309 // Send |h_3| over |h_1| to |h_0|. | 308 // Send |h3| over |h1| to |h0|. |
310 const char kHello[] = "hello"; | 309 const char kHello[] = "hello"; |
311 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); | 310 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); |
312 MojoHandle h_3_value; | 311 MojoHandle h3_value; |
313 h_3_value = h_3.release().value(); | 312 h3_value = h3.release().value(); |
314 EXPECT_NE(kInvalidHandleValue, h_3_value); | 313 EXPECT_NE(kInvalidHandleValue, h3_value); |
315 EXPECT_FALSE(h_3.get().is_valid()); | 314 EXPECT_FALSE(h3.get().is_valid()); |
316 EXPECT_EQ(MOJO_RESULT_OK, | 315 EXPECT_EQ(MOJO_RESULT_OK, |
317 WriteMessageRaw(h_1.get(), | 316 WriteMessageRaw(h1.get(), |
318 kHello, kHelloSize, | 317 kHello, kHelloSize, |
319 &h_3_value, 1, | 318 &h3_value, 1, |
320 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 319 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
321 // |h_3_value| should actually be invalid now. | 320 // |h3_value| should actually be invalid now. |
322 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(h_3_value)); | 321 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(h3_value)); |
323 | 322 |
324 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h_0.release().value())); | 323 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h0.release().value())); |
325 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h_1.release().value())); | 324 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h1.release().value())); |
326 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h_2.release().value())); | 325 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h2.release().value())); |
327 } | 326 } |
328 | 327 |
329 // Do this in a different order: make the enqueued |MessagePipe| handle only | 328 // Do this in a different order: make the enqueued |MessagePipe| handle only |
330 // half-alive. | 329 // half-alive. |
331 { | 330 { |
332 ScopedMessagePipeHandle h_0; | 331 ScopedMessagePipeHandle h0; |
333 ScopedMessagePipeHandle h_1; | 332 ScopedMessagePipeHandle h1; |
334 CreateMessagePipe(&h_0, &h_1); | 333 CreateMessagePipe(&h0, &h1); |
335 | 334 |
336 // Send a handle over the previously-establish |MessagePipe|. | 335 // Send a handle over the previously-establish |MessagePipe|. |
337 ScopedMessagePipeHandle h_2; | 336 ScopedMessagePipeHandle h2; |
338 ScopedMessagePipeHandle h_3; | 337 ScopedMessagePipeHandle h3; |
339 CreateMessagePipe(&h_2, &h_3); | 338 CreateMessagePipe(&h2, &h3); |
340 | 339 |
341 // Write a message to |h_2|, before we send |h_3|. | 340 // Write a message to |h2|, before we send |h3|. |
342 const char kWorld[] = "world!"; | 341 const char kWorld[] = "world!"; |
343 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); | 342 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); |
344 EXPECT_EQ(MOJO_RESULT_OK, | 343 EXPECT_EQ(MOJO_RESULT_OK, |
345 WriteMessageRaw(h_2.get(), | 344 WriteMessageRaw(h2.get(), |
346 kWorld, kWorldSize, | 345 kWorld, kWorldSize, |
347 NULL, 0, | 346 NULL, 0, |
348 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 347 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
349 // And also a message to |h_3|. | 348 // And also a message to |h3|. |
350 EXPECT_EQ(MOJO_RESULT_OK, | 349 EXPECT_EQ(MOJO_RESULT_OK, |
351 WriteMessageRaw(h_3.get(), | 350 WriteMessageRaw(h3.get(), |
352 kWorld, kWorldSize, | 351 kWorld, kWorldSize, |
353 NULL, 0, | 352 NULL, 0, |
354 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 353 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
355 | 354 |
356 // Send |h_3| over |h_1| to |h_0|. | 355 // Send |h3| over |h1| to |h0|. |
357 const char kHello[] = "hello"; | 356 const char kHello[] = "hello"; |
358 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); | 357 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); |
359 MojoHandle h_3_value; | 358 MojoHandle h3_value; |
360 h_3_value = h_3.release().value(); | 359 h3_value = h3.release().value(); |
361 EXPECT_NE(kInvalidHandleValue, h_3_value); | 360 EXPECT_NE(kInvalidHandleValue, h3_value); |
362 EXPECT_FALSE(h_3.get().is_valid()); | 361 EXPECT_FALSE(h3.get().is_valid()); |
363 EXPECT_EQ(MOJO_RESULT_OK, | 362 EXPECT_EQ(MOJO_RESULT_OK, |
364 WriteMessageRaw(h_1.get(), | 363 WriteMessageRaw(h1.get(), |
365 kHello, kHelloSize, | 364 kHello, kHelloSize, |
366 &h_3_value, 1, | 365 &h3_value, 1, |
367 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 366 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
368 // |h_3_value| should actually be invalid now. | 367 // |h3_value| should actually be invalid now. |
369 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(h_3_value)); | 368 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(h3_value)); |
370 | 369 |
371 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h_2.release().value())); | 370 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h2.release().value())); |
372 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h_0.release().value())); | 371 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h0.release().value())); |
373 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h_1.release().value())); | 372 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h1.release().value())); |
374 } | 373 } |
375 } | 374 } |
376 | 375 |
377 // TODO(vtl): Write data pipe tests. | 376 // TODO(vtl): Write data pipe tests. |
378 | 377 |
379 } // namespace | 378 } // namespace |
380 } // namespace mojo | 379 } // namespace mojo |
OLD | NEW |