blob: 9d60db5924e95b9e771e862ee34e43416f685a90 [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 com.sun.star.lib.uno.bridges.java_remote;
import com.sun.star.uno.IQueryInterface;
import com.sun.star.uno.MappingException;
import com.sun.star.uno.Type;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XInterface;
import com.sun.star.uno.XNamingService;
import complexlib.ComplexTestCase;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.UndeclaredThrowableException;
public final class ProxyFactory_Test extends ComplexTestCase {
public String getTestObjectName() {
return getClass().getName();
}
public String[] getTestMethodNames() {
return new String[] { "testQueryInterface", "testExceptionHandling" };
}
public void testQueryInterface() {
TestRequestHandler handler = new TestRequestHandler();
Type type = new Type(XNamingService.class);
Object proxy = new ProxyFactory(handler, null).create("TestOID", type);
assure("", proxy == ((IQueryInterface) proxy).queryInterface(type));
assure("", proxy == UnoRuntime.queryInterface(type, proxy));
}
public void testExceptionHandling() throws Exception {
TestRequestHandler handler = new TestRequestHandler();
Object proxy = new ProxyFactory(handler, null).create(
"TestOID", new Type(XNamingService.class));
testExceptions(
handler,
proxy.getClass().getMethod("queryInterface",
new Class[] { Type.class }),
proxy, new Object[] { new Type(XInterface.class) },
new Class[] { null, MappingException.class,
com.sun.star.uno.RuntimeException.class,
UndeclaredThrowableException.class,
NullPointerException.class,
UndeclaredThrowableException.class });
testExceptions(
handler,
proxy.getClass().getMethod("getRegisteredObject",
new Class[] { String.class }),
proxy, new Object[] { "TestName" },
new Class[] { null, MappingException.class,
com.sun.star.uno.RuntimeException.class,
com.sun.star.uno.Exception.class,
NullPointerException.class, Exception.class });
}
private void testExceptions(TestRequestHandler handler, Method method,
Object obj, Object[] args, Class[] exceptions)
throws Exception
{
for (int i = 0; i < exceptions.length; ++i) {
handler.setModus(i);
testExceptionType(method, obj, args, exceptions[i]);
}
}
private void testExceptionType(Method method, Object obj, Object[] args,
Class exception) throws Exception {
try {
method.invoke(obj, args);
assure("expected exception: " + exception, exception == null);
} catch (InvocationTargetException e) {
assure("unexpected exception: " + e.getTargetException(),
exception != null
&& exception.isInstance(e.getTargetException()));
// TODO check stack trace
}
}
private static final class TestRequestHandler implements RequestHandler {
public Object sendRequest(String oid, Type type, String operation,
Object[] args)
throws Throwable
{
if (operation.equals("release")) {
return null;
}
int m;
synchronized (lock) {
m = modus;
}
switch (m) {
case 0:
return operation.equals("getInstance") ? "TestResult" : null;
case 1:
// TODO What is this test, with an obviously obsoleted
// MappingException, good for?
throw new MappingException();
case 2:
throw new com.sun.star.uno.RuntimeException();
case 3:
throw new com.sun.star.uno.Exception();
case 4:
throw new NullPointerException();
default:
throw new Throwable();
}
}
public void setModus(int modus) {
synchronized (lock) {
this.modus = modus;
}
}
private final Object lock = new Object();
private int modus = 0;
}
}