1 /* 2 * Copyright (C) 2011 The Guava Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.google.common.hash; 18 19 import static java.nio.charset.StandardCharsets.US_ASCII; 20 import static java.nio.charset.StandardCharsets.UTF_8; 21 import static org.mockito.Mockito.inOrder; 22 import static org.mockito.Mockito.mock; 23 import static org.mockito.Mockito.verify; 24 25 import com.google.common.testing.EqualsTester; 26 import com.google.common.testing.SerializableTester; 27 import java.io.OutputStream; 28 import java.nio.ByteBuffer; 29 import java.nio.charset.Charset; 30 import java.util.Arrays; 31 import junit.framework.TestCase; 32 import org.mockito.InOrder; 33 34 /** 35 * Tests for HashExtractors. 36 * 37 * @author Dimitris Andreou 38 */ 39 public class FunnelsTest extends TestCase { testForBytes()40 public void testForBytes() { 41 PrimitiveSink primitiveSink = mock(PrimitiveSink.class); 42 Funnels.byteArrayFunnel().funnel(new byte[] {4, 3, 2, 1}, primitiveSink); 43 verify(primitiveSink).putBytes(new byte[] {4, 3, 2, 1}); 44 } 45 testForBytes_null()46 public void testForBytes_null() { 47 assertNullsThrowException(Funnels.byteArrayFunnel()); 48 } 49 testForStrings()50 public void testForStrings() { 51 PrimitiveSink primitiveSink = mock(PrimitiveSink.class); 52 Funnels.unencodedCharsFunnel().funnel("test", primitiveSink); 53 verify(primitiveSink).putUnencodedChars("test"); 54 } 55 testForStrings_null()56 public void testForStrings_null() { 57 assertNullsThrowException(Funnels.unencodedCharsFunnel()); 58 } 59 testForStringsCharset()60 public void testForStringsCharset() { 61 for (Charset charset : Charset.availableCharsets().values()) { 62 PrimitiveSink primitiveSink = mock(PrimitiveSink.class); 63 Funnels.stringFunnel(charset).funnel("test", primitiveSink); 64 verify(primitiveSink).putString("test", charset); 65 } 66 } 67 testForStringsCharset_null()68 public void testForStringsCharset_null() { 69 for (Charset charset : Charset.availableCharsets().values()) { 70 assertNullsThrowException(Funnels.stringFunnel(charset)); 71 } 72 } 73 testForInts()74 public void testForInts() { 75 Integer value = 1234; 76 PrimitiveSink primitiveSink = mock(PrimitiveSink.class); 77 Funnels.integerFunnel().funnel(value, primitiveSink); 78 verify(primitiveSink).putInt(1234); 79 } 80 testForInts_null()81 public void testForInts_null() { 82 assertNullsThrowException(Funnels.integerFunnel()); 83 } 84 testForLongs()85 public void testForLongs() { 86 Long value = 1234L; 87 PrimitiveSink primitiveSink = mock(PrimitiveSink.class); 88 Funnels.longFunnel().funnel(value, primitiveSink); 89 verify(primitiveSink).putLong(1234); 90 } 91 testForLongs_null()92 public void testForLongs_null() { 93 assertNullsThrowException(Funnels.longFunnel()); 94 } 95 testSequential()96 public void testSequential() { 97 @SuppressWarnings({"unchecked", "DoNotMock"}) 98 Funnel<Object> elementFunnel = mock(Funnel.class); 99 PrimitiveSink primitiveSink = mock(PrimitiveSink.class); 100 Funnel<Iterable<?>> sequential = Funnels.sequentialFunnel(elementFunnel); 101 sequential.funnel(Arrays.asList("foo", "bar", "baz", "quux"), primitiveSink); 102 InOrder inOrder = inOrder(elementFunnel); 103 inOrder.verify(elementFunnel).funnel("foo", primitiveSink); 104 inOrder.verify(elementFunnel).funnel("bar", primitiveSink); 105 inOrder.verify(elementFunnel).funnel("baz", primitiveSink); 106 inOrder.verify(elementFunnel).funnel("quux", primitiveSink); 107 } 108 assertNullsThrowException(Funnel<?> funnel)109 private static void assertNullsThrowException(Funnel<?> funnel) { 110 PrimitiveSink primitiveSink = 111 new AbstractStreamingHasher(4, 4) { 112 @Override 113 protected HashCode makeHash() { 114 throw new UnsupportedOperationException(); 115 } 116 117 @Override 118 protected void process(ByteBuffer bb) { 119 while (bb.hasRemaining()) { 120 bb.get(); 121 } 122 } 123 }; 124 try { 125 funnel.funnel(null, primitiveSink); 126 fail(); 127 } catch (NullPointerException ok) { 128 } 129 } 130 testAsOutputStream()131 public void testAsOutputStream() throws Exception { 132 PrimitiveSink sink = mock(PrimitiveSink.class); 133 OutputStream out = Funnels.asOutputStream(sink); 134 byte[] bytes = {1, 2, 3, 4}; 135 out.write(255); 136 out.write(bytes); 137 out.write(bytes, 1, 2); 138 verify(sink).putByte((byte) 255); 139 verify(sink).putBytes(bytes); 140 verify(sink).putBytes(bytes, 1, 2); 141 } 142 testSerialization()143 public void testSerialization() { 144 assertSame( 145 Funnels.byteArrayFunnel(), SerializableTester.reserialize(Funnels.byteArrayFunnel())); 146 assertSame(Funnels.integerFunnel(), SerializableTester.reserialize(Funnels.integerFunnel())); 147 assertSame(Funnels.longFunnel(), SerializableTester.reserialize(Funnels.longFunnel())); 148 assertSame( 149 Funnels.unencodedCharsFunnel(), 150 SerializableTester.reserialize(Funnels.unencodedCharsFunnel())); 151 assertEquals( 152 Funnels.sequentialFunnel(Funnels.integerFunnel()), 153 SerializableTester.reserialize(Funnels.sequentialFunnel(Funnels.integerFunnel()))); 154 assertEquals( 155 Funnels.stringFunnel(US_ASCII), 156 SerializableTester.reserialize(Funnels.stringFunnel(US_ASCII))); 157 } 158 testEquals()159 public void testEquals() { 160 new EqualsTester() 161 .addEqualityGroup(Funnels.byteArrayFunnel()) 162 .addEqualityGroup(Funnels.integerFunnel()) 163 .addEqualityGroup(Funnels.longFunnel()) 164 .addEqualityGroup(Funnels.unencodedCharsFunnel()) 165 .addEqualityGroup(Funnels.stringFunnel(UTF_8)) 166 .addEqualityGroup(Funnels.stringFunnel(US_ASCII)) 167 .addEqualityGroup( 168 Funnels.sequentialFunnel(Funnels.integerFunnel()), 169 SerializableTester.reserialize(Funnels.sequentialFunnel(Funnels.integerFunnel()))) 170 .addEqualityGroup(Funnels.sequentialFunnel(Funnels.longFunnel())) 171 .testEquals(); 172 } 173 } 174