blob: 96729e603508ef197981e0cf917f34df7aab8b9a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Oracle - initial API and implementation from Oracle TopLink
******************************************************************************/
package org.eclipse.persistence.testing.tests.remote;
import java.util.*;
import java.lang.reflect.*;
import org.eclipse.persistence.internal.sessions.remote.RemoteConnection;
import org.eclipse.persistence.exceptions.*;
import org.eclipse.persistence.sessions.remote.RemoteSession;
import org.eclipse.persistence.testing.framework.*;
public class RemoteConnectionExceptionsTest extends TestCase {
public RemoteConnectionExceptionsTest(int mode, Class remoteConnectionClass) {
this.remoteConnectionClass = remoteConnectionClass;
generator = new TransporterGenerator(mode);
setNameAndCheckMode();
setNamesToExclude();
setMethodsAndArgs();
setKnownBugs();
}
public RemoteConnectionExceptionsTest(int mode,
String remoteConnectionClassName) throws ClassNotFoundException {
this(mode, Class.forName(remoteConnectionClassName));
}
protected Class remoteConnectionClass;
private RemoteConnection remoteConnection;
protected TransporterGenerator generator;
protected Object[] results;
protected Throwable[] exceptions;
protected Hashtable knownBugs;
protected Vector namesToExclude;
protected Vector methods;
protected Vector args;
protected void setRemoteConnection(RemoteConnection remoteConnection) {
Class cls = remoteConnection.getClass();
if (!remoteConnectionClass.equals(cls)) {
throw new TestProblemException("remoteConnection's type is different from the type used to create the test");
}
this.remoteConnection = remoteConnection;
this.remoteConnection.setSession(new RemoteSession());
}
protected RemoteConnection getRemoteConnection() {
return remoteConnection;
}
protected void setNamesToExclude() {
namesToExclude = new Vector();
String namesToExcludeArray[] =
{ "createProxySession", "createRemoteSession", "cursoredStreamNextPage", "fixObjectReferences",
"getRemoteSessionController", "setRemoteSessionController", };
for (int i = 0; i < namesToExcludeArray.length; i++) {
namesToExclude.add(namesToExcludeArray[i]);
}
}
protected void setNameAndCheckMode() throws TestProblemException {
int mode = generator.getMode();
String className = remoteConnectionClass.getName();
if (mode == TransporterGenerator.THROW_REMOTE_EXCEPTION) {
setName(getName().concat(" THROW_REMOTE_EXCEPTION"));
setDescription("Verifies that CommunicationException are thrown by methods of " + className +
" class");
} else if (mode == TransporterGenerator.SET_EXCEPTION_INTO_TRANSPORTER) {
setName(getName().concat(" SET_EXCEPTION_INTO_TRANSPORTER"));
setDescription("Verifies that Transporter.getException() are thrown by methods of " + className +
" class");
} else {
throw new TestProblemException("Unsupported mode");
}
}
protected void setMethodsAndArgs() {
methods = new Vector();
args = new Vector();
Method[] allMethods = remoteConnectionClass.getMethods();
for (int i = 0; i < allMethods.length; i++) {
Method method = allMethods[i];
if (!method.getDeclaringClass().equals(remoteConnectionClass)) {
continue;
}
if (!Modifier.isPublic(method.getModifiers())) {
continue;
}
String name = method.getName();
if (namesToExclude != null && namesToExclude.contains(name)) {
continue;
}
methods.add(method);
Class[] types = method.getParameterTypes();
Object[] params = new Object[types.length];
for (int j = 0; j < types.length; j++) {
Class type = types[j];
if (type.isPrimitive()) {
params[j] = getWrapperClassInstance(type);
}
}
args.add(params);
}
}
protected void setKnownBugs() {
knownBugs = new Hashtable();
if (generator.getMode() == TransporterGenerator.SET_EXCEPTION_INTO_TRANSPORTER) {
for (int i = 0; i < methods.size(); i++) {
Method method = (Method)methods.elementAt(i);
Object[] params = (Object[])args.elementAt(i);
String name = method.getName();
if (name.equals("cursorSelectObjects")) {
if (params.length == 2) {
knownBugs.put(method, "bug 2909926");
}
}
}
}
}
protected String getNameToBind() {
return this.getClass().getName();
}
protected boolean isCorrect(int i) {
Throwable exception = exceptions[i];
boolean ok;
int mode = generator.getMode();
if (mode == TransporterGenerator.THROW_REMOTE_EXCEPTION) {
ok = exception != null;
if (ok) {
ok = CommunicationException.class.isInstance(exception);
if (ok) {
ok =
((CommunicationException)exception).getErrorCode() == CommunicationException.ERROR_IN_INVOCATION;
}
}
if (!ok) {
if (((Method)methods.elementAt(i)).getName().equals("isConnected")) {
if (Boolean.class.isInstance(results[i])) {
ok = !((Boolean)results[i]).booleanValue();
}
}
}
} else if (mode == TransporterGenerator.SET_EXCEPTION_INTO_TRANSPORTER) {
ok = exception != null;
if (ok) {
ok = TestException.class.isInstance(exception);
if (ok) {
ok = ((TestException)exception).getMessage().endsWith(generator.getMessage());
}
}
} else {
throw new TestException("Unsupported mode");
}
return ok;
}
public void test() throws Exception {
results = new Object[methods.size()];
exceptions = new Throwable[methods.size()];
for (int i = 0; i < methods.size(); i++) {
Method method = (Method)methods.elementAt(i);
Object[] params = (Object[])args.elementAt(i);
Object result = null;
Throwable exception = null;
try {
result = method.invoke(getRemoteConnection(), params);
} catch (InvocationTargetException ex) {
exception = ex.getTargetException();
}
results[i] = result;
exceptions[i] = exception;
}
}
public void verify() {
boolean errorHasOccured = false;
String errorMessage = new String("Wrong exception/result thrown/returned by methods:");
String unknownBug = new String("!!!UNKNOWN BUG!!!");
for (int i = 0; i < methods.size(); i++) {
Method method = (Method)methods.elementAt(i);
String name = method.getName();
if (!isCorrect(i)) {
errorHasOccured = true;
errorMessage = errorMessage.concat(" ");
errorMessage = errorMessage.concat(name);
errorMessage = errorMessage.concat("(");
String bug = unknownBug;
if (knownBugs != null && !knownBugs.isEmpty()) {
String knownBug = (String)knownBugs.get(methods.elementAt(i));
if (knownBug != null) {
bug = knownBug;
}
}
errorMessage = errorMessage.concat(bug);
errorMessage = errorMessage.concat(")");
errorMessage = errorMessage.concat(";");
}
}
if (errorHasOccured) {
throw new TestErrorException(errorMessage);
}
}
public static Object getWrapperClassInstance(Class cls) {
if (Integer.TYPE.equals(cls)) {
return new Integer(0);
} else if (Boolean.TYPE.equals(cls)) {
return new Boolean(false);
} else if (Character.TYPE.equals(cls)) {
return new Character(' ');
} else if (Byte.TYPE.equals(cls)) {
byte b = 0;
return new Byte(b);
} else if (Short.TYPE.equals(cls)) {
short s = 0;
return new Short(s);
} else if (Long.TYPE.equals(cls)) {
return new Long(0);
} else if (Float.TYPE.equals(cls)) {
return new Float(0);
} else if (Double.TYPE.equals(cls)) {
return new Double(0);
} else {
return null;
}
}
}