| Index: mojo/public/js/bindings/validation_unittests.js
|
| diff --git a/mojo/public/js/bindings/validation_unittests.js b/mojo/public/js/bindings/validation_unittests.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..69317779d806300b0ca8924321fba53eda54a74f
|
| --- /dev/null
|
| +++ b/mojo/public/js/bindings/validation_unittests.js
|
| @@ -0,0 +1,163 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +define([
|
| + "gin/test/expect",
|
| + "mojo/public/js/bindings/buffer",
|
| + "mojo/public/js/bindings/tests/validation_test_input_parser"
|
| + ], function(expect, buffer, parser) {
|
| +
|
| + function checkTestMessageParser() {
|
| + function TestMessageParserFailure(message, input) {
|
| + this.message = message;
|
| + this.input = input;
|
| + }
|
| +
|
| + TestMessageParserFailure.prototype.toString = function() {
|
| + return 'Error: ' + this.message + ' for "' + this.input + '"';
|
| + }
|
| +
|
| + function checkData(data, expectedData, input) {
|
| + if (data.byteLength != expectedData.byteLength) {
|
| + var s = "message length (" + data.byteLength + ") doesn't match " +
|
| + "expected length: " + expectedData.byteLength;
|
| + throw new TestMessageParserFailure(s, input);
|
| + }
|
| +
|
| + for (var i = 0; i < data.byteLength; i++) {
|
| + if (data.getUint8(i) != expectedData.getUint8(i)) {
|
| + var s = 'message data mismatch at byte offset ' + i;
|
| + throw new TestMessageParserFailure(s, input);
|
| + }
|
| + }
|
| + }
|
| +
|
| + function testFloatItems() {
|
| + var input = '[f]+.3e9 [d]-10.03';
|
| + var msg = parser.parseTestMessage(input);
|
| + var expectedData = new buffer.Buffer(12);
|
| + expectedData.setFloat32(0, +.3e9);
|
| + expectedData.setFloat64(4, -10.03);
|
| + checkData(msg.buffer, expectedData, input);
|
| + }
|
| +
|
| + function testUnsignedIntegerItems() {
|
| + var input = '[u1]0x10// hello world !! \n\r \t [u2]65535 \n' +
|
| + '[u4]65536 [u8]0xFFFFFFFFFFFFF 0 0Xff';
|
| + var msg = parser.parseTestMessage(input);
|
| + var expectedData = new buffer.Buffer(17);
|
| + expectedData.setUint8(0, 0x10);
|
| + expectedData.setUint16(1, 65535);
|
| + expectedData.setUint32(3, 65536);
|
| + expectedData.setUint64(7, 0xFFFFFFFFFFFFF);
|
| + expectedData.setUint8(15, 0);
|
| + expectedData.setUint8(16, 0xff);
|
| + checkData(msg.buffer, expectedData, input);
|
| + }
|
| +
|
| + function testSignedIntegerItems() {
|
| + var input = '[s8]-0x800 [s1]-128\t[s2]+0 [s4]-40';
|
| + var msg = parser.parseTestMessage(input);
|
| + var expectedData = new buffer.Buffer(15);
|
| + expectedData.setInt64(0, -0x800);
|
| + expectedData.setInt8(8, -128);
|
| + expectedData.setInt16(9, 0);
|
| + expectedData.setInt32(11, -40);
|
| + checkData(msg.buffer, expectedData, input);
|
| + }
|
| +
|
| + function testByteItems() {
|
| + var input = '[b]00001011 [b]10000000 // hello world\n [b]00000000';
|
| + var msg = parser.parseTestMessage(input);
|
| + var expectedData = new buffer.Buffer(3);
|
| + expectedData.setUint8(0, 11);
|
| + expectedData.setUint8(1, 128);
|
| + expectedData.setUint8(2, 0);
|
| + checkData(msg.buffer, expectedData, input);
|
| + }
|
| +
|
| + function testAnchors() {
|
| + var input = '[dist4]foo 0 [dist8]bar 0 [anchr]foo [anchr]bar';
|
| + var msg = parser.parseTestMessage(input);
|
| + var expectedData = new buffer.Buffer(14);
|
| + expectedData.setUint32(0, 14);
|
| + expectedData.setUint8(4, 0);
|
| + expectedData.setUint64(5, 9);
|
| + expectedData.setUint8(13, 0);
|
| + checkData(msg.buffer, expectedData, input);
|
| + }
|
| +
|
| + function testHandles() {
|
| + var input = '// This message has handles! \n[handles]50 [u8]2';
|
| + var msg = parser.parseTestMessage(input);
|
| + var expectedData = new buffer.Buffer(8);
|
| + expectedData.setUint64(0, 2);
|
| +
|
| + if (msg.handleCount != 50) {
|
| + var s = 'wrong handle count (' + msg.handleCount + ')';
|
| + throw new TestMessageParserFailure(s, input);
|
| + }
|
| + checkData(msg.buffer, expectedData, input);
|
| + }
|
| +
|
| + function testEmptyInput() {
|
| + var msg = parser.parseTestMessage('');
|
| + if (msg.buffer.byteLength != 0)
|
| + throw new TestMessageParserFailure('expected empty message', '');
|
| + }
|
| +
|
| + function testBlankInput() {
|
| + var input = ' \t // hello world \n\r \t// the answer is 42 ';
|
| + var msg = parser.parseTestMessage(input);
|
| + if (msg.buffer.byteLength != 0)
|
| + throw new TestMessageParserFailure('expected empty message', input);
|
| + }
|
| +
|
| + function testInvalidInput() {
|
| + function parserShouldFail(input) {
|
| + try {
|
| + parser.parseTestMessage(input);
|
| + } catch (e) {
|
| + if (e instanceof parser.InputError)
|
| + return;
|
| + throw new TestMessageParserFailure(
|
| + 'unexpected exception ' + e.toString(), input);
|
| + }
|
| + throw new TestMessageParserFailure("didn't detect invalid input", file);
|
| + }
|
| +
|
| + ['/ hello world',
|
| + '[u1]x',
|
| + '[u2]-1000',
|
| + '[u1]0x100',
|
| + '[s2]-0x8001',
|
| + '[b]1',
|
| + '[b]1111111k',
|
| + '[dist4]unmatched',
|
| + '[anchr]hello [dist8]hello',
|
| + '[dist4]a [dist4]a [anchr]a',
|
| + // '[dist4]a [anchr]a [dist4]a [anchr]a',
|
| + '0 [handles]50'
|
| + ].forEach(parserShouldFail);
|
| + }
|
| +
|
| + try {
|
| + testFloatItems();
|
| + testUnsignedIntegerItems();
|
| + testSignedIntegerItems();
|
| + testByteItems();
|
| + testInvalidInput();
|
| + testEmptyInput();
|
| + testBlankInput();
|
| + testHandles();
|
| + testAnchors();
|
| + } catch (e) {
|
| + return e.toString();
|
| + }
|
| + return null;
|
| + }
|
| +
|
| + expect(checkTestMessageParser()).toBeNull();
|
| + this.result = "PASS";
|
| +});
|
|
|