diff --git a/.travis.yml b/.travis.yml
index e350ebca..9dd53cb4 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,3 +5,6 @@ jdk:
- openjdk7
- oraclejdk7
- oraclejdk8
+
+after_success:
+ - mvn clean cobertura:cobertura coveralls:report
diff --git a/phabricator-plugin.iml b/phabricator-plugin.iml
index ee8e5638..ba37b2f1 100644
--- a/phabricator-plugin.iml
+++ b/phabricator-plugin.iml
@@ -6,6 +6,7 @@
+
diff --git a/pom.xml b/pom.xml
index 8d26791a..455dc026 100644
--- a/pom.xml
+++ b/pom.xml
@@ -55,12 +55,14 @@
cobertura
1.9.6
+
net.sf.trove4j
trove4j
3.0.3
jar
+
net.java.dev.jna
jna
@@ -68,6 +70,28 @@
+
+
+
+ org.eluder.coveralls
+ coveralls-maven-plugin
+ 3.1.0
+
+
+
+ org.codehaus.mojo
+ cobertura-maven-plugin
+ 2.6
+
+ xml
+ 256m
+
+ true
+
+
+
+
+
scm:git:ssh://github.com/jenkinsci/phabricator-plugin.git
scm:git:ssh://git@github.com/jenkinsci/phabricator-plugin.git
diff --git a/src/test/java/com/uber/jenkins/phabricator/conduit/ArcanistClientTest.java b/src/test/java/com/uber/jenkins/phabricator/conduit/ArcanistClientTest.java
new file mode 100644
index 00000000..e1ff2a18
--- /dev/null
+++ b/src/test/java/com/uber/jenkins/phabricator/conduit/ArcanistClientTest.java
@@ -0,0 +1,84 @@
+// Copyright (c) 2015 Uber Technologies, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+package com.uber.jenkins.phabricator.conduit;
+
+import hudson.Launcher;
+import net.sf.json.JSONException;
+import net.sf.json.JSONObject;
+import org.junit.Rule;
+import org.junit.Test;
+import org.jvnet.hudson.test.JenkinsRule;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class ArcanistClientTest {
+ @Rule
+ public JenkinsRule j = new JenkinsRule();
+
+ Map emptyParams = new HashMap();
+
+ @Test
+ public void testEcho() throws Exception {
+ ArcanistClient client = new ArcanistClient("echo", "hello", emptyParams, null);
+
+ int result = client.callConduit(getLauncher().launch(), System.err);
+ assertEquals(result, 0);
+ }
+
+ @Test
+ public void testEchoWithToken() throws Exception {
+ ArcanistClient client = new ArcanistClient("echo", "tokentest", emptyParams, "notarealtoken");
+
+ int result = client.callConduit(getLauncher().launch(), System.err);
+ assertEquals(result, 0);
+ }
+
+ @Test
+ public void testParseConduit() throws Exception {
+ String jsonString = "{\"hello\": \"world\"}";
+ ArcanistClient client = new ArcanistClient("echo", jsonString, emptyParams, null);
+
+ JSONObject result = client.parseConduit(getLauncher().launch(), System.err);
+ assertTrue(result.has("hello"));
+ assertEquals(result.getString("hello"), "world");
+ }
+
+ @Test(expected = ArcanistUsageException.class)
+ public void testNonZeroExitCode() throws Exception {
+ ArcanistClient client = new ArcanistClient("false", "", emptyParams, null);
+
+ client.parseConduit(getLauncher().launch(), System.err);
+ }
+
+ @Test(expected = JSONException.class)
+ public void testNonJsonOutput() throws Exception {
+ ArcanistClient client = new ArcanistClient("echo", "not-json", emptyParams, null);
+ client.parseConduit(getLauncher().launch(), System.err);
+ }
+
+ private Launcher getLauncher() {
+ return j.createLocalLauncher();
+ }
+}
\ No newline at end of file