/**
* 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.yoko.bindings.corba.interceptors;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventFactory;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.ws.Holder;
import junit.framework.TestCase;
import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
import org.apache.cxf.binding.BindingFactory;
import org.apache.cxf.binding.BindingFactoryManager;
import org.apache.cxf.databinding.DataBinding;
import org.apache.cxf.databinding.DataReader;
import org.apache.cxf.jaxb.io.EventDataReader;
import org.apache.cxf.message.Exchange;
import org.apache.cxf.message.ExchangeImpl;
import org.apache.cxf.message.Message;
import org.apache.cxf.message.MessageImpl;
import org.apache.cxf.service.Service;
import org.apache.cxf.service.ServiceImpl;
import org.apache.cxf.service.model.BindingInfo;
import org.apache.cxf.service.model.BindingOperationInfo;
import org.apache.cxf.service.model.DescriptionInfo;
import org.apache.cxf.service.model.EndpointInfo;
import org.apache.cxf.service.model.InterfaceInfo;
import org.apache.cxf.service.model.MessageInfo;
import org.apache.cxf.service.model.OperationInfo;
import org.apache.cxf.service.model.ServiceInfo;
import org.apache.cxf.service.model.ServiceModelUtil;
import org.apache.cxf.transport.MessageObserver;
import org.apache.cxf.ws.addressing.EndpointReferenceType;
import org.apache.cxf.wsdl11.WSDLServiceFactory;
import org.omg.CORBA.Any;
import org.omg.CORBA.NVList;
import org.omg.CORBA.ORB;
import org.omg.CORBA.TypeCode;
import org.apache.schemas.yoko.bindings.corba.ArgType;
import org.apache.schemas.yoko.bindings.corba.MemberType;
import org.apache.schemas.yoko.bindings.corba.ModeType;
import org.apache.schemas.yoko.bindings.corba.OperationType;
import org.apache.schemas.yoko.bindings.corba.ParamType;
import org.apache.schemas.yoko.bindings.corba.TypeMappingType;
import org.apache.yoko.bindings.corba.ContextUtils;
import org.apache.yoko.bindings.corba.CorbaBindingFactory;
import org.apache.yoko.bindings.corba.CorbaDestination;
import org.apache.yoko.bindings.corba.CorbaMessage;
import org.apache.yoko.bindings.corba.CorbaStaxObject;
import org.apache.yoko.bindings.corba.CorbaStreamable;
import org.apache.yoko.bindings.corba.CorbaTypeMap;
import org.apache.yoko.bindings.corba.CorbaUtils;
import org.apache.yoko.bindings.corba.TestUtils;
import org.apache.yoko.bindings.corba.types.CorbaHandlerUtils;
import org.apache.yoko.bindings.corba.types.CorbaObjectHandler;
import org.apache.yoko.bindings.corba.types.CorbaPrimitiveHandler;
import org.apache.yoko.bindings.corba.CorbaBinding;
import org.apache.yoko.orb.CORBA.ServerRequest;
import org.apache.yoko.wsdl.CorbaConstants;
import org.easymock.classextension.EasyMock;
import org.easymock.classextension.IMocksControl;
public class CorbaInInterceptorTest extends TestCase {
private static IMocksControl control;
protected Bus bus;
protected EndpointInfo endpointInfo;
protected EndpointReferenceType target;
protected MessageObserver observer;
protected Message inMessage;
BindingFactory factory;
ORB orb;
TestUtils testUtils;
public CorbaInInterceptorTest(String arg0) {
super(arg0);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(CorbaInInterceptorTest.class);
}
protected void setUp() throws Exception {
super.setUp();
control = EasyMock.createNiceControl();
java.util.Properties props = System.getProperties();
props.put("org.omg.CORBA.ORBClass", "org.apache.yoko.orb.CORBA.ORB");
props.put("org.omg.CORBA.ORBSingletonClass", "org.apache.yoko.orb.CORBA.ORBSingleton");
props.put("yoko.orb.id", "Yoko-Server-Binding");
orb = ORB.init(new String[0], props);
testUtils = new TestUtils();
}
public void tearDown() {
if (orb != null) {
try {
orb.destroy();
} catch (Exception ex) {
// Do nothing. Throw an Exception?
}
}
}
public void testHandleMessage() throws Exception {
Method m = CorbaInInterceptor.class.getDeclaredMethod("handleNotRequestMessage",
new Class[] {CorbaMessage.class, CorbaDestination.class});
CorbaInInterceptor inInterceptor = EasyMock.createMock(CorbaInInterceptor.class, new Method[] {m});
CorbaMessage msg = control.createMock(CorbaMessage.class);
CorbaDestination destination = control.createMock(CorbaDestination.class);
BindingInfo bInfo = control.createMock(BindingInfo.class);
ServiceInfo sInfo = control.createMock(ServiceInfo.class);
DescriptionInfo dInfo = control.createMock(DescriptionInfo.class);
EasyMock.expect(msg.getDestination()).andReturn(destination).times(2);
EasyMock.expect(destination.getBindingInfo()).andReturn(bInfo);
EasyMock.expect(bInfo.getService()).andReturn(sInfo);
EasyMock.expect(dInfo.getExtensors(TypeMappingType.class)).andReturn(null);
EasyMock.expect(sInfo.getDescription()).andReturn(dInfo);
inInterceptor.handleNotRequestMessage(msg, destination);
EasyMock.expectLastCall();
control.replay();
inInterceptor.handleMessage(msg);
control.verify();
}
public void testHandleMessage1() throws Exception {
Method m = CorbaInInterceptor.class.getDeclaredMethod("handleRequestMessage",
new Class[] {CorbaMessage.class, CorbaDestination.class});
CorbaInInterceptor inInterceptor = EasyMock.createMock(CorbaInInterceptor.class, new Method[] {m});
CorbaMessage msg = control.createMock(CorbaMessage.class);
CorbaDestination destination = control.createMock(CorbaDestination.class);
BindingInfo bInfo = control.createMock(BindingInfo.class);
ServiceInfo sInfo = control.createMock(ServiceInfo.class);
DescriptionInfo dInfo = control.createMock(DescriptionInfo.class);
EasyMock.expect(msg.getDestination()).andReturn(destination).times(2);
EasyMock.expect(destination.getBindingInfo()).andReturn(bInfo);
EasyMock.expect(bInfo.getService()).andReturn(sInfo);
EasyMock.expect(dInfo.getExtensors(TypeMappingType.class)).andReturn(null);
EasyMock.expect(sInfo.getDescription()).andReturn(dInfo);
EasyMock.expect(msg.containsKey(Message.REQUESTOR_ROLE)).andReturn(true);
inInterceptor.handleRequestMessage(msg, destination);
EasyMock.expectLastCall();
control.replay();
inInterceptor.handleMessage(msg);
control.verify();
}
public void testHandleMessage2() throws Exception {
Method m = CorbaInInterceptor.class.getDeclaredMethod("handleRequestMessage",
new Class[] {CorbaMessage.class, CorbaDestination.class});
CorbaInInterceptor inInterceptor = EasyMock.createMock(CorbaInInterceptor.class, new Method[] {m});
CorbaMessage msg = control.createMock(CorbaMessage.class);
CorbaDestination destination = control.createMock(CorbaDestination.class);
BindingInfo bInfo = control.createMock(BindingInfo.class);
ServiceInfo sInfo = control.createMock(ServiceInfo.class);
DescriptionInfo dInfo = control.createMock(DescriptionInfo.class);
EasyMock.expect(msg.getDestination()).andReturn(null);
Exchange exchange = control.createMock(Exchange.class);
EasyMock.expect(msg.getExchange()).andReturn(exchange);
EasyMock.expect(exchange.getDestination()).andReturn(destination);
EasyMock.expect(destination.getBindingInfo()).andReturn(bInfo);
EasyMock.expect(bInfo.getService()).andReturn(sInfo);
EasyMock.expect(dInfo.getExtensors(TypeMappingType.class)).andReturn(null);
EasyMock.expect(sInfo.getDescription()).andReturn(dInfo);
EasyMock.expect(msg.containsKey(Message.REQUESTOR_ROLE)).andReturn(true);
inInterceptor.handleRequestMessage(msg, destination);
EasyMock.expectLastCall();
control.replay();
inInterceptor.handleMessage(msg);
control.verify();
}
/*public void testHandleNotRequestMessage() throws Exception {
Method m = CorbaInInterceptor.class.getDeclaredMethod("getDataReader",
new Class[] {CorbaMessage.class});
Method m2 = CorbaInInterceptor.class.getDeclaredMethod("prepareArguments",
new Class[] {CorbaMessage.class, CorbaDestination.class,
InterfaceInfo.class, ServiceInfo.class,
OperationType.class, QName.class});
Method m3 = CorbaInInterceptor.class.getDeclaredMethod("addUnmarshalParams",
new Class[] {CorbaMessage.class, CorbaMessage.class,
List.class, InterfaceInfo.class,
OperationType.class, EventDataReader.class});
CorbaInInterceptor inInterceptor = control.createMock(CorbaInInterceptor.class, new Method[] {m, m2, m3});
CorbaDestination destination = control.createMock(CorbaDestination.class);
BindingInfo bInfo = control.createMock(BindingInfo.class);
EasyMock.expect(destination.getBindingInfo()).andReturn(bInfo);
InterfaceInfo info = control.createMock(InterfaceInfo.class);
EasyMock.expect(bInfo.getInterface()).andReturn(info);
CorbaMessage message = control.createMock(CorbaMessage.class);
EventDataReader reader = control.createMock(EventDataReader.class);
inInterceptor.getDataReader(message);
EasyMock.expectLastCall().andReturn(reader);
Exchange exchange = control.createMock(Exchange.class);
EasyMock.expect(message.getExchange()).andReturn(exchange).times(2);
EasyMock.expect(exchange.get(String.class)).andReturn("opName");
Collection<BindingOperationInfo> bopInfo = control.createMock(Collection.class);
Iterator iterator = control.createMock(Iterator.class);
EasyMock.expect(bInfo.getOperations()).andReturn(bopInfo);
EasyMock.expect(bopInfo.iterator()).andReturn(iterator);
ServerRequest request = control.createMock(ServerRequest.class);
EasyMock.expect(exchange.get(org.omg.CORBA.ServerRequest.class)).andReturn(request);
ServiceInfo sInfo = control.createMock(ServiceInfo.class);
EasyMock.expectLastCall();
control.replay();
inInterceptor.handleNotRequestMessage(message, destination, sInfo);
control.verify();
}
public void testHandleRequestMessage() throws Exception {
Method m2 = CorbaInInterceptor.class.getDeclaredMethod("writeReturnValue",
new Class[] {CorbaMessage.class,
CorbaMessage.class,
ArgType.class,
EventDataReader.class});
Method m3 = CorbaInInterceptor.class.getDeclaredMethod("addUnmarshalParams",
new Class[] {CorbaMessage.class, CorbaMessage.class, List.class,
InterfaceInfo.class, OperationType.class, EventDataReader.class});
CorbaInInterceptor inInterceptor =
control.createMock(CorbaInInterceptor.class, new Method[] {m2, m3});
CorbaDestination destination = control.createMock(CorbaDestination.class);
BindingInfo bInfo = control.createMock(BindingInfo.class);
CorbaMessage message = control.createMock(CorbaMessage.class);
EventDataReader reader = control.createMock(EventDataReader.class);
inInterceptor.getDataReader(message);
EasyMock.expectLastCall().andReturn(reader);
EasyMock.expect(destination.getBindingInfo()).andReturn(bInfo);
InterfaceInfo info = control.createMock(InterfaceInfo.class);
EasyMock.expect(bInfo.getInterface()).andReturn(info);
Exchange exchange = control.createMock(Exchange.class);
EasyMock.expect(message.getExchange()).andReturn(exchange);
BindingOperationInfo bopInfo = control.createMock(BindingOperationInfo.class);
OperationType opType = control.createMock(OperationType.class);
EasyMock.expect(exchange.get(BindingOperationInfo.class)).andReturn(bopInfo);
EasyMock.expect(bopInfo.getExtensor(OperationType.class)).andReturn(opType);
EasyMock.expect(exchange.getOutMessage()).andReturn(message);
ServiceInfo sInfo = control.createMock(ServiceInfo.class);
control.replay();
inInterceptor.handleRequestMessage(message, destination, sInfo);
control.verify();
}*/
/*
public void testWriteReturnValue() throws Exception {
CorbaInInterceptor inInterceptor = new CorbaInInterceptor();
CorbaMessage message = control.createMock(CorbaMessage.class);
CorbaStreamable streamable = control.createMock(CorbaStreamable.class);
EventDataReader reader = control.createMock(EventDataReader .class);
ArgType argType = control.createMock(ArgType.class);
BindingOperationInfo bopInfo = control.createMock(BindingOperationInfo.class);
EasyMock.expect(message.getStreamableReturn()).andReturn(streamable);
EasyMock.expect(streamable.getObject()).andReturn(null);
EasyMock.expect(argType.getName()).andReturn(null);
control.replay();
inInterceptor.writeReturnValue(message, message, bopInfo, argType, reader);
control.verify();
}
*/
/*public void testAddUnmarshalParams() throws Exception {
// NEED TO DO
}*/
public void testPrepareArguments() throws Exception {
Method m = CorbaInInterceptor.class.getDeclaredMethod("prepareDIIArgsList",
new Class[] {CorbaMessage.class,
CorbaStreamable[].class,
List.class, List.class});
CorbaInInterceptor inInterceptor = control.createMock(CorbaInInterceptor.class,
new Method[] {m});
CorbaDestination destination = control.createMock(CorbaDestination.class);
EndpointInfo endpointInfo = control.createMock(EndpointInfo.class);
ServiceInfo sInfo = control.createMock(ServiceInfo.class);
BindingInfo bInfo = control.createMock(BindingInfo.class);
InterfaceInfo info = control.createMock(InterfaceInfo.class);
BindingOperationInfo bopInfo = control.createMock(BindingOperationInfo.class);
OperationInfo opInfo = control.createMock(OperationInfo.class);
EasyMock.expect(destination.getBindingInfo()).andReturn(bInfo);
EasyMock.expect(destination.getEndPointInfo()).andReturn(endpointInfo);
QName qname = new QName("" , "Test", "");
EasyMock.expect(bInfo.getOperation(qname)).andReturn(bopInfo);
EasyMock.expect(bopInfo.getOperationInfo()).andReturn(opInfo);
CorbaMessage message = control.createMock(CorbaMessage.class);
Exchange exchange = control.createMock(Exchange.class);
EndpointReferenceType etype = control.createMock(EndpointReferenceType.class);
MessageInfo mInfo = control.createMock(MessageInfo.class);
EasyMock.expect(message.getExchange()).andReturn(exchange);
EasyMock.expect(destination.getAddress()).andReturn(etype);
EasyMock.expect(opInfo.getInput()).andReturn(mInfo);
exchange.setInMessage(message);
EasyMock.expectLastCall();
OperationType opType = control.createMock(OperationType.class);
List<ParamType> paramTypes = control.createMock(List.class);
EasyMock.expect(opType.getParam()).andReturn(paramTypes);
EasyMock.expect(paramTypes.size()).andReturn(0);
control.replay();
inInterceptor.prepareArguments(message, destination, info, opType, qname);
control.verify();
}
public void testprepareDIIArgsList() throws Exception {
CorbaInInterceptor inInterceptor = new CorbaInInterceptor();
CorbaStaxObject corbaStaxObject = new CorbaStaxObject();
Message msg = new MessageImpl();
CorbaMessage message = new CorbaMessage(msg);
List<CorbaTypeMap> typeMaps = new ArrayList<CorbaTypeMap>();
CorbaDestination destination = testUtils.getExceptionTypesTestDestination();
ServiceInfo service = destination.getBindingInfo().getService();
List<TypeMappingType> corbaTypes = service.getDescription().getExtensors(TypeMappingType.class);
if (corbaTypes != null) {
CorbaUtils.createCorbaTypeMap(typeMaps, corbaTypes);
corbaStaxObject.setTypeMaps(typeMaps);
}
QName name = new QName("http://schemas.apache.org/idl/except", "review_data", "");
BindingInfo bInfo = destination.getBindingInfo();
BindingOperationInfo bopInfo = bInfo.getOperation(name);
OperationType opType = bopInfo.getExtensor(OperationType.class);
List<ParamType> paramTypes = opType.getParam();
inInterceptor.setOrb(orb);
CorbaStreamable[] streamables = new CorbaStreamable[1];
NVList nvlist = inInterceptor.prepareDIIArgsList(message, streamables, paramTypes, typeMaps);
assertNotNull("NVList should not be null", nvlist != null);
assertEquals("There should be one item in the list", nvlist.count(), 1);
assertEquals("Item name should be data", nvlist.item(0).name(), "data");
assertEquals("Item flags should be 1", nvlist.item(0).flags(), 1);
}
public void testprepareArgs() throws Exception {
CorbaInInterceptor inInterceptor = new CorbaInInterceptor();
Message msg = new MessageImpl();
CorbaMessage message = new CorbaMessage(msg);
List<ParamType> paramTypes = new ArrayList<ParamType>(1);
ParamType param = new ParamType();
QName type = new QName("", "structure", "");
param.setName("param1");
param.setIdltype(type);
paramTypes.add(param);
inInterceptor.prepareArgs(message, paramTypes);
List<Object> args = message.getContent(List.class);
assertNotNull("args should exist and be empty", args != null);
}
}