1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.mojo.bindings; 6 7 import android.test.suitebuilder.annotation.SmallTest; 8 9 import org.chromium.mojo.MojoTestCase; 10 import org.chromium.mojo.bindings.BindingsTestUtils.RecordingMessageReceiver; 11 import org.chromium.mojo.system.Core; 12 import org.chromium.mojo.system.DataPipe; 13 import org.chromium.mojo.system.Handle; 14 import org.chromium.mojo.system.MessagePipeHandle; 15 import org.chromium.mojo.system.MojoException; 16 import org.chromium.mojo.system.MojoResult; 17 import org.chromium.mojo.system.Pair; 18 import org.chromium.mojo.system.impl.CoreImpl; 19 20 import java.nio.ByteBuffer; 21 import java.util.ArrayList; 22 import java.util.Arrays; 23 import java.util.List; 24 25 /** 26 * Testing {@link Connector#readAndDispatchMessage}. 27 */ 28 public class ReadAndDispatchMessageTest extends MojoTestCase { 29 30 private static final int DATA_SIZE = 1024; 31 32 private ByteBuffer mData; 33 private Pair<MessagePipeHandle, MessagePipeHandle> mHandles; 34 private List<Handle> mHandlesToSend = new ArrayList<Handle>(); 35 private List<Handle> mHandlesToClose = new ArrayList<Handle>(); 36 private RecordingMessageReceiver mMessageReceiver; 37 38 /** 39 * @see org.chromium.mojo.MojoTestCase#setUp() 40 */ 41 @Override setUp()42 protected void setUp() throws Exception { 43 super.setUp(); 44 Core core = CoreImpl.getInstance(); 45 mData = BindingsTestUtils.newRandomMessage(DATA_SIZE).getData(); 46 mMessageReceiver = new RecordingMessageReceiver(); 47 mHandles = core.createMessagePipe(new MessagePipeHandle.CreateOptions()); 48 Pair<DataPipe.ProducerHandle, DataPipe.ConsumerHandle> datapipe = core.createDataPipe(null); 49 mHandlesToSend.addAll(Arrays.asList(datapipe.first, datapipe.second)); 50 mHandlesToClose.addAll(Arrays.asList(mHandles.first, mHandles.second)); 51 mHandlesToClose.addAll(mHandlesToSend); 52 } 53 54 /** 55 * @see org.chromium.mojo.MojoTestCase#tearDown() 56 */ 57 @Override tearDown()58 protected void tearDown() throws Exception { 59 for (Handle handle : mHandlesToClose) { 60 handle.close(); 61 } 62 super.tearDown(); 63 } 64 65 /** 66 * Testing {@link Connector#readAndDispatchMessage(MessagePipeHandle, MessageReceiver)} 67 */ 68 @SmallTest testReadAndDispatchMessage()69 public void testReadAndDispatchMessage() { 70 mHandles.first.writeMessage(mData, mHandlesToSend, MessagePipeHandle.WriteFlags.NONE); 71 assertEquals(MojoResult.OK, Connector.readAndDispatchMessage(mHandles.second, 72 mMessageReceiver).getMojoResult()); 73 assertEquals(1, mMessageReceiver.messages.size()); 74 Message message = mMessageReceiver.messages.get(0); 75 mHandlesToClose.addAll(message.getHandles()); 76 assertEquals(mData, message.getData()); 77 assertEquals(2, message.getHandles().size()); 78 for (Handle handle : message.getHandles()) { 79 assertTrue(handle.isValid()); 80 } 81 } 82 83 /** 84 * Testing {@link Connector#readAndDispatchMessage(MessagePipeHandle, MessageReceiver)} 85 * with no message available. 86 */ 87 @SmallTest testReadAndDispatchMessageOnEmptyHandle()88 public void testReadAndDispatchMessageOnEmptyHandle() { 89 assertEquals(MojoResult.SHOULD_WAIT, Connector.readAndDispatchMessage(mHandles.second, 90 mMessageReceiver).getMojoResult()); 91 assertEquals(0, mMessageReceiver.messages.size()); 92 } 93 94 /** 95 * Testing {@link Connector#readAndDispatchMessage(MessagePipeHandle, MessageReceiver)} 96 * on closed handle. 97 */ 98 @SmallTest testReadAndDispatchMessageOnClosedHandle()99 public void testReadAndDispatchMessageOnClosedHandle() { 100 mHandles.first.close(); 101 try { 102 Connector.readAndDispatchMessage(mHandles.second, mMessageReceiver); 103 fail("MojoException should have been thrown"); 104 } catch (MojoException expected) { 105 assertEquals(MojoResult.FAILED_PRECONDITION, expected.getMojoResult()); 106 } 107 assertEquals(0, mMessageReceiver.messages.size()); 108 } 109 } 110