/* * Copyright (C) 2010 The Android Open Source Project * * 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 libcore.java.io; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.UTFDataFormatException; import java.util.Arrays; import junit.framework.TestCase; public final class DataOutputStreamTest extends TestCase { private ByteArrayOutputStream bytes = new ByteArrayOutputStream(); private DataOutputStream os = new DataOutputStream(bytes); public void test_writeBoolean() throws Exception { os.writeBoolean(true); os.writeBoolean(false); assertEquals("[01, 00]", toHexString(bytes.toByteArray())); } public void test_writeByte() throws Exception { os.writeByte(-1); os.writeByte(0); os.writeByte(1); os.writeByte(129); // writeByte takes only the bottom byte from its int parameter. os.writeByte(0x1234); assertEquals("[ff, 00, 01, 81, 34]", toHexString(bytes.toByteArray())); } public void test_writeBytes() throws Exception { // writeBytes takes only the bottom byte from each character. os.writeBytes("0\u12341"); assertEquals("[30, 34, 31]", toHexString(bytes.toByteArray())); } public void test_writeChar() throws Exception { // writeChar writes two-byte big-endian characters. os.writeChar('0'); os.writeChar(0x1234); assertEquals("[00, 30, 12, 34]", toHexString(bytes.toByteArray())); } public void test_writeChars() throws Exception { // writeChars writes two-byte big-endian characters. os.writeChars("0\u12341"); assertEquals("[00, 30, 12, 34, 00, 31]", toHexString(bytes.toByteArray())); } public void test_writeDouble() throws Exception { os.writeDouble(Double.longBitsToDouble(0x0123456789abcdefL)); assertEquals("[01, 23, 45, 67, 89, ab, cd, ef]", toHexString(bytes.toByteArray())); } public void test_writeFloat() throws Exception { os.writeFloat(Float.intBitsToFloat(0x01234567)); assertEquals("[01, 23, 45, 67]", toHexString(bytes.toByteArray())); } public void test_writeInt() throws Exception { os.writeInt(0x01234567); assertEquals("[01, 23, 45, 67]", toHexString(bytes.toByteArray())); } public void test_writeLong() throws Exception { os.writeLong(0x0123456789abcdefL); assertEquals("[01, 23, 45, 67, 89, ab, cd, ef]", toHexString(bytes.toByteArray())); } public void test_writeShort() throws Exception { // writeShort only writes the bottommost 16 bits of its int parameter. os.writeShort(0x01234567); assertEquals("[45, 67]", toHexString(bytes.toByteArray())); } public void test_writeUTF() throws Exception { // The limit is 65535 *bytes* but we want to test 2- and 3-byte characters too. char[] chars = new char[65535 - 1 - 2]; Arrays.fill(chars, 0, chars.length, 'a'); chars[0] = '\u0666'; // a two-byte character chars[1] = '\u2603'; // a three-byte character String maxLength = new String(chars); os.writeUTF(maxLength); byte[] expected = new byte[2 + 65535]; expected[0] = (byte) 0xff; expected[1] = (byte) 0xff; // U+0666 = 0xD9 0xA6 expected[2] = (byte) 0xd9; expected[3] = (byte) 0xa6; // U+2603 = 0xE2 0x98 0x83 expected[4] = (byte) 0xe2; expected[5] = (byte) 0x98; expected[6] = (byte) 0x83; Arrays.fill(expected, 7, expected.length, (byte) 'a'); assertEquals(Arrays.toString(expected), Arrays.toString(bytes.toByteArray())); } public void test_writeUTF_NUL() throws Exception { // This is a special case, represented with two non-zero bytes. os.writeUTF("\u0000"); assertEquals("[00, 02, c0, 80]", toHexString(bytes.toByteArray())); } public void test_writeUTF_too_long() throws Exception { String tooLong = new String(new char[65536]); try { os.writeUTF(tooLong); fail("should throw UTFDataFormatException"); } catch (UTFDataFormatException expected) { } assertEquals("[]", toHexString(bytes.toByteArray())); } /** * Returns a string representation of a byte array that's more useful for debugging. * TODO: move this somewhere where it's available to all tests. */ public static String toHexString(byte[] array) { if (array == null) { return null; } if (array.length == 0) { return "[]"; } StringBuilder sb = new StringBuilder(); sb.append('['); // TODO: don't use String.format if we put this in the library. Too expensive! sb.append(String.format("%02x", array[0] & 0xff)); for (int i = 1; i < array.length; i++) { sb.append(", "); sb.append(String.format("%02x", array[i] & 0xff)); } sb.append(']'); return sb.toString(); } }