Home | History | Annotate | Download | only in protobuf
      1 // Protocol Buffers - Google's data interchange format
      2 // Copyright 2008 Google Inc.  All rights reserved.
      3 // http://code.google.com/p/protobuf/
      4 //
      5 // Redistribution and use in source and binary forms, with or without
      6 // modification, are permitted provided that the following conditions are
      7 // met:
      8 //
      9 //     * Redistributions of source code must retain the above copyright
     10 // notice, this list of conditions and the following disclaimer.
     11 //     * Redistributions in binary form must reproduce the above
     12 // copyright notice, this list of conditions and the following disclaimer
     13 // in the documentation and/or other materials provided with the
     14 // distribution.
     15 //     * Neither the name of Google Inc. nor the names of its
     16 // contributors may be used to endorse or promote products derived from
     17 // this software without specific prior written permission.
     18 //
     19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30 
     31 package com.google.protobuf;
     32 
     33 import java.io.UnsupportedEncodingException;
     34 import java.util.Arrays;
     35 import java.util.Iterator;
     36 
     37 /**
     38  * This class tests {@link RopeByteString} by inheriting the tests from
     39  * {@link LiteralByteStringTest}.  Only a couple of methods are overridden.
     40  *
     41  * <p>A full test of the result of {@link RopeByteString#substring(int, int)} is found in the
     42  * separate class {@link RopeByteStringSubstringTest}.
     43  *
     44  * @author carlanton (at) google.com (Carl Haverl)
     45  */
     46 public class RopeByteStringTest extends LiteralByteStringTest {
     47 
     48   @Override
     49   protected void setUp() throws Exception {
     50     classUnderTest = "RopeByteString";
     51     referenceBytes = ByteStringTest.getTestBytes(22341, 22337766L);
     52     Iterator<ByteString> iter = ByteStringTest.makeConcretePieces(referenceBytes).iterator();
     53     stringUnderTest = iter.next();
     54     while (iter.hasNext()) {
     55       stringUnderTest = stringUnderTest.concat(iter.next());
     56     }
     57     expectedHashCode = -1214197238;
     58   }
     59 
     60   @Override
     61   public void testGetTreeDepth() {
     62     assertEquals(classUnderTest + " must have the expected tree depth",
     63         4, stringUnderTest.getTreeDepth());
     64   }
     65 
     66   public void testBalance() {
     67     int numberOfPieces = 10000;
     68     int pieceSize = 64;
     69     byte[] testBytes = ByteStringTest.getTestBytes(numberOfPieces * pieceSize, 113377L);
     70 
     71     // Build up a big ByteString from smaller pieces to force a rebalance
     72     ByteString concatenated = ByteString.EMPTY;
     73     for (int i = 0; i < numberOfPieces; ++i) {
     74       concatenated = concatenated.concat(ByteString.copyFrom(testBytes, i * pieceSize, pieceSize));
     75     }
     76 
     77     assertEquals(classUnderTest + " from string must have the expected type",
     78         classUnderTest, getActualClassName(concatenated));
     79     assertTrue(classUnderTest + " underlying bytes must match after balancing",
     80         Arrays.equals(testBytes, concatenated.toByteArray()));
     81     ByteString testString = ByteString.copyFrom(testBytes);
     82     assertTrue(classUnderTest + " balanced string must equal flat string",
     83         concatenated.equals(testString));
     84     assertTrue(classUnderTest + " flat string must equal balanced string",
     85         testString.equals(concatenated));
     86     assertEquals(classUnderTest + " balanced string must have same hash code as flat string",
     87         testString.hashCode(), concatenated.hashCode());
     88   }
     89 
     90   @Override
     91   public void testToString() throws UnsupportedEncodingException {
     92     String sourceString = "I love unicode \u1234\u5678 characters";
     93     ByteString sourceByteString = ByteString.copyFromUtf8(sourceString);
     94     int copies = 250;
     95 
     96     // By building the RopeByteString by concatenating, this is actually a fairly strenuous test.
     97     StringBuilder builder = new StringBuilder(copies * sourceString.length());
     98     ByteString unicode = ByteString.EMPTY;
     99     for (int i = 0; i < copies; ++i) {
    100       builder.append(sourceString);
    101       unicode = RopeByteString.concatenate(unicode, sourceByteString);
    102     }
    103     String testString = builder.toString();
    104 
    105     assertEquals(classUnderTest + " from string must have the expected type",
    106         classUnderTest, getActualClassName(unicode));
    107     String roundTripString = unicode.toString(UTF_8);
    108     assertEquals(classUnderTest + " unicode bytes must match",
    109         testString, roundTripString);
    110     ByteString flatString = ByteString.copyFromUtf8(testString);
    111     assertEquals(classUnderTest + " string must equal the flat string", flatString, unicode);
    112     assertEquals(classUnderTest + " string must must have same hashCode as the flat string",
    113         flatString.hashCode(), unicode.hashCode());
    114   }
    115 }
    116