/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: Noah Fontes <nfontes@invectorate.com>
*/
package org.h2.test.unit;
import org.h2.message.DbException;
import org.h2.test.TestBase;
import org.h2.util.StringUtils;
import org.h2.util.Utils;
/**
* Tests the ability to deserialize objects that are not part of the system
* class-loading scope.
*/
public class TestObjectDeserialization extends TestBase {
private static final String CLAZZ = "org.h2.test.unit.SampleObject";
private static final String OBJECT =
"aced00057372001d6f72672e68322e746573742e756e69742e53616d706c654f626a65637400000000000000010200007870";
/**
* The thread context class loader was used.
*/
protected boolean usesThreadContextClassLoader;
/**
* Run just this test.
*
* @param a ignored
*/
public static void main(String... a) throws Exception {
System.setProperty("h2.useThreadContextClassLoader", "true");
TestBase.createCaller().init().test();
}
public void test() throws Exception {
testThreadContextClassLoader();
}
private void testThreadContextClassLoader() throws Exception {
usesThreadContextClassLoader = false;
Thread.currentThread().setContextClassLoader(new TestClassLoader());
try {
Utils.deserialize(StringUtils.convertHexToBytes(OBJECT));
fail();
} catch (DbException e) {
// expected
}
assertTrue(usesThreadContextClassLoader);
}
/**
* A special class loader.
*/
private class TestClassLoader extends ClassLoader {
public TestClassLoader() {
super();
}
protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
if (name.equals(CLAZZ)) {
usesThreadContextClassLoader = true;
}
return super.loadClass(name, resolve);
}
}
}