10888a09821a98ac0680fad765217302858e70fa4Paul Duffin/* 20888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Copyright (C) 2013 The Guava Authors 30888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 40888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 50888a09821a98ac0680fad765217302858e70fa4Paul Duffin * in compliance with the License. You may obtain a copy of the License at 60888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 70888a09821a98ac0680fad765217302858e70fa4Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0 80888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 90888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Unless required by applicable law or agreed to in writing, software distributed under the License 100888a09821a98ac0680fad765217302858e70fa4Paul Duffin * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 110888a09821a98ac0680fad765217302858e70fa4Paul Duffin * or implied. See the License for the specific language governing permissions and limitations under 120888a09821a98ac0680fad765217302858e70fa4Paul Duffin * the License. 130888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 140888a09821a98ac0680fad765217302858e70fa4Paul Duffin 150888a09821a98ac0680fad765217302858e70fa4Paul Duffinpackage com.google.common.hash; 160888a09821a98ac0680fad765217302858e70fa4Paul Duffin 170888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static org.easymock.EasyMock.aryEq; 180888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static org.easymock.EasyMock.eq; 190888a09821a98ac0680fad765217302858e70fa4Paul Duffin 200888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.testing.NullPointerTester; 210888a09821a98ac0680fad765217302858e70fa4Paul Duffin 220888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestCase; 230888a09821a98ac0680fad765217302858e70fa4Paul Duffin 240888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport org.easymock.EasyMock; 250888a09821a98ac0680fad765217302858e70fa4Paul Duffin 260888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.io.ByteArrayInputStream; 273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinimport java.util.Arrays; 280888a09821a98ac0680fad765217302858e70fa4Paul Duffin 290888a09821a98ac0680fad765217302858e70fa4Paul Duffin/** 300888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Tests for {@link HashingInputStream}. 310888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 320888a09821a98ac0680fad765217302858e70fa4Paul Duffin * @author Qian Huang 330888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 340888a09821a98ac0680fad765217302858e70fa4Paul Duffinpublic class HashingInputStreamTest extends TestCase { 350888a09821a98ac0680fad765217302858e70fa4Paul Duffin private Hasher hasher; 360888a09821a98ac0680fad765217302858e70fa4Paul Duffin private HashFunction hashFunction; 370888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static final byte[] testBytes = new byte[] {'y', 'a', 'm', 's'}; 380888a09821a98ac0680fad765217302858e70fa4Paul Duffin private ByteArrayInputStream buffer; 390888a09821a98ac0680fad765217302858e70fa4Paul Duffin 400888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override protected void setUp() throws Exception { 410888a09821a98ac0680fad765217302858e70fa4Paul Duffin super.setUp(); 420888a09821a98ac0680fad765217302858e70fa4Paul Duffin hasher = EasyMock.createMock(Hasher.class); 430888a09821a98ac0680fad765217302858e70fa4Paul Duffin hashFunction = EasyMock.createMock(HashFunction.class); 440888a09821a98ac0680fad765217302858e70fa4Paul Duffin buffer = new ByteArrayInputStream(testBytes); 450888a09821a98ac0680fad765217302858e70fa4Paul Duffin 460888a09821a98ac0680fad765217302858e70fa4Paul Duffin EasyMock.expect(hashFunction.newHasher()).andReturn(hasher).once(); 470888a09821a98ac0680fad765217302858e70fa4Paul Duffin EasyMock.replay(hashFunction); 480888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 490888a09821a98ac0680fad765217302858e70fa4Paul Duffin 500888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testRead_putSingleByte() throws Exception { 510888a09821a98ac0680fad765217302858e70fa4Paul Duffin EasyMock.expect(hasher.putByte((byte) 'y')).andReturn(hasher).once(); 520888a09821a98ac0680fad765217302858e70fa4Paul Duffin EasyMock.replay(hasher); 530888a09821a98ac0680fad765217302858e70fa4Paul Duffin HashingInputStream in = new HashingInputStream(hashFunction, buffer); 540888a09821a98ac0680fad765217302858e70fa4Paul Duffin 550888a09821a98ac0680fad765217302858e70fa4Paul Duffin int b = in.read(); 560888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals('y', b); 570888a09821a98ac0680fad765217302858e70fa4Paul Duffin 580888a09821a98ac0680fad765217302858e70fa4Paul Duffin EasyMock.verify(hashFunction); 590888a09821a98ac0680fad765217302858e70fa4Paul Duffin EasyMock.verify(hasher); 600888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 610888a09821a98ac0680fad765217302858e70fa4Paul Duffin 620888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testRead_putByteArray() throws Exception { 630888a09821a98ac0680fad765217302858e70fa4Paul Duffin EasyMock.expect(hasher.putBytes(aryEq(testBytes), eq(0), eq(testBytes.length))) 640888a09821a98ac0680fad765217302858e70fa4Paul Duffin .andReturn(hasher).once(); 650888a09821a98ac0680fad765217302858e70fa4Paul Duffin EasyMock.replay(hasher); 660888a09821a98ac0680fad765217302858e70fa4Paul Duffin HashingInputStream in = new HashingInputStream(hashFunction, buffer); 670888a09821a98ac0680fad765217302858e70fa4Paul Duffin 680888a09821a98ac0680fad765217302858e70fa4Paul Duffin byte[] buf = new byte[4]; 690888a09821a98ac0680fad765217302858e70fa4Paul Duffin int numOfByteRead = in.read(buf, 0, buf.length); 700888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(4, numOfByteRead); 710888a09821a98ac0680fad765217302858e70fa4Paul Duffin for (int i = 0; i < testBytes.length; i++) { 720888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(testBytes[i], buf[i]); 730888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 740888a09821a98ac0680fad765217302858e70fa4Paul Duffin 750888a09821a98ac0680fad765217302858e70fa4Paul Duffin EasyMock.verify(hashFunction); 760888a09821a98ac0680fad765217302858e70fa4Paul Duffin EasyMock.verify(hasher); 770888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 780888a09821a98ac0680fad765217302858e70fa4Paul Duffin 790888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testRead_putByteArrayAtPos() throws Exception { 803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin EasyMock.expect(hasher.putBytes(aryEq(Arrays.copyOfRange(testBytes, 0, 3)), eq(0), eq(3))) 810888a09821a98ac0680fad765217302858e70fa4Paul Duffin .andReturn(hasher).once(); 820888a09821a98ac0680fad765217302858e70fa4Paul Duffin EasyMock.replay(hasher); 830888a09821a98ac0680fad765217302858e70fa4Paul Duffin HashingInputStream in = new HashingInputStream(hashFunction, buffer); 840888a09821a98ac0680fad765217302858e70fa4Paul Duffin 850888a09821a98ac0680fad765217302858e70fa4Paul Duffin byte[] buf = new byte[3]; 860888a09821a98ac0680fad765217302858e70fa4Paul Duffin int numOfByteRead = in.read(buf, 0, 3); 870888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(3, numOfByteRead); 880888a09821a98ac0680fad765217302858e70fa4Paul Duffin for (int i = 0; i < numOfByteRead; i++) { 890888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(testBytes[i], buf[i]); 900888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 910888a09821a98ac0680fad765217302858e70fa4Paul Duffin 920888a09821a98ac0680fad765217302858e70fa4Paul Duffin EasyMock.verify(hashFunction); 930888a09821a98ac0680fad765217302858e70fa4Paul Duffin EasyMock.verify(hasher); 940888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 950888a09821a98ac0680fad765217302858e70fa4Paul Duffin 960888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testRead_putByteArrayOutOfBound() throws Exception { 970888a09821a98ac0680fad765217302858e70fa4Paul Duffin byte[] buf = new byte[100]; 980888a09821a98ac0680fad765217302858e70fa4Paul Duffin byte[] expectedBytes = buf.clone(); 990888a09821a98ac0680fad765217302858e70fa4Paul Duffin System.arraycopy(testBytes, 0, expectedBytes, 0, testBytes.length); 1000888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1010888a09821a98ac0680fad765217302858e70fa4Paul Duffin EasyMock.expect(hasher.putBytes(aryEq(expectedBytes), eq(0), eq(4))) 1020888a09821a98ac0680fad765217302858e70fa4Paul Duffin .andReturn(hasher).once(); 1030888a09821a98ac0680fad765217302858e70fa4Paul Duffin EasyMock.replay(hasher); 1040888a09821a98ac0680fad765217302858e70fa4Paul Duffin HashingInputStream in = new HashingInputStream(hashFunction, buffer); 1050888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1060888a09821a98ac0680fad765217302858e70fa4Paul Duffin int numOfByteRead = in.read(buf, 0, 100); 1070888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(4, numOfByteRead); 1080888a09821a98ac0680fad765217302858e70fa4Paul Duffin for (int i = 0; i < numOfByteRead; i++) { 1090888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(testBytes[i], buf[i]); 1100888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1110888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1120888a09821a98ac0680fad765217302858e70fa4Paul Duffin EasyMock.verify(hashFunction); 1130888a09821a98ac0680fad765217302858e70fa4Paul Duffin EasyMock.verify(hasher); 1140888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1150888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1160888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testHash_hashesCorrectly() throws Exception { 1170888a09821a98ac0680fad765217302858e70fa4Paul Duffin HashCode expectedHash = Hashing.md5().hashBytes(testBytes); 1180888a09821a98ac0680fad765217302858e70fa4Paul Duffin HashingInputStream in = new HashingInputStream(Hashing.md5(), buffer); 1190888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1200888a09821a98ac0680fad765217302858e70fa4Paul Duffin byte[] buf = new byte[4]; 1210888a09821a98ac0680fad765217302858e70fa4Paul Duffin int numOfByteRead = in.read(buf, 0, buf.length); 1220888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(4, numOfByteRead); 1230888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1240888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(expectedHash, in.hash()); 1250888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1260888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1270888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testHash_hashesCorrectlyReadOutOfBound() throws Exception { 1280888a09821a98ac0680fad765217302858e70fa4Paul Duffin HashCode expectedHash = Hashing.md5().hashBytes(testBytes); 1290888a09821a98ac0680fad765217302858e70fa4Paul Duffin HashingInputStream in = new HashingInputStream(Hashing.md5(), buffer); 1300888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1310888a09821a98ac0680fad765217302858e70fa4Paul Duffin byte[] buf = new byte[100]; 1320888a09821a98ac0680fad765217302858e70fa4Paul Duffin int numOfByteRead = in.read(buf, 0, buf.length); 1330888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(-1, in.read()); // additional read 1340888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(4, numOfByteRead); 1350888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1360888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(expectedHash, in.hash()); 1370888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1380888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1390888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testHash_hashesCorrectlyForSkipping() throws Exception { 1400888a09821a98ac0680fad765217302858e70fa4Paul Duffin HashCode expectedHash = Hashing.md5().hashBytes(new byte[] {'m', 's'}); 1410888a09821a98ac0680fad765217302858e70fa4Paul Duffin HashingInputStream in = new HashingInputStream(Hashing.md5(), buffer); 1420888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1430888a09821a98ac0680fad765217302858e70fa4Paul Duffin long numOfByteSkipped = in.skip(2); 1440888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(2, numOfByteSkipped); 1450888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1460888a09821a98ac0680fad765217302858e70fa4Paul Duffin byte[] buf = new byte[4]; 1470888a09821a98ac0680fad765217302858e70fa4Paul Duffin int numOfByteRead = in.read(buf, 0, buf.length); 1480888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(2, numOfByteRead); 1490888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1500888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(expectedHash, in.hash()); 1510888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1520888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1530888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testChecksForNull() throws Exception { 1540888a09821a98ac0680fad765217302858e70fa4Paul Duffin NullPointerTester tester = new NullPointerTester(); 1550888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1560888a09821a98ac0680fad765217302858e70fa4Paul Duffin tester.testAllPublicInstanceMethods(new HashingInputStream(Hashing.md5(), buffer)); 1570888a09821a98ac0680fad765217302858e70fa4Paul Duffin tester.testAllPublicStaticMethods(HashingInputStream.class); 1580888a09821a98ac0680fad765217302858e70fa4Paul Duffin tester.testAllPublicConstructors(HashingInputStream.class); 1590888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1600888a09821a98ac0680fad765217302858e70fa4Paul Duffin} 161