| // Copyright 2014 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.bindings; |
| |
| import android.support.test.filters.SmallTest; |
| |
| import org.chromium.mojo.MojoTestCase; |
| import org.chromium.mojo.bindings.BindingsTestUtils.RecordingMessageReceiver; |
| import org.chromium.mojo.system.Core; |
| import org.chromium.mojo.system.DataPipe; |
| import org.chromium.mojo.system.Handle; |
| import org.chromium.mojo.system.MessagePipeHandle; |
| import org.chromium.mojo.system.MojoException; |
| import org.chromium.mojo.system.MojoResult; |
| import org.chromium.mojo.system.Pair; |
| import org.chromium.mojo.system.impl.CoreImpl; |
| |
| import java.nio.ByteBuffer; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.List; |
| |
| /** |
| * Testing {@link Connector#readAndDispatchMessage}. |
| */ |
| public class ReadAndDispatchMessageTest extends MojoTestCase { |
| |
| private static final int DATA_SIZE = 1024; |
| |
| private ByteBuffer mData; |
| private Pair<MessagePipeHandle, MessagePipeHandle> mHandles; |
| private List<Handle> mHandlesToSend = new ArrayList<Handle>(); |
| private List<Handle> mHandlesToClose = new ArrayList<Handle>(); |
| private RecordingMessageReceiver mMessageReceiver; |
| |
| /** |
| * @see org.chromium.mojo.MojoTestCase#setUp() |
| */ |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| Core core = CoreImpl.getInstance(); |
| mData = BindingsTestUtils.newRandomMessage(DATA_SIZE).getData(); |
| mMessageReceiver = new RecordingMessageReceiver(); |
| mHandles = core.createMessagePipe(new MessagePipeHandle.CreateOptions()); |
| Pair<DataPipe.ProducerHandle, DataPipe.ConsumerHandle> datapipe = core.createDataPipe(null); |
| mHandlesToSend.addAll(Arrays.asList(datapipe.first, datapipe.second)); |
| mHandlesToClose.addAll(Arrays.asList(mHandles.first, mHandles.second)); |
| mHandlesToClose.addAll(mHandlesToSend); |
| } |
| |
| /** |
| * @see org.chromium.mojo.MojoTestCase#tearDown() |
| */ |
| @Override |
| protected void tearDown() throws Exception { |
| for (Handle handle : mHandlesToClose) { |
| handle.close(); |
| } |
| super.tearDown(); |
| } |
| |
| /** |
| * Testing {@link Connector#readAndDispatchMessage(MessagePipeHandle, MessageReceiver)} |
| */ |
| @SmallTest |
| public void testReadAndDispatchMessage() { |
| mHandles.first.writeMessage(mData, mHandlesToSend, MessagePipeHandle.WriteFlags.NONE); |
| assertEquals(MojoResult.OK, Connector.readAndDispatchMessage(mHandles.second, |
| mMessageReceiver).getMojoResult()); |
| assertEquals(1, mMessageReceiver.messages.size()); |
| Message message = mMessageReceiver.messages.get(0); |
| mHandlesToClose.addAll(message.getHandles()); |
| assertEquals(mData, message.getData()); |
| assertEquals(2, message.getHandles().size()); |
| for (Handle handle : message.getHandles()) { |
| assertTrue(handle.isValid()); |
| } |
| } |
| |
| /** |
| * Testing {@link Connector#readAndDispatchMessage(MessagePipeHandle, MessageReceiver)} |
| * with no message available. |
| */ |
| @SmallTest |
| public void testReadAndDispatchMessageOnEmptyHandle() { |
| assertEquals(MojoResult.SHOULD_WAIT, Connector.readAndDispatchMessage(mHandles.second, |
| mMessageReceiver).getMojoResult()); |
| assertEquals(0, mMessageReceiver.messages.size()); |
| } |
| |
| /** |
| * Testing {@link Connector#readAndDispatchMessage(MessagePipeHandle, MessageReceiver)} |
| * on closed handle. |
| */ |
| @SmallTest |
| public void testReadAndDispatchMessageOnClosedHandle() { |
| mHandles.first.close(); |
| try { |
| Connector.readAndDispatchMessage(mHandles.second, mMessageReceiver); |
| fail("MojoException should have been thrown"); |
| } catch (MojoException expected) { |
| assertEquals(MojoResult.FAILED_PRECONDITION, expected.getMojoResult()); |
| } |
| assertEquals(0, mMessageReceiver.messages.size()); |
| } |
| } |