Package org.apache.xmlrpc.test

Source Code of org.apache.xmlrpc.test.BaseTest$Remote

/*
* Copyright 1999,2005 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 org.apache.xmlrpc.test;

import java.io.IOException;
import java.io.StringReader;
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.TimeZone;

import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilderFactory;

import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfig;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
import org.apache.xmlrpc.common.XmlRpcExtensionException;
import org.apache.xmlrpc.server.PropertyHandlerMapping;
import org.apache.xmlrpc.server.XmlRpcHandlerMapping;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;

import junit.framework.TestCase;


/** An abstract test case, to be implemented for the various
* transport classes.
*/
public class BaseTest extends TestCase {
  private ClientProvider[] providers;

  public void setUp() throws Exception {
    if (providers == null) {
      XmlRpcHandlerMapping mapping = getHandlerMapping();
      providers = new ClientProvider[]{
        new LocalTransportProvider(mapping),
        new LocalStreamTransportProvider(mapping),
        new LiteTransportProvider(mapping, true),
        new LiteTransportProvider(mapping, false),
        new SunHttpTransportProvider(mapping, true),
        new SunHttpTransportProvider(mapping, false),
        new CommonsProvider(mapping),
        new ServletWebServerProvider(mapping, true),
        new ServletWebServerProvider(mapping, false)
      };
    }
  }

  /** The remote class being invoked by the test case.
   */
  public static class Remote {
    /** Returns the argument, multiplied by two.
     * @param pArg The argument being doubled.
     * @return The argument, multiplied by two.
     */
    public int byteParam(byte pArg) { return pArg*2; }
    /** Returns the argument, multiplied by two.
     * @param pArg The argument being doubled.
     * @return The argument, multiplied by two.
     */
    public byte byteResult(byte pArg) { return (byte) (pArg*2); }
    /** Returns the argument, multiplied by two.
     * @param pArg The argument being doubled.
     * @return The argument, multiplied by two.
     */
    public int shortParam(short pArg) { return pArg*2; }
    /** Returns the argument, multiplied by two.
     * @param pArg The argument being doubled.
     * @return The argument, multiplied by two.
     */
    public short shortResult(short pArg) { return (short) (pArg*2); }
    /** Returns the argument, multiplied by two.
     * @param pArg The argument being doubled.
     * @return The argument, multiplied by two.
     */
    public int intParam(int pArg) { return pArg*2; }
    /** Returns the argument, multiplied by two.
     * @param pArg The argument being doubled.
     * @return The argument, multiplied by two.
     */
    public int longParam(long pArg) { return (int) (pArg*2); }
    /** Returns the argument, multiplied by two.
     * @param pArg The argument being doubled.
     * @return The argument, multiplied by two.
     */
    public long longResult(long pArg) { return pArg*2; }
    /** Returns the argument, multiplied by two.
     * @param pArg The argument being doubled.
     * @return The argument, multiplied by two.
     */
    public double floatParam(float pArg) { return pArg*2; }
    /** Returns the argument, multiplied by two.
     * @param pArg The argument being doubled.
     * @return The argument, multiplied by two.
     */
    public float floatResult(float pArg) { return pArg*2; }
    /** Returns the argument, multiplied by two.
     * @param pArg The argument being doubled.
     * @return The argument, multiplied by two.
     */
    public double doubleParam(double pArg) { return pArg*2; }
    /** Returns the argument, multiplied by two.
     * @param pArg The argument being doubled.
     * @return The argument, multiplied by two.
     */
    public double doubleResult(double pArg) { return pArg*2; }
    /** Returns the argument, concatenated with itself.
     * @param pArg The argument being concatenated.
     * @return The argument, concatenated with itself.
     */
    public String stringParam(String pArg) { return pArg+pArg; }
    /** Returns the argument, concatenated with itself.
     * @param pArg The argument being concatenated.
     * @return The argument, concatenated with itself.
     */
    public String nullableStringParam(String pArg) {
      if (pArg == null) {
        pArg = "";
      }
      return pArg+pArg;
    }
    /** Returns the argument, concatenated with itself.
     * @param pArg The argument being concatenated.
     * @return The argument, concatenated with itself.
     */
    public String nullableStringResult(String pArg) {
      if (pArg == null) {
        return null;
      }
      return pArg+pArg;
    }
    /** Returns the sum of the bytes in the given byte array.
     * @param pArg The array of bytes being added.
     * @return Sum over the bytes in the array.
     */
    public int byteArrayParam(byte[] pArg) {
      int sum = 0;
      for (int i = 0;  i < pArg.length;  i++) {
        sum += pArg[i];
      }
      return sum;
    }
    /** Returns an array with the bytes 0..pArg.
     * @param pArg Requestes byte array length.
     * @return Byte array with 0..pArg.
     */
    public byte[] byteArrayResult(int pArg) {
      byte[] result = new byte[pArg];
      for (int i = 0;  i < result.length;  i++) {
        result[i] = (byte) i;
      }
      return result;
    }
    /** Returns the sum over the objects in the array.
     * @param pArg Object array being added
     * @return Sum over the objects in the array
     */
    public int objectArrayParam(Object[] pArg) {
      int sum = 0;
      for (int i = 0;  i < pArg.length;  i++) {
        if (pArg[i] instanceof Number) {
          sum += ((Number) pArg[i]).intValue();
        } else {
          sum += Integer.parseInt((String) pArg[i]);
        }
      }
      return sum;
    }
    /** Returns an array of integers with the values
     * 0..pArg.
     * @param pArg Requested array length.
     * @return Array of integers with the values 0..pArg
     */
    public Object[] objectArrayResult(int pArg) {
      Object[] result = new Object[pArg];
      for (int i = 0;  i < result.length;  i++) {
        result[i] = new Integer(i);
      }
      return result;
    }
    /** Returns a sum over the entries in the map. Each
     * key is multiplied with its value.
     * @param pArg The map being iterated.
     * @return Sum of keys, multiplied by their values.
     */
    public int mapParam(Map pArg) {
      int sum = 0;
      for (Iterator iter = pArg.entrySet().iterator();  iter.hasNext()) {
        Map.Entry entry = (Map.Entry) iter.next();
        String key = (String) entry.getKey();
        Integer value = (Integer) entry.getValue();
        sum += Integer.parseInt(key) * value.intValue();
      }
      return sum;
    }
    /** Returns a map with the stringified values 0..pArg as
     * keys and the corresponding integers as values.
     * @param pArg Requested map size.
     * @return Map with the keys "0".."pArg" and
     * 0..pArg as values.
     */
    public Map mapResult(int pArg) {
      Map result = new HashMap();
      for (int i = 0;  i < pArg;  i++) {
        result.put(Integer.toString(i), new Integer(i));
      }
      return result;
    }
    /** Returns the sum of all "int" nodes in <code>pNode</code>.
     * @param pNode The node being counted.
     * @return The sum of the values of all "int" nodes.
     */
    public int nodeParam(Node pNode) {
      if (pNode.getNodeType() != Node.DOCUMENT_NODE) {
        throw new IllegalStateException("Expected document node, got " + pNode);
      }
      Element e = ((Document) pNode).getDocumentElement();
      if (!ROOT_TAG.equals(e.getLocalName()) || !INT_URI.equals(e.getNamespaceURI())) {
        throw new IllegalStateException("Expected root element 'root', got "
                        + new QName(e.getNamespaceURI(), e.getLocalName()));
      }
      return count(pNode);
    }
    private int count(Node pNode) {
      if (INT_TAG.equals(pNode.getLocalName())  &&  INT_URI.equals(pNode.getNamespaceURI())) {
        StringBuffer sb = new StringBuffer();
        for (Node child = pNode.getFirstChild();  child != null;  child = child.getNextSibling()) {
          if (child.getNodeType() == Node.TEXT_NODE  ||  child.getNodeType() == Node.CDATA_SECTION_NODE) {
            sb.append(child.getNodeValue());
          }
        }
        return Integer.parseInt(sb.toString());
      } else {
        int result = 0;
        for (Node child = pNode.getFirstChild();  child != null;  child = child.getNextSibling()) {
          if (child.getNodeType() == Node.ELEMENT_NODE) {
            result += count(child);
          }
        }
        return result;
      }
    }

    /** Returns the calendar value in milliseconds.
     * @param pCal Calendar object
     * @return <code>pCal.getTime().getTime()</code>.
     */
    public long serializableParam(Calendar pCal) {
      return pCal.getTime().getTime();
    }
  }

  protected XmlRpcHandlerMapping getHandlerMapping() throws IOException, XmlRpcException {
    return new PropertyHandlerMapping(getClass().getClassLoader(),
                      getClass().getResource("BaseTest.properties"));
  }

  protected XmlRpcClientConfigImpl getConfig(ClientProvider pProvider) throws Exception {
    return pProvider.getConfig();
  }

  protected XmlRpcClientConfig getExConfig(ClientProvider pProvider) throws Exception {
    XmlRpcClientConfigImpl config = getConfig(pProvider);
    config.setEnabledForExtensions(true);
    return config;
  }

  /** Test, whether we can invoke a method, passing a byte value.
   * @throws Exception The test failed.
   */
  public void testByteParam() throws Exception {
    for (int i = 0;  i < providers.length;  i++) {
      testByteParam(providers[i]);
    }
  }

  private void testByteParam(ClientProvider pProvider) throws Exception {
    final String methodName = "Remote.byteParam";
    final Object[] params = new Object[]{new Byte((byte) 3)};
    XmlRpcClient client = pProvider.getClient();
    Object result = client.execute(getExConfig(pProvider), methodName, params);
    assertEquals(new Integer(6), result);
    boolean ok = false;
    try {
      client.execute(getConfig(pProvider), methodName, params);
    } catch (XmlRpcExtensionException e) {
      ok = true;
    }
    assertTrue(ok);
  }

  /** Test, whether we can invoke a method, returning a byte.
   * @throws Exception The test failed.
   */
  public void testByteResult() throws Exception {
    for (int i = 0;  i < providers.length;  i++) {
      testByteResult(providers[i]);
    }
  }

  private void testByteResult(ClientProvider pProvider) throws Exception {
    final String methodName = "Remote.byteResult";
    final Object[] params = new Object[]{new Byte((byte) 3)};
    final XmlRpcClient client = pProvider.getClient();
    Object result = client.execute(getExConfig(pProvider), methodName, params);
    assertEquals(new Byte((byte) 6), result);
    boolean ok = false;
    try {
      client.execute(getConfig(pProvider), methodName, params);
    } catch (XmlRpcExtensionException e) {
      ok = true;
    }
    assertTrue(ok);
  }

  /** Test, whether we can invoke a method, passing a short value.
   * @throws Exception The test failed.
   */
  public void testShortParam() throws Exception {
    for (int i = 0;  i < providers.length;  i++) {
      testShortParam(providers[i]);
    }
  }

  private void testShortParam(ClientProvider pProvider) throws Exception {
    final String methodName = "Remote.shortParam";
    final Object[] params = new Object[]{new Short((short) 4)};
    final XmlRpcClient client = pProvider.getClient();
    Object result = client.execute(getExConfig(pProvider), methodName, params);
    assertEquals(new Integer(8), result);
    boolean ok = false;
    try {
      client.execute(getConfig(pProvider), methodName, params);
    } catch (XmlRpcExtensionException e) {
      ok = true;
    }
    assertTrue(ok);
  }

  /** Test, whether we can invoke a method, returning a short value.
   * @throws Exception The test failed.
   */
  public void testShortResult() throws Exception {
    for (int i = 0;  i < providers.length;  i++) {
      testShortResult(providers[i]);
    }
  }

  private void testShortResult(ClientProvider pProvider) throws Exception {
    final String methodName = "Remote.shortResult";
    final Object[] params = new Object[]{new Short((short) 4)};
    final XmlRpcClient client = pProvider.getClient();
    Object result = client.execute(getExConfig(pProvider), methodName, params);
    assertEquals(new Short((short) 8), result);
    boolean ok = false;
    try {
      client.execute(getConfig(pProvider), methodName, params);
    } catch (XmlRpcExtensionException e) {
      ok = true;
    }
    assertTrue(ok);
  }

  /** Test, whether we can invoke a method, passing an
   * integer value.
   * @throws Exception The test failed.
   */
  public void testIntParam() throws Exception {
    for (int i = 0;  i < providers.length;  i++) {
      testIntParam(providers[i]);
    }
  }

  private void testIntParam(ClientProvider pProvider) throws Exception {
    final String methodName = "Remote.intParam";
    final Object[] params = new Object[]{new Integer(5)};
    final XmlRpcClient client = pProvider.getClient();
    Object result = client.execute(getConfig(pProvider), methodName, params);
    assertEquals(new Integer(10), result);
    result = client.execute(getExConfig(pProvider), methodName, params);
    assertEquals(new Integer(10), result);
  }

  /** Test, whether we can invoke a method, passing a long value.
   * @throws Exception The test failed.
   */
  public void testLongParam() throws Exception {
    for (int i = 0;  i < providers.length;  i++) {
      testLongParam(providers[i]);
    }
  }

  private void testLongParam(ClientProvider pProvider) throws Exception {
    final String methodName = "Remote.longParam";
    final Object[] params = new Object[]{new Long(6L)};
    final XmlRpcClient client = pProvider.getClient();
    Object result = client.execute(getExConfig(pProvider), methodName, params);
    assertEquals(new Integer(12), result);
    boolean ok = false;
    try {
      client.execute(getConfig(pProvider), methodName, params);
    } catch (XmlRpcExtensionException e) {
      ok = true;
    }
    assertTrue(ok);
  }

  /** Test, whether we can invoke a method, returning a long value.
   * @throws Exception The test failed.
   */
  public void testLongResult() throws Exception {
    for (int i = 0;  i < providers.length;  i++) {
      testLongResult(providers[i]);
    }
  }

  private void testLongResult(ClientProvider pProvider) throws Exception {
    final String methodName = "Remote.longResult";
    final Object[] params = new Object[]{new Long(6L)};
    final XmlRpcClient client = pProvider.getClient();
    Object result = client.execute(getExConfig(pProvider), methodName, params);
    assertEquals(new Long(12L), result);
    boolean ok = false;
    try {
      client.execute(getConfig(pProvider), methodName, params);
    } catch (XmlRpcExtensionException e) {
      ok = true;
    }
    assertTrue(ok);
  }

  /** Test, whether we can invoke a method, passing a
   * string value.
   * @throws Exception The test failed.
   */
  public void testStringParam() throws Exception {
    for (int i = 0;  i < providers.length;  i++) {
      testStringParam(providers[i]);
    }
  }

  private void testStringParam(ClientProvider pProvider) throws Exception {
    final String methodName = "Remote.stringParam";
    final Object[] params = new Object[]{"abc"};
    final XmlRpcClient client = pProvider.getClient();
    Object result = client.execute(getConfig(pProvider), methodName, params);
    assertEquals("abcabc", result);
    result = client.execute(getExConfig(pProvider), methodName, params);
    assertEquals("abcabc", result);
  }

  /** Test, whether we can invoke a method, passing a
   * string value or null.
   * @throws Exception The test failed.
   */
  public void testNullableStringParam() throws Exception {
    for (int i = 0;  i < providers.length;  i++) {
      testNullableStringParam(providers[i]);
    }
  }

  private void testNullableStringParam(ClientProvider pProvider) throws Exception {
    final String methodName = "Remote.nullableStringParam";
    final Object[] params = new Object[]{"abc"};
    final XmlRpcClient client = pProvider.getClient();
    Object result = client.execute(getConfig(pProvider), methodName, params);
    assertEquals("abcabc", result);
    result = client.execute(getExConfig(pProvider), methodName, params);
    assertEquals("abcabc", result);
    final Object[] nullParams = new Object[]{null};
    result = client.execute(getExConfig(pProvider), methodName, nullParams);
    assertEquals("", result);
    boolean ok = false;
    try {
      client.execute(getConfig(pProvider), methodName, nullParams);
    } catch (XmlRpcExtensionException e) {
      ok = true;
    }
    assertTrue(ok);
  }

  /** Test, whether we can invoke a method, returning a
   * string value or null.
   * @throws Exception The test failed.
   */
  public void testNullableStringResult() throws Exception {
    for (int i = 0;  i < providers.length;  i++) {
      testNullableStringResult(providers[i]);
    }
  }

  private void testNullableStringResult(ClientProvider pProvider) throws Exception {
    final String methodName = "Remote.nullableStringResult";
    final Object[] params = new Object[]{"abc"};
    final XmlRpcClient client = pProvider.getClient();
    Object result = client.execute(getConfig(pProvider), methodName, params);
    assertEquals("abcabc", result);
    result = client.execute(getExConfig(pProvider), methodName, params);
    assertEquals("abcabc", result);
    final Object[] nullParams = new Object[]{null};
    result = client.execute(getExConfig(pProvider), methodName, nullParams);
    assertEquals(null, result);
    boolean ok = false;
    try {
      client.execute(getConfig(pProvider), methodName, nullParams);
    } catch (XmlRpcExtensionException e) {
      ok = true;
    }
    assertTrue(ok);
  }

  /** Test, whether we can invoke a method, passing a float value.
   * @throws Exception The test failed.
   */
  public void testFloatParam() throws Exception {
    for (int i = 0;  i < providers.length;  i++) {
      testFloatParam(providers[i]);
    }
  }

  private void testFloatParam(ClientProvider pProvider) throws Exception {
    final String methodName = "Remote.floatParam";
    final Object[] params = new Object[]{new Float(0.4)};
    final XmlRpcClient client = pProvider.getClient();
    Object result = client.execute(getExConfig(pProvider), methodName, params);
    assertEquals(8, Math.round(((Double) result).doubleValue()*10));
    boolean ok = false;
    try {
      client.execute(getConfig(pProvider), methodName, params);
    } catch (XmlRpcExtensionException e) {
      ok = true;
    }
    assertTrue(ok);
  }

  /** Test, whether we can invoke a method, returning a float value.
   * @throws Exception The test failed.
   */
  public void testFloatResult() throws Exception {
    for (int i = 0;  i < providers.length;  i++) {
      testFloatResult(providers[i]);
    }
  }

  private void testFloatResult(ClientProvider pProvider) throws Exception {
    final String methodName = "Remote.floatResult";
    final Object[] params = new Object[]{new Float(0.4)};
    final XmlRpcClient client = pProvider.getClient();
    Object result = client.execute(getExConfig(pProvider), methodName, params);
    assertEquals(new Float(0.8), result);
    boolean ok = false;
    try {
      client.execute(getConfig(pProvider), methodName, params);
    } catch (XmlRpcExtensionException e) {
      ok = true;
    }
    assertTrue(ok);
  }

  /** Test, whether we can invoke a method, passing a
   * double value.
   * @throws Exception The test failed.
   */
  public void testDoubleParam() throws Exception {
    for (int i = 0;  i < providers.length;  i++) {
      testDoubleParam(providers[i]);
    }
  }

  private void testDoubleParam(ClientProvider pProvider) throws Exception {
    final String methodName = "Remote.doubleParam";
    final Object[] params = new Object[]{new Double(0.6)};
    final XmlRpcClient client = pProvider.getClient();
    Object result = client.execute(getConfig(pProvider), methodName, params);
    assertEquals(new Double(1.2), result);
    result = client.execute(getExConfig(pProvider), methodName, params);
    assertEquals(new Double(1.2), result);
  }

  /** Test, whether we can invoke a method, returning a
   * double value.
   * @throws Exception The test failed.
   */
  public void testDoubleResult() throws Exception {
    for (int i = 0;  i < providers.length;  i++) {
      testDoubleResult(providers[i]);
    }
  }

  private void testDoubleResult(ClientProvider pProvider) throws Exception {
    final String methodName = "Remote.doubleResult";
    final Object[] params = new Object[]{new Double(0.6)};
    final XmlRpcClient client = pProvider.getClient();
    Object result = client.execute(getConfig(pProvider), methodName, params);
    assertEquals(new Double(1.2), result);
    result = client.execute(getExConfig(pProvider), methodName, params);
    assertEquals(new Double(1.2), result);
  }

  /** Test, whether we can invoke a method, passing a
   * byte array.
   * @throws Exception The test failed.
   */
  public void testByteArrayParam() throws Exception {
    for (int i = 0;  i < providers.length;  i++) {
      testByteArrayParam(providers[i]);
    }
  }

  private void testByteArrayParam(ClientProvider pProvider) throws Exception {
    final byte[] bytes = new byte[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    final String methodName = "Remote.byteArrayParam";
    final Object[] params = new Object[]{bytes};
    final XmlRpcClient client = pProvider.getClient();
    Object result = client.execute(getConfig(pProvider), methodName, params);
    assertEquals(new Integer(0+1+2+3+4+5+6+7+8+9), result);
    result = client.execute(getExConfig(pProvider), methodName, params);
    assertEquals(new Integer(0+1+2+3+4+5+6+7+8+9), result);
  }

  /** Test, whether we can invoke a method, returning a
   * byte array.
   * @throws Exception The test failed.
   */
  public void testByteArrayResult() throws Exception {
    for (int i = 0;  i < providers.length;  i++) {
      testByteArrayResult(providers[i]);
    }
  }

  private void testByteArrayResult(ClientProvider pProvider) throws Exception {
    final byte[] bytes = new byte[]{0, 1, 2, 3, 4, 5, 6, 7};
    final String methodName = "Remote.byteArrayResult";
    final Object[] params = new Object[]{new Integer(8)};
    final XmlRpcClient client = pProvider.getClient();
    Object result = client.execute(getConfig(pProvider), methodName, params);
    assertTrue(Arrays.equals(bytes, (byte[]) result));
    result = client.execute(getExConfig(pProvider), methodName, params);
    assertTrue(Arrays.equals(bytes, (byte[]) result));
  }

  /** Test, whether we can invoke a method, passing an
   * object array.
   * @throws Exception The test failed.
   */
  public void testObjectArrayParam() throws Exception {
    for (int i = 0;  i < providers.length;  i++) {
      testObjectArrayParam(providers[i]);
    }
  }

  private void testObjectArrayParam(ClientProvider pProvider) throws Exception {
    final Object[] objects = new Object[]{new Byte((byte) 1), new Short((short) 2),
                        new Integer(3), new Long(4), "5"};
    final String methodName = "Remote.objectArrayParam";
    final Object[] params = new Object[]{objects};
    final XmlRpcClient client = pProvider.getClient();
    boolean ok = false;
    try {
      client.execute(getConfig(pProvider), methodName, params);
    } catch (XmlRpcExtensionException e) {
      ok = true;
    }
    assertTrue(ok);
    Object result = client.execute(getExConfig(pProvider), methodName, params);
    assertEquals(new Integer(15), result);
  }

  /** Test, whether we can invoke a method, returning an
   * object array.
   * @throws Exception The test failed.
   */
  public void testObjectArrayResult() throws Exception {
    for (int i = 0;  i < providers.length;  i++) {
      testObjectArrayResult(providers[i]);
    }
  }

  private void testObjectArrayResult(ClientProvider pProvider) throws Exception {
    final Object[] objects = new Object[]{new Integer(0), new Integer(1),
                        new Integer(2), new Integer(3)};
    final String methodName = "Remote.objectArrayResult";
    final Object[] params = new Object[]{new Integer(4)};
    final XmlRpcClient client = pProvider.getClient();
    Object result = client.execute(getConfig(pProvider), methodName, params);
    assertTrue(Arrays.equals(objects, (Object[]) result));
    result = client.execute(getExConfig(pProvider), methodName, params);
    assertTrue(Arrays.equals(objects, (Object[]) result));
  }

  /** Test, whether we can invoke a method, passing a map.
   * @throws Exception The test failed.
   */
  public void testMapParam() throws Exception {
    for (int i = 0;  i < providers.length;  i++) {
      testMapParam(providers[i]);
    }
  }

  private void testMapParam(ClientProvider pProvider) throws Exception {
    final Map map = new HashMap();
    map.put("2", new Integer(3));
    map.put("3", new Integer(5));
    final String methodName = "Remote.mapParam";
    final Object[] params = new Object[]{map};
    final XmlRpcClient client = pProvider.getClient();
    Object result = client.execute(getConfig(pProvider), methodName, params);
    assertEquals(new Integer(21), result);
    result = client.execute(getExConfig(pProvider), methodName, params);
    assertEquals(new Integer(21), result);
  }

  private void checkMap(Map pResult) {
    assertEquals(4, pResult.size());
    assertEquals(new Integer(0), pResult.get("0"));
    assertEquals(new Integer(1), pResult.get("1"));
    assertEquals(new Integer(2), pResult.get("2"));
    assertEquals(new Integer(3), pResult.get("3"));
  }

  /** Test, whether we can invoke a method, returning a map.
   * @throws Exception The test failed.
   */
  public void testMapResult() throws Exception {
    for (int i = 0;  i < providers.length;  i++) {
      testMapResult(providers[i]);
    }
  }

  private void testMapResult(ClientProvider pProvider) throws Exception {
    final String methodName = "Remote.mapResult";
    final Object[] params = new Object[]{new Integer(4)};
    final XmlRpcClient client = pProvider.getClient();
    Object result = client.execute(getConfig(pProvider), methodName, params);
    checkMap((Map) result);
    result = client.execute(getExConfig(pProvider), methodName, params);
    checkMap((Map) result);
  }

  /** Test, whether we can invoke a method, passing a DOM
   * node as parameter.
   * @throws Exception The test failed.
   */
  public void testNodeParam() throws Exception {
    for (int i = 0;  i < providers.length;  i++) {
      testNodeParam(providers[i]);
    }
  }

  private static final String ROOT_TAG = "root";
  private static final String INT_TAG = "int";
  private static final String INT_URI = "http://ws.apache.org/xmlrpc/namespaces/testNodeParam";

  private void testNodeParam(ClientProvider pProvider) throws Exception {
    final String xml =
      "<" + ROOT_TAG + " xmlns='" + INT_URI +"'>" +
      "  <" + INT_TAG + ">1</" + INT_TAG + ">" +
      "  <" + INT_TAG + ">2</" + INT_TAG + ">" +
      "  <" + INT_TAG + ">3</" + INT_TAG + ">" +
      "  <" + INT_TAG + ">4</" + INT_TAG + ">" +
      "  <" + INT_TAG + ">5</" + INT_TAG + ">" +
      "</" + ROOT_TAG + ">";
    final String methodName = "Remote.nodeParam";
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setValidating(false);
    dbf.setNamespaceAware(true);
    Document doc = dbf.newDocumentBuilder().parse(new InputSource(new StringReader(xml)));
    final Object[] params = new Object[]{doc};
    final XmlRpcClient client = pProvider.getClient();
    Object result = client.execute(getExConfig(pProvider), methodName, params);
    assertEquals(new Integer(1+2+3+4+5), result);
    boolean ok = false;
    try {
      client.execute(getConfig(pProvider), methodName, params);
    } catch (XmlRpcExtensionException e) {
      ok = true;
    }
    assertTrue(ok);
  }

  /** Test, whether we can invoke a method, passing an instance of
   * {@link java.io.Serializable} as an instance.
   * @throws Exception The test failed.
   */
  public void testSerializableParam() throws Exception {
    for (int i = 0;  i < providers.length;  i++) {
      testSerializableParam(providers[i]);
    }
  }

  private void testSerializableParam(ClientProvider pProvider) throws Exception {
    final String methodName = "Remote.serializableParam";
    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
    cal.set(Calendar.YEAR, 2005);
    cal.set(Calendar.MONTH, 5);
    cal.set(Calendar.DAY_OF_MONTH, 23);
    cal.set(Calendar.HOUR_OF_DAY, 8);
    cal.set(Calendar.MINUTE, 4);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 5);
    final Object[] params = new Object[]{cal};
    final XmlRpcClient client = pProvider.getClient();
    Object result = client.execute(getExConfig(pProvider), methodName, params);
    assertEquals(new Long(cal.getTime().getTime()), result);
    boolean ok = false;
    try {
      client.execute(getConfig(pProvider), methodName, params);
    } catch (XmlRpcExtensionException e) {
      ok = true;
    }
    assertTrue(ok);
  }
}
TOP

Related Classes of org.apache.xmlrpc.test.BaseTest$Remote

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.