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 define('mojo/apps/js/test/js_to_cpp_unittest', [
7 'mojo/apps/js/test/js_to_cpp.mojom',
8 'mojo/public/js/bindings/connection',
9 'mojo/public/js/bindings/connector',
10 'mojo/public/js/bindings/core',
11 ], function (console, jsToCpp, connection, connector, core) {
12 var retainedConnection;
16 var DATA_PIPE_PARAMS = {
17 flags: core.CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,
22 function JsSideConnection(cppSide) {
23 this.cppSide_ = cppSide;
27 JsSideConnection.prototype = Object.create(jsToCpp.JsSideStub.prototype);
29 JsSideConnection.prototype.ping = function (arg) {
30 this.cppSide_.pingResponse();
33 JsSideConnection.prototype.echo = function (numIterations, arg) {
41 // Ensure expected negative values are negative.
54 for (i = 0; i < numIterations; ++i) {
55 dataPipe1 = core.createDataPipe(DATA_PIPE_PARAMS);
56 dataPipe2 = core.createDataPipe(DATA_PIPE_PARAMS);
57 messagePipe1 = core.createMessagePipe();
58 messagePipe2 = core.createMessagePipe();
60 arg.data_handle = dataPipe1.consumerHandle;
61 arg.message_handle = messagePipe1.handle1;
63 specialArg = new jsToCpp.EchoArgs();
68 specialArg.name = 'going';
69 specialArg.data_handle = dataPipe2.consumerHandle;
70 specialArg.message_handle = messagePipe2.handle1;
72 writeDataPipe(dataPipe1, sampleData);
73 writeDataPipe(dataPipe2, sampleData);
74 writeMessagePipe(messagePipe1, sampleMessage);
75 writeMessagePipe(messagePipe2, sampleMessage);
77 this.cppSide_.echoResponse(createEchoArgsList(specialArg, arg));
79 core.close(dataPipe1.producerHandle);
80 core.close(dataPipe2.producerHandle);
81 core.close(messagePipe1.handle0);
82 core.close(messagePipe2.handle0);
84 this.cppSide_.testFinished();
87 JsSideConnection.prototype.bitFlip = function (arg) {
91 var proto = connector.Connector.prototype;
92 var stopSignalled = false;
94 proto.realAccept = proto.accept;
95 proto.accept = function (message) {
96 var offset = iteration / 8;
99 if (offset < message.buffer.arrayBuffer.byteLength) {
100 mask = 1 << (iteration % 8);
101 value = message.buffer.getUint8(offset) ^ mask;
102 message.buffer.setUint8(offset, value);
103 return this.realAccept(message);
105 stopSignalled = true;
109 while (!stopSignalled) {
110 dataPipe = core.createDataPipe(DATA_PIPE_PARAMS);
111 messagePipe = core.createMessagePipe();
112 writeDataPipe(dataPipe, sampleData);
113 writeMessagePipe(messagePipe, sampleMessage);
114 arg.data_handle = dataPipe.consumerHandle;
115 arg.message_handle = messagePipe.handle1;
117 this.cppSide_.bitFlipResponse(createEchoArgsList(arg));
119 core.close(dataPipe.producerHandle);
120 core.close(messagePipe.handle0);
124 proto.accept = proto.realAccept;
125 proto.realAccept = null;
126 this.cppSide_.testFinished();
129 JsSideConnection.prototype.backPointer = function (arg) {
133 var proto = connector.Connector.prototype;
134 var stopSignalled = false;
136 proto.realAccept = proto.accept;
137 proto.accept = function (message) {
138 var delta = 8 * (1 + iteration % 32);
139 var offset = 8 * ((iteration / 32) | 0);
140 if (offset < message.buffer.arrayBuffer.byteLength - 4) {
141 message.buffer.dataView.setUint32(offset, 0x100000000 - delta, true);
142 message.buffer.dataView.setUint32(offset + 4, 0xffffffff, true);
143 return this.realAccept(message);
145 stopSignalled = true;
149 while (!stopSignalled) {
150 dataPipe = core.createDataPipe(DATA_PIPE_PARAMS);
151 messagePipe = core.createMessagePipe();
152 writeDataPipe(dataPipe, sampleData);
153 writeMessagePipe(messagePipe, sampleMessage);
154 arg.data_handle = dataPipe.consumerHandle;
155 arg.message_handle = messagePipe.handle1;
157 this.cppSide_.backPointerResponse(createEchoArgsList(arg));
159 core.close(dataPipe.producerHandle);
160 core.close(messagePipe.handle0);
164 proto.accept = proto.realAccept;
165 proto.realAccept = null;
166 this.cppSide_.testFinished();
169 function writeDataPipe(pipe, data) {
170 var writeResult = core.writeData(
171 pipe.producerHandle, data, core.WRITE_DATA_FLAG_ALL_OR_NONE);
173 if (writeResult.result != core.RESULT_OK) {
174 console.log('ERROR: Data pipe write result was ' + writeResult.result);
177 if (writeResult.numBytes != data.length) {
178 console.log('ERROR: Data pipe write length was ' + writeResult.numBytes);
184 function writeMessagePipe(pipe, arrayBuffer) {
185 var result = core.writeMessage(pipe.handle0, arrayBuffer, [], 0);
186 if (result != core.RESULT_OK) {
187 console.log('ERROR: Message pipe write result was ' + result);
193 function createEchoArgsListElement(item, next) {
194 var list = new jsToCpp.EchoArgsList();
200 function createEchoArgsList() {
201 var genuineArray = Array.prototype.slice.call(arguments);
202 return genuineArray.reduceRight(function (previous, current) {
203 return createEchoArgsListElement(current, previous);
207 return function(handle) {
209 sampleData = new Uint8Array(DATA_PIPE_PARAMS.capacityNumBytes);
210 for (i = 0; i < sampleData.length; ++i) {
213 sampleMessage = new Uint8Array(DATA_PIPE_PARAMS.capacityNumBytes);
214 for (i = 0; i < sampleMessage.length; ++i) {
215 sampleMessage[i] = 255 - i;
217 retainedConnection = new connection.Connection(handle, JsSideConnection,
218 jsToCpp.CppSideProxy);