Index: mojo/android/javatests/src/org/chromium/mojo/system/CoreTest.java |
diff --git a/mojo/android/javatests/src/org/chromium/mojo/system/CoreTest.java b/mojo/android/javatests/src/org/chromium/mojo/system/CoreTest.java |
index bf941b03d25d9ee108bd776ae6ccb8ae8ba5f924..4a909eb94219e977cda17693dbcfca4e88d78d1c 100644 |
--- a/mojo/android/javatests/src/org/chromium/mojo/system/CoreTest.java |
+++ b/mojo/android/javatests/src/org/chromium/mojo/system/CoreTest.java |
@@ -10,6 +10,8 @@ import android.test.suitebuilder.annotation.SmallTest; |
import org.chromium.base.JNINamespace; |
import org.chromium.base.library_loader.LibraryLoader; |
+import org.chromium.mojo.system.AsyncWaiter.Callback; |
+import org.chromium.mojo.system.AsyncWaiter.Cancellable; |
import org.chromium.mojo.system.Core.WaitFlags; |
import org.chromium.mojo.system.Core.WaitManyResult; |
import org.chromium.mojo.system.MessagePipeHandle.ReadFlags; |
@@ -33,9 +35,13 @@ import java.util.concurrent.TimeUnit; |
@JNINamespace("mojo::android") |
public class CoreTest extends InstrumentationTestCase { |
+ private static final long RUN_LOOP_TIMEOUT_MS = 5; |
+ |
private static final ScheduledExecutorService WORKER = |
Executors.newSingleThreadScheduledExecutor(); |
+ private long mTestEnvironmentPointer; |
+ |
/** |
* @see junit.framework.TestCase#setUp() |
*/ |
@@ -43,6 +49,15 @@ public class CoreTest extends InstrumentationTestCase { |
protected void setUp() throws Exception { |
LibraryLoader.ensureInitialized(); |
nativeInitApplicationContext(getInstrumentation().getTargetContext()); |
+ mTestEnvironmentPointer = nativeSetupTestEnvironment(); |
+ } |
+ |
+ /** |
+ * @see android.test.InstrumentationTestCase#tearDown() |
+ */ |
+ @Override |
+ protected void tearDown() throws Exception { |
+ nativeTearDownTestEnvironment(mTestEnvironmentPointer); |
} |
/** |
@@ -518,5 +533,295 @@ public class CoreTest extends InstrumentationTestCase { |
} |
} |
+ private static class AsyncWaiterResult implements Callback { |
+ private int mResult = Integer.MIN_VALUE; |
+ private MojoException mException = null; |
+ |
+ /** |
+ * @see Callback#onResult(int) |
+ */ |
+ @Override |
+ public void onResult(int result) { |
+ this.mResult = result; |
+ } |
+ |
+ /** |
+ * @see Callback#onError(MojoException) |
+ */ |
+ @Override |
+ public void onError(MojoException exception) { |
+ this.mException = exception; |
+ } |
+ |
+ /** |
+ * @return the result |
+ */ |
+ public int getResult() { |
+ return mResult; |
+ } |
+ |
+ /** |
+ * @return the exception |
+ */ |
+ public MojoException getException() { |
+ return mException; |
+ } |
+ |
+ } |
+ |
+ /** |
+ * Testing core {@link AsyncWaiter} implementation. |
+ */ |
+ @SmallTest |
+ public void testAsyncWaiterCorrectResult() { |
+ Core core = CoreImpl.getInstance(); |
+ |
+ // Checking a correct result. |
+ Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(); |
+ try { |
+ final AsyncWaiterResult asyncWaiterResult = new AsyncWaiterResult(); |
+ assertEquals(Integer.MIN_VALUE, asyncWaiterResult.getResult()); |
+ assertEquals(null, asyncWaiterResult.getException()); |
+ |
+ core.getDefaultAsyncWaiter().asyncWait(handles.first, |
+ WaitFlags.none().setReadable(true), Core.DEADLINE_INFINITE, asyncWaiterResult); |
+ assertEquals(Integer.MIN_VALUE, asyncWaiterResult.getResult()); |
+ assertEquals(null, asyncWaiterResult.getException()); |
+ |
+ handles.second.writeMessage(ByteBuffer.allocateDirect(1), null, |
+ MessagePipeHandle.WriteFlags.none()); |
+ nativeRunLoop(RUN_LOOP_TIMEOUT_MS); |
+ assertNull(asyncWaiterResult.getException()); |
+ assertEquals(MojoResult.OK, asyncWaiterResult.getResult()); |
+ } finally { |
+ handles.first.close(); |
+ handles.second.close(); |
+ } |
+ } |
+ |
+ /** |
+ * Testing core {@link AsyncWaiter} implementation. |
+ */ |
+ @SmallTest |
+ public void testAsyncWaiterClosingPeerHandle() { |
+ Core core = CoreImpl.getInstance(); |
+ |
+ // Closing the peer handle. |
+ Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(); |
+ try { |
+ final AsyncWaiterResult asyncWaiterResult = new AsyncWaiterResult(); |
+ assertEquals(Integer.MIN_VALUE, asyncWaiterResult.getResult()); |
+ assertEquals(null, asyncWaiterResult.getException()); |
+ |
+ core.getDefaultAsyncWaiter().asyncWait(handles.first, |
+ WaitFlags.none().setReadable(true), Core.DEADLINE_INFINITE, asyncWaiterResult); |
+ assertEquals(Integer.MIN_VALUE, asyncWaiterResult.getResult()); |
+ assertEquals(null, asyncWaiterResult.getException()); |
+ |
+ nativeRunLoop(RUN_LOOP_TIMEOUT_MS); |
+ assertEquals(Integer.MIN_VALUE, asyncWaiterResult.getResult()); |
+ assertEquals(null, asyncWaiterResult.getException()); |
+ |
+ handles.second.close(); |
+ nativeRunLoop(RUN_LOOP_TIMEOUT_MS); |
+ assertNull(asyncWaiterResult.getException()); |
+ assertEquals(MojoResult.FAILED_PRECONDITION, asyncWaiterResult.getResult()); |
+ } finally { |
+ handles.first.close(); |
+ handles.second.close(); |
+ } |
+ } |
+ |
+ /** |
+ * Testing core {@link AsyncWaiter} implementation. |
+ */ |
+ @SmallTest |
+ public void testAsyncWaiterClosingWaitingHandle() { |
+ Core core = CoreImpl.getInstance(); |
+ |
+ // Closing the peer handle. |
+ Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(); |
+ try { |
+ final AsyncWaiterResult asyncWaiterResult = new AsyncWaiterResult(); |
+ assertEquals(Integer.MIN_VALUE, asyncWaiterResult.getResult()); |
+ assertEquals(null, asyncWaiterResult.getException()); |
+ |
+ core.getDefaultAsyncWaiter().asyncWait(handles.first, |
+ WaitFlags.none().setReadable(true), Core.DEADLINE_INFINITE, asyncWaiterResult); |
+ assertEquals(Integer.MIN_VALUE, asyncWaiterResult.getResult()); |
+ assertEquals(null, asyncWaiterResult.getException()); |
+ |
+ nativeRunLoop(RUN_LOOP_TIMEOUT_MS); |
+ assertEquals(Integer.MIN_VALUE, asyncWaiterResult.getResult()); |
+ assertEquals(null, asyncWaiterResult.getException()); |
+ |
+ handles.first.close(); |
+ nativeRunLoop(RUN_LOOP_TIMEOUT_MS); |
+ // TODO(qsr) Re-enable when MojoWaitMany handles it correctly. |
+ // assertNull(asyncWaiterResult.getException()); |
+ // assertEquals(MojoResult.CANCELLED, asyncWaiterResult.getResult()); |
+ } finally { |
+ handles.first.close(); |
+ handles.second.close(); |
+ } |
+ } |
+ |
+ /** |
+ * Testing core {@link AsyncWaiter} implementation. |
+ */ |
+ @SmallTest |
+ public void testAsyncWaiterWaitingOnInvalidHandle() { |
+ Core core = CoreImpl.getInstance(); |
+ |
+ // Closing the peer handle. |
+ Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(); |
+ try { |
+ final AsyncWaiterResult asyncWaiterResult = new AsyncWaiterResult(); |
+ assertEquals(Integer.MIN_VALUE, asyncWaiterResult.getResult()); |
+ assertEquals(null, asyncWaiterResult.getException()); |
+ |
+ handles.first.close(); |
+ core.getDefaultAsyncWaiter().asyncWait(handles.first, |
+ WaitFlags.none().setReadable(true), Core.DEADLINE_INFINITE, asyncWaiterResult); |
+ assertEquals(Integer.MIN_VALUE, asyncWaiterResult.getResult()); |
+ assertEquals(null, asyncWaiterResult.getException()); |
+ |
+ nativeRunLoop(RUN_LOOP_TIMEOUT_MS); |
+ assertNotNull(asyncWaiterResult.getException()); |
+ assertEquals(MojoResult.INVALID_ARGUMENT, |
+ asyncWaiterResult.getException().getMojoResult()); |
+ assertEquals(Integer.MIN_VALUE, asyncWaiterResult.getResult()); |
+ } finally { |
+ handles.first.close(); |
+ handles.second.close(); |
+ } |
+ } |
+ |
+ /** |
+ * Testing core {@link AsyncWaiter} implementation. |
+ */ |
+ @SmallTest |
+ public void testAsyncWaiterWaitingOnDefaultInvalidHandle() { |
+ Core core = CoreImpl.getInstance(); |
+ |
+ final AsyncWaiterResult asyncWaiterResult = new AsyncWaiterResult(); |
+ assertEquals(Integer.MIN_VALUE, asyncWaiterResult.getResult()); |
+ assertEquals(null, asyncWaiterResult.getException()); |
+ |
+ core.getDefaultAsyncWaiter().asyncWait(new InvalidHandle(), |
+ WaitFlags.none().setReadable(true), Core.DEADLINE_INFINITE, asyncWaiterResult); |
+ assertEquals(Integer.MIN_VALUE, asyncWaiterResult.getResult()); |
+ assertEquals(null, asyncWaiterResult.getException()); |
+ |
+ nativeRunLoop(RUN_LOOP_TIMEOUT_MS); |
+ assertNotNull(asyncWaiterResult.getException()); |
+ assertEquals(MojoResult.INVALID_ARGUMENT, |
+ asyncWaiterResult.getException().getMojoResult()); |
+ assertEquals(Integer.MIN_VALUE, asyncWaiterResult.getResult()); |
+ } |
+ |
+ /** |
+ * Testing core {@link AsyncWaiter} implementation. |
+ */ |
+ @SmallTest |
+ public void testAsyncWaiterWaitingWithTimeout() { |
+ Core core = CoreImpl.getInstance(); |
+ |
+ // Closing the peer handle. |
+ Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(); |
+ try { |
+ final AsyncWaiterResult asyncWaiterResult = new AsyncWaiterResult(); |
+ assertEquals(Integer.MIN_VALUE, asyncWaiterResult.getResult()); |
+ assertEquals(null, asyncWaiterResult.getException()); |
+ |
+ core.getDefaultAsyncWaiter().asyncWait(handles.first, |
+ WaitFlags.none().setReadable(true), RUN_LOOP_TIMEOUT_MS / 4, asyncWaiterResult); |
rmcilroy
2014/05/19 13:06:27
Is there the possibility of flake here? How much p
qsr
2014/05/19 14:43:22
This is not specified. In practice, I didn't get a
|
+ assertEquals(Integer.MIN_VALUE, asyncWaiterResult.getResult()); |
+ assertEquals(null, asyncWaiterResult.getException()); |
+ |
+ nativeRunLoop(RUN_LOOP_TIMEOUT_MS); |
+ assertNull(asyncWaiterResult.getException()); |
+ assertEquals(MojoResult.DEADLINE_EXCEEDED, asyncWaiterResult.getResult()); |
+ } finally { |
+ handles.first.close(); |
+ handles.second.close(); |
+ } |
+ } |
+ |
+ /** |
+ * Testing core {@link AsyncWaiter} implementation. |
+ */ |
+ @SmallTest |
+ public void testAsyncWaiterCancelWaiting() { |
+ Core core = CoreImpl.getInstance(); |
+ |
+ // Closing the peer handle. |
+ Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(); |
+ try { |
+ final AsyncWaiterResult asyncWaiterResult = new AsyncWaiterResult(); |
+ assertEquals(Integer.MIN_VALUE, asyncWaiterResult.getResult()); |
+ assertEquals(null, asyncWaiterResult.getException()); |
+ |
+ Cancellable cancellable = core.getDefaultAsyncWaiter().asyncWait(handles.first, |
+ WaitFlags.none().setReadable(true), Core.DEADLINE_INFINITE, asyncWaiterResult); |
+ assertEquals(Integer.MIN_VALUE, asyncWaiterResult.getResult()); |
+ assertEquals(null, asyncWaiterResult.getException()); |
+ |
+ nativeRunLoop(RUN_LOOP_TIMEOUT_MS); |
+ assertEquals(Integer.MIN_VALUE, asyncWaiterResult.getResult()); |
+ assertEquals(null, asyncWaiterResult.getException()); |
+ |
+ cancellable.cancel(); |
+ nativeRunLoop(RUN_LOOP_TIMEOUT_MS); |
+ assertEquals(Integer.MIN_VALUE, asyncWaiterResult.getResult()); |
+ assertEquals(null, asyncWaiterResult.getException()); |
+ |
+ handles.second.writeMessage(ByteBuffer.allocateDirect(1), null, |
+ MessagePipeHandle.WriteFlags.none()); |
+ nativeRunLoop(RUN_LOOP_TIMEOUT_MS); |
+ assertEquals(Integer.MIN_VALUE, asyncWaiterResult.getResult()); |
+ assertEquals(null, asyncWaiterResult.getException()); |
+ } finally { |
+ handles.first.close(); |
+ handles.second.close(); |
+ } |
+ } |
+ |
+ /** |
+ * Testing core {@link AsyncWaiter} implementation. |
+ */ |
+ @SmallTest |
+ public void testAsyncWaiterImmediateCancelOnInvalidHandle() { |
+ Core core = CoreImpl.getInstance(); |
+ |
+ // Closing the peer handle. |
+ Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(); |
+ try { |
+ final AsyncWaiterResult asyncWaiterResult = new AsyncWaiterResult(); |
+ handles.first.close(); |
+ assertEquals(Integer.MIN_VALUE, asyncWaiterResult.getResult()); |
+ assertEquals(null, asyncWaiterResult.getException()); |
+ |
+ Cancellable cancellable = core.getDefaultAsyncWaiter().asyncWait(handles.first, |
+ WaitFlags.none().setReadable(true), Core.DEADLINE_INFINITE, asyncWaiterResult); |
+ assertEquals(Integer.MIN_VALUE, asyncWaiterResult.getResult()); |
+ assertEquals(null, asyncWaiterResult.getException()); |
+ cancellable.cancel(); |
+ |
+ nativeRunLoop(RUN_LOOP_TIMEOUT_MS); |
+ assertEquals(Integer.MIN_VALUE, asyncWaiterResult.getResult()); |
+ assertEquals(null, asyncWaiterResult.getException()); |
+ } finally { |
+ handles.first.close(); |
+ handles.second.close(); |
+ } |
+ } |
+ |
private native void nativeInitApplicationContext(Context context); |
+ |
+ private native long nativeSetupTestEnvironment(); |
+ |
+ private native void nativeTearDownTestEnvironment(long testEnvironment); |
+ |
+ private native void nativeRunLoop(long timeoutMS); |
} |