| Index: mojo/system/android/javatests/src/org/chromium/mojo/system/CoreTest.java
|
| diff --git a/mojo/system/android/javatests/src/org/chromium/mojo/system/CoreTest.java b/mojo/system/android/javatests/src/org/chromium/mojo/system/CoreTest.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f27e0c38785ac3dbd9d1c3df98198e44e89ac399
|
| --- /dev/null
|
| +++ b/mojo/system/android/javatests/src/org/chromium/mojo/system/CoreTest.java
|
| @@ -0,0 +1,307 @@
|
| +// Copyright 2013 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +package org.chromium.mojo.system;
|
| +
|
| +import android.content.Context;
|
| +import android.test.InstrumentationTestCase;
|
| +import android.test.suitebuilder.annotation.SmallTest;
|
| +
|
| +import org.chromium.base.JNINamespace;
|
| +import org.chromium.base.library_loader.LibraryLoader;
|
| +import org.chromium.mojo.system.Core.WaitFlags;
|
| +import org.chromium.mojo.system.Core.WaitManyResult;
|
| +import org.chromium.mojo.system.MessagePipeHandle.ReadFlags;
|
| +import org.chromium.mojo.system.MessagePipeHandle.ReadMessageResult;
|
| +import org.chromium.mojo.system.MessagePipeHandle.WriteFlags;
|
| +import org.chromium.mojo.system.SharedBufferHandle.MapFlags;
|
| +
|
| +import java.nio.ByteBuffer;
|
| +import java.util.ArrayList;
|
| +import java.util.Arrays;
|
| +import java.util.Collections;
|
| +import java.util.List;
|
| +import java.util.Random;
|
| +
|
| +/**
|
| + * TODO(qsr): Insert description here.
|
| + */
|
| +@JNINamespace("mojo")
|
| +public class CoreTest extends InstrumentationTestCase {
|
| +
|
| + /*
|
| + * (non-Javadoc)
|
| + * @see junit.framework.TestCase#setUp()
|
| + */
|
| + @Override
|
| + protected void setUp() throws Exception {
|
| + LibraryLoader.ensureInitialized();
|
| + nativeInitApplicationContext(getInstrumentation().getContext());
|
| + }
|
| +
|
| + static class CloseHandle implements Runnable {
|
| + private Handle mHandle;
|
| +
|
| + CloseHandle(Handle handle) {
|
| + this.mHandle = handle;
|
| + }
|
| +
|
| + @Override
|
| + public void run() {
|
| + mHandle.close();
|
| + }
|
| + }
|
| +
|
| + static class ExecuteAfterDelay implements Runnable {
|
| + private Runnable mRunnable;
|
| + private long mDelayMs;
|
| +
|
| + ExecuteAfterDelay(Runnable runnable, long delayMs) {
|
| + this.mRunnable = runnable;
|
| + this.mDelayMs = delayMs;
|
| + }
|
| +
|
| + @Override
|
| + public void run() {
|
| + try {
|
| + Thread.sleep(mDelayMs);
|
| + } catch (InterruptedException e) {
|
| + // Nothing to do.
|
| + }
|
| + mRunnable.run();
|
| + }
|
| + }
|
| +
|
| + private static void checkSendingMessage(MessagePipeHandle in, MessagePipeHandle out) {
|
| + Random random = new Random();
|
| +
|
| + // Writing a random 8 bytes message.
|
| + byte[] bytes = new byte[8];
|
| + random.nextBytes(bytes);
|
| + ByteBuffer buffer = ByteBuffer.allocateDirect(bytes.length);
|
| + buffer.put(bytes);
|
| + in.writeMessage(buffer, null, MessagePipeHandle.WriteFlags.none());
|
| +
|
| + // Try to read into a small buffer.
|
| + ByteBuffer receiveBuffer = ByteBuffer.allocateDirect(bytes.length / 2);
|
| + MessagePipeHandle.ReadMessageResult result = out.readMessage(receiveBuffer, 0,
|
| + MessagePipeHandle.ReadFlags.none());
|
| + assertFalse(result.wasMessageRead);
|
| + assertEquals(bytes.length, result.messageSize);
|
| + assertEquals(0, result.handlesCount);
|
| +
|
| + // Read into a correct buffer.
|
| + receiveBuffer = ByteBuffer.allocateDirect(bytes.length);
|
| + result = out.readMessage(receiveBuffer, 0,
|
| + MessagePipeHandle.ReadFlags.none());
|
| + assertEquals(bytes.length, result.messageSize);
|
| + assertEquals(0, result.handlesCount);
|
| + assertEquals(0, receiveBuffer.position());
|
| + assertEquals(result.messageSize, receiveBuffer.limit());
|
| + byte[] receivedBytes = new byte[result.messageSize];
|
| + receiveBuffer.get(receivedBytes);
|
| + assertTrue(Arrays.equals(bytes, receivedBytes));
|
| +
|
| + }
|
| +
|
| + /**
|
| + * TODO(qsr):
|
| + */
|
| + @SmallTest
|
| + public void testWaitMany() {
|
| + Core core = CoreImpl.getInstance();
|
| + Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe();
|
| +
|
| + List<Pair<Handle, WaitFlags>> handlesToWaitOn = new ArrayList<
|
| + Pair<Handle, WaitFlags>>();
|
| +
|
| + handlesToWaitOn.add(
|
| + new Pair<Handle, WaitFlags>(handles.second, WaitFlags.none().readable(true)));
|
| + handlesToWaitOn.add(
|
| + new Pair<Handle, WaitFlags>(handles.first, WaitFlags.none().writable(true)));
|
| + WaitManyResult result = core.waitMany(handlesToWaitOn, 0);
|
| + assertEquals(MojoResult.OK, result.mojoResult);
|
| + assertEquals(1, result.handleIndex);
|
| +
|
| + handlesToWaitOn.clear();
|
| + handlesToWaitOn.add(
|
| + new Pair<Handle, WaitFlags>(handles.first, WaitFlags.none().writable(true)));
|
| + handlesToWaitOn.add(
|
| + new Pair<Handle, WaitFlags>(handles.second, WaitFlags.none().readable(true)));
|
| + result = core.waitMany(handlesToWaitOn, 0);
|
| + assertEquals(MojoResult.OK, result.mojoResult);
|
| + assertEquals(0, result.handleIndex);
|
| + }
|
| +
|
| + /**
|
| + * TODO(qsr):
|
| + *
|
| + * @throws InterruptedException
|
| + */
|
| + @SmallTest
|
| + public void testMessagePipeEmpty() throws InterruptedException {
|
| + Core core = CoreImpl.getInstance();
|
| + Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe();
|
| +
|
| + // Testing wait.
|
| + assertEquals(MojoResult.OK, handles.first.wait(WaitFlags.all(), 0));
|
| + assertEquals(MojoResult.OK, handles.first.wait(WaitFlags.none().writable(true), 0));
|
| + assertEquals(MojoResult.DEADLINE_EXCEEDED,
|
| + handles.first.wait(WaitFlags.none().readable(true), 0));
|
| +
|
| + // Testing read on an empty pipe.
|
| + boolean exception = false;
|
| + try {
|
| + handles.first.readMessage(null, 0, MessagePipeHandle.ReadFlags.none());
|
| + } catch (MojoException e) {
|
| + assertEquals(MojoResult.SHOULD_WAIT, e.getMojoResult());
|
| + exception = true;
|
| + }
|
| + assertTrue(exception);
|
| +
|
| + // Closing a pipe while waiting.
|
| + Thread t = new Thread(new ExecuteAfterDelay(new CloseHandle(handles.first), 20));
|
| + t.start();
|
| + assertEquals(MojoResult.CANCELLED,
|
| + handles.first.wait(WaitFlags.none().readable(true), 1000000L));
|
| + t.join();
|
| +
|
| + handles = core.createMessagePipe();
|
| +
|
| + // Closing the other pipe while waiting.
|
| + t = new Thread(new ExecuteAfterDelay(new CloseHandle(handles.first), 20));
|
| + t.start();
|
| + assertEquals(MojoResult.FAILED_PRECONDITION,
|
| + handles.second.wait(WaitFlags.none().readable(true), 1000000L));
|
| + t.join();
|
| +
|
| + // Waiting on a closed pipe.
|
| + assertEquals(MojoResult.FAILED_PRECONDITION,
|
| + handles.second.wait(WaitFlags.none().readable(true), 0));
|
| + assertEquals(MojoResult.FAILED_PRECONDITION,
|
| + handles.second.wait(WaitFlags.none().writable(true), 0));
|
| +
|
| + }
|
| +
|
| + /**
|
| + * TODO(qsr):
|
| + */
|
| + @SmallTest
|
| + public void testMessagePipeSend() {
|
| + Core core = CoreImpl.getInstance();
|
| + Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe();
|
| +
|
| + checkSendingMessage(handles.first, handles.second);
|
| + checkSendingMessage(handles.second, handles.first);
|
| + }
|
| +
|
| + /**
|
| + * TODO(qsr):
|
| + */
|
| + @SmallTest
|
| + public void testMessagePipeSendHandles() {
|
| + Core core = CoreImpl.getInstance();
|
| + Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe();
|
| + Pair<MessagePipeHandle, MessagePipeHandle> handlesToShare = core.createMessagePipe();
|
| +
|
| + handles.first.writeMessage(null,
|
| + Collections.<Handle> singletonList(handlesToShare.second),
|
| + WriteFlags.none());
|
| + assertFalse(handlesToShare.second.isValid());
|
| + ReadMessageResult readMessageResult = handles.second.readMessage(null, 1, ReadFlags.none());
|
| + assertEquals(1, readMessageResult.handlesCount);
|
| + MessagePipeHandle newHandle = readMessageResult.handles.get(0).toMessagePipeHandle();
|
| + assertTrue(newHandle.isValid());
|
| +
|
| + checkSendingMessage(handlesToShare.first, newHandle);
|
| + }
|
| +
|
| + /**
|
| + * TODO(qsr):
|
| + */
|
| + @SmallTest
|
| + public void testDataPipeSend() {
|
| + Core core = CoreImpl.getInstance();
|
| + Pair<DataPipe.ProducerHandle, DataPipe.ConsumerHandle> handles = core.createDataPipe(null);
|
| +
|
| + Random random = new Random();
|
| +
|
| + // Writing a random 8 bytes message.
|
| + byte[] bytes = new byte[8];
|
| + random.nextBytes(bytes);
|
| + ByteBuffer buffer = ByteBuffer.allocateDirect(bytes.length);
|
| + buffer.put(bytes);
|
| + int result = handles.first.writeData(buffer, DataPipe.WriteFlags.none());
|
| + assertEquals(bytes.length, result);
|
| +
|
| + // Read into a buffer.
|
| + ByteBuffer receiveBuffer = ByteBuffer.allocateDirect(bytes.length);
|
| + result = handles.second.readData(receiveBuffer,
|
| + DataPipe.ReadFlags.none());
|
| + assertEquals(bytes.length, result);
|
| + assertEquals(0, receiveBuffer.position());
|
| + assertEquals(bytes.length, receiveBuffer.limit());
|
| + byte[] receivedBytes = new byte[bytes.length];
|
| + receiveBuffer.get(receivedBytes);
|
| + assertTrue(Arrays.equals(bytes, receivedBytes));
|
| + }
|
| +
|
| + /**
|
| + * TODO(qsr):
|
| + */
|
| + @SmallTest
|
| + public void testDataPipeTwoPhaseSend() {
|
| + Random random = new Random();
|
| + Core core = CoreImpl.getInstance();
|
| + Pair<DataPipe.ProducerHandle, DataPipe.ConsumerHandle> handles = core.createDataPipe(null);
|
| +
|
| + // Writing a random 8 bytes message.
|
| + byte[] bytes = new byte[8];
|
| + random.nextBytes(bytes);
|
| + ByteBuffer buffer = handles.first.beingWriteData(bytes.length, DataPipe.WriteFlags.none());
|
| + assertTrue(buffer.capacity() >= bytes.length);
|
| + buffer.put(bytes);
|
| + handles.first.endWriteData(bytes.length);
|
| +
|
| + // Read into a buffer.
|
| + ByteBuffer receiveBuffer = handles.second.beingReadData(bytes.length,
|
| + DataPipe.ReadFlags.none());
|
| + assertEquals(0, receiveBuffer.position());
|
| + assertEquals(bytes.length, receiveBuffer.limit());
|
| + byte[] receivedBytes = new byte[bytes.length];
|
| + receiveBuffer.get(receivedBytes);
|
| + assertTrue(Arrays.equals(bytes, receivedBytes));
|
| + handles.second.endReadData(bytes.length);
|
| + }
|
| +
|
| + /**
|
| + * TODO(qsr):
|
| + */
|
| + @SmallTest
|
| + public void testSharedBuffer() {
|
| + Random random = new Random();
|
| + Core core = CoreImpl.getInstance();
|
| +
|
| + SharedBufferHandle handle = core.createSharedBuffer(null, 8);
|
| + SharedBufferHandle newHandle = handle.duplicate(null);
|
| + ByteBuffer buffer1 = handle.map(0, 8, MapFlags.none());
|
| + assertEquals(8, buffer1.capacity());
|
| + ByteBuffer buffer2 = newHandle.map(0, 8, MapFlags.none());
|
| + assertEquals(8, buffer2.capacity());
|
| +
|
| + byte[] bytes = new byte[8];
|
| + random.nextBytes(bytes);
|
| + buffer1.put(bytes);
|
| +
|
| + byte[] receivedBytes = new byte[bytes.length];
|
| + buffer2.get(receivedBytes);
|
| +
|
| + assertTrue(Arrays.equals(bytes, receivedBytes));
|
| +
|
| + handle.unmap(buffer1);
|
| + newHandle.unmap(buffer2);
|
| + }
|
| +
|
| + private native void nativeInitApplicationContext(Context context);
|
| +}
|
|
|