blob: 6b0c75862cac087a1570cc8cd237e8cbe972932a [file] [log] [blame]
/*
* Copyright (C) 2011 The Guava Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.common.hash;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import com.google.common.base.Charsets;
import com.google.common.testing.EqualsTester;
import com.google.common.testing.SerializableTester;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.util.Arrays;
import junit.framework.TestCase;
import org.mockito.InOrder;
/**
* Tests for HashExtractors.
*
* @author Dimitris Andreou
*/
public class FunnelsTest extends TestCase {
public void testForBytes() {
PrimitiveSink primitiveSink = mock(PrimitiveSink.class);
Funnels.byteArrayFunnel().funnel(new byte[] {4, 3, 2, 1}, primitiveSink);
verify(primitiveSink).putBytes(new byte[] {4, 3, 2, 1});
}
public void testForBytes_null() {
assertNullsThrowException(Funnels.byteArrayFunnel());
}
public void testForStrings() {
PrimitiveSink primitiveSink = mock(PrimitiveSink.class);
Funnels.unencodedCharsFunnel().funnel("test", primitiveSink);
verify(primitiveSink).putUnencodedChars("test");
}
public void testForStrings_null() {
assertNullsThrowException(Funnels.unencodedCharsFunnel());
}
public void testForStringsCharset() {
for (Charset charset : Charset.availableCharsets().values()) {
PrimitiveSink primitiveSink = mock(PrimitiveSink.class);
Funnels.stringFunnel(charset).funnel("test", primitiveSink);
verify(primitiveSink).putString("test", charset);
}
}
public void testForStringsCharset_null() {
for (Charset charset : Charset.availableCharsets().values()) {
assertNullsThrowException(Funnels.stringFunnel(charset));
}
}
public void testForInts() {
Integer value = 1234;
PrimitiveSink primitiveSink = mock(PrimitiveSink.class);
Funnels.integerFunnel().funnel(value, primitiveSink);
verify(primitiveSink).putInt(1234);
}
public void testForInts_null() {
assertNullsThrowException(Funnels.integerFunnel());
}
public void testForLongs() {
Long value = 1234L;
PrimitiveSink primitiveSink = mock(PrimitiveSink.class);
Funnels.longFunnel().funnel(value, primitiveSink);
verify(primitiveSink).putLong(1234);
}
public void testForLongs_null() {
assertNullsThrowException(Funnels.longFunnel());
}
public void testSequential() {
@SuppressWarnings({"unchecked", "DoNotMock"})
Funnel<Object> elementFunnel = mock(Funnel.class);
PrimitiveSink primitiveSink = mock(PrimitiveSink.class);
Funnel<Iterable<?>> sequential = Funnels.sequentialFunnel(elementFunnel);
sequential.funnel(Arrays.asList("foo", "bar", "baz", "quux"), primitiveSink);
InOrder inOrder = inOrder(elementFunnel);
inOrder.verify(elementFunnel).funnel("foo", primitiveSink);
inOrder.verify(elementFunnel).funnel("bar", primitiveSink);
inOrder.verify(elementFunnel).funnel("baz", primitiveSink);
inOrder.verify(elementFunnel).funnel("quux", primitiveSink);
}
private static void assertNullsThrowException(Funnel<?> funnel) {
PrimitiveSink primitiveSink =
new AbstractStreamingHasher(4, 4) {
@Override
protected HashCode makeHash() {
throw new UnsupportedOperationException();
}
@Override
protected void process(ByteBuffer bb) {
while (bb.hasRemaining()) {
bb.get();
}
}
};
try {
funnel.funnel(null, primitiveSink);
fail();
} catch (NullPointerException ok) {
}
}
public void testAsOutputStream() throws Exception {
PrimitiveSink sink = mock(PrimitiveSink.class);
OutputStream out = Funnels.asOutputStream(sink);
byte[] bytes = {1, 2, 3, 4};
out.write(255);
out.write(bytes);
out.write(bytes, 1, 2);
verify(sink).putByte((byte) 255);
verify(sink).putBytes(bytes);
verify(sink).putBytes(bytes, 1, 2);
}
public void testSerialization() {
assertSame(
Funnels.byteArrayFunnel(), SerializableTester.reserialize(Funnels.byteArrayFunnel()));
assertSame(Funnels.integerFunnel(), SerializableTester.reserialize(Funnels.integerFunnel()));
assertSame(Funnels.longFunnel(), SerializableTester.reserialize(Funnels.longFunnel()));
assertSame(
Funnels.unencodedCharsFunnel(),
SerializableTester.reserialize(Funnels.unencodedCharsFunnel()));
assertEquals(
Funnels.sequentialFunnel(Funnels.integerFunnel()),
SerializableTester.reserialize(Funnels.sequentialFunnel(Funnels.integerFunnel())));
assertEquals(
Funnels.stringFunnel(Charsets.US_ASCII),
SerializableTester.reserialize(Funnels.stringFunnel(Charsets.US_ASCII)));
}
public void testEquals() {
new EqualsTester()
.addEqualityGroup(Funnels.byteArrayFunnel())
.addEqualityGroup(Funnels.integerFunnel())
.addEqualityGroup(Funnels.longFunnel())
.addEqualityGroup(Funnels.unencodedCharsFunnel())
.addEqualityGroup(Funnels.stringFunnel(Charsets.UTF_8))
.addEqualityGroup(Funnels.stringFunnel(Charsets.US_ASCII))
.addEqualityGroup(
Funnels.sequentialFunnel(Funnels.integerFunnel()),
SerializableTester.reserialize(Funnels.sequentialFunnel(Funnels.integerFunnel())))
.addEqualityGroup(Funnels.sequentialFunnel(Funnels.longFunnel()))
.testEquals();
}
}