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 define([ | 5 define([ |
6 "console", | 6 "console", |
7 "file", | 7 "file", |
8 "gin/test/expect", | 8 "gin/test/expect", |
9 "mojo/public/interfaces/bindings/tests/validation_test_interfaces.mojom", | 9 "mojo/public/interfaces/bindings/tests/validation_test_interfaces.mojom", |
10 "mojo/public/js/bindings/buffer", | 10 "mojo/public/js/bindings/buffer", |
11 "mojo/public/js/bindings/codec", | 11 "mojo/public/js/bindings/codec", |
12 "mojo/public/js/bindings/connection", | |
13 "mojo/public/js/bindings/connector", | |
14 "mojo/public/js/bindings/core", | |
12 "mojo/public/js/bindings/tests/validation_test_input_parser", | 15 "mojo/public/js/bindings/tests/validation_test_input_parser", |
16 "mojo/public/js/bindings/router", | |
13 "mojo/public/js/bindings/validator", | 17 "mojo/public/js/bindings/validator", |
14 ], function( | 18 ], function(console, |
15 console, file, expect, testInterface, buffer, codec, parser, validator) { | 19 file, |
20 expect, | |
21 testInterface, | |
22 buffer, | |
23 codec, | |
24 connection, | |
25 connector, | |
26 core, | |
27 parser, | |
28 router, | |
29 validator) { | |
30 | |
31 var noError = validator.validationError.NONE; | |
16 | 32 |
17 function checkTestMessageParser() { | 33 function checkTestMessageParser() { |
18 function TestMessageParserFailure(message, input) { | 34 function TestMessageParserFailure(message, input) { |
19 this.message = message; | 35 this.message = message; |
20 this.input = input; | 36 this.input = input; |
21 } | 37 } |
22 | 38 |
23 TestMessageParserFailure.prototype.toString = function() { | 39 TestMessageParserFailure.prototype.toString = function() { |
24 return 'Error: ' + this.message + ' for "' + this.input + '"'; | 40 return 'Error: ' + this.message + ' for "' + this.input + '"'; |
25 } | 41 } |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
189 expect(contents).not.toBeNull(); | 205 expect(contents).not.toBeNull(); |
190 return parser.parseTestMessage(contents); | 206 return parser.parseTestMessage(contents); |
191 } | 207 } |
192 | 208 |
193 function readTestExpected(filename) { | 209 function readTestExpected(filename) { |
194 var contents = file.readFileToString(filename + ".expected"); | 210 var contents = file.readFileToString(filename + ".expected"); |
195 expect(contents).not.toBeNull(); | 211 expect(contents).not.toBeNull(); |
196 return contents.trim(); | 212 return contents.trim(); |
197 } | 213 } |
198 | 214 |
215 function checkValidationResult(testFile, err) { | |
216 var actualResult = (err === noError) ? "PASS" : err; | |
yzshen1
2014/09/15 07:08:40
wrong indent.
hansmuller
2014/09/15 16:25:26
Done.
| |
217 var expectedResult = readTestExpected(testFile); | |
218 if (actualResult != expectedResult) | |
219 console.log("[Test message validation failed: " + testFile + " ]"); | |
220 expect(actualResult).toEqual(expectedResult); | |
221 } | |
222 | |
199 function testMessageValidation(key, filters) { | 223 function testMessageValidation(key, filters) { |
200 var testFiles = getMessageTestFiles(key); | 224 var testFiles = getMessageTestFiles(key); |
201 expect(testFiles.length).toBeGreaterThan(0); | 225 expect(testFiles.length).toBeGreaterThan(0); |
202 | 226 |
203 var noError = validator.validationError.NONE; | |
204 for (var i = 0; i < testFiles.length; i++) { | 227 for (var i = 0; i < testFiles.length; i++) { |
205 // TODO(hansmuller): Temporarily skipping array pointer overflow tests. | 228 // TODO(hansmuller): Temporarily skipping array pointer overflow tests. |
206 if (testFiles[i].indexOf("overflow") != -1) { | 229 if (testFiles[i].indexOf("overflow") != -1) { |
207 console.log("[Skipping " + testFiles[i] + "]"); | 230 console.log("[Skipping " + testFiles[i] + "]"); |
208 continue; | 231 continue; |
209 } | 232 } |
210 | 233 |
211 var testMessage = readTestMessage(testFiles[i]); | 234 var testMessage = readTestMessage(testFiles[i]); |
212 var handles = new Array(testMessage.handleCount); | 235 var handles = new Array(testMessage.handleCount); |
213 var message = new codec.Message(testMessage.buffer, handles); | 236 var message = new codec.Message(testMessage.buffer, handles); |
214 var messageValidator = new validator.Validator(message); | 237 var messageValidator = new validator.Validator(message); |
215 | 238 |
216 var err = messageValidator.validateMessageHeader(); | 239 var err = messageValidator.validateMessageHeader(); |
217 for (var j = 0; err === noError && j < filters.length; ++j) | 240 for (var j = 0; err === noError && j < filters.length; ++j) |
218 err = filters[j](messageValidator); | 241 err = filters[j](messageValidator); |
219 | 242 |
220 var actualResult = (err === noError) ? "PASS" : err; | 243 checkValidationResult(testFiles[i], err); |
221 var expectedResult = readTestExpected(testFiles[i]); | |
222 if (actualResult != expectedResult) | |
223 console.log("[Test message validation failed: " + testFiles[i] + " ]"); | |
224 expect(actualResult).toEqual(expectedResult); | |
225 } | 244 } |
226 } | 245 } |
227 | 246 |
228 function testConformanceMessageValidation() { | 247 function testConformanceMessageValidation() { |
229 testMessageValidation("conformance_", [ | 248 testMessageValidation("conformance_", [ |
230 testInterface.ConformanceTestInterfaceStub.prototype.validator]); | 249 testInterface.ConformanceTestInterfaceStub.prototype.validator]); |
231 } | 250 } |
232 | 251 |
233 function testNotImplementedMessageValidation() { | 252 function testNotImplementedMessageValidation() { |
234 testMessageValidation("not_implemented_", [ | 253 testMessageValidation("not_implemented_", [ |
235 testInterface.ConformanceTestInterfaceStub.prototype.validator]); | 254 testInterface.ConformanceTestInterfaceStub.prototype.validator]); |
236 } | 255 } |
237 | 256 |
238 function testIntegrationMessageValidation() { | 257 function doTestIntegratedMessageValidation() { |
239 testMessageValidation("integration_", [ | 258 var testFiles = getMessageTestFiles("integration_"); |
240 testInterface.IntegrationTestInterface1Stub.prototype.validator, | 259 expect(testFiles.length).toBeGreaterThan(0); |
241 testInterface.IntegrationTestInterface2Proxy.prototype.validator]); | 260 |
261 for (var i = 0; i < testFiles.length; i++) { | |
262 // TODO(hansmuller): Temporarily skipping array pointer overflow tests. | |
263 if (testFiles[i].indexOf("overflow") != -1) { | |
264 console.log("[Skipping " + testFiles[i] + "]"); | |
265 continue; | |
266 } | |
267 | |
268 var testMessage = readTestMessage(testFiles[i]); | |
269 var handles = new Array(testMessage.handleCount); | |
270 var testMessagePipe = new core.createMessagePipe(); | |
271 expect(testMessagePipe.result).toBe(core.RESULT_OK); | |
272 | |
273 var writeMessageValue = core.writeMessage( | |
274 testMessagePipe.handle0, | |
275 new Uint8Array(testMessage.buffer.arrayBuffer), | |
276 new Array(testMessage.handleCount), | |
277 core.WRITE_MESSAGE_FLAG_NONE); | |
278 expect(writeMessageValue).toBe(core.RESULT_OK); | |
279 | |
280 var testConnection = new connection.Connection( | |
281 testMessagePipe.handle1, | |
282 testInterface.IntegrationTestInterface1Stub, | |
283 testInterface.IntegrationTestInterface2Proxy); | |
284 | |
285 var validationError = noError; | |
286 testConnection.router_.validationErrorHandler = function(err) { | |
287 validationError = err; | |
yzshen1
2014/09/15 07:08:40
nit: wrong indent.
hansmuller
2014/09/15 16:25:25
Done.
| |
288 } | |
289 | |
290 testConnection.router_.connector_.deliverMessage(); | |
291 checkValidationResult(testFiles[i], validationError); | |
292 | |
293 testConnection.close(); | |
294 expect(core.close(testMessagePipe.handle0)).toBe(core.RESULT_OK); | |
295 } | |
296 } | |
297 | |
298 function testIntegratedMessageValidation() { | |
299 // Temporarily modify the Connector and Router classes: | |
300 // - Enable delivering a message without an async wait. | |
301 // - Defeat validated message handling. | |
302 // - Delegate invalid message handling. | |
303 try { | |
304 var waitToReadMore = connector.Connector.prototype.waitToReadMore_; | |
yzshen1
2014/09/15 07:08:40
[optional, something that may worth considering]
I
hansmuller
2014/09/15 16:25:26
I agree and I have to admit that what I had been d
yzshen1
2014/09/15 17:32:19
I like your new approach!
| |
305 connector.Connector.prototype.waitToReadMore_ = function() { }; | |
306 connector.Connector.prototype.deliverMessage = function() { | |
307 this.readMore_(core.RESULT_OK); | |
308 } | |
309 | |
310 var handleValidIncomingMessage = | |
311 router.Router.prototype.handleValidIncomingMessage_; | |
312 router.Router.prototype.handleValidIncomingMessage_ = function() { }; | |
313 | |
314 var handleInvalidIncomingMessage = | |
315 router.Router.prototype.handleValidIncomingMessage_; | |
316 router.Router.prototype.handleInvalidIncomingMessage_ = | |
317 function(message, error) { | |
318 this.validationErrorHandler(error); | |
319 }; | |
320 | |
321 doTestIntegratedMessageValidation(); | |
322 | |
323 } finally { | |
324 connector.Connector.prototype.waitToReadMore_ = waitToReadMore; | |
325 router.Router.prototype.handleValidIncomingMessage_ = | |
326 handleValidIncomingMessage; | |
327 router.Router.prototype.handleinValidIncomingMessage_ = | |
328 handleInvalidIncomingMessage; | |
329 } | |
242 } | 330 } |
243 | 331 |
244 expect(checkTestMessageParser()).toBeNull(); | 332 expect(checkTestMessageParser()).toBeNull(); |
245 testConformanceMessageValidation(); | 333 testConformanceMessageValidation(); |
246 testIntegrationMessageValidation(); | 334 testIntegratedMessageValidation(); |
247 this.result = "PASS"; | 335 this.result = "PASS"; |
248 }); | 336 }); |
OLD | NEW |