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

Side by Side Diff: mojo/android/javatests/src/org/chromium/mojo/system/impl/CoreImplTest.java

Issue 2741033003: Mojo EDK: Introduce MojoQueryHandleSignalsState API (Closed)
Patch Set: fix stupid bad DCHECK Created 3 years, 9 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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « mojo/android/javatests/src/org/chromium/mojo/bindings/RouterTest.java ('k') | mojo/android/system/core_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698