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 package org.chromium.mojo.system.impl; | 5 package org.chromium.mojo.system.impl; |
6 | 6 |
7 import android.support.test.filters.SmallTest; | 7 import android.support.test.filters.SmallTest; |
8 | 8 |
9 import org.chromium.mojo.MojoTestCase; | 9 import org.chromium.mojo.MojoTestCase; |
10 import org.chromium.mojo.system.Core; | 10 import org.chromium.mojo.system.Core; |
11 import org.chromium.mojo.system.Core.HandleSignals; | 11 import org.chromium.mojo.system.Core.HandleSignals; |
12 import org.chromium.mojo.system.Core.HandleSignalsState; | |
13 import org.chromium.mojo.system.Core.WaitManyResult; | |
14 import org.chromium.mojo.system.Core.WaitResult; | |
15 import org.chromium.mojo.system.DataPipe; | 12 import org.chromium.mojo.system.DataPipe; |
16 import org.chromium.mojo.system.Handle; | 13 import org.chromium.mojo.system.Handle; |
17 import org.chromium.mojo.system.InvalidHandle; | 14 import org.chromium.mojo.system.InvalidHandle; |
18 import org.chromium.mojo.system.MessagePipeHandle; | 15 import org.chromium.mojo.system.MessagePipeHandle; |
19 import org.chromium.mojo.system.MojoException; | 16 import org.chromium.mojo.system.MojoException; |
20 import org.chromium.mojo.system.MojoResult; | 17 import org.chromium.mojo.system.MojoResult; |
21 import org.chromium.mojo.system.Pair; | 18 import org.chromium.mojo.system.Pair; |
22 import org.chromium.mojo.system.ResultAnd; | 19 import org.chromium.mojo.system.ResultAnd; |
23 import org.chromium.mojo.system.SharedBufferHandle; | 20 import org.chromium.mojo.system.SharedBufferHandle; |
24 | 21 |
25 import java.nio.ByteBuffer; | 22 import java.nio.ByteBuffer; |
26 import java.util.ArrayList; | 23 import java.util.ArrayList; |
27 import java.util.Arrays; | 24 import java.util.Arrays; |
28 import java.util.Collections; | 25 import java.util.Collections; |
29 import java.util.List; | 26 import java.util.List; |
30 import java.util.Random; | 27 import java.util.Random; |
31 import java.util.concurrent.Executors; | 28 import java.util.concurrent.Executors; |
32 import java.util.concurrent.ScheduledExecutorService; | 29 import java.util.concurrent.ScheduledExecutorService; |
33 import java.util.concurrent.TimeUnit; | |
34 | 30 |
35 /** | 31 /** |
36 * Testing the core API. | 32 * Testing the core API. |
37 */ | 33 */ |
38 public class CoreImplTest extends MojoTestCase { | 34 public class CoreImplTest extends MojoTestCase { |
39 private static final long RUN_LOOP_TIMEOUT_MS = 5; | 35 private static final long RUN_LOOP_TIMEOUT_MS = 5; |
40 | 36 |
41 private static final ScheduledExecutorService WORKER = | 37 private static final ScheduledExecutorService WORKER = |
42 Executors.newSingleThreadScheduledExecutor(); | 38 Executors.newSingleThreadScheduledExecutor(); |
43 | 39 |
(...skipping 25 matching lines...) Expand all Loading... |
69 | 65 |
70 private void addHandleToClose(Handle handle) { | 66 private void addHandleToClose(Handle handle) { |
71 mHandlesToClose.add(handle); | 67 mHandlesToClose.add(handle); |
72 } | 68 } |
73 | 69 |
74 private void addHandlePairToClose(Pair<? extends Handle, ? extends Handle> h
andles) { | 70 private void addHandlePairToClose(Pair<? extends Handle, ? extends Handle> h
andles) { |
75 mHandlesToClose.add(handles.first); | 71 mHandlesToClose.add(handles.first); |
76 mHandlesToClose.add(handles.second); | 72 mHandlesToClose.add(handles.second); |
77 } | 73 } |
78 | 74 |
79 /** | |
80 * Runnable that will close the given handle. | |
81 */ | |
82 private static class CloseHandle implements Runnable { | |
83 private Handle mHandle; | |
84 | |
85 CloseHandle(Handle handle) { | |
86 mHandle = handle; | |
87 } | |
88 | |
89 @Override | |
90 public void run() { | |
91 mHandle.close(); | |
92 } | |
93 } | |
94 | |
95 private static void checkSendingMessage(MessagePipeHandle in, MessagePipeHan
dle out) { | 75 private static void checkSendingMessage(MessagePipeHandle in, MessagePipeHan
dle out) { |
96 Random random = new Random(); | 76 Random random = new Random(); |
97 | 77 |
98 // Writing a random 8 bytes message. | 78 // Writing a random 8 bytes message. |
99 byte[] bytes = new byte[8]; | 79 byte[] bytes = new byte[8]; |
100 random.nextBytes(bytes); | 80 random.nextBytes(bytes); |
101 ByteBuffer buffer = ByteBuffer.allocateDirect(bytes.length); | 81 ByteBuffer buffer = ByteBuffer.allocateDirect(bytes.length); |
102 buffer.put(bytes); | 82 buffer.put(bytes); |
103 in.writeMessage(buffer, null, MessagePipeHandle.WriteFlags.NONE); | 83 in.writeMessage(buffer, null, MessagePipeHandle.WriteFlags.NONE); |
104 | 84 |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
177 byte[] receivedBytes = new byte[bytes.length]; | 157 byte[] receivedBytes = new byte[bytes.length]; |
178 buffer2.get(receivedBytes); | 158 buffer2.get(receivedBytes); |
179 | 159 |
180 assertTrue(Arrays.equals(bytes, receivedBytes)); | 160 assertTrue(Arrays.equals(bytes, receivedBytes)); |
181 | 161 |
182 in.unmap(buffer1); | 162 in.unmap(buffer1); |
183 out.unmap(buffer2); | 163 out.unmap(buffer2); |
184 } | 164 } |
185 | 165 |
186 /** | 166 /** |
187 * Testing {@link Core#waitMany(List, long)}. | |
188 */ | |
189 @SmallTest | |
190 public void testWaitMany() { | |
191 Core core = CoreImpl.getInstance(); | |
192 Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessageP
ipe(null); | |
193 addHandlePairToClose(handles); | |
194 | |
195 // Test waiting on handles of a newly created message pipe - each should
be writable, but | |
196 // not readable. | |
197 List<Pair<Handle, Core.HandleSignals>> handlesToWaitOn = | |
198 new ArrayList<Pair<Handle, Core.HandleSignals>>(); | |
199 handlesToWaitOn.add( | |
200 new Pair<Handle, Core.HandleSignals>(handles.second, Core.Handle
Signals.READABLE)); | |
201 handlesToWaitOn.add( | |
202 new Pair<Handle, Core.HandleSignals>(handles.first, Core.HandleS
ignals.WRITABLE)); | |
203 WaitManyResult result = core.waitMany(handlesToWaitOn, 0); | |
204 assertEquals(MojoResult.OK, result.getMojoResult()); | |
205 assertEquals(1, result.getHandleIndex()); | |
206 for (HandleSignalsState state : result.getSignalStates()) { | |
207 assertEquals(HandleSignals.WRITABLE, state.getSatisfiedSignals()); | |
208 assertEquals(ALL_SIGNALS, state.getSatisfiableSignals()); | |
209 } | |
210 | |
211 // Same test, but swap the handles around. | |
212 handlesToWaitOn.clear(); | |
213 handlesToWaitOn.add( | |
214 new Pair<Handle, Core.HandleSignals>(handles.first, Core.HandleS
ignals.WRITABLE)); | |
215 handlesToWaitOn.add( | |
216 new Pair<Handle, Core.HandleSignals>(handles.second, Core.Handle
Signals.READABLE)); | |
217 result = core.waitMany(handlesToWaitOn, 0); | |
218 assertEquals(MojoResult.OK, result.getMojoResult()); | |
219 assertEquals(0, result.getHandleIndex()); | |
220 for (HandleSignalsState state : result.getSignalStates()) { | |
221 assertEquals(HandleSignals.WRITABLE, state.getSatisfiedSignals()); | |
222 assertEquals(ALL_SIGNALS, state.getSatisfiableSignals()); | |
223 } | |
224 } | |
225 | |
226 /** | |
227 * Testing that Core can be retrieved from a handle. | 167 * Testing that Core can be retrieved from a handle. |
228 */ | 168 */ |
229 @SmallTest | 169 @SmallTest |
230 public void testGetCore() { | 170 public void testGetCore() { |
231 Core core = CoreImpl.getInstance(); | 171 Core core = CoreImpl.getInstance(); |
232 | 172 |
233 Pair<? extends Handle, ? extends Handle> handles = core.createMessagePip
e(null); | 173 Pair<? extends Handle, ? extends Handle> handles = core.createMessagePip
e(null); |
234 addHandlePairToClose(handles); | 174 addHandlePairToClose(handles); |
235 assertEquals(core, handles.first.getCore()); | 175 assertEquals(core, handles.first.getCore()); |
236 assertEquals(core, handles.second.getCore()); | 176 assertEquals(core, handles.second.getCore()); |
(...skipping 30 matching lines...) Expand all Loading... |
267 } | 207 } |
268 | 208 |
269 /** | 209 /** |
270 * Testing {@link MessagePipeHandle}. | 210 * Testing {@link MessagePipeHandle}. |
271 */ | 211 */ |
272 @SmallTest | 212 @SmallTest |
273 public void testMessagePipeEmpty() { | 213 public void testMessagePipeEmpty() { |
274 Core core = CoreImpl.getInstance(); | 214 Core core = CoreImpl.getInstance(); |
275 Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessageP
ipe(null); | 215 Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessageP
ipe(null); |
276 addHandlePairToClose(handles); | 216 addHandlePairToClose(handles); |
277 // Test waiting on handles of a newly created message pipe. | |
278 WaitResult waitResult = handles.first.wait( | |
279 Core.HandleSignals.none().setReadable(true).setWritable(true), 0
); | |
280 assertEquals(MojoResult.OK, waitResult.getMojoResult()); | |
281 assertEquals( | |
282 HandleSignals.WRITABLE, waitResult.getHandleSignalsState().getSa
tisfiedSignals()); | |
283 assertEquals(ALL_SIGNALS, waitResult.getHandleSignalsState().getSatisfia
bleSignals()); | |
284 | |
285 waitResult = handles.first.wait(Core.HandleSignals.WRITABLE, 0); | |
286 assertEquals(MojoResult.OK, waitResult.getMojoResult()); | |
287 assertEquals( | |
288 HandleSignals.WRITABLE, waitResult.getHandleSignalsState().getSa
tisfiedSignals()); | |
289 assertEquals(ALL_SIGNALS, waitResult.getHandleSignalsState().getSatisfia
bleSignals()); | |
290 | |
291 waitResult = handles.first.wait(Core.HandleSignals.READABLE, 0); | |
292 assertEquals(MojoResult.DEADLINE_EXCEEDED, waitResult.getMojoResult()); | |
293 assertEquals( | |
294 HandleSignals.WRITABLE, waitResult.getHandleSignalsState().getSa
tisfiedSignals()); | |
295 assertEquals(ALL_SIGNALS, waitResult.getHandleSignalsState().getSatisfia
bleSignals()); | |
296 | 217 |
297 // Testing read on an empty pipe. | 218 // Testing read on an empty pipe. |
298 ResultAnd<MessagePipeHandle.ReadMessageResult> readResult = | 219 ResultAnd<MessagePipeHandle.ReadMessageResult> readResult = |
299 handles.first.readMessage(null, 0, MessagePipeHandle.ReadFlags.N
ONE); | 220 handles.first.readMessage(null, 0, MessagePipeHandle.ReadFlags.N
ONE); |
300 assertEquals(MojoResult.SHOULD_WAIT, readResult.getMojoResult()); | 221 assertEquals(MojoResult.SHOULD_WAIT, readResult.getMojoResult()); |
301 | 222 |
302 // Closing a pipe while waiting. | 223 handles.first.close(); |
303 WORKER.schedule(new CloseHandle(handles.first), 10, TimeUnit.MILLISECOND
S); | 224 handles.second.close(); |
304 waitResult = handles.first.wait(Core.HandleSignals.READABLE, 1000000L); | |
305 assertEquals(MojoResult.CANCELLED, waitResult.getMojoResult()); | |
306 assertEquals( | |
307 HandleSignals.none(), waitResult.getHandleSignalsState().getSati
sfiedSignals()); | |
308 assertEquals( | |
309 HandleSignals.none(), waitResult.getHandleSignalsState().getSati
sfiableSignals()); | |
310 | |
311 handles = core.createMessagePipe(null); | |
312 addHandlePairToClose(handles); | |
313 | |
314 // Closing the other pipe while waiting. | |
315 WORKER.schedule(new CloseHandle(handles.first), 10, TimeUnit.MILLISECOND
S); | |
316 waitResult = handles.second.wait(Core.HandleSignals.READABLE, 1000000L); | |
317 assertEquals(MojoResult.FAILED_PRECONDITION, waitResult.getMojoResult())
; | |
318 | |
319 // Waiting on a closed pipe. | |
320 waitResult = handles.second.wait(Core.HandleSignals.READABLE, 0); | |
321 assertEquals(MojoResult.FAILED_PRECONDITION, waitResult.getMojoResult())
; | |
322 waitResult = handles.second.wait(Core.HandleSignals.WRITABLE, 0); | |
323 assertEquals(MojoResult.FAILED_PRECONDITION, waitResult.getMojoResult())
; | |
324 } | 225 } |
325 | 226 |
326 /** | 227 /** |
327 * Testing {@link MessagePipeHandle}. | 228 * Testing {@link MessagePipeHandle}. |
328 */ | 229 */ |
329 @SmallTest | 230 @SmallTest |
330 public void testMessagePipeSend() { | 231 public void testMessagePipeSend() { |
331 Core core = CoreImpl.getInstance(); | 232 Core core = CoreImpl.getInstance(); |
332 Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessageP
ipe(null); | 233 Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessageP
ipe(null); |
333 addHandlePairToClose(handles); | 234 addHandlePairToClose(handles); |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
533 } | 434 } |
534 | 435 |
535 /** | 436 /** |
536 * Testing that invalid handle can be used with this implementation. | 437 * Testing that invalid handle can be used with this implementation. |
537 */ | 438 */ |
538 @SmallTest | 439 @SmallTest |
539 public void testInvalidHandle() { | 440 public void testInvalidHandle() { |
540 Core core = CoreImpl.getInstance(); | 441 Core core = CoreImpl.getInstance(); |
541 Handle handle = InvalidHandle.INSTANCE; | 442 Handle handle = InvalidHandle.INSTANCE; |
542 | 443 |
543 // Checking wait. | |
544 boolean exception = false; | |
545 try { | |
546 core.wait(handle, Core.HandleSignals.WRITABLE, 0); | |
547 } catch (MojoException e) { | |
548 assertEquals(MojoResult.INVALID_ARGUMENT, e.getMojoResult()); | |
549 exception = true; | |
550 } | |
551 assertTrue(exception); | |
552 | |
553 // Checking waitMany. | |
554 exception = false; | |
555 try { | |
556 List<Pair<Handle, Core.HandleSignals>> handles = | |
557 new ArrayList<Pair<Handle, Core.HandleSignals>>(); | |
558 handles.add(Pair.create(handle, Core.HandleSignals.WRITABLE)); | |
559 core.waitMany(handles, 0); | |
560 } catch (MojoException e) { | |
561 assertEquals(MojoResult.INVALID_ARGUMENT, e.getMojoResult()); | |
562 exception = true; | |
563 } | |
564 assertTrue(exception); | |
565 | |
566 // Checking sending an invalid handle. | 444 // Checking sending an invalid handle. |
567 // Until the behavior is changed on the C++ side, handle gracefully 2 di
fferent use case: | 445 // Until the behavior is changed on the C++ side, handle gracefully 2 di
fferent use case: |
568 // - Receive a INVALID_ARGUMENT exception | 446 // - Receive a INVALID_ARGUMENT exception |
569 // - Receive an invalid handle on the other side. | 447 // - Receive an invalid handle on the other side. |
570 Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessageP
ipe(null); | 448 Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessageP
ipe(null); |
571 addHandlePairToClose(handles); | 449 addHandlePairToClose(handles); |
572 try { | 450 try { |
573 handles.first.writeMessage(null, Collections.<Handle>singletonList(h
andle), | 451 handles.first.writeMessage(null, Collections.<Handle>singletonList(h
andle), |
574 MessagePipeHandle.WriteFlags.NONE); | 452 MessagePipeHandle.WriteFlags.NONE); |
575 ResultAnd<MessagePipeHandle.ReadMessageResult> readMessageResult = | 453 ResultAnd<MessagePipeHandle.ReadMessageResult> readMessageResult = |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
658 MessagePipeHandle converted = | 536 MessagePipeHandle converted = |
659 core.acquireNativeHandle(handles.first.releaseNativeHandle()).to
MessagePipeHandle(); | 537 core.acquireNativeHandle(handles.first.releaseNativeHandle()).to
MessagePipeHandle(); |
660 addHandleToClose(converted); | 538 addHandleToClose(converted); |
661 | 539 |
662 assertFalse(handles.first.isValid()); | 540 assertFalse(handles.first.isValid()); |
663 | 541 |
664 checkSendingMessage(converted, handles.second); | 542 checkSendingMessage(converted, handles.second); |
665 checkSendingMessage(handles.second, converted); | 543 checkSendingMessage(handles.second, converted); |
666 } | 544 } |
667 } | 545 } |
OLD | NEW |