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.
5 package org.chromium.mojo.bindings;
7 import android.test.suitebuilder.annotation.SmallTest;
9 import org.chromium.mojo.MojoTestCase;
10 import org.chromium.mojo.bindings.BindingsTestUtils.CapturingErrorHandler;
11 import org.chromium.mojo.bindings.BindingsTestUtils.RecordingMessageReceiverWithResponder;
12 import org.chromium.mojo.system.Core;
13 import org.chromium.mojo.system.Handle;
14 import org.chromium.mojo.system.MessagePipeHandle;
15 import org.chromium.mojo.system.MojoResult;
16 import org.chromium.mojo.system.Pair;
17 import org.chromium.mojo.system.impl.CoreImpl;
19 import java.nio.ByteBuffer;
20 import java.util.ArrayList;
23 * Testing {@link Router}
25 public class RouterTest extends MojoTestCase {
27 private static final long RUN_LOOP_TIMEOUT_MS = 25;
29 private MessagePipeHandle mHandle;
30 private Router mRouter;
31 private RecordingMessageReceiverWithResponder mReceiver;
32 private CapturingErrorHandler mErrorHandler;
35 * @see MojoTestCase#setUp()
38 protected void setUp() throws Exception {
40 Core core = CoreImpl.getInstance();
41 Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null);
42 mHandle = handles.first;
43 mRouter = new RouterImpl(handles.second);
44 mReceiver = new RecordingMessageReceiverWithResponder();
45 mRouter.setIncomingMessageReceiver(mReceiver);
46 mErrorHandler = new CapturingErrorHandler();
47 mRouter.setErrorHandler(mErrorHandler);
52 * Testing sending a message via the router that expected a response.
55 public void testSendingToRouterWithResponse() {
56 final int requestMessageType = 0xdead;
57 final int responseMessageType = 0xbeaf;
59 // Sending a message expecting a response.
60 MessageHeader header = new MessageHeader(requestMessageType,
61 MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG, 0);
62 Encoder encoder = new Encoder(CoreImpl.getInstance(), header.getSize());
63 header.encode(encoder);
64 mRouter.acceptWithResponder(encoder.getMessage(), mReceiver);
65 ByteBuffer receiveBuffer = ByteBuffer.allocateDirect(header.getSize());
66 MessagePipeHandle.ReadMessageResult result = mHandle.readMessage(receiveBuffer, 0,
67 MessagePipeHandle.ReadFlags.NONE);
69 assertEquals(MojoResult.OK, result.getMojoResult());
70 MessageHeader receivedHeader = new Message(
71 receiveBuffer, new ArrayList<Handle>()).asServiceMessage().getHeader();
73 assertEquals(header.getType(), receivedHeader.getType());
74 assertEquals(header.getFlags(), receivedHeader.getFlags());
75 assertTrue(receivedHeader.getRequestId() != 0);
77 // Sending the response.
78 MessageHeader responseHeader = new MessageHeader(responseMessageType,
79 MessageHeader.MESSAGE_IS_RESPONSE_FLAG, receivedHeader.getRequestId());
80 encoder = new Encoder(CoreImpl.getInstance(), header.getSize());
81 responseHeader.encode(encoder);
82 Message responseMessage = encoder.getMessage();
83 mHandle.writeMessage(responseMessage.getData(), new ArrayList<Handle>(),
84 MessagePipeHandle.WriteFlags.NONE);
85 nativeRunLoop(RUN_LOOP_TIMEOUT_MS);
87 assertEquals(1, mReceiver.messages.size());
88 ServiceMessage receivedResponseMessage = mReceiver.messages.get(0).asServiceMessage();
89 assertEquals(MessageHeader.MESSAGE_IS_RESPONSE_FLAG,
90 receivedResponseMessage.getHeader().getFlags());
91 assertEquals(responseMessage.getData(), receivedResponseMessage.getData());
95 * Testing receiving a message via the router that expected a response.
98 public void testReceivingViaRouterWithResponse() {
99 final int requestMessageType = 0xdead;
100 final int responseMessageType = 0xbeef;
101 final int requestId = 0xdeadbeaf;
103 // Sending a message expecting a response.
104 MessageHeader header = new MessageHeader(requestMessageType,
105 MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG, requestId);
106 Encoder encoder = new Encoder(CoreImpl.getInstance(), header.getSize());
107 header.encode(encoder);
108 Message headerMessage = encoder.getMessage();
109 mHandle.writeMessage(headerMessage.getData(), new ArrayList<Handle>(),
110 MessagePipeHandle.WriteFlags.NONE);
111 nativeRunLoop(RUN_LOOP_TIMEOUT_MS);
113 assertEquals(1, mReceiver.messagesWithReceivers.size());
114 Pair<Message, MessageReceiver> receivedMessage =
115 mReceiver.messagesWithReceivers.get(0);
116 assertEquals(headerMessage.getData(), receivedMessage.first.getData());
118 // Sending the response.
119 MessageHeader responseHeader = new MessageHeader(responseMessageType,
120 MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG, requestId);
121 encoder = new Encoder(CoreImpl.getInstance(), header.getSize());
122 responseHeader.encode(encoder);
123 Message message = encoder.getMessage();
124 receivedMessage.second.accept(message);
125 ByteBuffer receivedResponseMessage = ByteBuffer.allocateDirect(responseHeader.getSize());
126 MessagePipeHandle.ReadMessageResult result = mHandle.readMessage(receivedResponseMessage, 0,
127 MessagePipeHandle.ReadFlags.NONE);
129 assertEquals(MojoResult.OK, result.getMojoResult());
130 assertEquals(message.getData(), receivedResponseMessage);