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 MessagePipeHandle mHandle;
28 private Router mRouter;
29 private RecordingMessageReceiverWithResponder mReceiver;
30 private CapturingErrorHandler mErrorHandler;
33 * @see MojoTestCase#setUp()
36 protected void setUp() throws Exception {
38 Core core = CoreImpl.getInstance();
39 Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null);
40 mHandle = handles.first;
41 mRouter = new RouterImpl(handles.second);
42 mReceiver = new RecordingMessageReceiverWithResponder();
43 mRouter.setIncomingMessageReceiver(mReceiver);
44 mErrorHandler = new CapturingErrorHandler();
45 mRouter.setErrorHandler(mErrorHandler);
50 * Testing sending a message via the router that expected a response.
53 public void testSendingToRouterWithResponse() {
54 final int requestMessageType = 0xdead;
55 final int responseMessageType = 0xbeaf;
57 // Sending a message expecting a response.
58 MessageHeader header = new MessageHeader(requestMessageType,
59 MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG, 0);
60 Encoder encoder = new Encoder(CoreImpl.getInstance(), header.getSize());
61 header.encode(encoder);
62 mRouter.acceptWithResponder(encoder.getMessage(), mReceiver);
63 ByteBuffer receiveBuffer = ByteBuffer.allocateDirect(header.getSize());
64 MessagePipeHandle.ReadMessageResult result = mHandle.readMessage(receiveBuffer, 0,
65 MessagePipeHandle.ReadFlags.NONE);
67 assertEquals(MojoResult.OK, result.getMojoResult());
68 MessageHeader receivedHeader = new Message(
69 receiveBuffer, new ArrayList<Handle>()).asServiceMessage().getHeader();
71 assertEquals(header.getType(), receivedHeader.getType());
72 assertEquals(header.getFlags(), receivedHeader.getFlags());
73 assertTrue(receivedHeader.getRequestId() != 0);
75 // Sending the response.
76 MessageHeader responseHeader = new MessageHeader(responseMessageType,
77 MessageHeader.MESSAGE_IS_RESPONSE_FLAG, receivedHeader.getRequestId());
78 encoder = new Encoder(CoreImpl.getInstance(), header.getSize());
79 responseHeader.encode(encoder);
80 Message responseMessage = encoder.getMessage();
81 mHandle.writeMessage(responseMessage.getData(), new ArrayList<Handle>(),
82 MessagePipeHandle.WriteFlags.NONE);
85 assertEquals(1, mReceiver.messages.size());
86 ServiceMessage receivedResponseMessage = mReceiver.messages.get(0).asServiceMessage();
87 assertEquals(MessageHeader.MESSAGE_IS_RESPONSE_FLAG,
88 receivedResponseMessage.getHeader().getFlags());
89 assertEquals(responseMessage.getData(), receivedResponseMessage.getData());
93 * Testing receiving a message via the router that expected a response.
96 public void testReceivingViaRouterWithResponse() {
97 final int requestMessageType = 0xdead;
98 final int responseMessageType = 0xbeef;
99 final int requestId = 0xdeadbeaf;
101 // Sending a message expecting a response.
102 MessageHeader header = new MessageHeader(requestMessageType,
103 MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG, requestId);
104 Encoder encoder = new Encoder(CoreImpl.getInstance(), header.getSize());
105 header.encode(encoder);
106 Message headerMessage = encoder.getMessage();
107 mHandle.writeMessage(headerMessage.getData(), new ArrayList<Handle>(),
108 MessagePipeHandle.WriteFlags.NONE);
111 assertEquals(1, mReceiver.messagesWithReceivers.size());
112 Pair<Message, MessageReceiver> receivedMessage =
113 mReceiver.messagesWithReceivers.get(0);
114 assertEquals(headerMessage.getData(), receivedMessage.first.getData());
116 // Sending the response.
117 MessageHeader responseHeader = new MessageHeader(responseMessageType,
118 MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG, requestId);
119 encoder = new Encoder(CoreImpl.getInstance(), header.getSize());
120 responseHeader.encode(encoder);
121 Message message = encoder.getMessage();
122 receivedMessage.second.accept(message);
123 ByteBuffer receivedResponseMessage = ByteBuffer.allocateDirect(responseHeader.getSize());
124 MessagePipeHandle.ReadMessageResult result = mHandle.readMessage(receivedResponseMessage, 0,
125 MessagePipeHandle.ReadFlags.NONE);
127 assertEquals(MojoResult.OK, result.getMojoResult());
128 assertEquals(message.getData(), receivedResponseMessage);