/* * Copyright 2001-2004 The Apache Software Foundation. * * 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 samples.echo ; import org.apache.axis.AxisFault; import org.apache.axis.client.Stub; import org.apache.axis.types.HexBinary; import org.apache.axis.types.NegativeInteger; import org.apache.axis.types.NonNegativeInteger; import org.apache.axis.types.NonPositiveInteger; import org.apache.axis.types.NormalizedString; import org.apache.axis.types.PositiveInteger; import org.apache.axis.types.Token; import org.apache.axis.types.UnsignedByte; import org.apache.axis.types.UnsignedInt; import org.apache.axis.types.UnsignedLong; import org.apache.axis.types.UnsignedShort; import org.apache.axis.utils.JavaUtils; import org.apache.axis.utils.Options; import javax.xml.rpc.holders.FloatHolder; import javax.xml.rpc.holders.IntHolder; import javax.xml.rpc.holders.StringHolder; import java.io.PrintWriter; import java.io.StringWriter; import java.lang.reflect.Array; import java.math.BigDecimal; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TimeZone; /** * Test Client for the echo interop service. See the main entrypoint * for more details on usage. * * @author Sam Ruby <rubys@us.ibm.com> * Modified to use WSDL2Java generated stubs and artifacts by * @author Rich Scheuerle <scheu@us.ibm.com> */ public abstract class TestClient { private static InteropTestPortType binding = null; /** * When testMode is true, we throw exceptions up to the caller * instead of recording them and continuing. */ private boolean testMode = false; public TestClient() { } /** * Constructor which sets testMode */ public TestClient(boolean testMode) { this.testMode = testMode; } /** * Determine if two objects are equal. Handles nulls and recursively * verifies arrays are equal. Accepts dates within a tolerance of * 999 milliseconds. */ protected boolean equals(Object obj1, Object obj2) { if (obj1 == null || obj2 == null) return (obj1 == obj2); if (obj1.equals(obj2)) return true; // For comparison purposes, get the array of bytes representing // the HexBinary object. if (obj1 instanceof HexBinary) { obj1 = ((HexBinary) obj1).getBytes(); } if (obj2 instanceof HexBinary) { obj2 = ((HexBinary) obj2).getBytes(); } if (obj1 instanceof Calendar && obj2 instanceof Calendar) { if (Math.abs(((Calendar)obj1).getTime().getTime() - ((Calendar)obj2).getTime().getTime()) < 1000) { return true; } } if ((obj1 instanceof Map) && (obj2 instanceof Map)) { Map map1 = (Map)obj1; Map map2 = (Map)obj2; Set keys1 = map1.keySet(); Set keys2 = map2.keySet(); if (!(keys1.equals(keys2))) return false; // Check map1 is a subset of map2. Iterator i = keys1.iterator(); while (i.hasNext()) { Object key = i.next(); if (!equals(map1.get(key), map2.get(key))) return false; } // Check map2 is a subset of map1. Iterator j = keys2.iterator(); while (j.hasNext()) { Object key = j.next(); if (!equals(map1.get(key), map2.get(key))) return false; } return true; } if (obj1 instanceof List) obj1 = JavaUtils.convert(obj1, Object[].class); if (obj2 instanceof List) obj2 = JavaUtils.convert(obj2, Object[].class); if (!obj2.getClass().isArray()) return false; if (!obj1.getClass().isArray()) return false; if (Array.getLength(obj1) != Array.getLength(obj2)) return false; for (int i=0; i<Array.getLength(obj1); i++) if (!equals(Array.get(obj1,i),Array.get(obj2,i))) return false; return true; } /** * Set up the call object. */ public void setURL(String url) throws AxisFault { try { binding = new InteropTestServiceLocator(). getecho(new java.net.URL(url)); // safety first ((InteropTestSoapBindingStub)binding).setTimeout(60000); ((InteropTestSoapBindingStub)binding).setMaintainSession(true); } catch (Exception exp) { throw AxisFault.makeFault(exp); } } void setUser(String user) { ((Stub)binding).setUsername(user); } void setPassword(String password) { ((Stub)binding).setPassword(password); } /** * Execute all tests. */ public void executeAll() throws Exception { execute2A(); execute2B(); executeAxisXSD(); } /** * Test custom mapping of xsd types not standardized: xsd:token and * xsd:normalizedString. */ public void executeAxisXSD() throws Exception { Object output = null; // Test xsd:token Token tInput = new Token("abccdefg"); try { output = binding.echoToken(tInput); verify("echoToken", tInput, output); } catch (Exception e) { if (!testMode) { verify("echoToken", tInput, e); } else { throw e; } } // Test xsd:normalizedString NormalizedString nsInput = new NormalizedString("abccdefg"); try { output = binding.echoNormalizedString(nsInput); verify("echoNormalizedString", nsInput, output); } catch (Exception e) { if (!testMode) { verify("echoNormalizedString", nsInput, e); } else { throw e; } } // Test xsd:unsignedLong UnsignedLong ulInput = new UnsignedLong(100); try { output = binding.echoUnsignedLong(ulInput); verify("echoUnsignedLong", ulInput, output); } catch (Exception e) { if (!testMode) { verify("echoUnsignedLong", ulInput, e); } else { throw e; } } // Test xsd:unsignedInt UnsignedInt uiInput = new UnsignedInt(101); try { output = binding.echoUnsignedInt(uiInput); verify("echoUnsignedInt", uiInput, output); } catch (Exception e) { if (!testMode) { verify("echoUnsignedInt", uiInput, e); } else { throw e; } } // Test xsd:unsignedShort UnsignedShort usInput = new UnsignedShort(102); try { output = binding.echoUnsignedShort(usInput); verify("echoUnsignedShort", usInput, output); } catch (Exception e) { if (!testMode) { verify("echoUnsignedShort", usInput, e); } else { throw e; } } // Test xsd:unsignedByte UnsignedByte ubInput = new UnsignedByte(103); try { output = binding.echoUnsignedByte(ubInput); verify("echoUnsignedByte", ubInput, output); } catch (Exception e) { if (!testMode) { verify("echoUnsignedByte", ubInput, e); } else { throw e; } } // Test xsd:nonNegativeInteger NonNegativeInteger nniInput = new NonNegativeInteger("12345678901234567890"); try { output = binding.echoNonNegativeInteger(nniInput); verify("echoNonNegativeInteger", nniInput, output); } catch (Exception e) { if (!testMode) { verify("echoNonNegativeInteger", nniInput, e); } else { throw e; } } // Test xsd:positiveInteger PositiveInteger piInput = new PositiveInteger("12345678901234567890"); try { output = binding.echoPositiveInteger(piInput); verify("echoPositiveInteger", piInput, output); } catch (Exception e) { if (!testMode) { verify("echoPositiveInteger", piInput, e); } else { throw e; } } // Test xsd:nonPositiveInteger NonPositiveInteger npiInput = new NonPositiveInteger("-12345678901234567890"); try { output = binding.echoNonPositiveInteger(npiInput); verify("echoNonPositiveInteger", npiInput, output); } catch (Exception e) { if (!testMode) { verify("echoNonPositiveInteger", npiInput, e); } else { throw e; } } // Test xsd:negativeInteger NegativeInteger niInput = new NegativeInteger("-12345678901234567890"); try { output = binding.echoNegativeInteger(niInput); verify("echoNegativeInteger", niInput, output); } catch (Exception e) { if (!testMode) { verify("echoNegativeInteger", niInput, e); } else { throw e; } } } /** * Execute the 2A tests */ public void execute2A() throws Exception { // execute the tests Object output = null; { String input = "abccdefg"; try { output = binding.echoString(input); verify("echoString", input, output); } catch (Exception e) { if (!testMode) { verify("echoString", input, e); } else { throw e; } } } { String[] input = new String[] {"abc", "def"}; try { output = binding.echoStringArray(input); verify("echoStringArray", input, output); } catch (Exception e) { if (!testMode) { verify("echoStringArray", input, e); } else { throw e; } } } { Integer input = new Integer(42); try { output = new Integer( binding.echoInteger(input.intValue())); verify("echoInteger", input, output); } catch (Exception e) { if (!testMode) { verify("echoInteger", input, e); } else { throw e; } } } { int[] input = new int[] {42}; try { output = binding.echoIntegerArray(input); verify("echoIntegerArray", input, output); } catch (Exception e) { if (!testMode) { verify("echoIntegerArray", input, e); } else { throw e; } } } { Float input = new Float(3.7F); try { output = new Float(binding.echoFloat(input.floatValue())); verify("echoFloat", input, output); } catch (Exception e) { if (!testMode) { verify("echoFloat", input, e); } else { throw e; } } } { float[] input = new float[] {3.7F, 7F}; try { output = binding.echoFloatArray(input); verify("echoFloatArray", input, output); } catch (Exception e) { if (!testMode) { verify("echoFloatArray", input, e); } else { throw e; } } } { SOAPStruct input = new SOAPStruct(); input.setVarInt(5); input.setVarString("Hello"); input.setVarFloat(103F); try { output = binding.echoStruct(input); verify("echoStruct", input, output); } catch (Exception e) { if (!testMode) { verify("echoStruct", input, e); } else { throw e; } } } { SOAPStruct[] input = new SOAPStruct[] { new SOAPStruct(), new SOAPStruct(), new SOAPStruct()}; input[0].setVarInt(1); input[0].setVarString("one"); input[0].setVarFloat(1.1F); input[1].setVarInt(2); input[1].setVarString("two"); input[1].setVarFloat(2.2F); input[2].setVarInt(3); input[2].setVarString("three"); input[2].setVarFloat(3.3F); try { output = binding.echoStructArray(input); verify("echoStructArray", input, output); } catch (Exception e) { if (!testMode) { verify("echoStructArray", input, e); } else { throw e; } } } { try { binding.echoVoid(); verify("echoVoid", null, null); } catch (Exception e) { if (!testMode) { verify("echoVoid", null, e); } else { throw e; } } } { byte[] input = "Base64".getBytes(); try { output = binding.echoBase64(input); verify("echoBase64", input, output); } catch (Exception e) { if (!testMode) { verify("echoBase64", input, e); } else { throw e; } } } { HexBinary input = new HexBinary("3344"); try { output = binding.echoHexBinary(input.getBytes()); verify("echoHexBinary", input, output); } catch (Exception e) { if (!testMode) { verify("echoHexBinary", input, e); } else { throw e; } } } Calendar inputDate = Calendar.getInstance(); inputDate.setTimeZone(TimeZone.getTimeZone("GMT")); inputDate.setTime(new Date()); { try { output = binding.echoDate(inputDate); verify("echoDate", inputDate, output); } catch (Exception e) { if (!testMode) { verify("echoDate", inputDate, e); } else { throw e; } } } { BigDecimal input = new BigDecimal("3.14159"); try { output = binding.echoDecimal(input); verify("echoDecimal", input, output); } catch (Exception e) { if (!testMode) { verify("echoDecimal", input, e); } else { throw e; } } } { Boolean input = Boolean.TRUE; try { output = new Boolean( binding.echoBoolean(input.booleanValue())); verify("echoBoolean", input, output); } catch (Exception e) { if (!testMode) { verify("echoBoolean", input, e); } else { throw e; } } } HashMap map = new HashMap(); map.put(new Integer(5), "String Value"); map.put("String Key", inputDate); { HashMap input = map; try { output = binding.echoMap(input); verify("echoMap", input, output); } catch (Exception e) { if (!testMode) { verify("echoMap", input, e); } else { throw e; } } } HashMap map2 = new HashMap(); map2.put("this is the second map", new Boolean(true)); map2.put("test", new Float(411)); { HashMap[] input = new HashMap [] {map, map2 }; try { output = binding.echoMapArray(input); verify("echoMapArray", input, output); } catch (Exception e) { if (!testMode) { verify("echoMapArray", input, e); } else { throw e; } } } } /** * Execute the 2B tests */ public void execute2B() throws Exception { // execute the tests Object output = null; { SOAPStruct input = new SOAPStruct(); input.setVarInt(5); input.setVarString("Hello"); input.setVarFloat(103F); try { StringHolder outputString = new StringHolder(); IntHolder outputInteger = new IntHolder(); FloatHolder outputFloat = new FloatHolder(); binding.echoStructAsSimpleTypes(input, outputString, outputInteger, outputFloat); output = new SOAPStruct(); ((SOAPStruct)output).setVarInt(outputInteger.value); ((SOAPStruct)output).setVarString(outputString.value); ((SOAPStruct)output).setVarFloat(outputFloat.value); verify("echoStructAsSimpleTypes", input, output); } catch (Exception e) { if (!testMode) { verify("echoStructAsSimpleTypes", input, e); } else { throw e; } } } { SOAPStruct input = new SOAPStruct(); input.setVarInt(5); input.setVarString("Hello"); input.setVarFloat(103F); try { output = binding.echoSimpleTypesAsStruct( input.getVarString(), input.getVarInt(), input.getVarFloat()); verify("echoSimpleTypesAsStruct", input, output); } catch (Exception e) { if (!testMode) { verify("echoSimpleTypesAsStruct", input, e); } else { throw e; } } } { String[][] input = new String[2][2]; input[0][0] = "00"; input[0][1] = "01"; input[1][0] = "10"; input[1][1] = "11"; try { output = binding.echo2DStringArray(input); verify("echo2DStringArray", input, output); } catch (Exception e) { if (!testMode) { verify("echo2DStringArray", input, e); } else { throw e; } } } { SOAPStruct inputS =new SOAPStruct(); inputS.setVarInt(5); inputS.setVarString("Hello"); inputS.setVarFloat(103F); SOAPStructStruct input = new SOAPStructStruct(); input.setVarString("AXIS"); input.setVarInt(1); input.setVarFloat(3F); input.setVarStruct(inputS); try { output = binding.echoNestedStruct(input); verify("echoNestedStruct", input, output); } catch (Exception e) { if (!testMode) { verify("echoNestedStruct", input, e); } else { throw e; } } } { SOAPArrayStruct input = new SOAPArrayStruct(); input.setVarString("AXIS"); input.setVarInt(1); input.setVarFloat(3F); input.setVarArray(new String[] {"one", "two", "three"}); try { output = binding.echoNestedArray(input); verify("echoNestedArray", input, output); } catch (Exception e) { if (!testMode) { verify("echoNestedArray", input, e); } else { throw e; } } } } /** * Verify that the object sent was, indeed, the one you got back. * Subclasses are sent to override this with their own output. */ protected abstract void verify(String method, Object sent, Object gotBack); /** * Main entry point. Tests a variety of echo methods and reports * on their results. * * Arguments are of the form: * -h localhost -p 8080 -s /soap/servlet/rpcrouter * -h indicats the host */ public static void main(String args[]) throws Exception { Options opts = new Options(args); boolean testPerformance = opts.isFlagSet('k') > 0; boolean allTests = opts.isFlagSet('A') > 0; boolean onlyB = opts.isFlagSet('b') > 0; boolean testMode = opts.isFlagSet('t') > 0; // set up tests so that the results are sent to System.out TestClient client; if (testPerformance) { client = new TestClient(testMode) { public void verify(String method, Object sent, Object gotBack) { } }; } else { client = new TestClient(testMode) { public void verify(String method, Object sent, Object gotBack) { String message; if (this.equals(sent, gotBack)) { message = "OK"; } else { if (gotBack instanceof Exception) { if (gotBack instanceof AxisFault) { message = "Fault: " + ((AxisFault)gotBack).getFaultString(); } else { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); message = "Exception: "; ((Exception)gotBack).printStackTrace(pw); message += sw.getBuffer().toString(); } } else { message = "Fail:" + gotBack + " expected " + sent; } } // Line up the output String tab = ""; int l = method.length(); while (l < 25) { tab += " "; l++; } System.out.println(method + tab + " " + message); } }; } // set up the call object client.setURL(opts.getURL()); client.setUser(opts.getUser()); client.setPassword(opts.getPassword()); if (testPerformance) { long startTime = System.currentTimeMillis(); for (int i = 0; i < 10; i++) { if (allTests) { client.executeAll(); } else if (onlyB) { client.execute2B(); } else { client.execute2A(); } } long stopTime = System.currentTimeMillis(); System.out.println("That took " + (stopTime - startTime) + " milliseconds"); } else { if (allTests) { client.executeAll(); } else if (onlyB) { client.execute2B(); } else { client.execute2A(); } } } }