Update To 11.40.268.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 MessagePipeHandle mHandle;
28     private Router mRouter;
29     private RecordingMessageReceiverWithResponder mReceiver;
30     private CapturingErrorHandler mErrorHandler;
31
32     /**
33      * @see MojoTestCase#setUp()
34      */
35     @Override
36     protected void setUp() throws Exception {
37         super.setUp();
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);
46         mRouter.start();
47     }
48
49     /**
50      * Testing sending a message via the router that expected a response.
51      */
52     @SmallTest
53     public void testSendingToRouterWithResponse() {
54         final int requestMessageType = 0xdead;
55         final int responseMessageType = 0xbeaf;
56
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);
66
67         assertEquals(MojoResult.OK, result.getMojoResult());
68         MessageHeader receivedHeader = new Message(
69                 receiveBuffer, new ArrayList<Handle>()).asServiceMessage().getHeader();
70
71         assertEquals(header.getType(), receivedHeader.getType());
72         assertEquals(header.getFlags(), receivedHeader.getFlags());
73         assertTrue(receivedHeader.getRequestId() != 0);
74
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);
83         runLoopUntilIdle();
84
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());
90     }
91
92     /**
93      * Testing receiving a message via the router that expected a response.
94      */
95     @SmallTest
96     public void testReceivingViaRouterWithResponse() {
97         final int requestMessageType = 0xdead;
98         final int responseMessageType = 0xbeef;
99         final int requestId = 0xdeadbeaf;
100
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);
109         runLoopUntilIdle();
110
111         assertEquals(1, mReceiver.messagesWithReceivers.size());
112         Pair<Message, MessageReceiver> receivedMessage =
113                 mReceiver.messagesWithReceivers.get(0);
114         assertEquals(headerMessage.getData(), receivedMessage.first.getData());
115
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);
126
127         assertEquals(MojoResult.OK, result.getMojoResult());
128         assertEquals(message.getData(), receivedResponseMessage);
129     }
130 }