blob: 8e8c56babf8a196d01754af637a086b4c3fb26c6 [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.geode.internal;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.catchThrowable;
import java.io.DataInput;
import java.io.EOFException;
import java.io.IOException;
import org.junit.Test;
public class ByteArrayDataInputTest {
@Test
public void readFullyThatReadsPastEndOfDataThrowsEOFException() throws IOException {
byte[] inputBytes = new byte[1];
DataInput input = createDataInput(inputBytes);
byte[] outputBytes = new byte[2];
Throwable t = catchThrowable(() -> input.readFully(outputBytes));
assertThat(t).isInstanceOf(EOFException.class);
}
@Test
public void readLineGivenInputAtEOFReturnsNull() throws IOException {
byte[] inputBytes = new byte[1];
DataInput input = createDataInput(inputBytes);
input.readByte();
String result = input.readLine();
assertThat(result).isNull();
assertThat(dataRemaining(input)).isEqualTo(0);
}
@Test
public void readLineGivenEmptyLineTerminatedByLineFeedReturnsEmptyString() throws IOException {
byte[] inputBytes = new byte[] {'\n'};
DataInput input = createDataInput(inputBytes);
String result = input.readLine();
assertThat(result).isEmpty();
assertThat(dataRemaining(input)).isEqualTo(0);
}
@Test
public void readLineGivenEmptyLineTerminatedByLineFeedReturnsEmptyStringDoesNotConsumeNextByte()
throws IOException {
byte[] inputBytes = new byte[] {'\n', 'a'};
DataInput input = createDataInput(inputBytes);
String result = input.readLine();
assertThat(result).isEmpty();
assertThat(dataRemaining(input)).isEqualTo(1);
assertThat(input.readUnsignedByte()).isEqualTo((int) 'a');
}
@Test
public void readLineGivenEmptyLineTerminatedByCarriageReturnReturnsEmptyString()
throws IOException {
byte[] inputBytes = new byte[] {'\r'};
DataInput input = createDataInput(inputBytes);
String result = input.readLine();
assertThat(result).isEmpty();
assertThat(dataRemaining(input)).isEqualTo(0);
}
@Test
public void readLineGivenEmptyLineTerminatedByCarriageReturnReturnsEmptyStringAndDoesNotConsumeNextByte()
throws IOException {
byte[] inputBytes = new byte[] {'\r', 'a'};
DataInput input = createDataInput(inputBytes);
String result = input.readLine();
assertThat(result).isEmpty();
assertThat(dataRemaining(input)).isEqualTo(1);
assertThat(input.readUnsignedByte()).isEqualTo((int) 'a');
}
@Test
public void readLineGivenEmptyLineTerminatedByCarriageReturnLineFeedReturnsEmptyString()
throws IOException {
byte[] inputBytes = new byte[] {'\r', '\n'};
DataInput input = createDataInput(inputBytes);
String result = input.readLine();
assertThat(result).isEmpty();
assertThat(dataRemaining(input)).isEqualTo(0);
}
@Test
public void readLineGivenEmptyLineTerminatedByCarriageReturnLineFeedReturnsEmptyStringDoesNotConsumeNextByte()
throws IOException {
byte[] inputBytes = new byte[] {'\r', '\n', 'a'};
DataInput input = createDataInput(inputBytes);
String result = input.readLine();
assertThat(result).isEmpty();
assertThat(dataRemaining(input)).isEqualTo(1);
assertThat(input.readUnsignedByte()).isEqualTo((int) 'a');
}
@Test
public void readLineGivenLineTerminatedByEOFReturnsCorrectLineData() throws IOException {
byte[] inputBytes = new byte[] {'a', 'b', 'c'};
DataInput input = createDataInput(inputBytes);
String result = input.readLine();
assertThat(result).isEqualTo("abc");
assertThat(dataRemaining(input)).isEqualTo(0);
}
@Test
public void readLineGivenLineTerminatedByLineFeedReturnsCorrectLineData() throws IOException {
byte[] inputBytes = new byte[] {'a', 'b', 'c', '\n', '2'};
DataInput input = createDataInput(inputBytes);
String result = input.readLine();
assertThat(result).isEqualTo("abc");
assertThat(dataRemaining(input)).isEqualTo(1);
assertThat(input.readUnsignedByte()).isEqualTo((int) '2');
}
@Test
public void readLineGivenLineTerminatedByCarriageReturnReturnsCorrectLineData()
throws IOException {
byte[] inputBytes = new byte[] {'a', 'b', 'c', '\r', '2'};
DataInput input = createDataInput(inputBytes);
String result = input.readLine();
assertThat(result).isEqualTo("abc");
assertThat(dataRemaining(input)).isEqualTo(1);
assertThat(input.readUnsignedByte()).isEqualTo((int) '2');
}
@Test
public void readLineGivenLineTerminatedByCarriageReturnLineFeedReturnsCorrectLineData()
throws IOException {
byte[] inputBytes = new byte[] {'a', 'b', 'c', '\r', '\n', '2'};
DataInput input = createDataInput(inputBytes);
String result = input.readLine();
assertThat(result).isEqualTo("abc");
assertThat(dataRemaining(input)).isEqualTo(1);
assertThat(input.readUnsignedByte()).isEqualTo((int) '2');
}
@Test
public void readUTFHandlesEmptyString() throws IOException {
HeapDataOutputStream output = new HeapDataOutputStream(Version.CURRENT);
output.writeUTF("");
output.writeByte(1);
DataInput input = createDataInput(output.toByteArray());
String result = input.readUTF();
assertThat(result).isEmpty();
assertThat(dataRemaining(input)).isEqualTo(1);
assertThat(input.readByte()).isEqualTo((byte) 1);
}
@Test
public void readUTFHandlesAsciiString() throws IOException {
HeapDataOutputStream output = new HeapDataOutputStream(Version.CURRENT);
String string = "\u0001test\u007f";
output.writeUTF(string);
output.writeByte(1);
DataInput input = createDataInput(output.toByteArray());
String result = input.readUTF();
assertThat(result).isEqualTo(string);
assertThat(dataRemaining(input)).isEqualTo(1);
assertThat(input.readByte()).isEqualTo((byte) 1);
}
@Test
public void readUTFHandlesUTF16String() throws IOException {
HeapDataOutputStream output = new HeapDataOutputStream(Version.CURRENT);
String string = "\u0000test\u0080\uffff";
output.writeUTF(string);
output.writeByte(1);
DataInput input = createDataInput(output.toByteArray());
String result = input.readUTF();
assertThat(result).isEqualTo(string);
assertThat(dataRemaining(input)).isEqualTo(1);
assertThat(input.readByte()).isEqualTo((byte) 1);
}
@Test
public void readUTFOnInputWithJustLengthThrowsEOF() {
HeapDataOutputStream output = new HeapDataOutputStream(Version.CURRENT);
output.writeShort(1);
DataInput input = createDataInput(output.toByteArray());
Throwable t = catchThrowable(() -> input.readUTF());
assertThat(t).isInstanceOf(EOFException.class);
}
/**
* We want ByteArrayDataInput to behave like DataInputStream(ByteArrayInputStream).
* This boolean allows us to switch back and forth in this test to make sure
* they both behave the same. It should never be checked in with testJDK=true.
*/
private boolean testJDK = false;
private DataInput createDataInput(byte[] inputBytes) {
if (testJDK) {
return new java.io.DataInputStream(new java.io.ByteArrayInputStream(inputBytes));
} else {
ByteArrayDataInput input = new ByteArrayDataInput();
input.initialize(inputBytes, null);
return input;
}
}
private int dataRemaining(DataInput dataInput) {
if (testJDK) {
try {
return ((java.io.DataInputStream) dataInput).available();
} catch (IOException e) {
throw new IllegalStateException(e);
}
} else {
return ((ByteArrayDataInput) dataInput).available();
}
}
}