| Index: mojo/android/javatests/src/org/chromium/mojo/system/impl/CoreImplTest.java
|
| diff --git a/mojo/android/javatests/src/org/chromium/mojo/system/impl/CoreImplTest.java b/mojo/android/javatests/src/org/chromium/mojo/system/impl/CoreImplTest.java
|
| index 5120198feb90dc5f1180f5f36879a141cf14d0dd..77a9bda248f115a772654d3c236aa4f95040d4bd 100644
|
| --- a/mojo/android/javatests/src/org/chromium/mojo/system/impl/CoreImplTest.java
|
| +++ b/mojo/android/javatests/src/org/chromium/mojo/system/impl/CoreImplTest.java
|
| @@ -9,6 +9,9 @@
|
| import org.chromium.mojo.MojoTestCase;
|
| import org.chromium.mojo.system.Core;
|
| import org.chromium.mojo.system.Core.HandleSignals;
|
| +import org.chromium.mojo.system.Core.HandleSignalsState;
|
| +import org.chromium.mojo.system.Core.WaitManyResult;
|
| +import org.chromium.mojo.system.Core.WaitResult;
|
| import org.chromium.mojo.system.DataPipe;
|
| import org.chromium.mojo.system.Handle;
|
| import org.chromium.mojo.system.InvalidHandle;
|
| @@ -27,6 +30,7 @@
|
| import java.util.Random;
|
| import java.util.concurrent.Executors;
|
| import java.util.concurrent.ScheduledExecutorService;
|
| +import java.util.concurrent.TimeUnit;
|
|
|
| /**
|
| * Testing the core API.
|
| @@ -72,6 +76,22 @@
|
| mHandlesToClose.add(handles.second);
|
| }
|
|
|
| + /**
|
| + * Runnable that will close the given handle.
|
| + */
|
| + private static class CloseHandle implements Runnable {
|
| + private Handle mHandle;
|
| +
|
| + CloseHandle(Handle handle) {
|
| + mHandle = handle;
|
| + }
|
| +
|
| + @Override
|
| + public void run() {
|
| + mHandle.close();
|
| + }
|
| + }
|
| +
|
| private static void checkSendingMessage(MessagePipeHandle in, MessagePipeHandle out) {
|
| Random random = new Random();
|
|
|
| @@ -164,6 +184,46 @@
|
| }
|
|
|
| /**
|
| + * Testing {@link Core#waitMany(List, long)}.
|
| + */
|
| + @SmallTest
|
| + public void testWaitMany() {
|
| + Core core = CoreImpl.getInstance();
|
| + Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null);
|
| + addHandlePairToClose(handles);
|
| +
|
| + // Test waiting on handles of a newly created message pipe - each should be writable, but
|
| + // not readable.
|
| + List<Pair<Handle, Core.HandleSignals>> handlesToWaitOn =
|
| + new ArrayList<Pair<Handle, Core.HandleSignals>>();
|
| + handlesToWaitOn.add(
|
| + new Pair<Handle, Core.HandleSignals>(handles.second, Core.HandleSignals.READABLE));
|
| + handlesToWaitOn.add(
|
| + new Pair<Handle, Core.HandleSignals>(handles.first, Core.HandleSignals.WRITABLE));
|
| + WaitManyResult result = core.waitMany(handlesToWaitOn, 0);
|
| + assertEquals(MojoResult.OK, result.getMojoResult());
|
| + assertEquals(1, result.getHandleIndex());
|
| + for (HandleSignalsState state : result.getSignalStates()) {
|
| + assertEquals(HandleSignals.WRITABLE, state.getSatisfiedSignals());
|
| + assertEquals(ALL_SIGNALS, state.getSatisfiableSignals());
|
| + }
|
| +
|
| + // Same test, but swap the handles around.
|
| + handlesToWaitOn.clear();
|
| + handlesToWaitOn.add(
|
| + new Pair<Handle, Core.HandleSignals>(handles.first, Core.HandleSignals.WRITABLE));
|
| + handlesToWaitOn.add(
|
| + new Pair<Handle, Core.HandleSignals>(handles.second, Core.HandleSignals.READABLE));
|
| + result = core.waitMany(handlesToWaitOn, 0);
|
| + assertEquals(MojoResult.OK, result.getMojoResult());
|
| + assertEquals(0, result.getHandleIndex());
|
| + for (HandleSignalsState state : result.getSignalStates()) {
|
| + assertEquals(HandleSignals.WRITABLE, state.getSatisfiedSignals());
|
| + assertEquals(ALL_SIGNALS, state.getSatisfiableSignals());
|
| + }
|
| + }
|
| +
|
| + /**
|
| * Testing that Core can be retrieved from a handle.
|
| */
|
| @SmallTest
|
| @@ -214,14 +274,53 @@
|
| Core core = CoreImpl.getInstance();
|
| Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null);
|
| addHandlePairToClose(handles);
|
| + // Test waiting on handles of a newly created message pipe.
|
| + WaitResult waitResult = handles.first.wait(
|
| + Core.HandleSignals.none().setReadable(true).setWritable(true), 0);
|
| + assertEquals(MojoResult.OK, waitResult.getMojoResult());
|
| + assertEquals(
|
| + HandleSignals.WRITABLE, waitResult.getHandleSignalsState().getSatisfiedSignals());
|
| + assertEquals(ALL_SIGNALS, waitResult.getHandleSignalsState().getSatisfiableSignals());
|
| +
|
| + waitResult = handles.first.wait(Core.HandleSignals.WRITABLE, 0);
|
| + assertEquals(MojoResult.OK, waitResult.getMojoResult());
|
| + assertEquals(
|
| + HandleSignals.WRITABLE, waitResult.getHandleSignalsState().getSatisfiedSignals());
|
| + assertEquals(ALL_SIGNALS, waitResult.getHandleSignalsState().getSatisfiableSignals());
|
| +
|
| + waitResult = handles.first.wait(Core.HandleSignals.READABLE, 0);
|
| + assertEquals(MojoResult.DEADLINE_EXCEEDED, waitResult.getMojoResult());
|
| + assertEquals(
|
| + HandleSignals.WRITABLE, waitResult.getHandleSignalsState().getSatisfiedSignals());
|
| + assertEquals(ALL_SIGNALS, waitResult.getHandleSignalsState().getSatisfiableSignals());
|
|
|
| // Testing read on an empty pipe.
|
| ResultAnd<MessagePipeHandle.ReadMessageResult> readResult =
|
| handles.first.readMessage(null, 0, MessagePipeHandle.ReadFlags.NONE);
|
| assertEquals(MojoResult.SHOULD_WAIT, readResult.getMojoResult());
|
|
|
| - handles.first.close();
|
| - handles.second.close();
|
| + // Closing a pipe while waiting.
|
| + WORKER.schedule(new CloseHandle(handles.first), 10, TimeUnit.MILLISECONDS);
|
| + waitResult = handles.first.wait(Core.HandleSignals.READABLE, 1000000L);
|
| + assertEquals(MojoResult.CANCELLED, waitResult.getMojoResult());
|
| + assertEquals(
|
| + HandleSignals.none(), waitResult.getHandleSignalsState().getSatisfiedSignals());
|
| + assertEquals(
|
| + HandleSignals.none(), waitResult.getHandleSignalsState().getSatisfiableSignals());
|
| +
|
| + handles = core.createMessagePipe(null);
|
| + addHandlePairToClose(handles);
|
| +
|
| + // Closing the other pipe while waiting.
|
| + WORKER.schedule(new CloseHandle(handles.first), 10, TimeUnit.MILLISECONDS);
|
| + waitResult = handles.second.wait(Core.HandleSignals.READABLE, 1000000L);
|
| + assertEquals(MojoResult.FAILED_PRECONDITION, waitResult.getMojoResult());
|
| +
|
| + // Waiting on a closed pipe.
|
| + waitResult = handles.second.wait(Core.HandleSignals.READABLE, 0);
|
| + assertEquals(MojoResult.FAILED_PRECONDITION, waitResult.getMojoResult());
|
| + waitResult = handles.second.wait(Core.HandleSignals.WRITABLE, 0);
|
| + assertEquals(MojoResult.FAILED_PRECONDITION, waitResult.getMojoResult());
|
| }
|
|
|
| /**
|
| @@ -441,6 +540,29 @@
|
| Core core = CoreImpl.getInstance();
|
| Handle handle = InvalidHandle.INSTANCE;
|
|
|
| + // Checking wait.
|
| + boolean exception = false;
|
| + try {
|
| + core.wait(handle, Core.HandleSignals.WRITABLE, 0);
|
| + } catch (MojoException e) {
|
| + assertEquals(MojoResult.INVALID_ARGUMENT, e.getMojoResult());
|
| + exception = true;
|
| + }
|
| + assertTrue(exception);
|
| +
|
| + // Checking waitMany.
|
| + exception = false;
|
| + try {
|
| + List<Pair<Handle, Core.HandleSignals>> handles =
|
| + new ArrayList<Pair<Handle, Core.HandleSignals>>();
|
| + handles.add(Pair.create(handle, Core.HandleSignals.WRITABLE));
|
| + core.waitMany(handles, 0);
|
| + } catch (MojoException e) {
|
| + assertEquals(MojoResult.INVALID_ARGUMENT, e.getMojoResult());
|
| + exception = true;
|
| + }
|
| + assertTrue(exception);
|
| +
|
| // Checking sending an invalid handle.
|
| // Until the behavior is changed on the C++ side, handle gracefully 2 different use case:
|
| // - Receive a INVALID_ARGUMENT exception
|
|
|