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 org.mockito.Mockito.inOrder; 20 import static org.mockito.Mockito.mock; 21 import static org.mockito.Mockito.verify; 22 23 import com.google.common.base.Charsets; 24 import com.google.common.hash.AbstractStreamingHashFunction.AbstractStreamingHasher; 25 import com.google.common.testing.EqualsTester; 26 import com.google.common.testing.SerializableTester; 27 28 import junit.framework.TestCase; 29 30 import org.mockito.InOrder; 31 32 import java.io.OutputStream; 33 import java.nio.ByteBuffer; 34 import java.nio.charset.Charset; 35 import java.util.Arrays; 36 37 /** 38 * Tests for HashExtractors. 39 * 40 * @author Dimitris Andreou 41 */ 42 public class FunnelsTest extends TestCase { 43 public void testForBytes() { 44 PrimitiveSink primitiveSink = mock(PrimitiveSink.class); 45 Funnels.byteArrayFunnel().funnel(new byte[] { 4, 3, 2, 1 }, primitiveSink); 46 verify(primitiveSink).putBytes(new byte[] { 4, 3, 2, 1 }); 47 } 48 49 public void testForBytes_null() { 50 assertNullsThrowException(Funnels.byteArrayFunnel()); 51 } 52 53 public void testForStrings() { 54 PrimitiveSink primitiveSink = mock(PrimitiveSink.class); 55 Funnels.unencodedCharsFunnel().funnel("test", primitiveSink); 56 verify(primitiveSink).putUnencodedChars("test"); 57 } 58 59 public void testForStrings_null() { 60 assertNullsThrowException(Funnels.unencodedCharsFunnel()); 61 } 62 63 public void testForStringsCharset() { 64 for (Charset charset : Charset.availableCharsets().values()) { 65 PrimitiveSink primitiveSink = mock(PrimitiveSink.class); 66 Funnels.stringFunnel(charset).funnel("test", primitiveSink); 67 verify(primitiveSink).putString("test", charset); 68 } 69 } 70 71 public void testForStringsCharset_null() { 72 for (Charset charset : Charset.availableCharsets().values()) { 73 assertNullsThrowException(Funnels.stringFunnel(charset)); 74 } 75 } 76 77 public void testForInts() { 78 Integer value = 1234; 79 PrimitiveSink primitiveSink = mock(PrimitiveSink.class); 80 Funnels.integerFunnel().funnel(value, primitiveSink); 81 verify(primitiveSink).putInt(1234); 82 } 83 84 public void testForInts_null() { 85 assertNullsThrowException(Funnels.integerFunnel()); 86 } 87 88 public void testForLongs() { 89 Long value = 1234L; 90 PrimitiveSink primitiveSink = mock(PrimitiveSink.class); 91 Funnels.longFunnel().funnel(value, primitiveSink); 92 verify(primitiveSink).putLong(1234); 93 } 94 95 public void testForLongs_null() { 96 assertNullsThrowException(Funnels.longFunnel()); 97 } 98 99 public void testSequential() { 100 @SuppressWarnings("unchecked") 101 Funnel<Object> elementFunnel = mock(Funnel.class); 102 PrimitiveSink primitiveSink = mock(PrimitiveSink.class); 103 Funnel<Iterable<? extends Object>> sequential = Funnels.sequentialFunnel(elementFunnel); 104 sequential.funnel(Arrays.asList("foo", "bar", "baz", "quux"), primitiveSink); 105 InOrder inOrder = inOrder(elementFunnel); 106 inOrder.verify(elementFunnel).funnel("foo", primitiveSink); 107 inOrder.verify(elementFunnel).funnel("bar", primitiveSink); 108 inOrder.verify(elementFunnel).funnel("baz", primitiveSink); 109 inOrder.verify(elementFunnel).funnel("quux", primitiveSink); 110 } 111 112 private static void assertNullsThrowException(Funnel<?> funnel) { 113 PrimitiveSink primitiveSink = new AbstractStreamingHasher(4, 4) { 114 @Override HashCode makeHash() { throw new UnsupportedOperationException(); } 115 116 @Override protected void process(ByteBuffer bb) { 117 while (bb.hasRemaining()) { 118 bb.get(); 119 } 120 } 121 }; 122 try { 123 funnel.funnel(null, primitiveSink); 124 fail(); 125 } catch (NullPointerException ok) {} 126 } 127 128 public void testAsOutputStream() throws Exception { 129 PrimitiveSink sink = mock(PrimitiveSink.class); 130 OutputStream out = Funnels.asOutputStream(sink); 131 byte[] bytes = { 1, 2, 3, 4 }; 132 out.write(255); 133 out.write(bytes); 134 out.write(bytes, 1, 2); 135 verify(sink).putByte((byte) 255); 136 verify(sink).putBytes(bytes); 137 verify(sink).putBytes(bytes, 1, 2); 138 } 139 140 public void testSerialization() { 141 assertSame( 142 Funnels.byteArrayFunnel(), 143 SerializableTester.reserialize(Funnels.byteArrayFunnel())); 144 assertSame( 145 Funnels.integerFunnel(), 146 SerializableTester.reserialize(Funnels.integerFunnel())); 147 assertSame( 148 Funnels.longFunnel(), 149 SerializableTester.reserialize(Funnels.longFunnel())); 150 assertSame( 151 Funnels.unencodedCharsFunnel(), 152 SerializableTester.reserialize(Funnels.unencodedCharsFunnel())); 153 assertEquals( 154 Funnels.sequentialFunnel(Funnels.integerFunnel()), 155 SerializableTester.reserialize(Funnels.sequentialFunnel(Funnels.integerFunnel()))); 156 assertEquals( 157 Funnels.stringFunnel(Charsets.US_ASCII), 158 SerializableTester.reserialize(Funnels.stringFunnel(Charsets.US_ASCII))); 159 } 160 161 public void testEquals() { 162 new EqualsTester() 163 .addEqualityGroup(Funnels.byteArrayFunnel()) 164 .addEqualityGroup(Funnels.integerFunnel()) 165 .addEqualityGroup(Funnels.longFunnel()) 166 .addEqualityGroup(Funnels.unencodedCharsFunnel()) 167 .addEqualityGroup(Funnels.stringFunnel(Charsets.UTF_8)) 168 .addEqualityGroup(Funnels.stringFunnel(Charsets.US_ASCII)) 169 .addEqualityGroup(Funnels.sequentialFunnel(Funnels.integerFunnel()), 170 SerializableTester.reserialize(Funnels.sequentialFunnel( 171 Funnels.integerFunnel()))) 172 .addEqualityGroup(Funnels.sequentialFunnel(Funnels.longFunnel())) 173 .testEquals(); 174 } 175 } 176