1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
39
40
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 }