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

Unified Diff: mojo/system/android/javatests/src/org/chromium/mojo/system/CoreTest.java

Issue 228723002: Java API for mojo system. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Adding shared handle. Created 6 years, 8 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 side-by-side diff with in-line comments
Download patch
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);
+}

Powered by Google App Engine
This is Rietveld 408576698