LogServletTest: Use TypeToken to simplify JSON construction

Change-Id: I1c6822b7261e0348393a215bb38b0d10c3882bae
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java b/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java
index 20cb9cd..b1d8d8f 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java
@@ -37,6 +37,12 @@
   static final ImmutableSet<Field> DEFAULT_FIELDS = Sets.immutableEnumSet(
       Field.SHA, Field.TREE, Field.PARENTS, Field.AUTHOR, Field.COMMITTER, Field.MESSAGE);
 
+  public static class Log {
+    public List<Commit> log;
+    public String previous;
+    public String next;
+  }
+
   public static class Ident {
     public String name;
     public String email;
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
index 41a0239..ce9d38a 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
@@ -156,21 +156,21 @@
 
     try {
       DateFormatter df = new DateFormatter(getAccess(req), Format.DEFAULT);
-      Map<String, Object> result = Maps.newLinkedHashMap();
+      CommitJsonData.Log result = new CommitJsonData.Log();
       List<CommitJsonData.Commit> entries = Lists.newArrayListWithCapacity(paginator.getLimit());
       for (RevCommit c : paginator) {
         paginator.getWalk().parseBody(c);
         entries.add(new CommitJsonData().setRevWalk(paginator.getWalk())
             .toJsonData(req, c, fs, df));
       }
-      result.put("log", entries);
+      result.log = entries;
       if (paginator.getPreviousStart() != null) {
-        result.put("previous", paginator.getPreviousStart().name());
+        result.previous = paginator.getPreviousStart().name();
       }
       if (paginator.getNextStart() != null) {
-        result.put("next", paginator.getNextStart().name());
+        result.next = paginator.getNextStart().name();
       }
-      renderJson(req, res, result, new TypeToken<Map<String, Object>>() {}.getType());
+      renderJson(req, res, result, new TypeToken<CommitJsonData.Log>() {}.getType());
     } finally {
       paginator.getWalk().close();
     }
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/LogServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/LogServletTest.java
index 0acb39d..261afec 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/LogServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/LogServletTest.java
@@ -16,11 +16,10 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import com.google.gitiles.CommitJsonData.Commit;
+import com.google.gitiles.CommitJsonData.Log;
 import com.google.gitiles.DateFormatter.Format;
-import com.google.gson.FieldNamingPolicy;
-import com.google.gson.GsonBuilder;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
+import com.google.gson.reflect.TypeToken;
 
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.junit.Test;
@@ -32,21 +31,16 @@
 /** Tests for {@link LogServlet}. */
 @RunWith(JUnit4.class)
 public class LogServletTest extends ServletTest {
+  private static final TypeToken<Log> LOG = new TypeToken<Log>() {};
+
   @Test
   public void basicLog() throws Exception {
     RevCommit commit = repo.branch("HEAD").commit().create();
-    repo.getRevWalk().parseBody(commit);
 
-    JsonElement result = buildJson("/repo/+log", "");
-    JsonArray log = result.getAsJsonObject().get("log").getAsJsonArray();
-
-    GitilesAccess access = new TestGitilesAccess(repo.getRepository()).forRequest(null);
-    DateFormatter df = new DateFormatter(access, Format.DEFAULT);
-
-    assertThat(log).hasSize(1);
-    CommitJsonData.Commit jsonCommit = getJsonCommit(log.get(0));
-    verifyJsonCommit(jsonCommit, commit, df);
-    assertThat(jsonCommit.treeDiff).isNull();
+    Log response = buildJson("/repo/+log", LOG.getType(), "");
+    assertThat(response.log).hasSize(1);
+    verifyJsonCommit(response.log.get(0), commit);
+    assertThat(response.log.get(0).treeDiff).isNull();
   }
 
   @Test
@@ -55,40 +49,29 @@
     String contents2 = "foo\ncontents\n";
     RevCommit c1 = repo.update("master", repo.commit().add("foo", contents1));
     RevCommit c2 = repo.update("master", repo.commit().parent(c1).add("foo", contents2));
-    repo.getRevWalk().parseBody(c1);
-    repo.getRevWalk().parseBody(c2);
 
-    JsonElement result = buildJson("/repo/+log/master", "&name-status=1");
-    JsonArray log = result.getAsJsonObject().get("log").getAsJsonArray();
+    Log response = buildJson("/repo/+log/master", LOG.getType(), "&name-status=1");
+    assertThat(response.log).hasSize(2);
 
+    Commit jc2 = response.log.get(0);
+    verifyJsonCommit(jc2, c2);
+    assertThat(jc2.treeDiff).hasSize(1);
+    assertThat(jc2.treeDiff.get(0).type).isEqualTo("modify");
+    assertThat(jc2.treeDiff.get(0).oldPath).isEqualTo("foo");
+    assertThat(jc2.treeDiff.get(0).newPath).isEqualTo("foo");
+
+    Commit jc1 = response.log.get(1);
+    verifyJsonCommit(jc1, c1);
+    assertThat(jc1.treeDiff).hasSize(1);
+    assertThat(jc1.treeDiff.get(0).type).isEqualTo("add");
+    assertThat(jc1.treeDiff.get(0).oldPath).isEqualTo("/dev/null");
+    assertThat(jc1.treeDiff.get(0).newPath).isEqualTo("foo");
+  }
+
+  private void verifyJsonCommit(Commit jsonCommit, RevCommit commit) throws Exception {
+    repo.getRevWalk().parseBody(commit);
     GitilesAccess access = new TestGitilesAccess(repo.getRepository()).forRequest(null);
     DateFormatter df = new DateFormatter(access, Format.DEFAULT);
-
-    assertThat(log).hasSize(2);
-
-    CommitJsonData.Commit jsonCommit2 = getJsonCommit(log.get(0));
-    verifyJsonCommit(jsonCommit2, c2, df);
-    assertThat(jsonCommit2.treeDiff).hasSize(1);
-    assertThat(jsonCommit2.treeDiff.get(0).type).isEqualTo("modify");
-    assertThat(jsonCommit2.treeDiff.get(0).oldPath).isEqualTo("foo");
-    assertThat(jsonCommit2.treeDiff.get(0).newPath).isEqualTo("foo");
-
-    CommitJsonData.Commit jsonCommit1 = getJsonCommit(log.get(1));
-    verifyJsonCommit(jsonCommit1, c1, df);
-    assertThat(jsonCommit1.treeDiff.get(0).type).isEqualTo("add");
-    assertThat(jsonCommit1.treeDiff.get(0).oldPath).isEqualTo("/dev/null");
-    assertThat(jsonCommit1.treeDiff.get(0).newPath).isEqualTo("foo");
-  }
-
-  private CommitJsonData.Commit getJsonCommit(JsonElement element) {
-    GsonBuilder builder = new GsonBuilder();
-    builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
-    return builder.create().fromJson(element, CommitJsonData.Commit.class);
-  }
-
-  private void verifyJsonCommit(
-      CommitJsonData.Commit jsonCommit, RevCommit commit, DateFormatter df)
-      throws Exception {
     assertThat(jsonCommit.commit).isEqualTo(commit.name());
     assertThat(jsonCommit.tree).isEqualTo(commit.getTree().name());
 
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/ServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/ServletTest.java
index 3eac7ea..83469a2 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/ServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/ServletTest.java
@@ -20,9 +20,9 @@
 import static javax.servlet.http.HttpServletResponse.SC_OK;
 
 import com.google.common.net.HttpHeaders;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonParser;
+import com.google.gson.FieldNamingPolicy;
 import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
 
 import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
 import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
@@ -101,16 +101,28 @@
     return body.substring(magic.length());
   }
 
-  protected JsonElement buildJson(String path, String additionalQueryString) throws Exception {
-    return new JsonParser().parse(buildJsonRaw(path, additionalQueryString));
+  protected <T> T buildJson(String path, Class<T> classOfT, String additionalQueryString)
+      throws Exception {
+    return newGson().fromJson(buildJsonRaw(path, additionalQueryString), classOfT);
   }
 
   protected <T> T buildJson(String path, Class<T> classOfT) throws Exception {
-    return new Gson().fromJson(buildJsonRaw(path, ""), classOfT);
+    return buildJson(path, classOfT, "");
+  }
+
+  protected <T> T buildJson(String path, Type typeOfT, String additionalQueryString)
+      throws Exception {
+    return newGson().fromJson(buildJsonRaw(path, additionalQueryString), typeOfT);
   }
 
   protected <T> T buildJson(String path, Type typeOfT) throws Exception {
-    return new Gson().<T>fromJson(buildJsonRaw(path, ""), typeOfT);
+    return buildJson(path, typeOfT, "");
+  }
+
+  private static Gson newGson() {
+    return new GsonBuilder()
+        .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
+        .create();
   }
 
   protected void assertNotFound(String path, String queryString) throws Exception {