/*
 * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/* @test
 * @summary it is new version of old test which was
 *          /src/share/test/serialization/psiotest.java
 *          Test pickling and unpickling an object with derived classes
 *          and using a read special to serialize the "middle" class,
 *          which raises NotSerializableException inside writeObject()
 *          and readObject() methods.
 */

import java.io.*;

public class CheckForException {
    public static void main (String argv[]) {
        System.err.println("\nRegression test of " +
                           "serialization/deserialization of " +
                           "complex objects which raise " +
                           "NotSerializableException inside " +
                           "writeObject() and readObject() methods.\n");


        FileInputStream istream = null;
        try {

            FileOutputStream ostream = new FileOutputStream("psiotest3.tmp");
            ObjectOutputStream p = new ObjectOutputStream(ostream);

            /* Catch the expected exception and
             * complain if it does not occur.
             */
            TryPickleClass npc = new TryPickleClass();

            NotSerializableException we = null;
            try {
                // Two objects of the same class that are used
                // in cleanup test below
                p.writeObject("test");
                p.writeObject("test2");
                p.writeObject(npc);
            } catch (NotSerializableException e) {
                we = e;
            }
            if (we == null) {
                System.err.println("\nTEST FAILED: Write of NoPickleClass " +
                    "should have raised an exception");
                throw new Error();
            }

            p.flush();
            ostream.close();

            istream = new FileInputStream("psiotest3.tmp");
            ObjectInputStream q = new ObjectInputStream(istream);

            /* Catch the expected exception and
             * complain if it does not occur.
             */
            TryPickleClass npc_u;

            NotSerializableException re = null;
            try {
                // Read the two objects, neither has a cleanup method
                q.readObject();
                q.readObject();
                npc_u = (TryPickleClass)q.readObject();
            } catch (NotSerializableException e) {
                re = e;
            }
            if (re == null) {
                System.err.println("\nTEST FAILED: Read of NoPickleClass " +
                   "should have raised an exception");
                throw new Error();
            }

            istream.close();
            System.err.println("\nTEST PASSED");
        } catch (Exception e) {
            System.err.print("TEST FAILED: ");
            e.printStackTrace();
            throw new Error();
        }
    }
}

class PickleClass implements java.io.Serializable {
    int ii = 17;
    transient int tmp[];

    private void writeObject(ObjectOutputStream pw) throws IOException {
        pw.writeUTF("PickleClass");
        pw.writeInt(ii);
    }

    private void readObject(ObjectInputStream pr) throws IOException {
        tmp = new int[32];
        pr.readUTF();
        ii = pr.readInt();
    }

    private void readObjectCleanup(ObjectInputStream pr) {
        System.err.println("\nPickleClass cleanup correctly called on abort.");
        if (tmp != null) {
            tmp = null;
        }
    }

}

class NoPickleClass extends PickleClass {
    private void writeObject(ObjectOutputStream pw)
        throws NotSerializableException
    {
        throw new NotSerializableException("NoPickleClass");
    }

    private void readObject(ObjectInputStream pr)
            throws NotSerializableException
    {
            throw new NotSerializableException("NoPickleClass");
    }
}

class TryPickleClass  extends NoPickleClass {
    int i = 7;
    transient int tmp[];

    private void writeObject(ObjectOutputStream pw) throws IOException {
            pw.writeInt(i);
    }

    private void readObject(ObjectInputStream pr) throws IOException {
            tmp = new int[32];
            i = pr.readInt();
    }

    private void readObjectCleanup(ObjectInputStream pr) {
            System.err.println("\nCleanup called on abort");
            if (tmp != null) {
                tmp = null;
        }
    }
}
