11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 The Guava Authors 31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); 51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License. 61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at 71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0 91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software 111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS, 121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and 141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License. 151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.io; 181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.primitives.Bytes; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase; 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.ByteArrayInputStream; 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.ByteArrayOutputStream; 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.DataInput; 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.DataOutputStream; 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.EOFException; 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.IOException; 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Test class for {@link LittleEndianDataInputStream}. 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Chris Nokleberg 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class LittleEndianDataInputStreamTest extends TestCase { 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private byte[] data; 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected void setUp() throws Exception { 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert super.setUp(); 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ByteArrayOutputStream baos = new ByteArrayOutputStream(); 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert DataOutputStream out = new DataOutputStream(baos); 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert initializeData(out); 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert data = baos.toByteArray(); 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private void initializeData(DataOutputStream out) throws IOException { 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /* Write out various test values NORMALLY */ 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert out.write(new byte[] { -100, 100 }); 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert out.writeBoolean(true); 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert out.writeBoolean(false); 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert out.writeByte(100); 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert out.writeByte(-100); 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert out.writeByte((byte) 200); 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert out.writeChar('a'); 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert out.writeShort((short) -30000); 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert out.writeShort((short) 50000); 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert out.writeInt(0xCAFEBABE); 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert out.writeLong(0xDEADBEEFCAFEBABEL); 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert out.writeUTF("Herby Derby"); 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert out.writeFloat(Float.intBitsToFloat(0xCAFEBABE)); 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert out.writeDouble(Double.longBitsToDouble(0xDEADBEEFCAFEBABEL)); 671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testReadFully() throws IOException { 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert DataInput in = new LittleEndianDataInputStream(new ByteArrayInputStream(data)); 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert byte[] b = new byte[data.length]; 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert in.readFully(b); 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(Bytes.asList(data), Bytes.asList(b)); 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testReadUnsignedByte_eof() throws IOException { 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert DataInput in = new LittleEndianDataInputStream(new ByteArrayInputStream(new byte[0])); 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert in.readUnsignedByte(); 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (EOFException expected) { 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testReadUnsignedShort_eof() throws IOException { 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert byte[] buf = {23}; 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert DataInput in = new LittleEndianDataInputStream(new ByteArrayInputStream(buf)); 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert in.readUnsignedShort(); 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (EOFException expected) {} 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testReadLine() throws IOException { 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert DataInput in = new LittleEndianDataInputStream(new ByteArrayInputStream(data)); 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert in.readLine(); 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException expected) { 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("readLine is not supported", expected.getMessage()); 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testReadLittleEndian() throws IOException { 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert DataInput in = new LittleEndianDataInputStream(new ByteArrayInputStream(data)); 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /* Read in various values in LITTLE ENDIAN FORMAT */ 1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert byte[] b = new byte[2]; 1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert in.readFully(b); 1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(-100, b[0]); 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(100, b[1]); 1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(true, in.readBoolean()); 1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(false, in.readBoolean()); 1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(100, in.readByte()); 1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(-100, in.readByte()); 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(200, in.readUnsignedByte()); 1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals('\u6100', in.readChar()); 1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(-12150, in.readShort()); 1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(20675, in.readUnsignedShort()); 1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(0xBEBAFECA, in.readInt()); 1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(0xBEBAFECAEFBEADDEL, in.readLong()); 1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("Herby Derby", in.readUTF()); 1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(0xBEBAFECA, Float.floatToIntBits(in.readFloat())); 1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(0xBEBAFECAEFBEADDEL, Double.doubleToLongBits(in.readDouble())); 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testSkipBytes() throws IOException { 1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ByteArrayOutputStream baos = new ByteArrayOutputStream(); 1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert DataOutputStream out = new DataOutputStream(baos); 1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /* Write out various test values NORMALLY */ 1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert out.write(new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}); // 10 bytes of junk to skip 1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert initializeData(out); 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert byte[] data = baos.toByteArray(); 1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert DataInput in = new LittleEndianDataInputStream(new ByteArrayInputStream(data)); 1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int bytesSkipped = 0; 1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert while (bytesSkipped < 10) { 1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bytesSkipped += in.skipBytes(10 - bytesSkipped); 1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /* Read in various values in LITTLE ENDIAN FORMAT */ 1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert byte[] b = new byte[2]; 1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert in.readFully(b); 1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(-100, b[0]); 1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(100, b[1]); 1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(in.readBoolean()); 1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(in.readBoolean()); 1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 152