1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  this work for additional information regarding copyright ownership.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  the License.  You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage tests.api.java.io;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestLevel;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestTargetClass;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestTargetNew;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.File;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.FileInputStream;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.FileNotFoundException;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.IOException;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.lang.reflect.Constructor;
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.lang.reflect.InvocationTargetException;
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Vector;
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.zip.ZipEntry;
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.zip.ZipInputStream;
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@TestTargetClass(java.io.Serializable.class)
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class SerializationStressTest5 extends SerializationStressTest {
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    transient Throwable current;
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // Use this for retrieving a list of any Throwable Classes that did not get
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // tested.
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    transient Vector missedV = new Vector();
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    transient Class[][] params = new Class[][] { { String.class },
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            { Throwable.class }, { Exception.class },
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            { String.class, Exception.class }, { String.class, int.class },
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            { String.class, String.class, String.class },
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            { String.class, Error.class },
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            { int.class, boolean.class, boolean.class, int.class, int.class },
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {} };
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    transient Object[][] args = new Object[][] {
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            { "message" },
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            { new Throwable() },
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            { new Exception("exception") },
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            { "message", new Exception("exception") },
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            { "message", new Integer(5) },
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            { "message", "message", "message" },
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            { "message", new Error("error") },
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            { new Integer(5), new Boolean(false), new Boolean(false),
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    new Integer(5), new Integer(5) }, {} };
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.ADDITIONAL,
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "!Serialization:test ThrowableClasses",
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {}
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void _test_writeObject_Throwables() {
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            oos.close();
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IOException e) {
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        File javaDir = findJavaDir();
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Vector classFilesVector = new Vector();
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (javaDir != null)
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            findClassFiles(javaDir, classFilesVector);
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            findClassFilesFromZip(classFilesVector);
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (classFilesVector.size() == 0) {
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("No Class Files Found.");
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        File[] classFilesArray = new File[classFilesVector.size()];
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        classFilesVector.copyInto(classFilesArray);
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Class[] throwableClasses = findThrowableClasses(classFilesArray);
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        findParam(throwableClasses);
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Use this to print out the list of Throwable classes that weren't
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // tested.
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * System.out.println(); Class[] temp = new Class[missedV.size()];
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * missedV.copyInto(temp); for (int i = 0; i < temp.length; i++)
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * System.out.println(i+1 + ": " + temp[i].getName());
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private File[] makeClassPathArray() {
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String classPath;
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // if (System.getProperty("java.vendor").startsWith("IBM"))
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //     classPath = System.getProperty("org.apache.harmony.boot.class.path");
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // else
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //     classPath = System.getProperty("sun.boot.class.path");
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        classPath = System.getProperty("java.boot.class.path");
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int instanceOfSep = -1;
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int nextInstance = classPath.indexOf(File.pathSeparatorChar,
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                instanceOfSep + 1);
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Vector elms = new Vector();
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (nextInstance != -1) {
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            elms.add(new File(classPath.substring(instanceOfSep + 1,
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    nextInstance)));
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            instanceOfSep = nextInstance;
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            nextInstance = classPath.indexOf(File.pathSeparatorChar,
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    instanceOfSep + 1);
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        elms.add(new File(classPath.substring(instanceOfSep + 1)));
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        File[] result = new File[elms.size()];
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        elms.copyInto(result);
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result;
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private File findJavaDir() {
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        File[] files = makeClassPathArray();
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < files.length; i++) {
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (files[i].isDirectory()) {
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                String[] tempFileNames = files[i].list();
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                for (int j = 0; j < tempFileNames.length; j++) {
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    File tempfile = new File(files[i], tempFileNames[j]);
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (tempfile.isDirectory()
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            && tempFileNames[j].equals("java")) {
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        String[] subdirNames = tempfile.list();
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        for (int k = 0; k < subdirNames.length; k++) {
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            File subdir = new File(tempfile, subdirNames[k]);
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            if (subdir.isDirectory()
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                    && subdirNames[k].equals("lang")) {
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                return tempfile;
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            }
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        }
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return null;
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private void findClassFiles(File dir, Vector v) {
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String[] classFileNames = dir.list();
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < classFileNames.length; i++) {
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            File file = new File(dir, classFileNames[i]);
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (file.isDirectory())
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                findClassFiles(file, v);
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            else if (classFileNames[i].endsWith(".class"))
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                v.add(file);
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private Class[] findThrowableClasses(File[] files) {
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Class thrClass = Throwable.class;
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Vector resultVector = new Vector();
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String slash = System.getProperty("file.separator");
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String begTarget = slash + "java" + slash;
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String endTarget = ".class";
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < files.length; i++) {
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String fileName = files[i].getPath();
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int instOfBegTarget = fileName.indexOf(begTarget);
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int instOfEndTarget = fileName.indexOf(endTarget);
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fileName = fileName.substring(instOfBegTarget + 1, instOfEndTarget);
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fileName = fileName.replace(slash.charAt(0), '.');
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Class theClass = Class.forName(fileName, false, ClassLoader
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .getSystemClassLoader());
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (thrClass.isAssignableFrom(theClass)) {
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    // java.lang.VirtualMachineError is abstract.
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    // java.io.ObjectStreamException is abstract
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    // java.beans.PropertyVetoException needs a
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    // java.beans.PropertyChangeEvent as a parameter
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (!fileName.equals("java.lang.VirtualMachineError")
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            && !fileName
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                    .equals("java.io.ObjectStreamException")
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            && !fileName
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                    .equals("java.beans.PropertyVetoException"))
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        resultVector.add(theClass);
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ClassNotFoundException e) {
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("ClassNotFoundException : " + fileName);
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Class[] result = new Class[resultVector.size()];
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        resultVector.copyInto(result);
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result;
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private void initClass(Class thrC, int num) {
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Constructor[] cons = thrC.getConstructors();
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < cons.length; i++) {
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Throwable obj = (Throwable) cons[i].newInstance(args[num]);
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                t_Class(obj, num);
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                break;
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (IllegalArgumentException e) {
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // This error should be caught until the correct args is hit.
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (IllegalAccessException e) {
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail(
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        "IllegalAccessException while creating instance of: "
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                + thrC.getName());
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (InstantiationException e) {
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail(
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        "InstantiationException while creating instance of: "
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                + thrC.getName());
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (InvocationTargetException e) {
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail(
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        "InvocationTargetException while creating instance of: "
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                + thrC.getName());
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (i == cons.length - 1) {
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail(
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        "Failed to create newInstance of: " + thrC.getName());
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getDumpName() {
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (current == null) {
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            dumpCount++;
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return getName();
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return getName() + "_" + current.getClass().getName();
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private void t_Class(Throwable objToSave, int argsNum) {
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        current = objToSave;
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object objLoaded = null;
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (DEBUG)
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                System.out.println("Obj = " + objToSave);
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                objLoaded = dumpAndReload(objToSave);
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (FileNotFoundException e) {
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // Must be using xload, ignore missing Throwables
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                System.out.println("Ignoring: "
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        + objToSave.getClass().getName());
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return;
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // Has to have worked
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            boolean equals;
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            equals = objToSave.getClass().equals(objLoaded.getClass());
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertTrue(MSG_TEST_FAILED + objToSave, equals);
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (argsNum == 0 || (argsNum >= 3 && argsNum <= 7)) {
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                equals = ((Throwable) objToSave).getMessage().equals(
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        ((Throwable) objLoaded).getMessage());
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertTrue("Message Test: " + MSG_TEST_FAILED + objToSave,
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        equals);
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else {
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // System.out.println(((Throwable)objToSave).getMessage());
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                equals = ((Throwable) objToSave).getMessage() == null;
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertTrue("Null Test 1: (args=" + argsNum + ") "
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        + MSG_TEST_FAILED + objToSave, equals);
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                equals = ((Throwable) objLoaded).getMessage() == null;
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertTrue("Null Test 2: (args=" + argsNum + ") "
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        + MSG_TEST_FAILED + objToSave, equals);
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IOException e) {
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("Unexpected IOException in checkIt() : " + e.getMessage());
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (ClassNotFoundException e) {
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail(e.toString() + " - testing " + objToSave.getClass().getName());
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private void findParam(Class[] thrC) {
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < thrC.length; i++) {
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Constructor con = null;
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int j = 0; j < params.length; j++) {
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                try {
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    con = thrC[i].getConstructor(params[j]);
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } catch (NoSuchMethodException e) {
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    // This Error will be caught until the right param is found.
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (con != null) {
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    // If the param was found, initialize the Class
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    initClass(thrC[i], j);
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    break;
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // If the param not found then add to missed Vector.
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (j == params.length - 1)
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    missedV.add(thrC[i]);
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private void findClassFilesFromZip(Vector v) {
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String slash = System.getProperty("file.separator");
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String javaHome = System.getProperty("java.home");
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!javaHome.endsWith(slash))
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            javaHome += slash;
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String[] wanted = { "java" + slash + "io", "java" + slash + "lang",
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                "java" + slash + "math", "java" + slash + "net",
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                "java" + slash + "security", "java" + slash + "text",
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                "java" + slash + "util", "java" + slash + "beans",
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                "java" + slash + "rmi",
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // One or more class files in awt make the VM hang after being
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // loaded.
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // "java" + slash + "awt",
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                "java" + slash + "sql",
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // These are (possibly) all of the throwable classes in awt
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * "java\\awt\\AWTError", "java\\awt\\AWTException",
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * "java\\awt\\color\\CMMException",
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * "java\\awt\\color\\ProfileDataException",
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * "java\\awt\\datatransfer\\MimeTypeParseException",
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * "java\\awt\\datatransfer\\UnsupportedFlavorException",
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * "java\\awt\\dnd\\InvalidDnDOperationException",
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * "java\\awt\\FontFormatException",
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * "java\\awt\\geom\\IllegalPathStateException",
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * "java\\awt\\geom\\NoninvertibleTransformException",
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * "java\\awt\\IllegalComponentStateException",
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * "java\\awt\\image\\ImagingOpException",
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * "java\\awt\\image\\RasterFormatException",
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * "java\\awt\\print\\PrinterAbortException",
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * "java\\awt\\print\\PrinterException",
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * "java\\awt\\print\\PrinterIOException"
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        };
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        File[] files = makeClassPathArray();
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        FileInputStream fis = null;
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ZipInputStream zis = null;
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ZipEntry ze = null;
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < files.length; i++) {
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String fileName = files[i].getPath();
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (files[i].exists() && files[i].isFile()
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    && fileName.endsWith(".jar") || fileName.endsWith(".zip")) {
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                try {
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    fis = new FileInputStream(files[i].getPath());
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } catch (FileNotFoundException e) {
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    fail("FileNotFoundException trying to open "
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            + files[i].getPath());
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                zis = new ZipInputStream(fis);
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                while (true) {
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    try {
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        ze = zis.getNextEntry();
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    } catch (IOException e) {
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        fail("IOException while getting next zip entry: "
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                + e);
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (ze == null)
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        break;
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    String zeName = ze.getName();
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (zeName.endsWith(".class")) {
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        zeName = zeName.replace('/', slash.charAt(0));
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        for (int j = 0; j < wanted.length; j++) {
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            if (zeName.startsWith(wanted[j])) {
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                // When finding class files from directories the
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                // program saves them as files.
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                // To stay consistent we will turn the ZipEntry
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                // classes into instances of files.
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                File tempF = new File(javaHome + zeName);
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                // Making sure that the same class is not added
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                // twice.
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                boolean duplicate = false;
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                for (int k = 0; k < v.size(); k++) {
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                    if (v.get(k).equals(tempF))
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                        duplicate = true;
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                }
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                if (!duplicate)
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                    v.add(tempF);
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                break;
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            }
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        }
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                ;
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                try {
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    zis.close();
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    fis.close();
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } catch (IOException e) {
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    fail(
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            "IOException while trying to close InputStreams: "
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                    + e);
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
391