| /* |
| * 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 static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertTrue; |
| import static org.junit.Assert.fail; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.ByteArrayOutputStream; |
| import java.io.DataInputStream; |
| import java.io.DataOutputStream; |
| |
| import org.junit.Test; |
| |
| import org.apache.cassandra.io.util.BytesReadTracker; |
| import org.apache.cassandra.io.util.DataInputPlus; |
| import org.apache.cassandra.io.util.TrackedDataInputPlus; |
| import org.apache.cassandra.io.util.TrackedInputStream; |
| |
| public class BytesReadTrackerTest |
| { |
| |
| @Test |
| public void testBytesRead() throws Exception |
| { |
| internalTestBytesRead(true); |
| internalTestBytesRead(false); |
| } |
| |
| @Test |
| public void testUnsignedRead() throws Exception |
| { |
| internalTestUnsignedRead(true); |
| internalTestUnsignedRead(false); |
| } |
| |
| @Test |
| public void testSkipBytesAndReadFully() throws Exception |
| { |
| internalTestSkipBytesAndReadFully(true); |
| internalTestSkipBytesAndReadFully(false); |
| } |
| |
| @Test |
| public void testReadLine() throws Exception |
| { |
| internalTestReadLine(true); |
| internalTestReadLine(false); |
| } |
| |
| public void internalTestBytesRead(boolean inputStream) throws Exception |
| { |
| byte[] testData; |
| |
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| DataOutputStream out = new DataOutputStream(baos); |
| try |
| { |
| // 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); |
| |
| // String |
| out.writeUTF("abc"); |
| testData = baos.toByteArray(); |
| } |
| finally |
| { |
| out.close(); |
| } |
| |
| DataInputPlus.DataInputStreamPlus in = new DataInputPlus.DataInputStreamPlus(new ByteArrayInputStream(testData)); |
| BytesReadTracker tracker = inputStream? new TrackedInputStream(in) : new TrackedDataInputPlus(in); |
| DataInputPlus reader = inputStream? new DataInputPlus.DataInputStreamPlus((TrackedInputStream)tracker) : (DataInputPlus) tracker; |
| |
| try |
| { |
| // boolean = 1byte |
| boolean bool = reader.readBoolean(); |
| assertTrue(bool); |
| assertEquals(1, tracker.getBytesRead()); |
| // byte = 1byte |
| byte b = reader.readByte(); |
| assertEquals(b, 0x1); |
| assertEquals(2, tracker.getBytesRead()); |
| // char = 2byte |
| char c = reader.readChar(); |
| assertEquals('a', c); |
| assertEquals(4, tracker.getBytesRead()); |
| // short = 2bytes |
| short s = reader.readShort(); |
| assertEquals(1, s); |
| assertEquals((short) 6, tracker.getBytesRead()); |
| // int = 4bytes |
| int i = reader.readInt(); |
| assertEquals(1, i); |
| assertEquals(10, tracker.getBytesRead()); |
| // long = 8bytes |
| long l = reader.readLong(); |
| assertEquals(1L, l); |
| assertEquals(18, tracker.getBytesRead()); |
| // float = 4bytes |
| float f = reader.readFloat(); |
| assertEquals(1.0f, f, 0); |
| assertEquals(22, tracker.getBytesRead()); |
| // double = 8bytes |
| double d = reader.readDouble(); |
| assertEquals(1.0d, d, 0); |
| assertEquals(30, tracker.getBytesRead()); |
| // String("abc") = 2(string size) + 3 = 5 bytes |
| String str = reader.readUTF(); |
| assertEquals("abc", str); |
| assertEquals(35, tracker.getBytesRead()); |
| |
| assertEquals(testData.length, tracker.getBytesRead()); |
| } |
| finally |
| { |
| in.close(); |
| } |
| |
| tracker.reset(0); |
| assertEquals(0, tracker.getBytesRead()); |
| } |
| |
| public void internalTestUnsignedRead(boolean inputStream) throws Exception |
| { |
| byte[] testData; |
| |
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| DataOutputStream out = new DataOutputStream(baos); |
| try |
| { |
| // byte |
| out.writeByte(0x1); |
| // short |
| out.writeShort(1); |
| testData = baos.toByteArray(); |
| } |
| finally |
| { |
| out.close(); |
| } |
| |
| DataInputPlus.DataInputStreamPlus in = new DataInputPlus.DataInputStreamPlus(new ByteArrayInputStream(testData)); |
| BytesReadTracker tracker = inputStream? new TrackedInputStream(in) : new TrackedDataInputPlus(in); |
| DataInputPlus reader = inputStream? new DataInputPlus.DataInputStreamPlus((TrackedInputStream)tracker) : (DataInputPlus) tracker; |
| |
| try |
| { |
| // byte = 1byte |
| int b = reader.readUnsignedByte(); |
| assertEquals(b, 1); |
| assertEquals(1, tracker.getBytesRead()); |
| // short = 2bytes |
| int s = reader.readUnsignedShort(); |
| assertEquals(1, s); |
| assertEquals(3, tracker.getBytesRead()); |
| |
| assertEquals(testData.length, tracker.getBytesRead()); |
| } |
| finally |
| { |
| in.close(); |
| } |
| } |
| |
| public void internalTestSkipBytesAndReadFully(boolean inputStream) throws Exception |
| { |
| String testStr = "1234567890"; |
| byte[] testData = testStr.getBytes(); |
| |
| DataInputPlus.DataInputStreamPlus in = new DataInputPlus.DataInputStreamPlus(new ByteArrayInputStream(testData)); |
| BytesReadTracker tracker = inputStream? new TrackedInputStream(in) : new TrackedDataInputPlus(in); |
| DataInputPlus reader = inputStream? new DataInputPlus.DataInputStreamPlus((TrackedInputStream)tracker) : (DataInputPlus) tracker; |
| |
| try |
| { |
| // read first 5 bytes |
| byte[] out = new byte[5]; |
| reader.readFully(out, 0, 5); |
| assertEquals("12345", new String(out)); |
| assertEquals(5, tracker.getBytesRead()); |
| |
| // then skip 2 bytes |
| reader.skipBytes(2); |
| assertEquals(7, tracker.getBytesRead()); |
| |
| // and read the rest |
| out = new byte[3]; |
| reader.readFully(out); |
| assertEquals("890", new String(out)); |
| assertEquals(10, tracker.getBytesRead()); |
| |
| assertEquals(testData.length, tracker.getBytesRead()); |
| } |
| finally |
| { |
| in.close(); |
| } |
| } |
| |
| public void internalTestReadLine(boolean inputStream) throws Exception |
| { |
| DataInputStream in = new DataInputStream(new ByteArrayInputStream("1".getBytes())); |
| BytesReadTracker tracker = inputStream? new TrackedInputStream(in) : new TrackedDataInputPlus(in); |
| DataInputPlus reader = inputStream? new DataInputPlus.DataInputStreamPlus((TrackedInputStream)tracker) : (DataInputPlus) tracker; |
| |
| try |
| { |
| String line = reader.readLine(); |
| if (inputStream) |
| assertEquals(line, "1"); |
| else |
| fail("Should have thrown UnsupportedOperationException"); |
| } |
| catch (UnsupportedOperationException e) |
| { |
| if (inputStream) |
| fail("Should have not thrown UnsupportedOperationException"); |
| } |
| finally |
| { |
| in.close(); |
| } |
| } |
| } |