You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by jl...@apache.org on 2006/11/16 11:43:35 UTC
svn commit: r475675 - in /incubator/cxf/trunk:
api/src/main/java/org/apache/cxf/endpoint/
api/src/main/java/org/apache/cxf/interceptor/
api/src/main/java/org/apache/cxf/phase/
api/src/test/java/org/apache/cxf/phase/
rt/core/src/main/java/org/apache/cxf...
Author: jliu
Date: Thu Nov 16 02:43:34 2006
New Revision: 475675
URL: http://svn.apache.org/viewvc?view=rev&rev=475675
Log:
CXF-195.
If logical handler returns false, for a request-response MEP, the message direction is reversed and the request message becomes a response message.
Modified:
incubator/cxf/trunk/api/src/main/java/org/apache/cxf/endpoint/Client.java
incubator/cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/InterceptorChain.java
incubator/cxf/trunk/api/src/main/java/org/apache/cxf/phase/PhaseInterceptorChain.java
incubator/cxf/trunk/api/src/test/java/org/apache/cxf/phase/PhaseInterceptorChainTest.java
incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/endpoint/ClientImpl.java
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/AbstractJAXWSHandlerInterceptor.java
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/HandlerChainInvoker.java
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/LogicalHandlerInterceptor.java
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/LogicalMessageImpl.java
incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/LogicalHandlerInterceptorTest.java
incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/HandlerClientServerTest.java
Modified: incubator/cxf/trunk/api/src/main/java/org/apache/cxf/endpoint/Client.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/api/src/main/java/org/apache/cxf/endpoint/Client.java?view=diff&rev=475675&r1=475674&r2=475675
==============================================================================
--- incubator/cxf/trunk/api/src/main/java/org/apache/cxf/endpoint/Client.java (original)
+++ incubator/cxf/trunk/api/src/main/java/org/apache/cxf/endpoint/Client.java Thu Nov 16 02:43:34 2006
@@ -23,8 +23,9 @@
import org.apache.cxf.interceptor.InterceptorProvider;
import org.apache.cxf.service.model.BindingOperationInfo;
+import org.apache.cxf.transport.MessageObserver;
-public interface Client extends InterceptorProvider {
+public interface Client extends InterceptorProvider, MessageObserver {
String REQUEST_CONTEXT = "RequestContext";
String RESPONSE_CONTEXT = "ResponseContext";
Modified: incubator/cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/InterceptorChain.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/InterceptorChain.java?view=diff&rev=475675&r1=475674&r2=475675
==============================================================================
--- incubator/cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/InterceptorChain.java (original)
+++ incubator/cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/InterceptorChain.java Thu Nov 16 02:43:34 2006
@@ -35,14 +35,18 @@
SUBCHAIN_COMPLETE
};
+ String STARTING_AFTER_INTERCEPTOR_ID = "starting_after_interceptor_id";
+
void add(Interceptor i);
void remove(Interceptor i);
boolean doIntercept(Message message);
- boolean doInterceptInSubChain(Message message);
-
+ boolean doIntercept(Message message, String startingAfterInterceptorID);
+
+ boolean doInterceptInSubChain(Message message);
+
void pause();
void resume();
Modified: incubator/cxf/trunk/api/src/main/java/org/apache/cxf/phase/PhaseInterceptorChain.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/api/src/main/java/org/apache/cxf/phase/PhaseInterceptorChain.java?view=diff&rev=475675&r1=475674&r2=475675
==============================================================================
--- incubator/cxf/trunk/api/src/main/java/org/apache/cxf/phase/PhaseInterceptorChain.java (original)
+++ incubator/cxf/trunk/api/src/main/java/org/apache/cxf/phase/PhaseInterceptorChain.java Thu Nov 16 02:43:34 2006
@@ -182,6 +182,24 @@
}
/**
+ * Invokes each phase's handler in turn. Start after the Interceptor
+ * specified
+ *
+ * @param context
+ * @throws Exception
+ */
+ @SuppressWarnings("unchecked")
+ public boolean doIntercept(Message message, String startingAfterInterceptorID) {
+ while (state == State.EXECUTING && iterator.hasNext()) {
+ PhaseInterceptor currentInterceptor = (PhaseInterceptor)iterator.next();
+ if (currentInterceptor.getId().equals(startingAfterInterceptorID)) {
+ break;
+ }
+ }
+ return doIntercept(message);
+ }
+
+ /**
* Invokes following inteceptors in a sub chain until the last chain in the
* sub chain calls finishSubChain, which makes the flow continues in the
* main chain.
Modified: incubator/cxf/trunk/api/src/test/java/org/apache/cxf/phase/PhaseInterceptorChainTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/api/src/test/java/org/apache/cxf/phase/PhaseInterceptorChainTest.java?view=diff&rev=475675&r1=475674&r2=475675
==============================================================================
--- incubator/cxf/trunk/api/src/test/java/org/apache/cxf/phase/PhaseInterceptorChainTest.java (original)
+++ incubator/cxf/trunk/api/src/test/java/org/apache/cxf/phase/PhaseInterceptorChainTest.java Thu Nov 16 02:43:34 2006
@@ -196,7 +196,7 @@
assertEquals(0, p1.faultInvoked);
}
- public void testWrappedInvokation() throws Exception {
+ public void testWrappedInvocation() throws Exception {
CountingPhaseInterceptor p1 = new CountingPhaseInterceptor("phase1",
"p1");
WrapperingPhaseInterceptor p2 = new WrapperingPhaseInterceptor(
@@ -217,7 +217,7 @@
assertEquals(1, p3.invoked);
}
- public void testSubChainInvokation() throws Exception {
+ public void testSubChainInvocation() throws Exception {
SubChainPhaseInterceptor p1 = new SubChainPhaseInterceptor("phase1",
"p1");
EndOfSubChainPhaseInterceptor p2 = new EndOfSubChainPhaseInterceptor(
@@ -238,7 +238,7 @@
assertEquals(1, p3.invoked);
}
- public void testSubChainInvokationWithoutEnteringSubChain() throws Exception {
+ public void testSubChainInvocationWithoutEnteringSubChain() throws Exception {
CountingPhaseInterceptor p1 = new CountingPhaseInterceptor("phase1",
"p1");
EndOfSubChainPhaseInterceptor p2 = new EndOfSubChainPhaseInterceptor(
@@ -259,6 +259,27 @@
assertEquals(1, p3.invoked);
}
+ public void testChainInvocationStartFromSpecifiedInterceptor() throws Exception {
+ CountingPhaseInterceptor p1 = new CountingPhaseInterceptor("phase1",
+ "p1");
+ EndOfSubChainPhaseInterceptor p2 = new EndOfSubChainPhaseInterceptor(
+ "phase2", "p2");
+ CountingPhaseInterceptor p3 = new CountingPhaseInterceptor("phase3",
+ "p3");
+
+ message.getInterceptorChain();
+ EasyMock.expectLastCall().andReturn(chain).anyTimes();
+
+ control.replay();
+ chain.add(p1);
+ chain.add(p2);
+ chain.add(p3);
+ chain.doIntercept(message, p2.getId());
+ assertEquals(0, p1.invoked);
+ assertEquals(0, p2.invoked);
+ assertEquals(1, p3.invoked);
+ }
+
AbstractPhaseInterceptor setUpPhaseInterceptor(String phase, String id) {
return setUpPhaseInterceptor(phase, id, null);
}
Modified: incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/endpoint/ClientImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/endpoint/ClientImpl.java?view=diff&rev=475675&r1=475674&r2=475675
==============================================================================
--- incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/endpoint/ClientImpl.java (original)
+++ incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/endpoint/ClientImpl.java Thu Nov 16 02:43:34 2006
@@ -56,10 +56,9 @@
import org.apache.cxf.transport.MessageObserver;
public class ClientImpl extends AbstractBasicInterceptorProvider implements Client, MessageObserver {
+ public static final String FINISHED = "exchange.finished";
private static final Logger LOG = LogUtils.getL7dLogger(ClientImpl.class);
-
- private static final String FINISHED = "exchange.finished";
private Bus bus;
private Endpoint endpoint;
@@ -124,6 +123,9 @@
exchange.setConduit(conduit);
conduit.setMessageObserver(this);
+ //set clientImpl to exchange. used by jax-ws handlers
+ exchange.put(Client.class, this);
+
// execute chain
chain.doIntercept(message);
@@ -241,7 +243,13 @@
// execute chain
try {
- chain.doIntercept(message);
+ String startingInterceptorID = (String) message.get(
+ PhaseInterceptorChain.STARTING_AFTER_INTERCEPTOR_ID);
+ if (startingInterceptorID != null) {
+ chain.doIntercept(message, startingInterceptorID);
+ } else {
+ chain.doIntercept(message);
+ }
} finally {
synchronized (message.getExchange()) {
if (!isPartialResponse(message)) {
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/AbstractJAXWSHandlerInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/AbstractJAXWSHandlerInterceptor.java?view=diff&rev=475675&r1=475674&r2=475675
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/AbstractJAXWSHandlerInterceptor.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/AbstractJAXWSHandlerInterceptor.java Thu Nov 16 02:43:34 2006
@@ -41,7 +41,7 @@
|| message == message.getExchange().getOutFaultMessage();
}
- boolean isRequestor(T message) {
+ protected boolean isRequestor(T message) {
Boolean b = (Boolean)message.get(Message.REQUESTOR_ROLE);
return b == null ? true : b.booleanValue();
}
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/HandlerChainInvoker.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/HandlerChainInvoker.java?view=diff&rev=475675&r1=475674&r2=475675
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/HandlerChainInvoker.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/HandlerChainInvoker.java Thu Nov 16 02:43:34 2006
@@ -245,6 +245,8 @@
// and control all of the processing here.
changeMessageDirection(ctx);
handlerProcessingAborted = true;
+
+ //TODO: reverse chain, call handlerMessage or close
}
return continueProcessing;
}
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/LogicalHandlerInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/LogicalHandlerInterceptor.java?view=diff&rev=475675&r1=475674&r2=475675
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/LogicalHandlerInterceptor.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/LogicalHandlerInterceptor.java Thu Nov 16 02:43:34 2006
@@ -19,39 +19,76 @@
package org.apache.cxf.jaxws.handler;
+import java.util.List;
+
+import javax.xml.transform.Source;
import javax.xml.ws.Binding;
+import org.apache.cxf.endpoint.Client;
import org.apache.cxf.message.Message;
+import org.apache.cxf.message.MessageImpl;
import org.apache.cxf.phase.Phase;
+import org.apache.cxf.phase.PhaseInterceptorChain;
public class LogicalHandlerInterceptor<T extends Message> extends AbstractJAXWSHandlerInterceptor<T> {
-
+
public LogicalHandlerInterceptor(Binding binding) {
super(binding);
setPhase(Phase.USER_LOGICAL);
}
-
+
public void handleMessage(T message) {
HandlerChainInvoker invoker = getInvoker(message);
if (!invoker.getLogicalHandlers().isEmpty()) {
LogicalMessageContextImpl lctx = new LogicalMessageContextImpl(message);
if (!invoker.invokeLogicalHandlers(isRequestor(message), lctx)) {
- // need to abort - not sure how to do this:
- // we have access to the interceptor chain via the message but
- // there is no support for terminating the chain yet
+ //TODO: reverseHandlers();
+
+ message.getInterceptorChain().abort();
+ Message responseMsg = new MessageImpl();
+ message.getExchange().setInMessage(responseMsg);
+
+ /**
+ * 1. message.setHeaders()
+ * 2. message.setAttachments()
+ * 3. set XMLSTreamReader to element inside Body
+ * OR
+ * message.setContent(Element.class, elementInBody);
+ * 4. invoke Client.onMessage() starting after this.getID()
+ */
+ Client client = (Client)message.getExchange().get(Client.class);
+ responseMsg.put(PhaseInterceptorChain.STARTING_AFTER_INTERCEPTOR_ID, this.getId());
+ if (client != null) {
+ //message.getExchange().put(ClientImpl.FINISHED, Boolean.TRUE);
+ //lctx.getMessage().getPayload();
+ Source inSource = message.getContent(Source.class);
+ if (inSource != null) {
+ responseMsg.setContent(Source.class, inSource);
+ }
+ List inObj = message.getContent(List.class);
+ if (inObj != null) {
+ responseMsg.setContent(List.class, inObj);
+ }
+ client.onMessage(responseMsg);
+ } else if (!message.getExchange().isOneWay()) {
+ //for the server side inbound
+
+ //InterceptorChain chain = OutgoingChainSetupInterceptor.getOutInterceptorChain(
+ // message.getExchange());
+ //chain.doIntercept(message);
+ }
}
}
}
-
+
public void handleFault(T message) {
// TODO
}
-
-
+
public void onCompletion(T message) {
if (isRequestor(message) && (isOneway(message) || !isOutbound(message))) {
getInvoker(message).mepComplete(message);
}
}
-
+
}
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/LogicalMessageImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/LogicalMessageImpl.java?view=diff&rev=475675&r1=475674&r2=475675
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/LogicalMessageImpl.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/LogicalMessageImpl.java Thu Nov 16 02:43:34 2006
@@ -20,7 +20,7 @@
package org.apache.cxf.jaxws.handler;
-import java.util.Arrays;
+import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBContext;
@@ -51,7 +51,9 @@
public void setPayload(Object arg0, JAXBContext arg1) {
// TODO - what to do with JAXB context?
- msgContext.getWrappedMessage().setContent(List.class, Arrays.asList(arg0));
+ List<Object> l = new ArrayList<Object>();
+ l.add(arg0);
+ msgContext.getWrappedMessage().setContent(List.class, l);
}
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/LogicalHandlerInterceptorTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/LogicalHandlerInterceptorTest.java?view=diff&rev=475675&r1=475674&r2=475675
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/LogicalHandlerInterceptorTest.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/LogicalHandlerInterceptorTest.java Thu Nov 16 02:43:34 2006
@@ -23,14 +23,21 @@
import java.util.List;
import javax.xml.ws.Binding;
+import javax.xml.ws.LogicalMessage;
+import javax.xml.ws.handler.Handler;
import javax.xml.ws.handler.LogicalHandler;
import javax.xml.ws.handler.LogicalMessageContext;
import javax.xml.ws.handler.MessageContext;
import junit.framework.TestCase;
+import org.apache.cxf.endpoint.Client;
+import org.apache.cxf.interceptor.InterceptorChain;
import org.apache.cxf.message.Exchange;
import org.apache.cxf.message.Message;
+import org.apache.cxf.message.MessageImpl;
+import org.apache.handlers.types.AddNumbersResponse;
+import org.easymock.EasyMock;
import org.easymock.classextension.IMocksControl;
import static org.easymock.EasyMock.eq;
@@ -40,33 +47,34 @@
import static org.easymock.classextension.EasyMock.createNiceControl;
public class LogicalHandlerInterceptorTest extends TestCase {
-
+
private IMocksControl control;
private Binding binding;
private HandlerChainInvoker invoker;
private Message message;
private Exchange exchange;
-
+
public void setUp() {
control = createNiceControl();
binding = control.createMock(Binding.class);
invoker = control.createMock(HandlerChainInvoker.class);
message = control.createMock(Message.class);
- exchange = control.createMock(Exchange.class);
+ exchange = control.createMock(Exchange.class);
}
-
+
public void tearDown() {
- control.verify();
}
-
+
public void testInterceptSuccess() {
List<LogicalHandler> list = new ArrayList<LogicalHandler>();
list.add(new LogicalHandler() {
public void close(MessageContext arg0) {
}
+
public boolean handleFault(MessageContext arg0) {
return true;
}
+
public boolean handleMessage(MessageContext arg0) {
return true;
}
@@ -75,37 +83,14 @@
expect(message.getExchange()).andReturn(exchange).anyTimes();
expect(exchange.get(HandlerChainInvoker.class)).andReturn(invoker);
expect(exchange.getOutMessage()).andReturn(message);
- expect(invoker.invokeLogicalHandlers(eq(true),
- isA(LogicalMessageContext.class))).andReturn(true);
+ expect(invoker.invokeLogicalHandlers(eq(true), isA(LogicalMessageContext.class))).andReturn(true);
control.replay();
LogicalHandlerInterceptor<Message> li = new LogicalHandlerInterceptor<Message>(binding);
assertEquals("unexpected phase", "user-logical", li.getPhase());
li.handleMessage(message);
+ control.verify();
}
-
- public void testInterceptFailure() {
- List<LogicalHandler> list = new ArrayList<LogicalHandler>();
- list.add(new LogicalHandler() {
- public void close(MessageContext arg0) {
- }
- public boolean handleFault(MessageContext arg0) {
- return true;
- }
- public boolean handleMessage(MessageContext arg0) {
- return true;
- }
- });
- expect(invoker.getLogicalHandlers()).andReturn(list);
- expect(message.getExchange()).andReturn(exchange).anyTimes();
- expect(exchange.get(HandlerChainInvoker.class)).andReturn(invoker);
- expect(exchange.getOutMessage()).andReturn(message);
- expect(invoker.invokeLogicalHandlers(eq(true),
- isA(LogicalMessageContext.class))).andReturn(false);
- control.replay();
- LogicalHandlerInterceptor<Message> li = new LogicalHandlerInterceptor<Message>(binding);
- li.handleMessage(message);
- }
-
+
public void testOnCompletion() {
expect(message.getExchange()).andReturn(exchange).anyTimes();
expect(exchange.get(HandlerChainInvoker.class)).andReturn(invoker);
@@ -115,5 +100,51 @@
control.replay();
LogicalHandlerInterceptor<Message> li = new LogicalHandlerInterceptor<Message>(binding);
li.onCompletion(message);
+ control.verify();
+ }
+
+ //JAX-WS spec: If handler returns false, for a request-response MEP, if the message
+ //direction is reversed during processing of a request message then the message
+ //becomes a response message.
+ public void testReturnFalseClientSide() throws Exception {
+ List<Handler> list = new ArrayList<Handler>();
+ list.add(new LogicalHandler<LogicalMessageContext>() {
+ public void close(MessageContext arg0) {
+ }
+
+ public boolean handleFault(LogicalMessageContext messageContext) {
+ return true;
+ }
+
+ public boolean handleMessage(LogicalMessageContext messageContext) {
+ LogicalMessage msg = messageContext.getMessage();
+ AddNumbersResponse resp = new AddNumbersResponse();
+ resp.setReturn(11);
+ msg.setPayload(resp, null);
+ return false;
+ }
+ });
+ HandlerChainInvoker invoker1 = new HandlerChainInvoker(list);
+
+ IMocksControl control1 = createNiceControl();
+ Binding binding1 = control1.createMock(Binding.class);
+ Exchange exchange1 = control1.createMock(Exchange.class);
+ expect(exchange1.get(HandlerChainInvoker.class)).andReturn(invoker1).anyTimes();
+ Message outMessage = new MessageImpl();
+ outMessage.setExchange(exchange1);
+ InterceptorChain chain = control1.createMock(InterceptorChain.class);
+ outMessage.setInterceptorChain(chain);
+ chain.abort();
+ EasyMock.expectLastCall();
+ Client client = control1.createMock(Client.class);
+ expect(exchange1.get(Client.class)).andReturn(client).anyTimes();
+ client.onMessage(isA(Message.class));
+ EasyMock.expectLastCall();
+
+ control1.replay();
+
+ LogicalHandlerInterceptor<Message> li = new LogicalHandlerInterceptor<Message>(binding1);
+ li.handleMessage(outMessage);
+ control1.verify();
}
}
Modified: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/HandlerClientServerTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/HandlerClientServerTest.java?view=diff&rev=475675&r1=475674&r2=475675
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/HandlerClientServerTest.java (original)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/HandlerClientServerTest.java Thu Nov 16 02:43:34 2006
@@ -65,9 +65,8 @@
int result = port.addNumbers(10, 20);
assertEquals(200, result);
- //int result1 = port.addNumbers(5, 6);
- //TODO: This test can not pass due to jira cxf-195
- //assertEquals(11, result1);
+ int result1 = port.addNumbers(5, 6);
+ assertEquals(11, result1);
}
}