• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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