This is an automated email from the git hooks/post-receive script. gturri-guest pushed a commit to tag temp in repository axmlrpc.
commit 3e408dfc3359839c46478a08662ae4ed385887b5 Author: Guillaume Turri <[email protected]> Date: Tue Apr 12 10:18:02 2016 +0200 Imported Upstream version 1.9.0 --- .gitignore | 3 + .travis.yml | 1 + Changelog | 9 + README.md | 89 ++------ build.gradle | 50 ----- pom.xml | 248 +++++++++++++++++++++ settings.gradle | 1 - src/main/java/de/timroes/axmlrpc/Call.java | 10 +- .../java/de/timroes/axmlrpc/ResponseParser.java | 33 ++- src/main/java/de/timroes/axmlrpc/XMLRPCClient.java | 14 +- .../axmlrpc/serializer/DateTimeSerializer.java | 24 +- .../de/timeroes/axmlrpc/TestResponseParser.java | 68 ++++++ src/test/java/de/timeroes/base64/TestBase64.java | 24 ++ .../axmlrpc/serializer/TestDateTimeSerializer.java | 129 +++++++++-- .../axmlrpc/serializer/TestSerializers.java | 62 ++++++ 15 files changed, 592 insertions(+), 173 deletions(-) diff --git a/.gitignore b/.gitignore index 5e36154..2938b43 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,6 @@ build/ dist/ .gradle/ /.nb-gradle/private/ +target +.classpath +.project diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..dff5f3a --- /dev/null +++ b/.travis.yml @@ -0,0 +1 @@ +language: java diff --git a/Changelog b/Changelog new file mode 100644 index 0000000..2c43402 --- /dev/null +++ b/Changelog @@ -0,0 +1,9 @@ +Add FLAGS_DEBUG to display the xml returned by the server + +1.8.3 +Fix compatibility with Android + +1.8.2 + +Forking from timroes project. The only purpose of this version is to have +the fix from 1.8.1 in maven central diff --git a/README.md b/README.md index 34e7a2f..2e0b96f 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ How to include it? ================== How to include the aXMLRPC client into your project? -There are four different ways to do that: +There are several ways to do that: ### Include the source code @@ -26,9 +26,9 @@ as a module to yours. So you will always stay up to date with the library. ### Compile it as library -aXMLRPC uses gradle, so you can build it using +aXMLRPC uses maven, so you can build it using - ./gradlew jar + mvn install ### Use Maven @@ -36,7 +36,7 @@ To use it on your Maven project, add it as a dependency on your pom.xml file: ```xml <dependency> - <groupId>de.timroes</groupId> + <groupId>fr.turri</groupId> <artifactId>aXMLRPC</artifactId> <version>X.Y.Z</version> </dependency> @@ -44,77 +44,6 @@ To use it on your Maven project, add it as a dependency on your pom.xml file: where X.Y.Z is the current aXMLRPC version -### Download the JAR library - -You can download a compiled jar file from the below list and use it as a library -for your project. - -[aXMLRPC v1.7.2](https://dl.dropbox.com/u/56970236/aXMLRPC/aXMLRPC_v1.7.2.jar) - - * Bugfix in double representation - * Allow usage of any Iterable for array parameters - * Allow usage of BigDecimal as double parameters - -[aXMLRPC v1.7.1](https://dl.dropbox.com/u/56970236/aXMLRPC/aXMLRPC_v1.7.1.jar) - - * Bugfix in String escaping (New default behavior: Escape Strings according to spec) - * Bugfix in Float encoding - -[aXMLRPC v1.7.0](https://dl.dropbox.com/u/56970236/aXMLRPC/aXMLRPC_v1.7.0.jar) - - * Added funtionality for custom TrustManagers - -[aXMLRPC v1.6.0](https://dl.dropbox.com/u/56970236/aXMLRPC/aXMLRPC_v1.6.0.jar) - - * Added support for timeout - * Minor code improvements - -[aXMLRPC v1.5.0](https://dl.dropbox.com/u/56970236/aXMLRPC/aXMLRPC_v1.5.0.jar) - - * Added Proxy Support - * Fixed #13, Support for cookie reading - -[aXMLRPC v1.4.0](https://dl.dropbox.com/u/56970236/aXMLRPC/aXMLRPC_v1.4.0.jar) - - * Added FLAGS_IGNORE_NAMESPACE, FLAGS_DEFAULT_TYPE_STRING - -[aXMLRPC v1.3.5](https://dl.dropbox.com/u/56970236/aXMLRPC/aXMLRPC_v1.3.5.jar) - - * Fixed bug in canceling async calls - -[aXMLRPC v1.3.4](https://dl.dropbox.com/u/56970236/aXMLRPC/aXMLRPC_v1.3.4.jar) - - * Added getURL-method - * Added FLAGS_IGNORE_SSL_ERRORS - * Removed debugging information from JAR - -[aXMLRPC v1.3.3](https://dl.dropbox.com/u/56970236/aXMLRPC/aXMLRPC_v1.3.3.jar) - - * Improved handling of 40X http errors - -[aXMLRPC v1.3.2](https://dl.dropbox.com/u/56970236/aXMLRPC/aXMLRPC_v1.3.2.jar) - - * Fixed handling of 40x http errors - -[aXMLRPC v1.3.1](https://dl.dropbox.com/u/56970236/aXMLRPC/aXMLRPC_v1.3.1.jar) - - * Fixed bug in XML struct creation - * Method to clear HTTP basic auth login data - -[aXMLRPC v1.3.0](https://dl.dropbox.com/u/56970236/aXMLRPC/aXMLRPC_v1.3.0.jar) - - * Flags to ignore SSL warnings - * HTTP forwarding - * Improved code quality - -**Real old versions:** - - * [aXMLRPC v1.2.0](https://dl.dropbox.com/u/56970236/aXMLRPC/aXMLRPC_v1.2.0.jar) - * [aXMLRPC v1.1.0](https://dl.dropbox.com/u/56970236/aXMLRPC/aXMLRPC_v1.1.0.jar) - * [aXMLRPC v1.0.3](https://dl.dropbox.com/u/56970236/aXMLRPC/aXMLRPC_v1.0.3.jar) - * [aXMLRPC v1.0.2](https://dl.dropbox.com/u/56970236/aXMLRPC/aXMLRPC_v1.0.2.jar) - * [aXMLRPC v1.0.1](https://dl.dropbox.com/u/56970236/aXMLRPC/aXMLRPC_v1.0.1.jar) - How to use the library? ======================= @@ -314,6 +243,10 @@ This prevents the decoding of incoming strings, meaning `&` and `<` won't be decoded to the & sign and the "less then" sign. See `FLAGS_NO_STRING_ENCODE` for the counterpart. +#### FLAGS_DEBUG +Will display additional information on the console. +Do not use it in production. + Meta Flags ---------- @@ -355,4 +288,8 @@ Bugs? ===== If you find a bug or wish some enhancements for the library, please -fill an issue here on github or contact me otherwise (www.timroes.de). +fill an issue here on github. + +Build status +============ +Status:  diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 92c0363..0000000 --- a/build.gradle +++ /dev/null @@ -1,50 +0,0 @@ -plugins { - id "com.jfrog.bintray" version "1.3.1" -} - -apply plugin: 'java' -apply plugin: 'maven' -apply plugin: 'signing' - -version = '1.8.1' -group = 'de.timroes' - -task sourcesJar(type: Jar, dependsOn: classes) { - classifier = 'sources' - from sourceSets.main.allSource -} - -task javadocJar(type: Jar, dependsOn: javadoc) { - classifier = 'javadoc' - from javadoc.destinationDir -} - -artifacts { - archives sourcesJar - archives javadocJar -} - -repositories { - mavenLocal() - mavenCentral() -} - -dependencies { - testCompile "junit:junit:4.12" -} - -bintray { - user = project.properties['bintray.user'] - key = project.properties['bintray.key'] - configurations = ['archives'] - pkg { - repo = 'maven' - name = 'aXMLRPC' - userOrg = project.properties['bintray.user'] - licenses = ['MIT'] - vcsUrl = 'https://github.com/timroes/aXMLRPC.git' - version { - name = project.version - } - } -} diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..798b3d4 --- /dev/null +++ b/pom.xml @@ -0,0 +1,248 @@ +<?xml version='1.0' encoding='UTF-8'?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>fr.turri</groupId> + <artifactId>aXMLRPC</artifactId> + <version>1.9.0</version> + <packaging>jar</packaging> + <name>aXMLRPC</name> + <description>Lightweight Java XML-RPC working also on Android.</description> + <url>https://github.com/gturri/aXMLRPC</url> + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <maven.compiler.source>1.7</maven.compiler.source> + <maven.compiler.target>1.7</maven.compiler.target> + </properties> + <licenses> + <license> + <name>The MIT License (MIT)</name> + </license> + </licenses> + <developers> + <developer> + <id>timroes</id> + <name>Tim Roes</name> + <email>[email protected]</email> + </developer> + <developer> + <id>gturri</id> + <name>Guillaume Turri</name> + <email>[email protected]</email> + </developer> + </developers> + <dependencies> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.12</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>fr.turri</groupId> + <artifactId>jISO8601</artifactId> + <version>0.2</version> + </dependency> + <dependency> + <groupId>com.github.tomakehurst</groupId> + <artifactId>wiremock</artifactId> + <version>1.58</version> + <scope>test</scope> + <classifier>standalone</classifier> + <exclusions> + <exclusion> + <groupId>org.mortbay.jetty</groupId> + <artifactId>jetty</artifactId> + </exclusion> + <exclusion> + <groupId>com.google.guava</groupId> + <artifactId>guava</artifactId> + </exclusion> + <exclusion> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-core</artifactId> + </exclusion> + <exclusion> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-annotations</artifactId> + </exclusion> + <exclusion> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-databind</artifactId> + </exclusion> + <exclusion> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpclient</artifactId> + </exclusion> + <exclusion> + <groupId>org.skyscreamer</groupId> + <artifactId>jsonassert</artifactId> + </exclusion> + <exclusion> + <groupId>xmlunit</groupId> + <artifactId>xmlunit</artifactId> + </exclusion> + <exclusion> + <groupId>com.jayway.jsonpath</groupId> + <artifactId>json-path</artifactId> + </exclusion> + <exclusion> + <groupId>net.sf.jopt-simple</groupId> + <artifactId>jopt-simple</artifactId> + </exclusion> + </exclusions> + </dependency> + </dependencies> + <scm> + <connection>scm:git:https://github.com/gturri/aXMLRPC.git</connection> + <developerConnection>scm:git:[email protected]:gturri/aXMLRPC.git</developerConnection> + <url>https://github.com/gturri/aXMLRPC</url> + <tag>aXMLRPC-1.9.0</tag> + </scm> + <build> + <pluginManagement> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-release-plugin</artifactId> + <version>2.5.3</version> + <configuration> + <useReleaseProfile>false</useReleaseProfile> + <releaseProfiles>release</releaseProfiles> + <goals>deploy</goals> + </configuration> + </plugin> + </plugins> + </pluginManagement> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <version>2.6</version> + <configuration> + <archive> + <manifest> + <addClasspath>true</addClasspath> + </manifest> + </archive> + </configuration> + </plugin> + <plugin> + <groupId>org.sonatype.plugins</groupId> + <artifactId>nexus-staging-maven-plugin</artifactId> + <version>1.6.7</version> + <extensions>true</extensions> + <configuration> + <serverId>ossrh</serverId> + <nexusUrl>https://oss.sonatype.org/</nexusUrl> + <autoReleaseAfterClose>true</autoReleaseAfterClose> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + <version>2.10.3</version> + <executions> + <execution> + <id>attach-javadocs</id> + <goals> + <goal>jar</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> + <reporting> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-report-plugin</artifactId> + <version>2.19.1</version> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>cobertura-maven-plugin</artifactId> + <version>2.7</version> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + <version>2.10.3</version> + <reportSets> + <reportSet> + <reports> + <report>javadoc</report> + </reports> + <configuration> + <destDir>doc-${project.version}</destDir> + </configuration> + </reportSet> + </reportSets> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>findbugs-maven-plugin</artifactId> + <version>3.0.3</version> + </plugin> + </plugins> + </reporting> + <profiles> + <profile> + <id>release</id> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-source-plugin</artifactId> + <version>3.0.0</version> + <executions> + <execution> + <id>attach-sources</id> + <goals> + <goal>jar-no-fork</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + <version>2.10.3</version> + <executions> + <execution> + <id>attach-javadocs</id> + <goals> + <goal>jar</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-gpg-plugin</artifactId> + <version>1.6</version> + <executions> + <execution> + <id>sign-artifacts</id> + <phase>verify</phase> + <goals> + <goal>sign</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> + </profile> + </profiles> + <distributionManagement> + <snapshotRepository> + <id>ossrh</id> + <url>https://oss.sonatype.org/content/repositories/snapshots</url> + </snapshotRepository> + <repository> + <id>ossrh</id> + <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url> + </repository> + </distributionManagement> +</project> diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index 5d76855..0000000 --- a/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'aXMLRPC' diff --git a/src/main/java/de/timroes/axmlrpc/Call.java b/src/main/java/de/timroes/axmlrpc/Call.java index de393ec..ff8ec2b 100644 --- a/src/main/java/de/timroes/axmlrpc/Call.java +++ b/src/main/java/de/timroes/axmlrpc/Call.java @@ -45,7 +45,7 @@ public class Call { * be build without errors. * @see XMLRPCClient */ - public String getXML() throws XMLRPCException { + public String getXML(boolean debugMode) throws XMLRPCException { SimpleXMLCreator creator = new SimpleXMLCreator(); @@ -65,7 +65,13 @@ public class Call { } } - return creator.toString(); + String result = creator.toString(); + + if ( debugMode){ + System.out.println(result); + } + + return result; } /** diff --git a/src/main/java/de/timroes/axmlrpc/ResponseParser.java b/src/main/java/de/timroes/axmlrpc/ResponseParser.java index b096896..f9e3bd0 100644 --- a/src/main/java/de/timroes/axmlrpc/ResponseParser.java +++ b/src/main/java/de/timroes/axmlrpc/ResponseParser.java @@ -1,10 +1,22 @@ package de.timroes.axmlrpc; import de.timroes.axmlrpc.serializer.SerializerHandler; + +import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; +import java.io.OutputStreamWriter; import java.util.Map; + import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -27,7 +39,7 @@ class ResponseParser { * @throws XMLRPCException Will be thrown whenever something fails. * @throws XMLRPCServerException Will be thrown, if the server returns an error. */ - public Object parse(InputStream response) throws XMLRPCException { + public Object parse(InputStream response, boolean debugMode) throws XMLRPCException { try { @@ -35,8 +47,12 @@ class ResponseParser { factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); Document dom = builder.parse(response); + if (debugMode ){ + printDocument(dom, System.out); + } Element e = dom.getDocumentElement(); + // Check for root tag if(!e.getNodeName().equals(XMLRPCClient.METHOD_RESPONSE)) { throw new XMLRPCException("MethodResponse root tag is missing."); @@ -76,10 +92,23 @@ class ResponseParser { } + public static void printDocument(Document doc, OutputStream out) throws IOException, TransformerException { + TransformerFactory tf = TransformerFactory.newInstance(); + Transformer transformer = tf.newTransformer(); + transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); + transformer.setOutputProperty(OutputKeys.METHOD, "xml"); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); + transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); + + transformer.transform(new DOMSource(doc), + new StreamResult(new OutputStreamWriter(out, "UTF-8"))); + } + /** * This method takes an element (must be a param or fault element) and * returns the deserialized object of this param tag. - * + * * @param element An param element. * @return The deserialized object within the given param element. * @throws XMLRPCException Will be thrown when the structure of the document diff --git a/src/main/java/de/timroes/axmlrpc/XMLRPCClient.java b/src/main/java/de/timroes/axmlrpc/XMLRPCClient.java index d07332a..cc7dc00 100644 --- a/src/main/java/de/timroes/axmlrpc/XMLRPCClient.java +++ b/src/main/java/de/timroes/axmlrpc/XMLRPCClient.java @@ -152,6 +152,12 @@ public class XMLRPCClient { public static final int FLAGS_NO_STRING_ENCODE = 0x1000; /** + * Activate debug mode. + * Do NOT use if you don't need it. + */ + public static final int FLAGS_DEBUG = 0x2000; + + /** * This flag disables all SSL warnings. It is an alternative to use * FLAGS_SSL_IGNORE_INVALID_CERT | FLAGS_SSL_IGNORE_INVALID_HOST. There * is no functional difference. @@ -286,7 +292,7 @@ public class XMLRPCClient { /** * Sets the time in seconds after which a call should timeout. * If {@code timeout} will be zero or less the connection will never timeout. - * In case the connection times out and {@link XMLRPCTimeoutException} will + * In case the connection times out an {@link XMLRPCTimeoutException} will * be thrown for calls made by {@link #call(java.lang.String, java.lang.Object[])}. * For calls made by {@link #callAsync(de.timroes.axmlrpc.XMLRPCCallback, java.lang.String, java.lang.Object[])} * the {@link XMLRPCCallback#onError(long, de.timroes.axmlrpc.XMLRPCException)} method @@ -311,7 +317,7 @@ public class XMLRPCClient { /** * Sets a proxy to use for this client. If you want to use the system proxy, - * use {@link #FLAGS_adbUSE_SYSTEM_PROXY} instead. If combined with + * use {@link #FLAGS_USE_SYSTEM_PROXY} instead. If combined with * {@code FLAGS_USE_SYSTEM_PROXY}, this proxy will be used instead of the * system proxy. * @@ -650,7 +656,7 @@ public class XMLRPCClient { cookieManager.setCookies(http); OutputStreamWriter stream = new OutputStreamWriter(http.getOutputStream()); - stream.write(c.getXML()); + stream.write(c.getXML(isFlagSet(FLAGS_DEBUG))); stream.flush(); stream.close(); @@ -735,7 +741,7 @@ public class XMLRPCClient { cookieManager.readCookies(http); - return responseParser.parse(istream); + return responseParser.parse(istream, isFlagSet(FLAGS_DEBUG)); } catch(SocketTimeoutException ex) { throw new XMLRPCTimeoutException("The XMLRPC call timed out."); diff --git a/src/main/java/de/timroes/axmlrpc/serializer/DateTimeSerializer.java b/src/main/java/de/timroes/axmlrpc/serializer/DateTimeSerializer.java index b1410c0..009251a 100644 --- a/src/main/java/de/timroes/axmlrpc/serializer/DateTimeSerializer.java +++ b/src/main/java/de/timroes/axmlrpc/serializer/DateTimeSerializer.java @@ -1,14 +1,13 @@ package de.timroes.axmlrpc.serializer; import java.text.SimpleDateFormat; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import org.w3c.dom.Element; import de.timroes.axmlrpc.XMLRPCException; import de.timroes.axmlrpc.XMLUtil; import de.timroes.axmlrpc.xmlcreator.XmlElement; +import fr.turri.jiso8601.Iso8601Deserializer; /** * @@ -16,10 +15,8 @@ import de.timroes.axmlrpc.xmlcreator.XmlElement; */ public class DateTimeSerializer implements Serializer { - private static final String DATETIME_FORMAT = "yyyyMMdd'T'HH:mm:ss"; + private static final String DATETIME_FORMAT = "yyyyMMdd'T'HHmmss"; private static final SimpleDateFormat DATE_FORMATER = new SimpleDateFormat(DATETIME_FORMAT); - private static final Pattern PATTERN_WITHOUT_COLON = Pattern.compile("(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\+\\d{2})(\\d{2})"); - private static final Pattern PATTERN_LEGACY = Pattern.compile("(\\d{4})(\\d{2})(\\d{2}T\\d{2}:\\d{2}:\\d{2})"); @Override public Object deserialize(Element content) throws XMLRPCException { @@ -28,27 +25,12 @@ public class DateTimeSerializer implements Serializer { public Object deserialize(String dateStr) throws XMLRPCException { try { - String value = formatStringIfNeeded(dateStr); - return javax.xml.bind.DatatypeConverter.parseDateTime(value).getTime(); + return Iso8601Deserializer.toDate(dateStr); } catch (Exception ex) { throw new XMLRPCException("Unable to parse given date.", ex); } } - private static String formatStringIfNeeded(String dateStr){ - Matcher matcherWithoutColon = PATTERN_WITHOUT_COLON.matcher(dateStr); - if ( matcherWithoutColon.matches() ){ - return matcherWithoutColon.group(1) + ":" + matcherWithoutColon.group(2); - } - - Matcher matcherLegacy = PATTERN_LEGACY.matcher(dateStr); - if ( matcherLegacy.matches() ){ - return matcherLegacy.group(1) + "-" + matcherLegacy.group(2) + "-" + matcherLegacy.group(3); - } - - return dateStr; - } - @Override public XmlElement serialize(Object object) { return XMLUtil.makeXmlTag(SerializerHandler.TYPE_DATETIME, diff --git a/src/test/java/de/timeroes/axmlrpc/TestResponseParser.java b/src/test/java/de/timeroes/axmlrpc/TestResponseParser.java new file mode 100644 index 0000000..a0292d4 --- /dev/null +++ b/src/test/java/de/timeroes/axmlrpc/TestResponseParser.java @@ -0,0 +1,68 @@ +package de.timeroes.axmlrpc; + +import java.net.URL; + +import org.junit.Test; + +import static com.github.tomakehurst.wiremock.client.WireMock.*; +import static org.junit.Assert.*; + +import org.junit.Rule; + +import com.github.tomakehurst.wiremock.junit.WireMockRule; + +import de.timroes.axmlrpc.XMLRPCClient; + +public class TestResponseParser { + private final int port = 8080; + private final String endPoint = "/dummyEndPoint"; + + @Rule + public WireMockRule wireMockRule = new WireMockRule(port); + + @Test + public void canParseString() throws Exception { + setMockWithXmlRpcContent("<value><string>toto</string></value>"); + assertEquals("toto", makeDummyCall()); + } + + @Test + public void canParseAsStringWhenTypeIsntExplicitelyProvided() throws Exception { + setMockWithXmlRpcContent("<value>toto</value>"); + assertEquals("toto", makeDummyCall(XMLRPCClient.FLAGS_DEFAULT_TYPE_STRING)); + } + + @Test + public void canParseInt() throws Exception { + setMockWithXmlRpcContent("<value><i4>32</i4></value>"); + assertEquals(32, makeDummyCall()); + + setMockWithXmlRpcContent("<value><int>33</int></value>"); + assertEquals(33, makeDummyCall()); + } + + @Test + public void canParseBoolean() throws Exception { + setMockWithXmlRpcContent("<value><boolean>1</boolean></value>"); + assertEquals(true, makeDummyCall()); + + setMockWithXmlRpcContent("<value><boolean>0</boolean></value>"); + assertEquals(false, makeDummyCall()); + } + + private void setMockWithXmlRpcContent(String content){ + stubFor(post(urlEqualTo(endPoint)) + .willReturn(aResponse() + .withStatus(200) + .withBody("<methodResponse><params><param>" + content + "</param></params></methodResponse>") + )); + } + + private Object makeDummyCall() throws Exception { + return makeDummyCall(XMLRPCClient.FLAGS_NONE); + } + + private Object makeDummyCall(int flags) throws Exception { + return new XMLRPCClient(new URL("http://localhost:" + port + endPoint), flags).call("dummy_method"); + } +} diff --git a/src/test/java/de/timeroes/base64/TestBase64.java b/src/test/java/de/timeroes/base64/TestBase64.java new file mode 100644 index 0000000..02dafeb --- /dev/null +++ b/src/test/java/de/timeroes/base64/TestBase64.java @@ -0,0 +1,24 @@ +package de.timeroes.base64; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import de.timroes.base64.Base64; + +public class TestBase64 { + + @Test + public void canEncode(){ + assertEquals("TWFu", Base64.encode("Man")); + assertEquals("TWE=", Base64.encode("Ma")); + assertEquals("TQ==", Base64.encode("M")); + } + + @Test + public void canDecode(){ + assertEquals("Man", Base64.decodeAsString("TWFu")); + assertEquals("Ma", Base64.decodeAsString("TWE=")); + assertEquals("M", Base64.decodeAsString("TQ==")); + } +} diff --git a/src/test/java/de/timroes/axmlrpc/serializer/TestDateTimeSerializer.java b/src/test/java/de/timroes/axmlrpc/serializer/TestDateTimeSerializer.java index fce8b13..67dff3f 100644 --- a/src/test/java/de/timroes/axmlrpc/serializer/TestDateTimeSerializer.java +++ b/src/test/java/de/timroes/axmlrpc/serializer/TestDateTimeSerializer.java @@ -1,33 +1,128 @@ package de.timroes.axmlrpc.serializer; import static org.junit.Assert.*; +import org.junit.*; import java.util.Date; +import java.util.TimeZone; public class TestDateTimeSerializer { - private static final Date EXPECTED_DATE = new Date(85, 2, 4, 12, 13, 14); + private TimeZone _previousTZ; - @org.junit.Test - public void canParseLegacyDates() throws Exception { - Date date = (Date) new DateTimeSerializer().deserialize("19850304T12:13:14"); - assertDatesCloseEnough(EXPECTED_DATE, date); + @Before + public void setUp(){ + _previousTZ = TimeZone.getDefault(); + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); } - @org.junit.Test - public void canParseDateWithoutSemiColon() throws Exception { - Date date = (Date) new DateTimeSerializer().deserialize("1985-03-04T12:13:14+0100"); - assertDatesCloseEnough(EXPECTED_DATE, date); + @After + public void tearDown(){ + TimeZone.setDefault(_previousTZ); } - @org.junit.Test - public void canParseDateWithSemiColon() throws Exception { - Date date = (Date) new DateTimeSerializer().deserialize("1985-03-04T12:13:14+01:00"); - assertDatesCloseEnough(EXPECTED_DATE, date); + @Test + public void canParseBasicFormatDate() throws Exception { + assertDeserializeEquals(new Date(85, 2, 4), "19850304"); } - //Because I don't want the tests to fail if the user isn't in my timezone - private void assertDatesCloseEnough(Date expected, Date actual){ - long differenceInMs = Math.abs(expected.getTime() - actual.getTime()); - assertTrue(differenceInMs < 24 * 60 * 60 * 1000); + @Test + public void canParseExtendedFormatDate() throws Exception { + assertDeserializeEquals(new Date(85, 2, 4), "1985-03-04"); + } + + @Test + public void canParseDateWithoutDay() throws Exception { + assertDeserializeEquals(new Date(85, 2, 1), "1985-03"); + } + + @Test + public void canParseDateWithoutMonth() throws Exception { + assertDeserializeEquals(new Date(85, 0, 1), "1985"); + } + + @Test + public void canParseBasicFormatHour() throws Exception { + assertDeserializeEquals(new Date(85, 2, 4, 12, 21, 36), "19850304T122136"); + } + + @Test + public void canParseExtendedFormatHour() throws Exception { + assertDeserializeEquals(new Date(85, 2, 4, 12, 21, 36), "1985-03-04T12:21:36"); + } + + @Test + public void canParseHourWithoutMinute() throws Exception { + assertDeserializeEquals(new Date(85, 2, 4, 12, 0), "1985-03-04T12"); + } + + @Test + public void canParseHourWithoutSecond() throws Exception { + assertDeserializeEquals(new Date(85, 2, 4, 12, 10), "1985-03-04T12:10"); + } + + @Test + public void canParseDecimalPartOfAMinute() throws Exception { + assertDeserializeEquals(new Date(85, 2, 4, 12, 21, 15), "1985-03-04T12:21.25"); + assertDeserializeEquals(new Date(85, 2, 4, 12, 21, 30), "1985-03-04T12:21.5"); + } + + @Test + public void canParseDecimalPartOfAnHour() throws Exception { + assertDeserializeEquals(new Date(85, 2, 4, 12, 15), "1985-03-04T12.25"); + assertDeserializeEquals(new Date(85, 2, 4, 12, 0, 36), "1985-03-04T12.01"); + } + + @Test + public void canParseMilliseconds() throws Exception { + Date ms500 = (Date) new DateTimeSerializer().deserialize("1985-03-04T12:21:36.5"); + assertEquals(500, ms500.getTime() - new Date(85, 2, 4, 12, 21, 36).getTime()); + } + + @Test + public void canParseUTCHour() throws Exception { + Date expected = new Date(85, 2, 4, 12, 21, 36); + assertDeserializeEquals(expected, "1985-03-04T12:21:36Z"); + + // When timezone is explicit, we should get the exact same date regardless of this computer default timezone + TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles")); + assertDeserializeEquals(expected, "1985-03-04T12:21:36Z"); + } + + @Test + public void canParseBasicFormatTimeOffset() throws Exception { + Date expected = new Date(85, 2, 4, 1, 40, 31); + assertDeserializeEquals(expected, "19850304T131031+1130"); + + // When timezone is explicit, we should get the exact same date regardless of this computer default timezone + TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles")); + assertDeserializeEquals(expected, "19850304T131031+1130"); + } + + @Test + public void canParseExtendedFormatTimeOffset() throws Exception { + assertDeserializeEquals(new Date(85, 2, 4, 1, 40, 31), "1985-03-04T13:10:31+11:30"); + } + + @Test + public void canParseTimeOffsetWithoutMinute() throws Exception { + assertDeserializeEquals(new Date(85, 2, 4, 2, 10, 31), "1985-03-04T13:10:31+11"); + } + + @Test + public void canParseNegativeTimeOffset() throws Exception { + assertDeserializeEquals(new Date(85, 2, 4, 22, 30, 31), "1985-03-04T13:10:31-09:20"); + } + + @Test + public void canHandleLimitCases() throws Exception { + assertDeserializeEquals(new Date(80, 0, 1), "1980-01-01T00:00:00.0Z"); + assertDeserializeEquals(new Date(80, 0, 1), "1980-01-01T00Z"); + assertDeserializeEquals(new Date(81, 11, 31, 23, 59, 59), "1981-12-31T23:59:59Z"); + } + + private void assertDeserializeEquals(Date expected, String toDeserialize) throws Exception { + Date date = (Date) new DateTimeSerializer().deserialize(toDeserialize); + long diffMs = date.getTime() - expected.getTime(); + assertEquals(expected, date); } } diff --git a/src/test/java/de/timroes/axmlrpc/serializer/TestSerializers.java b/src/test/java/de/timroes/axmlrpc/serializer/TestSerializers.java new file mode 100644 index 0000000..0288d87 --- /dev/null +++ b/src/test/java/de/timroes/axmlrpc/serializer/TestSerializers.java @@ -0,0 +1,62 @@ +package de.timroes.axmlrpc.serializer; + +import static org.junit.Assert.*; + +import java.util.Date; + +import org.junit.Test; + +import de.timroes.axmlrpc.xmlcreator.XmlElement; + +public class TestSerializers { + + @Test + public void canSerializeBase64(){ + assertExpectedSerialized("<base64>AQIDBA==</base64>", new Base64Serializer().serialize(new Byte[]{1, 2, 3, 4})); + } + + @Test + public void canSerializeBoolean(){ + assertExpectedSerialized("<boolean>1</boolean>", new BooleanSerializer().serialize(true)); + assertExpectedSerialized("<boolean>0</boolean>", new BooleanSerializer().serialize(false)); + } + + @Test + public void canSerializeDouble(){ + assertExpectedSerialized("<double>3.2</double>", new DoubleSerializer().serialize(3.2)); + } + + @Test + public void canSerializeDate(){ + assertExpectedSerialized("<dateTime.iso8601>19850503T122334</dateTime.iso8601>", + new DateTimeSerializer().serialize(new Date(85, 4, 3, 12, 23, 34))); + } + + @Test + public void canSerializeInt(){ + assertExpectedSerialized("<int>4</int>", new IntSerializer().serialize(4)); + } + + @Test + public void canSerializeLong(){ + assertExpectedSerialized("<i8>1234</i8>", new LongSerializer().serialize(1234L)); + } + + @Test + public void canSerializeNullElement(){ + assertExpectedSerialized("<nil/>", new NullSerializer().serialize(null)); + } + + @Test + public void canSerializeString(){ + boolean encodeString = true; + assertExpectedSerialized("<string>te<&>st</string>", new StringSerializer(encodeString, true).serialize("te<&>st")); + + encodeString = false; + assertExpectedSerialized("<string>te<&>st</string>", new StringSerializer(encodeString, true).serialize("te<&>st")); + } + + private static void assertExpectedSerialized(String expected, XmlElement actual){ + assertEquals(expected, actual.toString().trim()); + } +} -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/axmlrpc.git _______________________________________________ pkg-java-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-java-commits

