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