1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc. All rights reserved. 3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// http://code.google.com/p/protobuf/ 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met: 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions of source code must retain the above copyright 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer. 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions in binary form must reproduce the above 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution. 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Neither the name of Google Inc. nor the names of its 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission. 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillepackage com.google.protobuf; 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport protobuf_unittest.UnittestProto.TestAllTypes; 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport protobuf_unittest.UnittestProto.TestPackedTypes; 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport junit.framework.TestCase; 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport java.io.ByteArrayOutputStream; 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport java.util.ArrayList; 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport java.util.Arrays; 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport java.util.List; 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville/** 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Unit test for {@link CodedOutputStream}. 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * @author kenton@google.com Kenton Varda 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillepublic class CodedOutputStreamTest extends TestCase { 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Helper to construct a byte array from a bunch of bytes. The inputs are 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * actually ints so that I can use hex notation and not get stupid errors 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * about precision. 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private byte[] bytes(int... bytesAsInts) { 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville byte[] bytes = new byte[bytesAsInts.length]; 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < bytesAsInts.length; i++) { 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bytes[i] = (byte) bytesAsInts[i]; 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return bytes; 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Arrays.asList() does not work with arrays of primitives. :( */ 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private List<Byte> toList(byte[] bytes) { 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville List<Byte> result = new ArrayList<Byte>(); 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (byte b : bytes) { 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result.add(b); 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private void assertEqualBytes(byte[] a, byte[] b) { 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(toList(a), toList(b)); 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Writes the given value using writeRawVarint32() and writeRawVarint64() and 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * checks that the result matches the given bytes. 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private void assertWriteVarint(byte[] data, long value) throws Exception { 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Only do 32-bit write if the value fits in 32 bits. 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if ((value >>> 32) == 0) { 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ByteArrayOutputStream rawOutput = new ByteArrayOutputStream(); 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream output = CodedOutputStream.newInstance(rawOutput); 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output.writeRawVarint32((int) value); 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output.flush(); 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEqualBytes(data, rawOutput.toByteArray()); 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Also try computing size. 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(data.length, 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream.computeRawVarint32Size((int) value)); 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ByteArrayOutputStream rawOutput = new ByteArrayOutputStream(); 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream output = CodedOutputStream.newInstance(rawOutput); 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output.writeRawVarint64(value); 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output.flush(); 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEqualBytes(data, rawOutput.toByteArray()); 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Also try computing size. 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(data.length, 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream.computeRawVarint64Size(value)); 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Try different block sizes. 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int blockSize = 1; blockSize <= 16; blockSize *= 2) { 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Only do 32-bit write if the value fits in 32 bits. 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if ((value >>> 32) == 0) { 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ByteArrayOutputStream rawOutput = new ByteArrayOutputStream(); 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream output = 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream.newInstance(rawOutput, blockSize); 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output.writeRawVarint32((int) value); 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output.flush(); 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEqualBytes(data, rawOutput.toByteArray()); 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ByteArrayOutputStream rawOutput = new ByteArrayOutputStream(); 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream output = 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream.newInstance(rawOutput, blockSize); 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output.writeRawVarint64(value); 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output.flush(); 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEqualBytes(data, rawOutput.toByteArray()); 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Tests writeRawVarint32() and writeRawVarint64(). */ 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void testWriteVarint() throws Exception { 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertWriteVarint(bytes(0x00), 0); 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertWriteVarint(bytes(0x01), 1); 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertWriteVarint(bytes(0x7f), 127); 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 14882 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertWriteVarint(bytes(0xa2, 0x74), (0x22 << 0) | (0x74 << 7)); 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 2961488830 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertWriteVarint(bytes(0xbe, 0xf7, 0x92, 0x84, 0x0b), 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) | 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (0x0bL << 28)); 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 64-bit 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 7256456126 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertWriteVarint(bytes(0xbe, 0xf7, 0x92, 0x84, 0x1b), 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) | 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (0x1bL << 28)); 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 41256202580718336 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertWriteVarint( 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bytes(0x80, 0xe6, 0xeb, 0x9c, 0xc3, 0xc9, 0xa4, 0x49), 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (0x00 << 0) | (0x66 << 7) | (0x6b << 14) | (0x1c << 21) | 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (0x43L << 28) | (0x49L << 35) | (0x24L << 42) | (0x49L << 49)); 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 11964378330978735131 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertWriteVarint( 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bytes(0x9b, 0xa8, 0xf9, 0xc2, 0xbb, 0xd6, 0x80, 0x85, 0xa6, 0x01), 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (0x1b << 0) | (0x28 << 7) | (0x79 << 14) | (0x42 << 21) | 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (0x3bL << 28) | (0x56L << 35) | (0x00L << 42) | 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (0x05L << 49) | (0x26L << 56) | (0x01L << 63)); 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Parses the given bytes using writeRawLittleEndian32() and checks 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * that the result matches the given value. 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private void assertWriteLittleEndian32(byte[] data, int value) 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws Exception { 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ByteArrayOutputStream rawOutput = new ByteArrayOutputStream(); 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream output = CodedOutputStream.newInstance(rawOutput); 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output.writeRawLittleEndian32(value); 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output.flush(); 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEqualBytes(data, rawOutput.toByteArray()); 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Try different block sizes. 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int blockSize = 1; blockSize <= 16; blockSize *= 2) { 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville rawOutput = new ByteArrayOutputStream(); 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output = CodedOutputStream.newInstance(rawOutput, blockSize); 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output.writeRawLittleEndian32(value); 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output.flush(); 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEqualBytes(data, rawOutput.toByteArray()); 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Parses the given bytes using writeRawLittleEndian64() and checks 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * that the result matches the given value. 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private void assertWriteLittleEndian64(byte[] data, long value) 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws Exception { 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ByteArrayOutputStream rawOutput = new ByteArrayOutputStream(); 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream output = CodedOutputStream.newInstance(rawOutput); 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output.writeRawLittleEndian64(value); 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output.flush(); 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEqualBytes(data, rawOutput.toByteArray()); 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Try different block sizes. 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int blockSize = 1; blockSize <= 16; blockSize *= 2) { 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville rawOutput = new ByteArrayOutputStream(); 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output = CodedOutputStream.newInstance(rawOutput, blockSize); 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output.writeRawLittleEndian64(value); 197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output.flush(); 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEqualBytes(data, rawOutput.toByteArray()); 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Tests writeRawLittleEndian32() and writeRawLittleEndian64(). */ 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void testWriteLittleEndian() throws Exception { 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertWriteLittleEndian32(bytes(0x78, 0x56, 0x34, 0x12), 0x12345678); 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertWriteLittleEndian32(bytes(0xf0, 0xde, 0xbc, 0x9a), 0x9abcdef0); 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertWriteLittleEndian64( 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bytes(0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12), 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 0x123456789abcdef0L); 210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertWriteLittleEndian64( 211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bytes(0x78, 0x56, 0x34, 0x12, 0xf0, 0xde, 0xbc, 0x9a), 212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 0x9abcdef012345678L); 213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Test encodeZigZag32() and encodeZigZag64(). */ 216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void testEncodeZigZag() throws Exception { 217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(0, CodedOutputStream.encodeZigZag32( 0)); 218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(1, CodedOutputStream.encodeZigZag32(-1)); 219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(2, CodedOutputStream.encodeZigZag32( 1)); 220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(3, CodedOutputStream.encodeZigZag32(-2)); 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(0x7FFFFFFE, CodedOutputStream.encodeZigZag32(0x3FFFFFFF)); 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(0x7FFFFFFF, CodedOutputStream.encodeZigZag32(0xC0000000)); 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(0xFFFFFFFE, CodedOutputStream.encodeZigZag32(0x7FFFFFFF)); 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(0xFFFFFFFF, CodedOutputStream.encodeZigZag32(0x80000000)); 225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(0, CodedOutputStream.encodeZigZag64( 0)); 227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(1, CodedOutputStream.encodeZigZag64(-1)); 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(2, CodedOutputStream.encodeZigZag64( 1)); 229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(3, CodedOutputStream.encodeZigZag64(-2)); 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(0x000000007FFFFFFEL, 231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream.encodeZigZag64(0x000000003FFFFFFFL)); 232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(0x000000007FFFFFFFL, 233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream.encodeZigZag64(0xFFFFFFFFC0000000L)); 234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(0x00000000FFFFFFFEL, 235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream.encodeZigZag64(0x000000007FFFFFFFL)); 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(0x00000000FFFFFFFFL, 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream.encodeZigZag64(0xFFFFFFFF80000000L)); 238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(0xFFFFFFFFFFFFFFFEL, 239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream.encodeZigZag64(0x7FFFFFFFFFFFFFFFL)); 240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(0xFFFFFFFFFFFFFFFFL, 241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream.encodeZigZag64(0x8000000000000000L)); 242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Some easier-to-verify round-trip tests. The inputs (other than 0, 1, -1) 244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // were chosen semi-randomly via keyboard bashing. 245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(0, 246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream.encodeZigZag32(CodedInputStream.decodeZigZag32(0))); 247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(1, 248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream.encodeZigZag32(CodedInputStream.decodeZigZag32(1))); 249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(-1, 250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream.encodeZigZag32(CodedInputStream.decodeZigZag32(-1))); 251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(14927, 252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream.encodeZigZag32(CodedInputStream.decodeZigZag32(14927))); 253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(-3612, 254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream.encodeZigZag32(CodedInputStream.decodeZigZag32(-3612))); 255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(0, 257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream.encodeZigZag64(CodedInputStream.decodeZigZag64(0))); 258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(1, 259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream.encodeZigZag64(CodedInputStream.decodeZigZag64(1))); 260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(-1, 261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream.encodeZigZag64(CodedInputStream.decodeZigZag64(-1))); 262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(14927, 263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream.encodeZigZag64(CodedInputStream.decodeZigZag64(14927))); 264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(-3612, 265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream.encodeZigZag64(CodedInputStream.decodeZigZag64(-3612))); 266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(856912304801416L, 268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream.encodeZigZag64( 269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedInputStream.decodeZigZag64( 270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 856912304801416L))); 271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEquals(-75123905439571256L, 272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream.encodeZigZag64( 273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedInputStream.decodeZigZag64( 274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville -75123905439571256L))); 275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Tests writing a whole message with every field type. */ 278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void testWriteWholeMessage() throws Exception { 279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestAllTypes message = TestUtil.getAllSet(); 280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville byte[] rawBytes = message.toByteArray(); 282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEqualBytes(TestUtil.getGoldenMessage().toByteArray(), rawBytes); 283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Try different block sizes. 285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int blockSize = 1; blockSize < 256; blockSize *= 2) { 286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ByteArrayOutputStream rawOutput = new ByteArrayOutputStream(); 287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream output = 288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CodedOutputStream.newInstance(rawOutput, blockSize); 289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.writeTo(output); 290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output.flush(); 291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEqualBytes(rawBytes, rawOutput.toByteArray()); 292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Tests writing a whole message with every packed field type. Ensures the 296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * wire format of packed fields is compatible with C++. */ 297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void testWriteWholePackedFieldsMessage() throws Exception { 298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestPackedTypes message = TestUtil.getPackedSet(); 299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville byte[] rawBytes = message.toByteArray(); 301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville assertEqualBytes(TestUtil.getGoldenPackedFieldsMessage().toByteArray(), 302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville rawBytes); 303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 305