1 // Protocol Buffers - Google's data interchange format 2 // Copyright 2008 Google Inc. All rights reserved. 3 // https://developers.google.com/protocol-buffers/ 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.Iterator; 35 36 /** 37 * This class tests {@link RopeByteString#substring(int, int)} by inheriting the tests from 38 * {@link LiteralByteStringTest}. Only a couple of methods are overridden. 39 * 40 * @author carlanton@google.com (Carl Haverl) 41 */ 42 public class RopeByteStringSubstringTest extends LiteralByteStringTest { 43 44 @Override setUp()45 protected void setUp() throws Exception { 46 classUnderTest = "RopeByteString"; 47 byte[] sourceBytes = ByteStringTest.getTestBytes(22341, 22337766L); 48 Iterator<ByteString> iter = ByteStringTest.makeConcretePieces(sourceBytes).iterator(); 49 ByteString sourceString = iter.next(); 50 while (iter.hasNext()) { 51 sourceString = sourceString.concat(iter.next()); 52 } 53 54 int from = 1130; 55 int to = sourceBytes.length - 5555; 56 stringUnderTest = sourceString.substring(from, to); 57 referenceBytes = new byte[to - from]; 58 System.arraycopy(sourceBytes, from, referenceBytes, 0, to - from); 59 expectedHashCode = -1259260680; 60 } 61 62 @Override testGetTreeDepth()63 public void testGetTreeDepth() { 64 assertEquals(classUnderTest + " must have the expected tree depth", 65 3, stringUnderTest.getTreeDepth()); 66 } 67 68 @Override testToString()69 public void testToString() throws UnsupportedEncodingException { 70 String sourceString = "I love unicode \u1234\u5678 characters"; 71 ByteString sourceByteString = ByteString.copyFromUtf8(sourceString); 72 int copies = 250; 73 74 // By building the RopeByteString by concatenating, this is actually a fairly strenuous test. 75 StringBuilder builder = new StringBuilder(copies * sourceString.length()); 76 ByteString unicode = ByteString.EMPTY; 77 for (int i = 0; i < copies; ++i) { 78 builder.append(sourceString); 79 unicode = RopeByteString.concatenate(unicode, sourceByteString); 80 } 81 String testString = builder.toString(); 82 83 // Do the substring part 84 testString = testString.substring(2, testString.length() - 6); 85 unicode = unicode.substring(2, unicode.size() - 6); 86 87 assertEquals(classUnderTest + " from string must have the expected type", 88 classUnderTest, getActualClassName(unicode)); 89 String roundTripString = unicode.toString(UTF_8); 90 assertEquals(classUnderTest + " unicode bytes must match", 91 testString, roundTripString); 92 ByteString flatString = ByteString.copyFromUtf8(testString); 93 assertEquals(classUnderTest + " string must equal the flat string", flatString, unicode); 94 assertEquals(classUnderTest + " string must must have same hashCode as the flat string", 95 flatString.hashCode(), unicode.hashCode()); 96 } 97 98 @Override testCharsetToString()99 public void testCharsetToString() { 100 String sourceString = "I love unicode \u1234\u5678 characters"; 101 ByteString sourceByteString = ByteString.copyFromUtf8(sourceString); 102 int copies = 250; 103 104 // By building the RopeByteString by concatenating, this is actually a fairly strenuous test. 105 StringBuilder builder = new StringBuilder(copies * sourceString.length()); 106 ByteString unicode = ByteString.EMPTY; 107 for (int i = 0; i < copies; ++i) { 108 builder.append(sourceString); 109 unicode = RopeByteString.concatenate(unicode, sourceByteString); 110 } 111 String testString = builder.toString(); 112 113 // Do the substring part 114 testString = testString.substring(2, testString.length() - 6); 115 unicode = unicode.substring(2, unicode.size() - 6); 116 117 assertEquals(classUnderTest + " from string must have the expected type", 118 classUnderTest, getActualClassName(unicode)); 119 String roundTripString = unicode.toString(Internal.UTF_8); 120 assertEquals(classUnderTest + " unicode bytes must match", 121 testString, roundTripString); 122 ByteString flatString = ByteString.copyFromUtf8(testString); 123 assertEquals(classUnderTest + " string must equal the flat string", flatString, unicode); 124 assertEquals(classUnderTest + " string must must have same hashCode as the flat string", 125 flatString.hashCode(), unicode.hashCode()); 126 } 127 } 128