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