blob: 17e8c5f1659646f88b46d0c4a50ea5d29a1362ef [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 by SAP AG, Walldorf.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.ws.jaxws.dom.runtime.tests.validation;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jst.ws.jaxws.dom.runtime.validation.provider.MethodValidator;
import org.eclipse.jst.ws.jaxws.dom.runtime.validation.provider.exceptions.AbstractClassNotImplementedException;
import org.eclipse.jst.ws.jaxws.dom.runtime.validation.provider.exceptions.HasInadmisableInnerTypesException;
import org.eclipse.jst.ws.jaxws.dom.runtime.validation.provider.exceptions.InheritanceAndImplementationExecption;
import org.eclipse.jst.ws.jaxws.dom.runtime.validation.provider.exceptions.InterfacesNotSupportedException;
import org.eclipse.jst.ws.jaxws.dom.runtime.validation.provider.exceptions.NoDefaultConstructorException;
import org.eclipse.jst.ws.jaxws.dom.runtime.validation.provider.exceptions.RemoteObjectException;
import org.eclipse.jst.ws.jaxws.testutils.project.ClassLoadingTest;
@SuppressWarnings("nls")
public class MethodValidatorTest extends ClassLoadingTest
{
private static final String SRC = "src";
private static final String PCK = "runtime.type.validation.test";
private MethodValidator validator;
private IType endpoint;
@Override
protected void setUp() throws Exception
{
createJavaProject(SRC, PCK);
createClasses("mock/RuntimeClasses.src");
endpoint = createClass("mock/Endpoint.src", "Endpoint");
validator = new MethodValidator();
}
//FIXME Uncomment when Eclipse 3.6 M4 is used in the WTP builds. Contains a fix for Bug# 158361
// public void testCheckGeneralCases() throws Exception
// {
// String[] emptyParams = new String[] {};
//
// // check constructor
// IMethod method = endpoint.getMethod("Endpoint", emptyParams);
// assertNotNull(method);
// IStatus status = validator.check(method);
// assertTrue(status.getSeverity() == IStatus.ERROR);
// assertTrue(status.getException() instanceof ConstructorNotExposableException);
//
// // check private method
// method = endpoint.getMethod("privateMethod", emptyParams);
// assertNotNull(method);
// status = validator.check(method);
// assertTrue(status.getSeverity() == IStatus.ERROR);
// assertNotNull(status.getMessage());
// assertTrue(status.getException() instanceof MethodNotPublicException);
//
// // check protected
// method = endpoint.getMethod("protectedMethod", emptyParams);
// assertNotNull(method);
// status = validator.check(method);
// assertTrue(status.getSeverity() == IStatus.ERROR);
// assertNotNull(status.getMessage());
// assertTrue(status.getException() instanceof MethodNotPublicException);
//
// // check use unsupported javax.* class for return type
// method = endpoint.getMethod("useUnsupportedJavaType", emptyParams);
// assertNotNull(method);
// status = validator.check(method);
// assertTrue(status.getSeverity() == IStatus.ERROR);
// assertNotNull(status.getMessage());
// assertTrue(status.getException() instanceof NoDefaultConstructorException);
//
// // check use unsupported javax.* class for return type
// method = endpoint.getMethod("useSupportedJavaType", emptyParams);
// assertNotNull(method);
// status = validator.check(method);
// assertTrue(status.getSeverity() == IStatus.OK);
// assertTrue(status.getMessage().equals(""));
// assertNull(status.getException());
//
// // check use void return type
// method = endpoint.getMethod("useVoid", emptyParams);
// assertNotNull(method);
// status = validator.check(method);
// assertTrue(status.getSeverity() == IStatus.OK);
// assertTrue(status.getMessage().equals(""));
// assertNull(status.getException());
//
// // check use array as return type
// method = endpoint.getMethod("useArrayAsReturnValue", emptyParams);
// assertNotNull(method);
// status = validator.check(method);
// assertTrue(status.getSeverity() == IStatus.OK);
// assertTrue(status.getMessage().equals(""));
// assertNull(status.getException());
//
// // check use array as paramether
// method = endpoint.getMethod("useArrayAsParam", new String[] { "[I" });
// assertNotNull(method);
// status = validator.check(method);
// assertTrue(status.getSeverity() == IStatus.OK);
// assertTrue(status.getMessage().equals(""));
// assertNull(status.getException());
//
// // check use multy dimention array as paramether
// method = endpoint.getMethod("useMDArrayAsParam", new String[] { "[[[I" });
// assertNotNull(method);
// status = validator.check(method);
// assertTrue(status.getSeverity() == IStatus.OK);
// assertTrue(status.getMessage().equals(""));
// assertNull(status.getException());
//
// // check use nested generics
// method = endpoint.getMethod("useNestedGenerics", emptyParams);
// assertNotNull(method);
// status = validator.check(method);
// assertTrue(status.getSeverity() == IStatus.OK);
// assertNotNull(status.getMessage());
// assertNull(status.getException());
//
// method = endpoint.getMethod("useExtendsInGenerics", emptyParams);
// assertNotNull(method);
// status = validator.check(method);
// assertTrue(status.getSeverity() == IStatus.OK);
// assertNotNull(status.getMessage());
// assertNull(status.getException());
//
// method = endpoint.getMethod("useSuperInGenerics", emptyParams);
// assertNotNull(method);
// status = validator.check(method);
// assertTrue(status.getSeverity() == IStatus.OK);
// assertNotNull(status.getMessage());
// assertNull(status.getException());
//
// method = endpoint.getMethod("useSuperInGenericsAsParam", new String[] { "QList<-QString;>;" });
// assertNotNull(method);
// status = validator.check(method);
// assertTrue(status.getSeverity() == IStatus.OK);
// assertNotNull(status.getMessage());
// assertNull(status.getException());
//
// // check method returning enum
// method = endpoint.getMethod("useEnum", emptyParams);
// assertNotNull(method);
// status = validator.check(method);
// assertTrue(status.getSeverity() == IStatus.OK);
// assertNotNull(status.getMessage());
// assertNull(status.getException());
//
// // check method returning custom map
// method = endpoint.getMethod("useMyMap", emptyParams);
// assertNotNull(method);
// status = validator.check(method);
// assertTrue(status.getSeverity() == IStatus.OK);
// assertNotNull(status.getMessage());
// assertNull(status.getException());
// }
public void testCeckTypesIncompatible() throws Exception
{
String[] emptyParams = new String[] {};
// use type which doesn't have default constructor
IMethod method = endpoint.getMethod("useImplementsRemote", emptyParams);
assertNotNull(method);
IStatus status = validator.check(method);
assertTrue(status.getSeverity() == IStatus.ERROR);
assertNotNull(status.getMessage());
assertTrue(status.getException() instanceof RemoteObjectException);
// use type which doesn't have default constructor
method = endpoint.getMethod("useNoDefaultConstructor", emptyParams);
assertNotNull(method);
status = validator.check(method);
assertTrue(status.getSeverity() == IStatus.ERROR);
assertNotNull(status.getMessage());
assertTrue(status.getException() instanceof NoDefaultConstructorException);
// use type which has non public non static inner class
method = endpoint.getMethod("useHasInadmisableInnerClass", emptyParams);
assertNotNull(method);
status = validator.check(method);
assertTrue(status.getSeverity() == IStatus.ERROR);
assertNotNull(status.getMessage());
assertTrue(status.getException() instanceof HasInadmisableInnerTypesException);
// use type as paramether which contains unsupported java type as public field
String[] params = new String[] { "QUsesUnsupportedAsField;" };
method = endpoint.getMethod("useUsesUnsupportedAsField", params);
assertNotNull(method);
status = validator.check(method);
assertTrue(status.getSeverity() == IStatus.ERROR);
assertNotNull(status.getMessage());
assertTrue(status.getException() instanceof NoDefaultConstructorException);
}
public void testCeckTypesIncompatibleImplementation() throws Exception
{
String[] emptyParams = new String[] {};
// use not implemented abstract class
IMethod method = endpoint.getMethod("useNotImplementedAbstractClass", emptyParams);
assertNotNull(method);
IStatus status = validator.check(method);
assertTrue(status.getSeverity() == IStatus.ERROR);
assertNotNull(status.getMessage());
assertTrue(status.getException() instanceof AbstractClassNotImplementedException);
// use implemented abstract class
method = endpoint.getMethod("useImplementedAbstractClass", emptyParams);
assertNotNull(method);
status = validator.check(method);
assertTrue(status.getSeverity() == IStatus.OK);
assertTrue(status.getMessage().equals(""));
assertNull(status.getException());
}
//FIXME Uncomment when Eclipse 3.6 M4 is used in the WTP builds. Contains a fix for Bug# 158361
// public void testCheckInterfacesUsed() throws Exception
// {
// String[] emptyParams = new String[] {};
//
// // use not implemented interface
// IMethod method = endpoint.getMethod("useInterface", emptyParams);
// assertNotNull(method);
// IStatus status = validator.check(method);
// assertTrue(status.getSeverity() == IStatus.ERROR);
// assertNotNull(status.getMessage());
// assertTrue(status.getException() instanceof InterfacesNotSupportedException);
// }
public void testCeckTypesIncompatibleInheritance() throws Exception
{
String[] emptyParams = new String[] {};
// use class that extends custom class and custom interface
IMethod method = endpoint.getMethod("useMultyInheritanceUseClass", new String[] { "QMultyInheritanceUseClass;" });
assertNotNull(method);
IStatus status = validator.check(method);
assertTrue(status.getSeverity() == IStatus.ERROR);
assertNotNull(status.getMessage());
assertTrue(status.getException() instanceof InheritanceAndImplementationExecption);
// use class that extends class and implements 3 supported interfaces
method = endpoint.getMethod("useSupportedMultyInheritanceWithBaseClass", emptyParams);
assertNotNull(method);
status = validator.check(method);
assertTrue(status.getSeverity() == IStatus.OK);
assertTrue(status.getMessage().equals(""));
assertNull(status.getException());
// SupportedMultyInheritanceWithInterface
method = endpoint.getMethod("useSupportedMultyInheritanceWithInterface", emptyParams);
assertNotNull(method);
status = validator.check(method);
assertTrue(status.getSeverity() == IStatus.OK);
assertTrue(status.getMessage().equals(""));
assertNull(status.getException());
method = endpoint.getMethod("useImplementedBaseInGenerics", emptyParams);
assertNotNull(method);
status = validator.check(method);
assertTrue(status.getSeverity() == IStatus.OK);
assertTrue(status.getMessage().equals(""));
assertNull(status.getException());
}
public void testCeckMethodsWithExceptions() throws Exception
{
String[] emptyParams = new String[] {};
// use class that extends java.lang.Exception and custom interface
IMethod method = endpoint.getMethod("useCustomException", emptyParams);
assertNotNull(method);
IStatus status = validator.check(method);
assertTrue(status.getSeverity() == IStatus.OK);
assertTrue(status.getMessage().equals(""));
assertNull(status.getException());
method = endpoint.getMethod("useException", emptyParams);
assertNotNull(method);
status = validator.check(method);
assertTrue(status.getSeverity() == IStatus.OK);
assertTrue(status.getMessage().equals(""));
assertNull(status.getException());
}
public void testCheckMethodWithDefaultAccessInInterface() throws JavaModelException
{
final String seiCode = "public interface SEIWithDefaultAccessMethod { \n" +
" String test(); \n" +
"}";
final IType seiType = getTestProject().createType(defaultPackage, "SEIWithDefaultAccessMethod.java", seiCode);
final IMethod method = seiType.getMethod("test", new String []{});
IStatus status = validator.check(method);
assertEquals("Default method in SEI reported as incorrect", IStatus.OK, status.getSeverity());
}
}