// Copyright 2011, Google Inc. All Rights Reserved. // // Licensed 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 com.google.api.ads.common.lib.soap; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.mockito.Mockito.when; import com.google.api.ads.common.lib.exception.ServiceException; import com.google.api.ads.common.lib.soap.testing.MockSoapClient; import org.hamcrest.Matchers; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Map; import javax.xml.namespace.QName; import javax.xml.soap.SOAPHeaderElement; /** * Tests for {@link SoapClientHandler}. */ @RunWith(JUnit4.class) public class SoapClientHandlerTest { private SoapClientHandler<Object> soapClientHandler; private MockSoapClient soapClient; @Mock private SoapCall<Object> soapCall; @Rule public ExpectedException thrown = ExpectedException.none(); @SuppressWarnings("unchecked") @Before public void setUp() { MockitoAnnotations.initMocks(this); soapClient = new MockSoapClient(); soapClientHandler = new SoapClientHandlerImpl(); } @Test public void testProcessArgs() throws Exception { Object[] args = new Object[] {new Object[] { new Double(1.0), new String("2"), new Long(3)}, new String("4")}; Object[] processedArgs = soapClientHandler.processSoapArguments(MockSoapClient.class.getMethod("lotsOfArgsCall", Object.class, Object[].class, Object.class, Object.class), args); assertEquals(args[0], processedArgs[0]); assertEquals(args[1], processedArgs[1]); assertNull(processedArgs[2]); assertNull(processedArgs[3]); assertEquals(4, processedArgs.length); } @Test public void testProcessArgs_emptyArgs() throws Exception { Object[] args = new Object[] {}; Object[] processedArgs = soapClientHandler.processSoapArguments(MockSoapClient.class.getMethod("lotsOfArgsCall", Object.class, Object[].class, Object.class, Object.class), args); assertNull(processedArgs[0]); assertNull(processedArgs[1]); assertNull(processedArgs[2]); assertNull(processedArgs[3]); assertEquals(4, processedArgs.length); } @Test public void testProcessArgs_emptyMethod() throws Exception { Object[] args = new Object[] {}; Object[] processedArgs = soapClientHandler.processSoapArguments(MockSoapClient.class.getMethod("emptyCall"), args); assertEquals(0, processedArgs.length); } @Test public void testProcessArgs_null() throws Exception { Object[] args = null; Object[] processedArgs = soapClientHandler.processSoapArguments(MockSoapClient.class.getMethod("emptyCall"), args); assertNull(processedArgs); } @Test public void testProcessArgs_tooMany() throws Exception { Object[] args = new Object[] {new Object[] {new Double(1.0), new String("2"), new Long(3)}, new String("4")}; Object[] processedArgs = soapClientHandler.processSoapArguments(MockSoapClient.class.getMethod("emptyCall"), args); assertEquals(args[0], processedArgs[0]); assertEquals(args[1], processedArgs[1]); assertEquals(2, processedArgs.length); } @Test public void testGetSoapClientMethod() throws Exception { Method method = soapClientHandler.getSoapClientMethod(soapClient, SimilarMockSoapClient.class.getMethod( "identityCall", Object[].class, Object.class, Object.class)); assertEquals(MockSoapClient.class.getMethod("identityCall", Object[].class), method); } @Test public void testGetSoapClientMethod_noMethod() throws Exception { thrown.expect(NoSuchMethodException.class); soapClientHandler.getSoapClientMethod(soapClient, SimilarMockSoapClient.class.getMethod( "noSuchMethod", Object[].class, Object.class, Object.class)); } @Test public void testGetSoapClientMethod_incorrectReturnType() throws Exception { thrown.expect(NoSuchMethodException.class); soapClientHandler.getSoapClientMethod(soapClient, SimilarMockSoapClient.class.getMethod("voidCall", Object[].class)); } @Test public void testCall_identityCall() throws Throwable { Object[] args = new Object[] {new Long(1), "2", new Double(3.0)}; when(soapCall.getSoapClientMethod()).thenReturn( MockSoapClient.class.getMethod("identityCall", Object[].class)); when(soapCall.getSoapClient()).thenReturn(new MockSoapClient()); when(soapCall.getSoapArgs()).thenReturn(new Object[] {args}); Object result = soapClientHandler.invoke(soapCall); assertSame(args, result); } @Test public void testInvoke_voidCall() throws Exception { Object[] args = new Object[] {"2", 1}; when(soapCall.getSoapClientMethod()).thenReturn( MockSoapClient.class.getMethod("voidCall", Object[].class)); when(soapCall.getSoapClient()).thenReturn(new MockSoapClient()); when(soapCall.getSoapArgs()).thenReturn(new Object[] {args}); Object result = soapClientHandler.invoke(soapCall); assertNull(result); } @Test public void testInvoke_emptyCall() throws Exception { Object[] args = null; when(soapCall.getSoapClientMethod()).thenReturn( MockSoapClient.class.getMethod("emptyCall")); when(soapCall.getSoapClient()).thenReturn(new MockSoapClient()); when(soapCall.getSoapArgs()).thenReturn(args); Object result = soapClientHandler.invoke(soapCall); assertNull(result); } @Test public void testInvoke_lotsOfArgs() throws Exception { Object firstArg = new Object(); Object[] args = new Object[] {firstArg, new Object[] {}, new Object(), new Object()}; when(soapCall.getSoapClientMethod()).thenReturn( MockSoapClient.class.getMethod("lotsOfArgsCall", Object.class, Object[].class, Object.class, Object.class)); when(soapCall.getSoapClient()).thenReturn(new MockSoapClient()); when(soapCall.getSoapArgs()).thenReturn(args); Object result = soapClientHandler.invoke(soapCall); assertSame(firstArg, result); } @Test public void testInvoke_overloadedOneParam() throws Exception { Object[] args = new Object[] {1}; when(soapCall.getSoapClientMethod()).thenReturn( MockSoapClient.class.getMethod("testOverloaded", int.class)); when(soapCall.getSoapClient()).thenReturn(new MockSoapClient()); when(soapCall.getSoapArgs()).thenReturn(args); Object result = soapClientHandler.invoke(soapCall); assertSame(1, result); } @Test public void testInvoke_overloadedTwoParams() throws Exception { Object[] args = new Object[] {"moo", "cow"}; when(soapCall.getSoapClientMethod()).thenReturn( MockSoapClient.class.getMethod("testOverloaded", String.class, String.class)); when(soapCall.getSoapClient()).thenReturn(new MockSoapClient()); when(soapCall.getSoapArgs()).thenReturn(args); Object result = soapClientHandler.invoke(soapCall); assertSame("moo", result); } @Test public void testCall_exception() throws Throwable { Object[] args = new Object[] {new Long(1), "2", new Double(3.0)}; MockSoapClient mockSoapClient = new MockSoapClient(); when(soapCall.getSoapClientMethod()).thenReturn( MockSoapClient.class.getMethod("throwException", Object[].class)); when(soapCall.getSoapClient()).thenReturn(mockSoapClient); when(soapCall.getSoapArgs()).thenReturn(new Object[] {args}); thrown.expect(InvocationTargetException.class); thrown.expectCause(Matchers.<Exception>is(MockSoapClient.EXCEPTION)); soapClientHandler.invoke(soapCall); } @Test public void testCall_null() throws Throwable { when(soapCall.getSoapClientMethod()).thenReturn( MockSoapClient.class.getMethod("identityCall", Object[].class)); when(soapCall.getSoapClient()).thenReturn(new MockSoapClient()); when(soapCall.getSoapArgs()).thenReturn(new Object[] {null}); Object result = soapClientHandler.invoke(soapCall); assertNull(result); } /** * Mock class similar to {@link MockSoapClient}. */ private static class SimilarMockSoapClient { /** * Returns the passed in {@code args} as a single {@code Object}. */ @SuppressWarnings("unused") // Used in test. public Object identityCall(Object[] args, Object otherArg, Object otherArg2) { return args; } /** * Returns the passed in {@code args} as a single {@code Object}. */ @SuppressWarnings("unused") // Used in test. public Object voidCall(Object[] args) { return args; } /** * Returns the passed in {@code args} as a single {@code Object}. */ @SuppressWarnings("unused") // Used in test. public Object noSuchMethod(Object[] args, Object otherArg, Object otherArg2) { return args; } } /** * Bare-bones implementation of {@link SoapClientHandler} for testing. * */ private static class SoapClientHandlerImpl extends SoapClientHandler<Object> { @Override public Object createSoapClient(SoapServiceDescriptor soapServiceDescriptor) throws ServiceException { throw new UnsupportedOperationException(); } @Override public SoapCallReturn invokeSoapCall(SoapCall<Object> soapCall) { throw new UnsupportedOperationException(); } @Override public void setEndpointAddress(Object soapClient, String endpointAddress) { throw new UnsupportedOperationException(); } @Override public String getEndpointAddress(Object soapClient) { throw new UnsupportedOperationException(); } @Override public void clearHeaders(Object soapClient) { throw new UnsupportedOperationException(); } @Override public SOAPHeaderElement createSoapHeaderElement(QName qName) { throw new UnsupportedOperationException(); } @Override public void setHeader( Object soapClient, String namespace, String headerName, Object headerValue) throws ServiceException { throw new UnsupportedOperationException(); } @Override public void putAllHttpHeaders(Object soapClient, Map<String, String> headersMap) { throw new UnsupportedOperationException(); } @Override public Object getHeader(Object soapClient, String headerName) { throw new UnsupportedOperationException(); } @Override public void setCompression(Object soapClient, boolean compress) { throw new UnsupportedOperationException(); } @Override public void setRequestTimeout(Object soapClient, int timeout) { throw new UnsupportedOperationException(); } } }