Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / mojo / android / javatests / src / org / chromium / mojo / bindings / RouterTest.java
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.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;
18
19 import java.nio.ByteBuffer;
20 import java.util.ArrayList;
21
22 /**
23  * Testing {@link Router}
24  */
25 public class RouterTest extends MojoTestCase {
26
27     private static final long RUN_LOOP_TIMEOUT_MS = 25;
28
29     private MessagePipeHandle mHandle;
30     private Router mRouter;
31     private RecordingMessageReceiverWithResponder mReceiver;
32     private CapturingErrorHandler mErrorHandler;
33
34     /**
35      * @see MojoTestCase#setUp()
36      */
37     @Override
38     protected void setUp() throws Exception {
39         super.setUp();
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);
48         mRouter.start();
49     }
50
51     /**
52      * Testing sending a message via the router that expected a response.
53      */
54     @SmallTest
55     public void testSendingToRouterWithResponse() {
56         final int requestMessageType = 0xdead;
57         final int responseMessageType = 0xbeaf;
58
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);
68
69         assertEquals(MojoResult.OK, result.getMojoResult());
70         MessageHeader receivedHeader = new Message(
71                 receiveBuffer, new ArrayList<Handle>()).asServiceMessage().getHeader();
72
73         assertEquals(header.getType(), receivedHeader.getType());
74         assertEquals(header.getFlags(), receivedHeader.getFlags());
75         assertTrue(receivedHeader.getRequestId() != 0);
76
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);
86
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());
92     }
93
94     /**
95      * Testing receiving a message via the router that expected a response.
96      */
97     @SmallTest
98     public void testReceivingViaRouterWithResponse() {
99         final int requestMessageType = 0xdead;
100         final int responseMessageType = 0xbeef;
101         final int requestId = 0xdeadbeaf;
102
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);
112
113         assertEquals(1, mReceiver.messagesWithReceivers.size());
114         Pair<Message, MessageReceiver> receivedMessage =
115                 mReceiver.messagesWithReceivers.get(0);
116         assertEquals(headerMessage.getData(), receivedMessage.first.getData());
117
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);
128
129         assertEquals(MojoResult.OK, result.getMojoResult());
130         assertEquals(message.getData(), receivedResponseMessage);
131     }
132 }