1e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller/* 2e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * Copyright (C) 2014 Square, Inc. 3e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * 4e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * Licensed under the Apache License, Version 2.0 (the "License"); 5e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * you may not use this file except in compliance with the License. 6e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * You may obtain a copy of the License at 7e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * 8e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * http://www.apache.org/licenses/LICENSE-2.0 9e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * 10e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * Unless required by applicable law or agreed to in writing, software 11e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * distributed under the License is distributed on an "AS IS" BASIS, 12e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * See the License for the specific language governing permissions and 14e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller * limitations under the License. 15e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller */ 16e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fullerpackage okio; 17e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 18a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fullerimport java.io.ObjectInputStream; 19a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fullerimport java.io.ObjectOutputStream; 20a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fullerimport java.io.Serializable; 21e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fullerimport java.util.Arrays; 22e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fullerimport java.util.Random; 23e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 24e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fullerimport static org.junit.Assert.assertEquals; 25a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fullerimport static org.junit.Assert.assertFalse; 26a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fullerimport static org.junit.Assert.assertTrue; 27e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 28e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fullerfinal class TestUtil { 29e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller private TestUtil() { 30e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller } 31e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 32e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller static void assertByteArraysEquals(byte[] a, byte[] b) { 33e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller assertEquals(Arrays.toString(a), Arrays.toString(b)); 34e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller } 35e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 36e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller static void assertByteArrayEquals(String expectedUtf8, byte[] b) { 37e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller assertEquals(expectedUtf8, new String(b, Util.UTF_8)); 38e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller } 39e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 40e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller static ByteString randomBytes(int length) { 41e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller Random random = new Random(0); 42e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller byte[] randomBytes = new byte[length]; 43e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller random.nextBytes(randomBytes); 44e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller return ByteString.of(randomBytes); 45e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller } 46e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller 47e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller static String repeat(char c, int count) { 48e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller char[] array = new char[count]; 49e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller Arrays.fill(array, c); 50e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller return new String(array); 51e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller } 52a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller 53a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller public static void assertEquivalent(ByteString b1, ByteString b2) { 54a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller // Equals. 55a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertTrue(b1.equals(b2)); 56a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertTrue(b1.equals(b1)); 57a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertTrue(b2.equals(b1)); 58a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller 59a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller // Hash code. 60a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertEquals(b1.hashCode(), b2.hashCode()); 61a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertEquals(b1.hashCode(), b1.hashCode()); 62a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertEquals(b1.toString(), b2.toString()); 63a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller 64a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller // Content. 65a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertEquals(b1.size(), b2.size()); 66a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller byte[] b2Bytes = b2.toByteArray(); 67a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller for (int i = 0; i < b2Bytes.length; i++) { 68a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller byte b = b2Bytes[i]; 69a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertEquals(b, b1.getByte(i)); 70a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller } 71a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertByteArraysEquals(b1.toByteArray(), b2Bytes); 72a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller 73a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller // Doesn't equal a different byte string. 74a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertFalse(b1.equals(null)); 75a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertFalse(b1.equals(new Object())); 76a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller if (b2Bytes.length > 0) { 77a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller byte[] b3Bytes = b2Bytes.clone(); 78a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller b3Bytes[b3Bytes.length - 1]++; 79a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller ByteString b3 = new ByteString(b3Bytes); 80a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertFalse(b1.equals(b3)); 81a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertFalse(b1.hashCode() == b3.hashCode()); 82a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller } else { 83a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller ByteString b3 = ByteString.encodeUtf8("a"); 84a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertFalse(b1.equals(b3)); 85a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertFalse(b1.hashCode() == b3.hashCode()); 86a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller } 87a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller } 88a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller 89a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller public static void assertEquivalent(Buffer b1, Buffer b2) { 90a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller // Equals. 91a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertTrue(b1.equals(b2)); 92a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertTrue(b1.equals(b1)); 93a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertTrue(b2.equals(b1)); 94a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller 95a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller // Hash code. 96a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertEquals(b1.hashCode(), b2.hashCode()); 97a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertEquals(b1.hashCode(), b1.hashCode()); 98a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertEquals(b1.toString(), b2.toString()); 99a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller 100a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller // Content. 101a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertEquals(b1.size(), b2.size()); 102a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller Buffer buffer = new Buffer(); 103a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller b2.copyTo(buffer, 0, b2.size); 104a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller byte[] b2Bytes = b2.readByteArray(); 105a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller for (int i = 0; i < b2Bytes.length; i++) { 106a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller byte b = b2Bytes[i]; 107a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertEquals(b, b1.getByte(i)); 108a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller } 109a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller 110a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller // Doesn't equal a different buffer. 111a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertFalse(b1.equals(null)); 112a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertFalse(b1.equals(new Object())); 113a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller if (b2Bytes.length > 0) { 114a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller byte[] b3Bytes = b2Bytes.clone(); 115a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller b3Bytes[b3Bytes.length - 1]++; 116a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller Buffer b3 = new Buffer().write(b3Bytes); 117a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertFalse(b1.equals(b3)); 118a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertFalse(b1.hashCode() == b3.hashCode()); 119a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller } else { 120a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller Buffer b3 = new Buffer().writeUtf8("a"); 121a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertFalse(b1.equals(b3)); 122a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller assertFalse(b1.hashCode() == b3.hashCode()); 123a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller } 124a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller } 125a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller 126a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller /** Serializes original to bytes, then deserializes those bytes and returns the result. */ 127a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller @SuppressWarnings("unchecked") // Assume serialization doesn't change types. 128a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller public static <T extends Serializable> T reserialize(T original) throws Exception { 129a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller Buffer buffer = new Buffer(); 130a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller ObjectOutputStream out = new ObjectOutputStream(buffer.outputStream()); 131a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller out.writeObject(original); 132a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller ObjectInputStream in = new ObjectInputStream(buffer.inputStream()); 133a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller return (T) in.readObject(); 134a2cab72aa5ff730ba2ae987b45398faafffeb505Neil Fuller } 135e78f117bcbd6b57d783737107f445ef75ecb474aNeil Fuller} 136