blob: db2341e1b6e17bb58dc7c436422d18e2d0ebac61 [file] [log] [blame]
/*
* 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 org.apache.harmony.luni.tests.java.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Vector;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
@SuppressWarnings( { "serial", "unused" })
public class SerializationStressTest5 extends SerializationStressTest {
transient Throwable current;
// Use this for retrieving a list of any Throwable Classes that did not get
// tested.
transient Vector<Class> missedV = new Vector<Class>();
transient Class[][] params = new Class[][] { { String.class },
{ Throwable.class }, { Exception.class },
{ String.class, Exception.class }, { String.class, int.class },
{ String.class, String.class, String.class },
{ String.class, Error.class },
{ int.class, boolean.class, boolean.class, int.class, int.class },
{} };
transient Object[][] args = new Object[][] {
{ "message" },
{ new Throwable() },
{ new Exception("exception") },
{ "message", new Exception("exception") },
{ "message", new Integer(5) },
{ "message", "message", "message" },
{ "message", new Error("error") },
{ new Integer(5), new Boolean(false), new Boolean(false),
new Integer(5), new Integer(5) }, {} };
public SerializationStressTest5(String name) {
super(name);
}
public void test_writeObject_Throwables() {
try {
oos.close();
} catch (IOException e) {
}
File javaDir = findJavaDir();
Vector<File> classFilesVector = new Vector<File>();
if (javaDir != null)
findClassFiles(javaDir, classFilesVector);
else
findClassFilesFromZip(classFilesVector);
if (classFilesVector.size() == 0) {
fail("No Class Files Found.");
}
File[] classFilesArray = new File[classFilesVector.size()];
classFilesVector.copyInto(classFilesArray);
Class[] throwableClasses = findThrowableClasses(classFilesArray);
findParam(throwableClasses);
// Use this to print out the list of Throwable classes that weren't
// tested.
/*
* System.out.println(); Class[] temp = new Class[missedV.size()];
* missedV.copyInto(temp); for (int i = 0; i < temp.length; i++)
* System.out.println(i+1 + ": " + temp[i].getName());
*/
}
private File[] makeClassPathArray() {
String classPath;
if (System.getProperty("java.vendor").startsWith("IBM"))
classPath = System.getProperty("org.apache.harmony.boot.class.path");
else
classPath = System.getProperty("sun.boot.class.path");
int instanceOfSep = -1;
int nextInstance = classPath.indexOf(File.pathSeparatorChar,
instanceOfSep + 1);
Vector<File> elms = new Vector<File>();
while (nextInstance != -1) {
elms.add(new File(classPath.substring(instanceOfSep + 1,
nextInstance)));
instanceOfSep = nextInstance;
nextInstance = classPath.indexOf(File.pathSeparatorChar,
instanceOfSep + 1);
}
elms.add(new File(classPath.substring(instanceOfSep + 1)));
File[] result = new File[elms.size()];
elms.copyInto(result);
return result;
}
private File findJavaDir() {
File[] files = makeClassPathArray();
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
String[] tempFileNames = files[i].list();
for (int j = 0; j < tempFileNames.length; j++) {
File tempfile = new File(files[i], tempFileNames[j]);
if (tempfile.isDirectory()
&& tempFileNames[j].equals("java")) {
String[] subdirNames = tempfile.list();
for (int k = 0; k < subdirNames.length; k++) {
File subdir = new File(tempfile, subdirNames[k]);
if (subdir.isDirectory()
&& subdirNames[k].equals("lang")) {
return tempfile;
}
}
}
}
}
}
return null;
}
private void findClassFiles(File dir, Vector<File> v) {
String[] classFileNames = dir.list();
for (int i = 0; i < classFileNames.length; i++) {
File file = new File(dir, classFileNames[i]);
if (file.isDirectory())
findClassFiles(file, v);
else if (classFileNames[i].endsWith(".class"))
v.add(file);
}
}
private Class[] findThrowableClasses(File[] files) {
Class<Throwable> thrClass = Throwable.class;
Vector<Class> resultVector = new Vector<Class>();
String slash = System.getProperty("file.separator");
String begTarget = slash + "java" + slash;
String endTarget = ".class";
for (int i = 0; i < files.length; i++) {
String fileName = files[i].getPath();
int instOfBegTarget = fileName.indexOf(begTarget);
int instOfEndTarget = fileName.indexOf(endTarget);
fileName = fileName.substring(instOfBegTarget + 1, instOfEndTarget);
fileName = fileName.replace(slash.charAt(0), '.');
try {
Class theClass = Class.forName(fileName, false, ClassLoader
.getSystemClassLoader());
if (thrClass.isAssignableFrom(theClass)) {
// java.lang.VirtualMachineError is abstract.
// java.io.ObjectStreamException is abstract
// java.beans.PropertyVetoException needs a
// java.beans.PropertyChangeEvent as a parameter
if (!fileName.equals("java.lang.VirtualMachineError")
&& !fileName
.equals("java.io.ObjectStreamException")
&& !fileName
.equals("java.beans.PropertyVetoException"))
resultVector.add(theClass);
}
} catch (ClassNotFoundException e) {
fail("ClassNotFoundException : " + fileName);
}
}
Class[] result = new Class[resultVector.size()];
resultVector.copyInto(result);
return result;
}
private void initClass(Class thrC, int num) {
Constructor[] cons = thrC.getConstructors();
for (int i = 0; i < cons.length; i++) {
try {
Throwable obj = (Throwable) cons[i].newInstance(args[num]);
t_Class(obj, num);
break;
} catch (IllegalArgumentException e) {
// This error should be caught until the correct args is hit.
} catch (IllegalAccessException e) {
fail(
"IllegalAccessException while creating instance of: "
+ thrC.getName());
} catch (InstantiationException e) {
fail(
"InstantiationException while creating instance of: "
+ thrC.getName());
} catch (InvocationTargetException e) {
fail(
"InvocationTargetException while creating instance of: "
+ thrC.getName());
}
if (i == cons.length - 1) {
fail(
"Failed to create newInstance of: " + thrC.getName());
}
}
}
public String getDumpName() {
if (current == null) {
dumpCount++;
return getName();
}
return getName() + "_" + current.getClass().getName();
}
private void t_Class(Throwable objToSave, int argsNum) {
current = objToSave;
Object objLoaded = null;
try {
if (DEBUG)
System.out.println("Obj = " + objToSave);
try {
objLoaded = dumpAndReload(objToSave);
} catch (FileNotFoundException e) {
// Must be using xload, ignore missing Throwables
System.out.println("Ignoring: "
+ objToSave.getClass().getName());
return;
}
// Has to have worked
boolean equals;
equals = objToSave.getClass().equals(objLoaded.getClass());
assertTrue(MSG_TEST_FAILED + objToSave, equals);
if (argsNum == 0 || (argsNum >= 3 && argsNum <= 7)) {
equals = ((Throwable) objToSave).getMessage().equals(
((Throwable) objLoaded).getMessage());
assertTrue("Message Test: " + MSG_TEST_FAILED + objToSave,
equals);
} else {
// System.out.println(((Throwable)objToSave).getMessage());
equals = ((Throwable) objToSave).getMessage() == null;
assertTrue("Null Test 1: (args=" + argsNum + ") "
+ MSG_TEST_FAILED + objToSave, equals);
equals = ((Throwable) objLoaded).getMessage() == null;
assertTrue("Null Test 2: (args=" + argsNum + ") "
+ MSG_TEST_FAILED + objToSave, equals);
}
} catch (IOException e) {
fail("Unexpected IOException in checkIt() : " + e.getMessage());
} catch (ClassNotFoundException e) {
fail(e.toString() + " - testing " + objToSave.getClass().getName());
}
}
private void findParam(Class[] thrC) {
for (int i = 0; i < thrC.length; i++) {
Constructor con = null;
for (int j = 0; j < params.length; j++) {
try {
con = thrC[i].getConstructor(params[j]);
} catch (NoSuchMethodException e) {
// This Error will be caught until the right param is found.
}
if (con != null) {
// If the param was found, initialize the Class
initClass(thrC[i], j);
break;
}
// If the param not found then add to missed Vector.
if (j == params.length - 1)
missedV.add(thrC[i]);
}
}
}
private void findClassFilesFromZip(Vector<File> v) {
String slash = System.getProperty("file.separator");
String javaHome = System.getProperty("java.home");
if (!javaHome.endsWith(slash))
javaHome += slash;
String[] wanted = { "java" + slash + "io", "java" + slash + "lang",
"java" + slash + "math", "java" + slash + "net",
"java" + slash + "security", "java" + slash + "text",
"java" + slash + "util", "java" + slash + "beans",
"java" + slash + "rmi",
// One or more class files in awt make the VM hang after being
// loaded.
// "java" + slash + "awt",
"java" + slash + "sql",
// These are (possibly) all of the throwable classes in awt
/*
* "java\\awt\\AWTError", "java\\awt\\AWTException",
* "java\\awt\\color\\CMMException",
* "java\\awt\\color\\ProfileDataException",
* "java\\awt\\datatransfer\\MimeTypeParseException",
* "java\\awt\\datatransfer\\UnsupportedFlavorException",
* "java\\awt\\dnd\\InvalidDnDOperationException",
* "java\\awt\\FontFormatException",
* "java\\awt\\geom\\IllegalPathStateException",
* "java\\awt\\geom\\NoninvertibleTransformException",
* "java\\awt\\IllegalComponentStateException",
* "java\\awt\\image\\ImagingOpException",
* "java\\awt\\image\\RasterFormatException",
* "java\\awt\\print\\PrinterAbortException",
* "java\\awt\\print\\PrinterException",
* "java\\awt\\print\\PrinterIOException"
*/
};
File[] files = makeClassPathArray();
FileInputStream fis = null;
ZipInputStream zis = null;
ZipEntry ze = null;
for (int i = 0; i < files.length; i++) {
String fileName = files[i].getPath();
if (files[i].exists() && files[i].isFile()
&& fileName.endsWith(".jar") || fileName.endsWith(".zip")) {
try {
fis = new FileInputStream(files[i].getPath());
} catch (FileNotFoundException e) {
fail("FileNotFoundException trying to open "
+ files[i].getPath());
}
zis = new ZipInputStream(fis);
while (true) {
try {
ze = zis.getNextEntry();
} catch (IOException e) {
fail("IOException while getting next zip entry: "
+ e);
}
if (ze == null)
break;
String zeName = ze.getName();
if (zeName.endsWith(".class")) {
zeName = zeName.replace('/', slash.charAt(0));
for (int j = 0; j < wanted.length; j++) {
if (zeName.startsWith(wanted[j])) {
// When finding class files from directories the
// program saves them as files.
// To stay consistent we will turn the ZipEntry
// classes into instances of files.
File tempF = new File(javaHome + zeName);
// Making sure that the same class is not added
// twice.
boolean duplicate = false;
for (int k = 0; k < v.size(); k++) {
if (v.get(k).equals(tempF))
duplicate = true;
}
if (!duplicate)
v.add(tempF);
break;
}
}
}
}
;
try {
zis.close();
fis.close();
} catch (IOException e) {
fail(
"IOException while trying to close InputStreams: "
+ e);
}
}
}
}
}