OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Tests launched by extensions/renderer/api/serial/data_receiver_unittest.cc | 5 // Tests launched by extensions/renderer/api/serial/data_receiver_unittest.cc |
6 | 6 |
7 var test = require('test').binding; | 7 var test = require('test').binding; |
8 var unittestBindings = require('test_environment_specific_bindings'); | 8 var unittestBindings = require('test_environment_specific_bindings'); |
9 | 9 |
10 var fatalErrorValue = 2; | 10 var BUFFER_SIZE = 10; |
11 var bufferSize = 10; | 11 var FATAL_ERROR = 2; |
12 | 12 |
| 13 // Returns a promise to a newly created DataReceiver. |
13 function createReceiver() { | 14 function createReceiver() { |
14 return Promise.all([ | 15 return Promise.all([ |
15 requireAsync('content/public/renderer/service_provider'), | 16 requireAsync('content/public/renderer/service_provider'), |
16 requireAsync('data_receiver'), | 17 requireAsync('data_receiver'), |
17 requireAsync('device/serial/data_stream.mojom'), | 18 requireAsync('device/serial/data_stream.mojom'), |
18 ]).then(test.callbackPass(function(modules) { | 19 ]).then(function(modules) { |
19 var serviceProvider = modules[0]; | 20 var serviceProvider = modules[0]; |
20 var dataReceiver = modules[1]; | 21 var dataReceiver = modules[1]; |
21 var dataStream = modules[2]; | 22 var dataStream = modules[2]; |
22 return new dataReceiver.DataReceiver( | 23 return new dataReceiver.DataReceiver( |
23 serviceProvider.connectToService(dataStream.DataSourceProxy.NAME_), | 24 serviceProvider.connectToService(dataStream.DataSourceProxy.NAME_), |
24 bufferSize, | 25 BUFFER_SIZE, |
25 fatalErrorValue); | 26 FATAL_ERROR); |
26 })); | 27 }); |
| 28 } |
| 29 |
| 30 // Returns a promise that will resolve to |receiver| when it has received an |
| 31 // error from its DataSource. |
| 32 function waitForReceiveError(receiver) { |
| 33 return new Promise(function(resolve, reject) { |
| 34 var onError = receiver.onError; |
| 35 receiver.onError = function() { |
| 36 $Function.apply(onError, receiver, arguments); |
| 37 resolve(receiver); |
| 38 }; |
| 39 }); |
| 40 } |
| 41 |
| 42 // Returns a function that receives data from a provided DataReceiver |
| 43 // |receiver|, checks that it matches the expected data and returns a promise |
| 44 // that will resolve to |receiver|. |
| 45 function receiveAndCheckData(expectedData) { |
| 46 return function(receiver) { |
| 47 return receiver.receive().then(function(data) { |
| 48 test.assertEq(expectedData.length, data.byteLength); |
| 49 for (var i = 0; i < expectedData.length; i++) |
| 50 test.assertEq(expectedData.charCodeAt(i), new Int8Array(data)[i]); |
| 51 return receiver; |
| 52 }); |
| 53 test.assertThrows( |
| 54 receiver.receive, receiver, [], 'Receive already in progress.'); |
| 55 }; |
| 56 } |
| 57 |
| 58 // Returns a function that attempts to receive data from a provided DataReceiver |
| 59 // |receiver|, checks that the correct error is reported and returns a promise |
| 60 // that will resolve to |receiver|. |
| 61 function receiveAndCheckError(expectedError) { |
| 62 return function(receiver) { |
| 63 return receiver.receive().catch(function(error) { |
| 64 test.assertEq(expectedError, error.error); |
| 65 return receiver; |
| 66 }); |
| 67 test.assertThrows( |
| 68 receiver.receive, receiver, [], 'Receive already in progress.'); |
| 69 }; |
| 70 } |
| 71 |
| 72 // Serializes and deserializes the provided DataReceiver |receiver|, returning |
| 73 // a promise that will resolve to the newly deserialized DataReceiver. |
| 74 function serializeRoundTrip(receiver) { |
| 75 return Promise.all([ |
| 76 receiver.serialize(), |
| 77 requireAsync('data_receiver'), |
| 78 ]).then(function(promises) { |
| 79 var serialized = promises[0]; |
| 80 var dataReceiverModule = promises[1]; |
| 81 return dataReceiverModule.DataReceiver.deserialize(serialized); |
| 82 }); |
| 83 } |
| 84 |
| 85 // Closes and returns the provided DataReceiver |receiver|. |
| 86 function closeReceiver(receiver) { |
| 87 receiver.close(); |
| 88 return receiver; |
27 } | 89 } |
28 | 90 |
29 unittestBindings.exportTests([ | 91 unittestBindings.exportTests([ |
30 function testReceive() { | 92 function testReceive() { |
31 createReceiver().then(test.callbackPass(function(receiver) { | 93 createReceiver() |
32 receiver.receive().then(test.callbackPass(function(data) { | 94 .then(receiveAndCheckData('a')) |
33 test.assertEq(1, data.byteLength); | 95 .then(closeReceiver) |
34 test.assertEq('a'.charCodeAt(0), new Int8Array(data)[0]); | 96 .then(test.succeed, test.fail); |
35 receiver.close(); | |
36 })); | |
37 test.assertThrows( | |
38 receiver.receive, receiver, [], 'Receive already in progress.'); | |
39 })); | |
40 }, | 97 }, |
41 | 98 |
42 function testReceiveError() { | 99 function testReceiveError() { |
43 createReceiver().then(test.callbackPass(function(receiver) { | 100 createReceiver() |
44 receiver.receive().catch(test.callbackPass(function(error) { | 101 .then(receiveAndCheckError(1)) |
45 test.assertEq(1, error.error); | 102 .then(closeReceiver) |
46 receiver.close(); | 103 .then(test.succeed, test.fail); |
47 })); | |
48 })); | |
49 }, | 104 }, |
50 | 105 |
51 function testReceiveDataAndError() { | 106 function testReceiveDataAndError() { |
52 createReceiver().then(test.callbackPass(function(receiver) { | 107 createReceiver() |
53 receiver.receive().then(test.callbackPass(function(data) { | 108 .then(receiveAndCheckData('a')) |
54 test.assertEq(1, data.byteLength); | 109 .then(receiveAndCheckError(1)) |
55 test.assertEq('a'.charCodeAt(0), new Int8Array(data)[0]); | 110 .then(receiveAndCheckData('b')) |
56 return receiver.receive(); | 111 .then(closeReceiver) |
57 })).catch(test.callbackPass(function(error) { | 112 .then(test.succeed, test.fail); |
58 test.assertEq(1, error.error); | |
59 return receiver.receive(); | |
60 })).then(test.callbackPass(function(data) { | |
61 test.assertEq(1, data.byteLength); | |
62 test.assertEq('b'.charCodeAt(0), new Int8Array(data)[0]); | |
63 receiver.close(); | |
64 })); | |
65 })); | |
66 }, | 113 }, |
67 | 114 |
68 function testReceiveErrorThenData() { | 115 function testReceiveErrorThenData() { |
69 createReceiver().then(test.callbackPass(function(receiver) { | 116 createReceiver() |
70 receiver.receive().catch(test.callbackPass(function(error) { | 117 .then(receiveAndCheckError(1)) |
71 test.assertEq(1, error.error); | 118 .then(receiveAndCheckData('a')) |
72 return receiver.receive(); | 119 .then(closeReceiver) |
73 })).then(test.callbackPass(function(data) { | 120 .then(test.succeed, test.fail); |
74 test.assertEq(1, data.byteLength); | 121 }, |
75 test.assertEq('a'.charCodeAt(0), new Int8Array(data)[0]); | 122 |
76 receiver.close(); | 123 function testReceiveBeforeAndAfterSerialization() { |
77 })); | 124 createReceiver() |
78 })); | 125 .then(receiveAndCheckData('a')) |
| 126 .then(serializeRoundTrip) |
| 127 .then(receiveAndCheckData('b')) |
| 128 .then(closeReceiver) |
| 129 .then(test.succeed, test.fail); |
| 130 }, |
| 131 |
| 132 function testReceiveErrorSerialization() { |
| 133 createReceiver() |
| 134 .then(waitForReceiveError) |
| 135 .then(serializeRoundTrip) |
| 136 .then(receiveAndCheckError(1)) |
| 137 .then(receiveAndCheckError(3)) |
| 138 .then(closeReceiver) |
| 139 .then(test.succeed, test.fail); |
| 140 }, |
| 141 |
| 142 function testReceiveDataAndErrorSerialization() { |
| 143 createReceiver() |
| 144 .then(waitForReceiveError) |
| 145 .then(receiveAndCheckData('a')) |
| 146 .then(serializeRoundTrip) |
| 147 .then(receiveAndCheckError(1)) |
| 148 .then(receiveAndCheckData('b')) |
| 149 .then(receiveAndCheckError(3)) |
| 150 .then(closeReceiver) |
| 151 .then(test.succeed, test.fail); |
| 152 }, |
| 153 |
| 154 function testSerializeDuringReceive() { |
| 155 var receiver = createReceiver(); |
| 156 Promise.all([ |
| 157 receiver.then(receiveAndCheckError(FATAL_ERROR)), |
| 158 receiver |
| 159 .then(serializeRoundTrip) |
| 160 .then(receiveAndCheckData('a')) |
| 161 .then(closeReceiver) |
| 162 ]).then(test.succeed, test.fail); |
| 163 }, |
| 164 |
| 165 function testSerializeAfterClose() { |
| 166 function receiveAfterClose(receiver) { |
| 167 test.assertThrows( |
| 168 receiver.receive, receiver, [], 'DataReceiver has been closed'); |
| 169 } |
| 170 |
| 171 createReceiver() |
| 172 .then(closeReceiver) |
| 173 .then(serializeRoundTrip) |
| 174 .then(receiveAfterClose) |
| 175 .then(test.succeed, test.fail); |
79 }, | 176 }, |
80 | 177 |
81 function testSourceShutdown() { | 178 function testSourceShutdown() { |
82 createReceiver().then(test.callbackPass(function(receiver) { | 179 createReceiver() |
83 receiver.receive().catch(test.callbackPass(function(error) { | 180 .then(receiveAndCheckError(FATAL_ERROR)) |
84 test.assertEq(fatalErrorValue, error.error); | 181 .then(closeReceiver) |
85 receiver.close(); | 182 .then(test.succeed, test.fail); |
86 })); | |
87 })); | |
88 }, | 183 }, |
89 | 184 |
90 ], test.runTests, exports); | 185 ], test.runTests, exports); |
OLD | NEW |