• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 The Guava Authors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5  * in compliance with the License. You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software distributed under the License
10  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11  * or implied. See the License for the specific language governing permissions and limitations under
12  * the License.
13  */
14 
15 package com.google.common.hash;
16 
17 import static com.google.common.base.Charsets.UTF_16LE;
18 import static org.junit.Assert.assertArrayEquals;
19 
20 import junit.framework.TestCase;
21 
22 import java.io.ByteArrayOutputStream;
23 import java.util.Random;
24 
25 /**
26  * Tests for AbstractByteHasher.
27  *
28  * @author Colin Decker
29  */
30 public class AbstractByteHasherTest extends TestCase {
31 
testBytes()32   public void testBytes() {
33     TestHasher hasher = new TestHasher(); // byte order insignificant here
34     byte[] expected = {1, 2, 3, 4, 5, 6, 7, 8};
35     hasher.putByte((byte) 1);
36     hasher.putBytes(new byte[]{2, 3, 4, 5, 6});
37     hasher.putByte((byte) 7);
38     hasher.putBytes(new byte[]{});
39     hasher.putBytes(new byte[]{8});
40     hasher.assertBytes(expected);
41   }
42 
testShort()43   public void testShort() {
44     TestHasher hasher = new TestHasher();
45     hasher.putShort((short) 0x0201);
46     hasher.assertBytes(new byte[]{1, 2});
47   }
48 
testInt()49   public void testInt() {
50     TestHasher hasher = new TestHasher();
51     hasher.putInt(0x04030201);
52     hasher.assertBytes(new byte[]{1, 2, 3, 4});
53   }
54 
testLong()55   public void testLong() {
56     TestHasher hasher = new TestHasher();
57     hasher.putLong(0x0807060504030201L);
58     hasher.assertBytes(new byte[]{1, 2, 3, 4, 5, 6, 7, 8});
59   }
60 
testChar()61   public void testChar() {
62     TestHasher hasher = new TestHasher();
63     hasher.putChar((char) 0x0201);
64     hasher.assertBytes(new byte[]{1, 2});
65   }
66 
testString()67   public void testString() {
68     Random random = new Random();
69     for (int i = 0; i < 100; i++) {
70       byte[] bytes = new byte[64];
71       random.nextBytes(bytes);
72       String s = new String(bytes, UTF_16LE); // so all random strings are valid
73       assertEquals(
74           new TestHasher().putUnencodedChars(s).hash(),
75           new TestHasher().putBytes(s.getBytes(UTF_16LE)).hash());
76       assertEquals(
77           new TestHasher().putUnencodedChars(s).hash(),
78           new TestHasher().putString(s, UTF_16LE).hash());
79     }
80   }
81 
testFloat()82   public void testFloat() {
83     TestHasher hasher = new TestHasher();
84     hasher.putFloat(Float.intBitsToFloat(0x04030201));
85     hasher.assertBytes(new byte[]{1, 2, 3, 4});
86   }
87 
testDouble()88   public void testDouble() {
89     TestHasher hasher = new TestHasher();
90     hasher.putDouble(Double.longBitsToDouble(0x0807060504030201L));
91     hasher.assertBytes(new byte[]{1, 2, 3, 4, 5, 6, 7, 8});
92   }
93 
testCorrectExceptions()94   public void testCorrectExceptions() {
95     TestHasher hasher = new TestHasher();
96     try {
97       hasher.putBytes(new byte[8], -1, 4);
98       fail();
99     } catch (IndexOutOfBoundsException expected) {
100     }
101     try {
102       hasher.putBytes(new byte[8], 0, 16);
103       fail();
104     } catch (IndexOutOfBoundsException expected) {
105     }
106     try {
107       hasher.putBytes(new byte[8], 0, -1);
108       fail();
109     } catch (IndexOutOfBoundsException expected) {
110     }
111   }
112 
113   private class TestHasher extends AbstractByteHasher {
114 
115     private final ByteArrayOutputStream out = new ByteArrayOutputStream();
116 
117     @Override
update(byte b)118     protected void update(byte b) {
119       out.write(b);
120     }
121 
122     @Override
update(byte[] b, int off, int len)123     protected void update(byte[] b, int off, int len) {
124       out.write(b, off, len);
125     }
126 
bytes()127     byte[] bytes() {
128       return out.toByteArray();
129     }
130 
assertBytes(byte[] expected)131     void assertBytes(byte[] expected) {
132       assertArrayEquals(expected, bytes());
133     }
134 
135     @Override
hash()136     public HashCode hash() {
137       return HashCode.fromBytesNoCopy(bytes());
138     }
139   }
140 }
141