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 {