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