Refactoring the code to make classes testable

Now, instead of passing the parameters to establish a connection to the whole
chain of classes, dependency injection is used to simplify the class
dependencies.

Given the injection stack is limited when doing the site initialization,
circumvent it by calling directly the class responsible for establishing
the connection.

Change-Id: Id933998dfa30d188b6cfcece6e5355fd6a8079cd
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/jira/InitJira.java b/src/main/java/com/googlesource/gerrit/plugins/its/jira/InitJira.java
index 77d2b1b..59cb1bd 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/jira/InitJira.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/jira/InitJira.java
@@ -14,6 +14,7 @@
 
 package com.googlesource.gerrit.plugins.its.jira;
 
+import com.google.common.base.Strings;
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.pgm.init.api.AllProjectsConfig;
 import com.google.gerrit.pgm.init.api.AllProjectsNameOnInitProvider;
@@ -24,6 +25,8 @@
 import com.google.inject.Singleton;
 import com.googlesource.gerrit.plugins.its.base.its.InitIts;
 import com.googlesource.gerrit.plugins.its.base.validation.ItsAssociationPolicy;
+import com.googlesource.gerrit.plugins.its.jira.restapi.JiraServerInfo;
+import com.googlesource.gerrit.plugins.its.jira.restapi.JiraServerInfoRestApi;
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -126,8 +129,13 @@
   private boolean isJiraConnectSuccessful() {
     ui.message("Checking Jira connectivity ... ");
     try {
-      new JiraClient(jiraUrl, jiraUsername, jiraPassword).sysInfo().getVersion();
-      ui.message("[OK]\n");
+      JiraServerInfo serverInfo =
+          new JiraServerInfoRestApi(jiraUrl, jiraUsername, jiraPassword).get();
+      if (Strings.isNullOrEmpty(serverInfo.getVersion())) {
+        ui.message("*ERROR* Jira returned an empty version number");
+        return false;
+      }
+      ui.message("[OK] - Jira Ver {}\n", serverInfo.getVersion());
       return true;
     } catch (IOException e) {
       ui.message("*FAILED* (%s)\n", e.toString());
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/jira/JiraClient.java b/src/main/java/com/googlesource/gerrit/plugins/its/jira/JiraClient.java
index 7311a9b..4a77ca3 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/jira/JiraClient.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/jira/JiraClient.java
@@ -31,7 +31,6 @@
 import com.googlesource.gerrit.plugins.its.jira.restapi.JiraServerInfo;
 import com.googlesource.gerrit.plugins.its.jira.restapi.JiraTransition;
 import java.io.IOException;
-import java.net.URL;
 import java.util.Arrays;
 import java.util.List;
 import org.slf4j.Logger;
@@ -44,19 +43,8 @@
   private final Gson gson;
 
   @Inject
-  public JiraClient(JiraConfig jiraConfig) {
-    this(jiraConfig.getJiraUrl(), jiraConfig.getUsername(), jiraConfig.getPassword());
-  }
-
-  /**
-   * This constructor is kept to allow testing connectivity from the init class
-   *
-   * @param url jira url
-   * @param user username of the jira user
-   * @param pass password of the jira user
-   */
-  JiraClient(URL url, String user, String pass) {
-    this.apiBuilder = new JiraRestApiProvider(url, user, pass);
+  public JiraClient(JiraRestApiProvider apiBuilder) {
+    this.apiBuilder = apiBuilder;
     this.gson = new Gson();
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApi.java b/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApi.java
index 35f70ce..450ac47 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApi.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApi.java
@@ -17,6 +17,7 @@
 import static com.googlesource.gerrit.plugins.its.jira.UrlHelper.*;
 
 import com.google.gson.Gson;
+import com.google.inject.Inject;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
@@ -30,7 +31,9 @@
 
 /** Jira Rest Client. */
 public class JiraRestApi<T> {
+
   private static final String BASE_PREFIX = "rest/api/2";
+
   private final URL baseUrl;
   private final String auth;
   private final Gson gson;
@@ -45,14 +48,21 @@
    * @param url jira url
    * @param user username of the jira user
    * @param pass password of the jira user
+   * @param classOfT class type of the object requested
+   * @param classPrefix prefix for the rest api request
    */
-  JiraRestApi(URL url, String user, String pass, Class<T> classOfT, String classPrefix) {
-    this.auth = Base64.getEncoder().encodeToString((user + ":" + pass).getBytes());
+  @Inject
+  public JiraRestApi(URL url, String user, String pass, Class<T> classOfT, String classPrefix) {
+    this.auth = encode(user, pass);
     this.baseUrl = resolveUrl(url, BASE_PREFIX, classPrefix, "/");
     this.gson = new Gson();
     this.classOfT = classOfT;
   }
 
+  private static String encode(String user, String pass) {
+    return Base64.getEncoder().encodeToString((user + ":" + pass).getBytes());
+  }
+
   public int getResponseCode() {
     return responseCode;
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApiProvider.java b/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApiProvider.java
index 37534a5..d09441a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApiProvider.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApiProvider.java
@@ -14,21 +14,24 @@
 
 package com.googlesource.gerrit.plugins.its.jira.restapi;
 
-import java.net.URL;
+import com.google.inject.Inject;
+import com.googlesource.gerrit.plugins.its.jira.JiraConfig;
 
 public class JiraRestApiProvider {
-  private final URL url;
-  private final String user;
-  private final String pass;
+  private JiraConfig jiraConfig;
 
-  public JiraRestApiProvider(URL url, String user, String pass) {
-    this.url = url;
-    this.user = user;
-    this.pass = pass;
+  @Inject
+  public JiraRestApiProvider(JiraConfig jiraConfig) {
+    this.jiraConfig = jiraConfig;
   }
 
   public <T> JiraRestApi<T> get(Class<T> classOfT, String classPrefix) {
-    return new JiraRestApi<>(url, user, pass, classOfT, classPrefix);
+    return new JiraRestApi<>(
+        jiraConfig.getJiraUrl(),
+        jiraConfig.getUsername(),
+        jiraConfig.getPassword(),
+        classOfT,
+        classPrefix);
   }
 
   public JiraRestApi<JiraIssue> getIssue() {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraServerInfoRestApi.java b/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraServerInfoRestApi.java
new file mode 100644
index 0000000..10a4c91
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraServerInfoRestApi.java
@@ -0,0 +1,31 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// 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.googlesource.gerrit.plugins.its.jira.restapi;
+
+import static java.net.HttpURLConnection.HTTP_OK;
+
+import java.io.IOException;
+import java.net.URL;
+
+public class JiraServerInfoRestApi extends JiraRestApi<JiraServerInfo> {
+
+  public JiraServerInfoRestApi(URL url, String user, String pass) {
+    super(url, user, pass, JiraServerInfo.class, "/serverInfo/");
+  }
+
+  public JiraServerInfo get() throws IOException {
+    return doGet("", HTTP_OK);
+  }
+}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApiTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApiTest.java
index b87b591..073a03c 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApiTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApiTest.java
@@ -16,38 +16,48 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import com.google.common.base.CharMatcher;
+import java.net.MalformedURLException;
 import java.net.URL;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnitRunner;
 
+@RunWith(MockitoJUnitRunner.class)
+@SuppressWarnings({"unchecked", "rawtypes"})
 public class JiraRestApiTest {
+  private static final String ISSUE_CLASS_PREFIX = "/issue/";
+
+  private URL url;
+  private String user = "user";
+  private String password = "pass";
+  private JiraRestApi restApi;
+
+  private void setURL(String jiraUrl) throws MalformedURLException {
+    url = new URL(CharMatcher.is('/').trimFrom(jiraUrl) + "/");
+  }
 
   @Test
   public void testJiraServerInfoForNonRootJiraUrl() throws Exception {
-    URL nonRootJiraUrl = new URL("http://jira.mycompany.com/myroot/");
-    JiraRestApi<JiraServerInfo> serverInfo =
-        new JiraRestApiProvider(nonRootJiraUrl, "", "").getServerInfo();
-
-    String jiraApiUrl = serverInfo.getBaseUrl().toString();
-    assertThat(jiraApiUrl).startsWith(nonRootJiraUrl.toString());
+    setURL("http://jira.mycompany.com/myroot/");
+    restApi = new JiraRestApi(url, user, password, JiraIssue.class, ISSUE_CLASS_PREFIX);
+    String jiraApiUrl = restApi.getBaseUrl().toString();
+    assertThat(jiraApiUrl).startsWith(url.toString());
   }
 
   @Test
   public void testJiraServerInfoForNonRootJiraUrlNotEndingWithSlash() throws Exception {
-    URL nonRootJiraUrl = new URL("http://jira.mycompany.com/myroot/");
-    JiraRestApi<JiraServerInfo> serverInfo =
-        new JiraRestApiProvider(nonRootJiraUrl, "", "").getServerInfo();
-
-    String jiraApiUrl = serverInfo.getBaseUrl().toString();
-    assertThat(jiraApiUrl).startsWith(nonRootJiraUrl.toString());
+    setURL("http://jira.mycompany.com/myroot");
+    restApi = new JiraRestApi(url, user, password, JiraIssue.class, ISSUE_CLASS_PREFIX);
+    String jiraApiUrl = restApi.getBaseUrl().toString();
+    assertThat(jiraApiUrl).startsWith(url.toString());
   }
 
   @Test
   public void testJiraServerInfoForRootJiraUrl() throws Exception {
-    URL rootJiraUrl = new URL("http://jira.mycompany.com");
-    JiraRestApi<JiraServerInfo> serverInfo =
-        new JiraRestApiProvider(rootJiraUrl, "", "").getServerInfo();
-
-    String jiraApiUrl = serverInfo.getBaseUrl().toString();
-    assertThat(jiraApiUrl).startsWith(rootJiraUrl.toString());
+    setURL("http://jira.mycompany.com");
+    restApi = new JiraRestApi(url, user, password, JiraIssue.class, ISSUE_CLASS_PREFIX);
+    String jiraApiUrl = restApi.getBaseUrl().toString();
+    assertThat(jiraApiUrl).startsWith(url.toString());
   }
 }