/** * 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.openejb.client; import junit.framework.TestCase; import javax.ejb.EJBHome; import javax.ejb.EJBObject; import javax.ejb.Handle; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.reflect.Method; public class EJBRequestTest extends TestCase { private EJBMetaDataImpl ejb; static interface FooHome extends EJBHome { FooObject create(); FooObject findByPrimaryKey(Integer key); } static interface FooObject extends EJBObject { String businessMethod(String param); } @Override protected void setUp() throws Exception { ejb = new EJBMetaDataImpl(FooHome.class, FooObject.class, Integer.class, "BMP_ENTITY", "FooBeanID", InterfaceType.BUSINESS_REMOTE, null, null); } public void testEJBHomeCreate() throws Exception { final RequestMethodCode requestMethod = RequestMethodCode.EJB_HOME_CREATE; final Method method = FooHome.class.getMethod("create", new Class[0]); final Object[] args = new Object[]{}; invoke(requestMethod, method, args); } public void testEJBHomeFind() throws Exception { final RequestMethodCode requestMethod = RequestMethodCode.EJB_HOME_FIND; final Method method = FooHome.class.getMethod("findByPrimaryKey", new Class[]{Integer.class}); final Object[] args = new Object[]{4}; invoke(requestMethod, method, args); } public void testEJBHomeRemove1() throws Exception { final RequestMethodCode requestMethod = RequestMethodCode.EJB_HOME_REMOVE_BY_HANDLE; final Method method = FooHome.class.getMethod("remove", new Class[]{Handle.class}); final Object[] args = new Object[]{null}; invoke(requestMethod, method, args); } public void testEJBHomeRemove2() throws Exception { final RequestMethodCode requestMethod = RequestMethodCode.EJB_HOME_REMOVE_BY_PKEY; final Method method = FooHome.class.getMethod("remove", new Class[]{Object.class}); final Object[] args = new Object[]{4}; invoke(requestMethod, method, args); } public void testGetMetaData() throws Exception { final RequestMethodCode requestMethod = RequestMethodCode.EJB_HOME_GET_EJB_META_DATA; final Method method = FooHome.class.getMethod("getEJBMetaData", new Class[]{}); final Object[] args = new Object[]{}; invoke(requestMethod, method, args); } public void testGetHomeHandle() throws Exception { final RequestMethodCode requestMethod = RequestMethodCode.EJB_HOME_GET_HOME_HANDLE; final Method method = FooHome.class.getMethod("getHomeHandle", new Class[]{}); final Object[] args = new Object[]{}; invoke(requestMethod, method, args); } public void testBusinessMethod() throws Exception { final RequestMethodCode requestMethod = RequestMethodCode.EJB_OBJECT_BUSINESS_METHOD; final Method method = FooObject.class.getMethod("businessMethod", new Class[]{String.class}); final Object[] args = new Object[]{"hola mundo"}; invoke(requestMethod, method, args); } public void testGetEJBHome() throws Exception { final RequestMethodCode requestMethod = RequestMethodCode.EJB_OBJECT_GET_EJB_HOME; final Method method = FooObject.class.getMethod("getEJBHome", new Class[]{}); final Object[] args = new Object[]{}; invoke(requestMethod, method, args); } public void testGetHandle() throws Exception { final RequestMethodCode requestMethod = RequestMethodCode.EJB_OBJECT_GET_HANDLE; final Method method = FooObject.class.getMethod("getHandle", new Class[]{}); final Object[] args = new Object[]{}; invoke(requestMethod, method, args); } public void testGetPrimaryKey() throws Exception { final RequestMethodCode requestMethod = RequestMethodCode.EJB_OBJECT_GET_PRIMARY_KEY; final Method method = FooObject.class.getMethod("getPrimaryKey", new Class[]{}); final Object[] args = new Object[]{}; invoke(requestMethod, method, args); } public void testIsIdentical() throws Exception { final RequestMethodCode requestMethod = RequestMethodCode.EJB_OBJECT_IS_IDENTICAL; final Method method = FooObject.class.getMethod("isIdentical", new Class[]{EJBObject.class}); final Object[] args = new Object[]{null}; invoke(requestMethod, method, args); } public void testEJBObjectRemove() throws Exception { final RequestMethodCode requestMethod = RequestMethodCode.EJB_OBJECT_REMOVE; final Method method = FooObject.class.getMethod("remove", new Class[]{}); final Object[] args = new Object[]{}; invoke(requestMethod, method, args); } private void invoke(final RequestMethodCode requestMethod, final Method method, final Object[] args) throws IOException, ClassNotFoundException { final EJBRequest expected = new EJBRequest(requestMethod, ejb, method, args, null, null); expected.getBody().setAuthentication(new JNDIContext.AuthenticationInfo("realm", "user", new char[]{'p', 'w'})); final EJBRequest actual = new EJBRequest(); final ByteArrayOutputStream baos = new ByteArrayOutputStream(); final ObjectOutputStream out = new ObjectOutputStream(baos); expected.writeExternal(out); out.close(); final ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); final ObjectInputStream in = new ObjectInputStream(bais); actual.readExternal(in); actual.getBody().readExternal(in); final JNDIContext.AuthenticationInfo authentication = actual.getBody().getAuthentication(); assertNotNull(authentication); assertEquals("AuthenticationInfo.Realm", "realm", authentication.getRealm()); assertEquals("AuthenticationInfo.User", "user", authentication.getUser()); assertEquals("RequestType", expected.getRequestType(), actual.getRequestType()); assertEquals("RequestMethod", expected.getRequestMethod(), actual.getRequestMethod()); assertEquals("DeploymentId", expected.getDeploymentId(), actual.getDeploymentId()); assertEquals("DeploymentCode", expected.getDeploymentCode(), actual.getDeploymentCode()); assertEquals("PrimaryKey", expected.getPrimaryKey(), actual.getPrimaryKey()); assertEquals("ClientIdentity", expected.getClientIdentity(), actual.getClientIdentity()); assertEquals("InterfaceClass", expected.getInterfaceClass(), actual.getInterfaceClass()); assertEquals("MethodInstance", expected.getMethodInstance(), actual.getMethodInstance()); final Object[] expectedParams = expected.getMethodParameters(); final Object[] actualParams = actual.getMethodParameters(); assertNotNull("MethodParameters", actualParams); assertEquals("MethodParameters.length", expectedParams.length, actualParams.length); for (int i = 0; i < expectedParams.length; i++) { assertEquals("MethodParameters." + i, expectedParams[i], actualParams[i]); } } }