| /* |
| * 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 libcore.java.io; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.ByteArrayOutputStream; |
| import java.io.FileInputStream; |
| import java.io.FileOutputStream; |
| import java.io.IOException; |
| import java.io.NotActiveException; |
| import java.io.ObjectInputStream; |
| import java.io.ObjectOutputStream; |
| import java.io.OutputStream; |
| import java.io.Serializable; |
| import junit.framework.TestCase; |
| import tests.support.Support_ASimpleOutputStream; |
| import tests.support.Support_OutputStream; |
| |
| public class OldObjectOutputStreamTest extends TestCase implements Serializable { |
| |
| static final long serialVersionUID = 1L; |
| |
| java.io.File f; |
| |
| public class SerializableTestHelper implements Serializable { |
| public String aField1; |
| |
| public String aField2; |
| |
| SerializableTestHelper(String s, String t) { |
| aField1 = s; |
| aField2 = t; |
| } |
| |
| private void readObject(ObjectInputStream ois) throws IOException { |
| // note aField2 is not read |
| try { |
| ObjectInputStream.GetField fields = ois.readFields(); |
| aField1 = (String) fields.get("aField1", "Zap"); |
| } catch (Exception e) { |
| } |
| } |
| |
| private void writeObject(ObjectOutputStream oos) throws IOException { |
| // note aField2 is not written |
| ObjectOutputStream.PutField fields = oos.putFields(); |
| fields.put("aField1", aField1); |
| oos.writeFields(); |
| } |
| |
| public String getText1() { |
| return aField1; |
| } |
| |
| public String getText2() { |
| return aField2; |
| } |
| } |
| |
| private static class BasicObjectOutputStream extends ObjectOutputStream { |
| public boolean writeStreamHeaderCalled; |
| |
| public BasicObjectOutputStream() throws IOException, SecurityException { |
| super(); |
| writeStreamHeaderCalled = false; |
| } |
| |
| public BasicObjectOutputStream(OutputStream output) throws IOException { |
| super(output); |
| } |
| |
| public void drain() throws IOException { |
| super.drain(); |
| } |
| |
| public boolean enableReplaceObject(boolean enable) |
| throws SecurityException { |
| return super.enableReplaceObject(enable); |
| } |
| |
| public void writeObjectOverride(Object object) throws IOException { |
| super.writeObjectOverride(object); |
| } |
| |
| public void writeStreamHeader() throws IOException { |
| super.writeStreamHeader(); |
| writeStreamHeaderCalled = true; |
| } |
| } |
| |
| private static class NoFlushTestOutputStream extends ByteArrayOutputStream { |
| public boolean flushCalled; |
| |
| public NoFlushTestOutputStream() { |
| super(); |
| flushCalled = false; |
| } |
| |
| public void flush() throws IOException { |
| super.flush(); |
| flushCalled = true; |
| } |
| } |
| |
| protected static final String MODE_XLOAD = "xload"; |
| |
| protected static final String MODE_XDUMP = "xdump"; |
| |
| static final String FOO = "foo"; |
| |
| static final String MSG_WITE_FAILED = "Failed to write: "; |
| |
| private static final boolean DEBUG = false; |
| |
| protected static boolean xload = false; |
| |
| protected static boolean xdump = false; |
| |
| protected static String xFileName = null; |
| |
| protected ObjectInputStream ois; |
| |
| protected ObjectOutputStream oos; |
| |
| protected ObjectOutputStream oos_ioe; |
| |
| protected Support_OutputStream sos; |
| |
| protected ByteArrayOutputStream bao; |
| |
| static final int INIT_INT_VALUE = 7; |
| |
| static final String INIT_STR_VALUE = "a string that is blortz"; |
| |
| /** |
| * java.io.ObjectOutputStream#ObjectOutputStream(java.io.OutputStream) |
| */ |
| public void test_ConstructorLjava_io_OutputStream() throws IOException { |
| oos.close(); |
| oos = new ObjectOutputStream(new ByteArrayOutputStream()); |
| oos.close(); |
| |
| try { |
| oos = new ObjectOutputStream(null); |
| fail("Test 1: NullPointerException expected."); |
| } catch (NullPointerException e) { |
| // Expected. |
| } |
| |
| Support_ASimpleOutputStream sos = new Support_ASimpleOutputStream(true); |
| try { |
| oos = new ObjectOutputStream(sos); |
| fail("Test 2: IOException expected."); |
| } catch (IOException e) { |
| // Expected. |
| } |
| } |
| |
| public void test_close() throws IOException { |
| int outputSize = bao.size(); |
| // Writing of a primitive type should be buffered. |
| oos.writeInt(42); |
| assertTrue("Test 1: Primitive data unexpectedly written to the target stream.", |
| bao.size() == outputSize); |
| // Closing should write the buffered data to the target stream. |
| oos.close(); |
| assertTrue("Test 2: Primitive data has not been written to the the target stream.", |
| bao.size() > outputSize); |
| |
| try { |
| oos_ioe.close(); |
| fail("Test 3: IOException expected."); |
| } catch (IOException e) { |
| // Expected. |
| } |
| } |
| |
| public void test_drain() throws IOException { |
| NoFlushTestOutputStream target = new NoFlushTestOutputStream(); |
| BasicObjectOutputStream boos = new BasicObjectOutputStream(target); |
| int initialSize = target.size(); |
| boolean written = false; |
| |
| boos.writeBytes("Lorem ipsum"); |
| // If there is no buffer then the bytes have already been written. |
| written = (target.size() > initialSize); |
| |
| boos.drain(); |
| assertTrue("Content has not been written to the target.", |
| written || (target.size() > initialSize)); |
| assertFalse("flush() has been called on the target.", |
| target.flushCalled); |
| } |
| |
| public void test_enableReplaceObjectB() throws IOException { |
| // Start testing without a SecurityManager. |
| BasicObjectOutputStream boos = new BasicObjectOutputStream(); |
| assertFalse("Test 1: Object resolving must be disabled by default.", |
| boos.enableReplaceObject(true)); |
| |
| assertTrue("Test 2: enableReplaceObject did not return the previous value.", |
| boos.enableReplaceObject(false)); |
| } |
| |
| public void test_flush() throws Exception { |
| // Test for method void java.io.ObjectOutputStream.flush() |
| int size = bao.size(); |
| oos.writeByte(127); |
| assertTrue("Test 1: Data already flushed.", bao.size() == size); |
| oos.flush(); |
| assertTrue("Test 2: Failed to flush data.", bao.size() > size); |
| |
| try { |
| oos_ioe.flush(); |
| fail("Test 3: IOException expected."); |
| } catch (IOException e) { |
| // Expected. |
| } |
| } |
| |
| public void test_putFields() throws Exception { |
| /* |
| * "SerializableTestHelper" is an object created for these tests with |
| * two fields (Strings) and simple implementations of readObject and |
| * writeObject which simply read and write the first field but not the |
| * second one. |
| */ |
| SerializableTestHelper sth; |
| |
| try { |
| oos.putFields(); |
| fail("Test 1: NotActiveException expected."); |
| } catch (NotActiveException e) { |
| // Expected. |
| } |
| |
| oos.writeObject(new SerializableTestHelper("Gabba", "Jabba")); |
| oos.flush(); |
| ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray())); |
| sth = (SerializableTestHelper) (ois.readObject()); |
| assertEquals("Test 2: readFields or writeFields failed; first field not set.", |
| "Gabba", sth.getText1()); |
| assertNull("Test 3: readFields or writeFields failed; second field should not have been set.", |
| sth.getText2()); |
| } |
| |
| public void test_reset() throws Exception { |
| String o = "HelloWorld"; |
| sos = new Support_OutputStream(200); |
| oos.close(); |
| oos = new ObjectOutputStream(sos); |
| oos.writeObject(o); |
| oos.writeObject(o); |
| oos.reset(); |
| oos.writeObject(o); |
| |
| sos.setThrowsException(true); |
| try { |
| oos.reset(); |
| fail("Test 1: IOException expected."); |
| } catch (IOException e) { |
| // Expected. |
| } |
| sos.setThrowsException(false); |
| |
| ois = new ObjectInputStream(new ByteArrayInputStream(sos.toByteArray())); |
| assertEquals("Test 2: Incorrect object read.", o, ois.readObject()); |
| assertEquals("Test 3: Incorrect object read.", o, ois.readObject()); |
| assertEquals("Test 4: Incorrect object read.", o, ois.readObject()); |
| ois.close(); |
| } |
| |
| public void test_write$BII() throws Exception { |
| byte[] buf = new byte[10]; |
| ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray())); |
| try { |
| ois.read(buf, 0, -1); |
| fail("IndexOutOfBoundsException not thrown"); |
| } catch (IndexOutOfBoundsException e) { |
| // Expected |
| } |
| try { |
| ois.read(buf, -1, 1); |
| fail("IndexOutOfBoundsException not thrown"); |
| } catch (IndexOutOfBoundsException e) { |
| // Expected |
| } |
| try { |
| ois.read(buf, 10, 1); |
| fail("IndexOutOfBoundsException not thrown"); |
| } catch (IndexOutOfBoundsException e) { |
| // Expected |
| } |
| ois.close(); |
| |
| } |
| |
| public void test_writeObjectOverrideLjava_lang_Object() throws IOException { |
| BasicObjectOutputStream boos = |
| new BasicObjectOutputStream(new ByteArrayOutputStream()); |
| |
| try { |
| boos.writeObjectOverride(new Object()); |
| fail("IOException expected."); |
| } |
| catch (IOException e) { |
| } |
| finally { |
| boos.close(); |
| } |
| } |
| |
| public void test_writeStreamHeader() throws IOException { |
| BasicObjectOutputStream boos; |
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| short s; |
| byte[] buffer; |
| |
| // Test 1: Make sure that writeStreamHeader() has been called. |
| boos = new BasicObjectOutputStream(baos); |
| try { |
| assertTrue("Test 1: writeStreamHeader() has not been called.", |
| boos.writeStreamHeaderCalled); |
| |
| // Test 2: Check that at least four bytes have been written. |
| buffer = baos.toByteArray(); |
| assertTrue("Test 2: At least four bytes should have been written", |
| buffer.length >= 4); |
| |
| // Test 3: Check the magic number. |
| s = buffer[0]; |
| s <<= 8; |
| s += ((short) buffer[1] & 0x00ff); |
| assertEquals("Test 3: Invalid magic number written.", |
| java.io.ObjectStreamConstants.STREAM_MAGIC, s); |
| |
| // Test 4: Check the stream version number. |
| s = buffer[2]; |
| s <<= 8; |
| s += ((short) buffer[3] & 0x00ff); |
| assertEquals("Invalid stream version number written.", |
| java.io.ObjectStreamConstants.STREAM_VERSION, s); |
| } |
| finally { |
| boos.close(); |
| } |
| } |
| |
| /** |
| * Sets up the fixture, for example, open a network connection. This method |
| * is called before a test is executed. |
| */ |
| protected void setUp() throws Exception { |
| super.setUp(); |
| oos = new ObjectOutputStream(bao = new ByteArrayOutputStream()); |
| oos_ioe = new ObjectOutputStream(sos = new Support_OutputStream()); |
| sos.setThrowsException(true); |
| } |
| |
| /** |
| * Tears down the fixture, for example, close a network connection. This |
| * method is called after a test is executed. |
| */ |
| protected void tearDown() throws Exception { |
| super.tearDown(); |
| if (oos != null) { |
| try { |
| oos.close(); |
| } catch (Exception e) {} |
| } |
| if (oos_ioe != null) { |
| try { |
| oos_ioe.close(); |
| } catch (Exception e) {} |
| } |
| if (f != null && f.exists()) { |
| if (!f.delete()) { |
| fail("Error cleaning up files during teardown"); |
| } |
| } |
| } |
| |
| protected Object reload() throws IOException, ClassNotFoundException { |
| |
| // Choose the load stream |
| if (xload || xdump) { |
| // Load from pre-existing file |
| ois = new ObjectInputStream(new FileInputStream(xFileName + "-" |
| + getName() + ".ser")); |
| } else { |
| // Just load from memory, we dumped to memory |
| ois = new ObjectInputStream(new ByteArrayInputStream(bao |
| .toByteArray())); |
| } |
| |
| try { |
| return ois.readObject(); |
| } finally { |
| ois.close(); |
| } |
| } |
| |
| protected void dump(Object o) throws IOException, ClassNotFoundException { |
| |
| // Choose the dump stream |
| if (xdump) { |
| oos = new ObjectOutputStream(new FileOutputStream( |
| f = new java.io.File(xFileName + "-" + getName() + ".ser"))); |
| } else { |
| oos = new ObjectOutputStream(bao = new ByteArrayOutputStream()); |
| } |
| |
| // Dump the object |
| try { |
| oos.writeObject(o); |
| } finally { |
| oos.close(); |
| } |
| } |
| } |