Index: third_party/protobuf/js/binary/decoder_test.js |
diff --git a/third_party/protobuf/js/binary/decoder_test.js b/third_party/protobuf/js/binary/decoder_test.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..27342e493f7d3336d954a839ea88a8b52cb2b805 |
--- /dev/null |
+++ b/third_party/protobuf/js/binary/decoder_test.js |
@@ -0,0 +1,327 @@ |
+// Protocol Buffers - Google's data interchange format |
+// Copyright 2008 Google Inc. All rights reserved. |
+// https://developers.google.com/protocol-buffers/ |
+// |
+// Redistribution and use in source and binary forms, with or without |
+// modification, are permitted provided that the following conditions are |
+// met: |
+// |
+// * Redistributions of source code must retain the above copyright |
+// notice, this list of conditions and the following disclaimer. |
+// * Redistributions in binary form must reproduce the above |
+// copyright notice, this list of conditions and the following disclaimer |
+// in the documentation and/or other materials provided with the |
+// distribution. |
+// * Neither the name of Google Inc. nor the names of its |
+// contributors may be used to endorse or promote products derived from |
+// this software without specific prior written permission. |
+// |
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ |
+/** |
+ * @fileoverview Test cases for jspb's binary protocol buffer decoder. |
+ * |
+ * There are two particular magic numbers that need to be pointed out - |
+ * 2^64-1025 is the largest number representable as both a double and an |
+ * unsigned 64-bit integer, and 2^63-513 is the largest number representable as |
+ * both a double and a signed 64-bit integer. |
+ * |
+ * Test suite is written using Jasmine -- see http://jasmine.github.io/ |
+ * |
+ * @author aappleby@google.com (Austin Appleby) |
+ */ |
+ |
+goog.require('goog.testing.asserts'); |
+goog.require('jspb.BinaryConstants'); |
+goog.require('jspb.BinaryDecoder'); |
+goog.require('jspb.BinaryWriter'); |
+ |
+ |
+/** |
+ * Tests raw encoding and decoding of unsigned types. |
+ * @param {Function} readValue |
+ * @param {Function} writeValue |
+ * @param {number} epsilon |
+ * @param {number} upperLimit |
+ * @param {Function} filter |
+ * @suppress {missingProperties|visibility} |
+ */ |
+function doTestUnsignedValue(readValue, |
+ writeValue, epsilon, upperLimit, filter) { |
+ var writer = new jspb.BinaryWriter(); |
+ |
+ // Encode zero and limits. |
+ writeValue.call(writer, filter(0)); |
+ writeValue.call(writer, filter(epsilon)); |
+ writeValue.call(writer, filter(upperLimit)); |
+ |
+ // Encode positive values. |
+ for (var cursor = epsilon; cursor < upperLimit; cursor *= 1.1) { |
+ writeValue.call(writer, filter(cursor)); |
+ } |
+ |
+ var reader = jspb.BinaryDecoder.alloc(writer.getResultBuffer()); |
+ |
+ // Check zero and limits. |
+ assertEquals(filter(0), readValue.call(reader)); |
+ assertEquals(filter(epsilon), readValue.call(reader)); |
+ assertEquals(filter(upperLimit), readValue.call(reader)); |
+ |
+ // Check positive values. |
+ for (var cursor = epsilon; cursor < upperLimit; cursor *= 1.1) { |
+ if (filter(cursor) != readValue.call(reader)) throw 'fail!'; |
+ } |
+} |
+ |
+ |
+/** |
+ * Tests raw encoding and decoding of signed types. |
+ * @param {Function} readValue |
+ * @param {Function} writeValue |
+ * @param {number} epsilon |
+ * @param {number} lowerLimit |
+ * @param {number} upperLimit |
+ * @param {Function} filter |
+ * @suppress {missingProperties} |
+ */ |
+function doTestSignedValue(readValue, |
+ writeValue, epsilon, lowerLimit, upperLimit, filter) { |
+ var writer = new jspb.BinaryWriter(); |
+ |
+ // Encode zero and limits. |
+ writeValue.call(writer, filter(lowerLimit)); |
+ writeValue.call(writer, filter(-epsilon)); |
+ writeValue.call(writer, filter(0)); |
+ writeValue.call(writer, filter(epsilon)); |
+ writeValue.call(writer, filter(upperLimit)); |
+ |
+ var inputValues = []; |
+ |
+ // Encode negative values. |
+ for (var cursor = lowerLimit; cursor < -epsilon; cursor /= 1.1) { |
+ var val = filter(cursor); |
+ writeValue.call(writer, val); |
+ inputValues.push(val); |
+ } |
+ |
+ // Encode positive values. |
+ for (var cursor = epsilon; cursor < upperLimit; cursor *= 1.1) { |
+ var val = filter(cursor); |
+ writeValue.call(writer, val); |
+ inputValues.push(val); |
+ } |
+ |
+ var reader = jspb.BinaryDecoder.alloc(writer.getResultBuffer()); |
+ |
+ // Check zero and limits. |
+ assertEquals(filter(lowerLimit), readValue.call(reader)); |
+ assertEquals(filter(-epsilon), readValue.call(reader)); |
+ assertEquals(filter(0), readValue.call(reader)); |
+ assertEquals(filter(epsilon), readValue.call(reader)); |
+ assertEquals(filter(upperLimit), readValue.call(reader)); |
+ |
+ // Verify decoded values. |
+ for (var i = 0; i < inputValues.length; i++) { |
+ assertEquals(inputValues[i], readValue.call(reader)); |
+ } |
+} |
+ |
+describe('binaryDecoderTest', function() { |
+ /** |
+ * Tests the decoder instance cache. |
+ * @suppress {visibility} |
+ */ |
+ it('testInstanceCache', function() { |
+ // Empty the instance caches. |
+ jspb.BinaryDecoder.instanceCache_ = []; |
+ |
+ // Allocating and then freeing a decoder should put it in the instance |
+ // cache. |
+ jspb.BinaryDecoder.alloc().free(); |
+ |
+ assertEquals(1, jspb.BinaryDecoder.instanceCache_.length); |
+ |
+ // Allocating and then freeing three decoders should leave us with three in |
+ // the cache. |
+ |
+ var decoder1 = jspb.BinaryDecoder.alloc(); |
+ var decoder2 = jspb.BinaryDecoder.alloc(); |
+ var decoder3 = jspb.BinaryDecoder.alloc(); |
+ decoder1.free(); |
+ decoder2.free(); |
+ decoder3.free(); |
+ |
+ assertEquals(3, jspb.BinaryDecoder.instanceCache_.length); |
+ }); |
+ |
+ |
+ /** |
+ * Tests reading 64-bit integers as hash strings. |
+ */ |
+ it('testHashStrings', function() { |
+ var writer = new jspb.BinaryWriter(); |
+ |
+ var hashA = String.fromCharCode(0x00, 0x00, 0x00, 0x00, |
+ 0x00, 0x00, 0x00, 0x00); |
+ var hashB = String.fromCharCode(0x12, 0x34, 0x00, 0x00, |
+ 0x00, 0x00, 0x00, 0x00); |
+ var hashC = String.fromCharCode(0x12, 0x34, 0x56, 0x78, |
+ 0x87, 0x65, 0x43, 0x21); |
+ var hashD = String.fromCharCode(0xFF, 0xFF, 0xFF, 0xFF, |
+ 0xFF, 0xFF, 0xFF, 0xFF); |
+ |
+ writer.rawWriteVarintHash64(hashA); |
+ writer.rawWriteVarintHash64(hashB); |
+ writer.rawWriteVarintHash64(hashC); |
+ writer.rawWriteVarintHash64(hashD); |
+ |
+ writer.rawWriteFixedHash64(hashA); |
+ writer.rawWriteFixedHash64(hashB); |
+ writer.rawWriteFixedHash64(hashC); |
+ writer.rawWriteFixedHash64(hashD); |
+ |
+ var decoder = jspb.BinaryDecoder.alloc(writer.getResultBuffer()); |
+ |
+ assertEquals(hashA, decoder.readVarintHash64()); |
+ assertEquals(hashB, decoder.readVarintHash64()); |
+ assertEquals(hashC, decoder.readVarintHash64()); |
+ assertEquals(hashD, decoder.readVarintHash64()); |
+ |
+ assertEquals(hashA, decoder.readFixedHash64()); |
+ assertEquals(hashB, decoder.readFixedHash64()); |
+ assertEquals(hashC, decoder.readFixedHash64()); |
+ assertEquals(hashD, decoder.readFixedHash64()); |
+ }); |
+ |
+ |
+ /** |
+ * Verifies that misuse of the decoder class triggers assertions. |
+ * @suppress {checkTypes|visibility} |
+ */ |
+ it('testDecodeErrors', function() { |
+ // Reading a value past the end of the stream should trigger an assertion. |
+ var decoder = jspb.BinaryDecoder.alloc([0, 1, 2]); |
+ assertThrows(function() {decoder.readUint64()}); |
+ |
+ // Overlong varints should trigger assertions. |
+ decoder.setBlock( |
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0]); |
+ assertThrows(function() {decoder.readUnsignedVarint64()}); |
+ decoder.reset(); |
+ assertThrows(function() {decoder.readSignedVarint64()}); |
+ decoder.reset(); |
+ assertThrows(function() {decoder.readZigzagVarint64()}); |
+ |
+ // Positive 32-bit varints encoded with 1 bits in positions 33 through 35 |
+ // should trigger assertions. |
+ decoder.setBlock([255, 255, 255, 255, 0x1F]); |
+ assertThrows(function() {decoder.readUnsignedVarint32()}); |
+ |
+ decoder.setBlock([255, 255, 255, 255, 0x2F]); |
+ assertThrows(function() {decoder.readUnsignedVarint32()}); |
+ |
+ decoder.setBlock([255, 255, 255, 255, 0x4F]); |
+ assertThrows(function() {decoder.readUnsignedVarint32()}); |
+ |
+ // Negative 32-bit varints encoded with non-1 bits in the high dword should |
+ // trigger assertions. |
+ decoder.setBlock([255, 255, 255, 255, 255, 255, 0, 255, 255, 1]); |
+ assertThrows(function() {decoder.readUnsignedVarint32()}); |
+ |
+ decoder.setBlock([255, 255, 255, 255, 255, 255, 255, 255, 255, 0]); |
+ assertThrows(function() {decoder.readUnsignedVarint32()}); |
+ }); |
+ |
+ |
+ /** |
+ * Tests raw encoding and decoding of unsigned integers. |
+ */ |
+ it('testRawUnsigned', function() { |
+ doTestUnsignedValue( |
+ jspb.BinaryDecoder.prototype.readUint8, |
+ jspb.BinaryWriter.prototype.rawWriteUint8, |
+ 1, 0xFF, Math.round); |
+ |
+ doTestUnsignedValue( |
+ jspb.BinaryDecoder.prototype.readUint16, |
+ jspb.BinaryWriter.prototype.rawWriteUint16, |
+ 1, 0xFFFF, Math.round); |
+ |
+ doTestUnsignedValue( |
+ jspb.BinaryDecoder.prototype.readUint32, |
+ jspb.BinaryWriter.prototype.rawWriteUint32, |
+ 1, 0xFFFFFFFF, Math.round); |
+ |
+ doTestUnsignedValue( |
+ jspb.BinaryDecoder.prototype.readUint64, |
+ jspb.BinaryWriter.prototype.rawWriteUint64, |
+ 1, Math.pow(2, 64) - 1025, Math.round); |
+ }); |
+ |
+ |
+ /** |
+ * Tests raw encoding and decoding of signed integers. |
+ */ |
+ it('testRawSigned', function() { |
+ doTestSignedValue( |
+ jspb.BinaryDecoder.prototype.readInt8, |
+ jspb.BinaryWriter.prototype.rawWriteInt8, |
+ 1, -0x80, 0x7F, Math.round); |
+ |
+ doTestSignedValue( |
+ jspb.BinaryDecoder.prototype.readInt16, |
+ jspb.BinaryWriter.prototype.rawWriteInt16, |
+ 1, -0x8000, 0x7FFF, Math.round); |
+ |
+ doTestSignedValue( |
+ jspb.BinaryDecoder.prototype.readInt32, |
+ jspb.BinaryWriter.prototype.rawWriteInt32, |
+ 1, -0x80000000, 0x7FFFFFFF, Math.round); |
+ |
+ doTestSignedValue( |
+ jspb.BinaryDecoder.prototype.readInt64, |
+ jspb.BinaryWriter.prototype.rawWriteInt64, |
+ 1, -Math.pow(2, 63), Math.pow(2, 63) - 513, Math.round); |
+ }); |
+ |
+ |
+ /** |
+ * Tests raw encoding and decoding of floats. |
+ */ |
+ it('testRawFloats', function() { |
+ /** |
+ * @param {number} x |
+ * @return {number} |
+ */ |
+ function truncate(x) { |
+ var temp = new Float32Array(1); |
+ temp[0] = x; |
+ return temp[0]; |
+ } |
+ doTestSignedValue( |
+ jspb.BinaryDecoder.prototype.readFloat, |
+ jspb.BinaryWriter.prototype.rawWriteFloat, |
+ jspb.BinaryConstants.FLOAT32_EPS, |
+ -jspb.BinaryConstants.FLOAT32_MAX, |
+ jspb.BinaryConstants.FLOAT32_MAX, |
+ truncate); |
+ |
+ doTestSignedValue( |
+ jspb.BinaryDecoder.prototype.readDouble, |
+ jspb.BinaryWriter.prototype.rawWriteDouble, |
+ jspb.BinaryConstants.FLOAT64_EPS * 10, |
+ -jspb.BinaryConstants.FLOAT64_MAX, |
+ jspb.BinaryConstants.FLOAT64_MAX, |
+ function(x) { return x; }); |
+ }); |
+}); |