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