1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonpackage libcore.java.io; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ByteArrayOutputStream; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStream; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectOutputStream; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Arrays; 24935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonimport junit.framework.TestCase; 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport tests.support.Support_GetPutFields; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport tests.support.Support_GetPutFieldsDeprecated; 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Tests the methods of {@code ObjectOutputStream.PutField}. Three things make 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this class somewhat difficult to test: 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ol> 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>It is a completely abstract class; none of the methods is implemented in 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code ObjectOutputStream.PutField}.</li> 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>There is no public class that implements 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code ObjectOutputStream.PutField}. The only way to get an implementation 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is by calling {@code ObjectOutputStream.putFields()}.</li> 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>Invoking the methods of {@code ObjectOutputStream.PutField} only works 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * from within the private {@code writeObject(ObjectOutputStream)} method of a 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * class that implements {@code Serializable}; an exception is thrown 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * otherwise.</li> 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ol> 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Given these restrictions, an indirect approach is used to test 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code ObjectOutputStream.PutField}: The serializable helper class 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code tests.support.Support_GetPutFields} implements 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code writeObject(ObjectOutputStream)} and uses all {@code putX} methods in 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code PutField} to write data to the output stream. A second helper class, 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code tests.support.Support_GetPutFieldsDeprecated}, also uses the 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * deprecated {@code ObjectOutputStream.PutField.write(ObjectOutput)}. 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code tests.util.FieldTestFileGenerator} can then be used on a reference 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * platform to write these two classes to the file {@code testFields.ser} and 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code testFieldsDeprecated.ser} respectively. 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The test methods in this class expect to find {@code testFields.ser} and 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code testFieldsDeprecated.ser} as a resource stored at 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code tests/api/java/io}. The contents of these files is compared to what 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is written when {@code Support_GetPutFields.writeObject(ObjectOutputStream)} 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and {@code Support_GetPutFieldsDeprecated.writeObject(ObjectOutputStream)} is 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * called by the test methods. 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 63935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonpublic class OldObjectOutputStreamPutFieldTest extends TestCase { 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 65f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes private final String FILENAME = 66740cbf1565815f08d9fb3a0a8d4a581cdc0d2a9dJorg Pleumann "/tests/api/java/io/testFields.ser"; 67f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes private final String DEPRECATED_FILENAME = 68740cbf1565815f08d9fb3a0a8d4a581cdc0d2a9dJorg Pleumann "/tests/api/java/io/testFieldsDeprecated.ser"; 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_put() throws Exception { 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_GetPutFields toSerialize = new Support_GetPutFields(); 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] content; 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] refContent; 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ObjectOutputStream oos = null; 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ByteArrayOutputStream baos; 76f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project toSerialize.initTestValues(); 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project refContent = getRefContent(FILENAME); 81f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project baos = new ByteArrayOutputStream(refContent.length); 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project oos = new ObjectOutputStream(baos); 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project oos.writeObject(toSerialize); 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project content = baos.toByteArray(); 87f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes assertTrue("Serialization is not equal to reference platform.", 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Arrays.equals(content, refContent)); 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project finally { 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (oos != null) oos.close(); 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 94f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_writeLjava_io_ObjectOutputStream() throws Exception { 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_GetPutFieldsDeprecated toSerialize = new Support_GetPutFieldsDeprecated(); 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] content; 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] refContent; 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ObjectOutputStream oos = null; 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ByteArrayOutputStream baos; 101f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project toSerialize.initTestValues(); 103f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project refContent = getRefContent(DEPRECATED_FILENAME); 106f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project baos = new ByteArrayOutputStream(refContent.length); 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project oos = new ObjectOutputStream(baos); 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project oos.writeObject(toSerialize); 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project content = baos.toByteArray(); 112f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes assertTrue("Serialization is not equal to reference platform.", 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Arrays.equals(content, refContent)); 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project finally { 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (oos != null) oos.close(); 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 119f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private byte[] getRefContent(String path) throws Exception { 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int bytesRead; 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] refContent; 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] streamContent = new byte[2000]; 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream refStream = null; 125f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 127740cbf1565815f08d9fb3a0a8d4a581cdc0d2a9dJorg Pleumann refStream = getClass().getResourceAsStream(path); 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bytesRead = refStream.read(streamContent); 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue("Test case implementation error: The byte array to " + 130f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes "store the reference file is too small.", 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (refStream.read() == -1)); 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project refContent = new byte[bytesRead]; 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project System.arraycopy(streamContent, 0, refContent, 0, bytesRead); 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project finally { 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (refStream != null) refStream.close(); 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return refContent; 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 141