blob: baac9ca73d63937de1ab28c361415ab3a65ddefa [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.cassandra.utils;
import java.util.Arrays;
import org.junit.Test;
import org.apache.cassandra.io.util.DataInputBuffer;
import org.apache.cassandra.io.util.DataOutputBuffer;
import org.apache.cassandra.io.util.TeeDataInputPlus;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class TeeDataInputPlusTest
{
@Test
public void testTeeBuffer() throws Exception
{
DataOutputBuffer out = new DataOutputBuffer();
byte[] testData;
// boolean
out.writeBoolean(true);
// byte
out.writeByte(0x1);
// char
out.writeChar('a');
// short
out.writeShort(1);
// int
out.writeInt(1);
// long
out.writeLong(1L);
// float
out.writeFloat(1.0f);
// double
out.writeDouble(1.0d);
// vint
out.writeVInt(-1337L);
//unsigned vint
out.writeUnsignedVInt(1337L);
// String
out.writeUTF("abc");
//Another string to test skip
out.writeUTF("garbagetoskipattheend");
testData = out.toByteArray();
int LIMITED_SIZE = 40;
DataInputBuffer reader = new DataInputBuffer(testData);
DataInputBuffer reader2 = new DataInputBuffer(testData);
DataOutputBuffer teeOut = new DataOutputBuffer();
DataOutputBuffer limitedTeeOut = new DataOutputBuffer();
TeeDataInputPlus tee = new TeeDataInputPlus(reader, teeOut);
TeeDataInputPlus limitedTee = new TeeDataInputPlus(reader2, limitedTeeOut, LIMITED_SIZE);
// boolean = 1byte
boolean bool = tee.readBoolean();
assertTrue(bool);
bool = limitedTee.readBoolean();
assertTrue(bool);
// byte = 1byte
byte b = tee.readByte();
assertEquals(b, 0x1);
b = limitedTee.readByte();
assertEquals(b, 0x1);
// char = 2byte
char c = tee.readChar();
assertEquals('a', c);
c = limitedTee.readChar();
assertEquals('a', c);
// short = 2bytes
short s = tee.readShort();
assertEquals(1, s);
s = limitedTee.readShort();
assertEquals(1, s);
// int = 4bytes
int i = tee.readInt();
assertEquals(1, i);
i = limitedTee.readInt();
assertEquals(1, i);
// long = 8bytes
long l = tee.readLong();
assertEquals(1L, l);
l = limitedTee.readLong();
assertEquals(1L, l);
// float = 4bytes
float f = tee.readFloat();
assertEquals(1.0f, f, 0);
f = limitedTee.readFloat();
assertEquals(1.0f, f, 0);
// double = 8bytes
double d = tee.readDouble();
assertEquals(1.0d, d, 0);
d = limitedTee.readDouble();
assertEquals(1.0d, d, 0);
long vint = tee.readVInt();
assertEquals(-1337L, vint);
vint = limitedTee.readVInt();
assertEquals(-1337L, vint);
long uvint = tee.readUnsignedVInt();
assertEquals(1337L, uvint);
uvint = limitedTee.readUnsignedVInt();
assertEquals(1337L, uvint);
// String("abc") = 2(string size) + 3 = 5 bytes
String str = tee.readUTF();
assertEquals("abc", str);
str = limitedTee.readUTF();
assertEquals("abc", str);
int skipped = tee.skipBytes(100);
assertEquals(23, skipped);
skipped = limitedTee.skipBytes(100);
assertEquals(23, skipped);
byte[] teeData = teeOut.toByteArray();
assertFalse(tee.isLimitReached());
assertTrue(Arrays.equals(testData, teeData));
byte[] limitedTeeData = limitedTeeOut.toByteArray();
assertTrue(limitedTee.isLimitReached());
assertTrue(Arrays.equals(Arrays.copyOf(testData, LIMITED_SIZE - 1 ), limitedTeeData));
}
}