blob: 4311833fa573d96cabbc610abf72021396355be1 [file] [log] [blame]
Dave Borowitzb7fd3f32014-05-01 12:31:25 -07001// Copyright (C) 2014 Google Inc. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package com.google.gitiles;
16
Dave Borowitzfde41fd2015-09-16 15:14:38 -040017import static com.google.common.truth.Truth.assertThat;
Dave Borowitz4f568702014-05-01 19:54:57 -070018import static java.nio.charset.StandardCharsets.UTF_8;
AJ Ross001ea9b2016-08-23 13:40:04 -070019import static javax.servlet.http.HttpServletResponse.SC_OK;
Dave Borowitzb7fd3f32014-05-01 12:31:25 -070020
Dave Borowitz4f568702014-05-01 19:54:57 -070021import com.google.common.io.BaseEncoding;
AJ Ross001ea9b2016-08-23 13:40:04 -070022import com.google.common.net.HttpHeaders;
Andrew Bonventre199efc42017-05-10 13:57:39 -070023import com.google.gitiles.FileJsonData.File;
Dave Borowitz3c441502014-09-05 16:06:37 -070024import com.google.gitiles.TreeJsonData.Tree;
Dave Borowitzb7fd3f32014-05-01 12:31:25 -070025import com.google.template.soy.data.SoyListData;
26import com.google.template.soy.data.restricted.StringData;
Dave Borowitz3b744b12016-08-19 16:11:10 -040027import java.util.List;
28import java.util.Map;
Dave Borowitzb7fd3f32014-05-01 12:31:25 -070029import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
30import org.eclipse.jgit.dircache.DirCacheEntry;
Dave Borowitzb7fd3f32014-05-01 12:31:25 -070031import org.eclipse.jgit.lib.FileMode;
32import org.eclipse.jgit.lib.ObjectId;
33import org.eclipse.jgit.revwalk.RevBlob;
Dave Borowitz2387b142014-05-02 16:56:27 -070034import org.eclipse.jgit.revwalk.RevCommit;
Dave Borowitz228f3572014-05-02 14:26:25 -070035import org.eclipse.jgit.revwalk.RevTree;
Dave Borowitzb7fd3f32014-05-01 12:31:25 -070036import org.junit.Test;
Dave Borowitz3dc854f2014-11-04 16:19:37 -080037import org.junit.runner.RunWith;
38import org.junit.runners.JUnit4;
Dave Borowitzb7fd3f32014-05-01 12:31:25 -070039
Dave Borowitzb7fd3f32014-05-01 12:31:25 -070040/** Tests for {@PathServlet}. */
41@SuppressWarnings("unchecked")
Dave Borowitz3dc854f2014-11-04 16:19:37 -080042@RunWith(JUnit4.class)
Nodir Turakulov4bc26002015-08-18 18:24:37 -070043public class PathServletTest extends ServletTest {
Dave Borowitzb7fd3f32014-05-01 12:31:25 -070044 @Test
45 public void rootTreeHtml() throws Exception {
46 repo.branch("master").commit().add("foo", "contents").create();
47
48 Map<String, ?> data = buildData("/repo/+/master/");
Dave Borowitzfde41fd2015-09-16 15:14:38 -040049 assertThat(data).containsEntry("type", "TREE");
Dave Borowitzb7fd3f32014-05-01 12:31:25 -070050 List<Map<String, ?>> entries = getTreeEntries(data);
Dave Borowitzfde41fd2015-09-16 15:14:38 -040051 assertThat(entries).hasSize(1);
52 assertThat(entries.get(0).get("name")).isEqualTo("foo");
Dave Borowitzb7fd3f32014-05-01 12:31:25 -070053 }
54
55 @Test
56 public void subTreeHtml() throws Exception {
Dave Borowitzcf38c032016-05-02 11:06:23 -040057 repo.branch("master")
58 .commit()
Dave Borowitzb7fd3f32014-05-01 12:31:25 -070059 .add("foo/bar", "bar contents")
60 .add("baz", "baz contents")
61 .create();
62
63 Map<String, ?> data = buildData("/repo/+/master/");
Dave Borowitzfde41fd2015-09-16 15:14:38 -040064 assertThat(data).containsEntry("type", "TREE");
Dave Borowitzb7fd3f32014-05-01 12:31:25 -070065 List<Map<String, ?>> entries = getTreeEntries(data);
Dave Borowitzfde41fd2015-09-16 15:14:38 -040066 assertThat(entries).hasSize(2);
67 assertThat(entries.get(0).get("name")).isEqualTo("baz");
68 assertThat(entries.get(1).get("name")).isEqualTo("foo/");
Dave Borowitzb7fd3f32014-05-01 12:31:25 -070069
70 data = buildData("/repo/+/master/foo");
Dave Borowitzfde41fd2015-09-16 15:14:38 -040071 assertThat(data).containsEntry("type", "TREE");
Dave Borowitzb7fd3f32014-05-01 12:31:25 -070072 entries = getTreeEntries(data);
Dave Borowitzfde41fd2015-09-16 15:14:38 -040073 assertThat(entries).hasSize(1);
74 assertThat(entries.get(0).get("name")).isEqualTo("bar");
Dave Borowitzb7fd3f32014-05-01 12:31:25 -070075
76 data = buildData("/repo/+/master/foo/");
Dave Borowitzfde41fd2015-09-16 15:14:38 -040077 assertThat(data).containsEntry("type", "TREE");
Dave Borowitzb7fd3f32014-05-01 12:31:25 -070078 entries = getTreeEntries(data);
Dave Borowitzfde41fd2015-09-16 15:14:38 -040079 assertThat(entries).hasSize(1);
80 assertThat(entries.get(0).get("name")).isEqualTo("bar");
Dave Borowitzb7fd3f32014-05-01 12:31:25 -070081 }
82
83 @Test
84 public void fileHtml() throws Exception {
85 repo.branch("master").commit().add("foo", "foo\ncontents\n").create();
86
87 Map<String, ?> data = buildData("/repo/+/master/foo");
Dave Borowitzfde41fd2015-09-16 15:14:38 -040088 assertThat(data).containsEntry("type", "REGULAR_FILE");
Dave Borowitzb7fd3f32014-05-01 12:31:25 -070089
90 SoyListData lines = (SoyListData) getBlobData(data).get("lines");
Dave Borowitzfde41fd2015-09-16 15:14:38 -040091 assertThat(lines.length()).isEqualTo(2);
Dave Borowitzb7fd3f32014-05-01 12:31:25 -070092
93 SoyListData spans = lines.getListData(0);
Dave Borowitzfde41fd2015-09-16 15:14:38 -040094 assertThat(spans.length()).isEqualTo(1);
95 assertThat(spans.getMapData(0).get("classes")).isEqualTo(StringData.forValue("pln"));
96 assertThat(spans.getMapData(0).get("text")).isEqualTo(StringData.forValue("foo"));
Dave Borowitzb7fd3f32014-05-01 12:31:25 -070097
98 spans = lines.getListData(1);
Dave Borowitzfde41fd2015-09-16 15:14:38 -040099 assertThat(spans.length()).isEqualTo(1);
100 assertThat(spans.getMapData(0).get("classes")).isEqualTo(StringData.forValue("pln"));
101 assertThat(spans.getMapData(0).get("text")).isEqualTo(StringData.forValue("contents"));
Dave Borowitzb7fd3f32014-05-01 12:31:25 -0700102 }
103
104 @Test
Ronald Bhuleskarc9208e52019-07-10 17:44:08 -0700105 public void fileWithMaxLines() throws Exception {
106 int MAX_LINE_COUNT = 50000;
107 StringBuilder contentBuilder = new StringBuilder();
108 for (int i = 1; i < MAX_LINE_COUNT; i++) {
109 contentBuilder.append("\n");
110 }
111 repo.branch("master").commit().add("bar", contentBuilder.toString()).create();
112
113 Map<String, ?> data = buildData("/repo/+/master/bar");
114 SoyListData lines = (SoyListData) getBlobData(data).get("lines");
115 assertThat(lines.length()).isEqualTo(MAX_LINE_COUNT - 1);
116 }
117
118 @Test
119 public void fileLargerThanSupportedLines() throws Exception {
120 int MAX_LINE_COUNT = 50000;
121 StringBuilder contentBuilder = new StringBuilder();
122 for (int i = 1; i <= MAX_LINE_COUNT; i++) {
123 contentBuilder.append("\n");
124 }
125 repo.branch("master").commit().add("largebar", contentBuilder.toString()).create();
126
127 Map<String, ?> data = buildData("/repo/+/master/largebar");
128 SoyListData lines = (SoyListData) getBlobData(data).get("lines");
129 assertThat(lines).isNull();
130 }
131
132 @Test
Luca Milanesiobeb12ac2019-11-18 12:14:38 -0800133 public void largeFileHtml() throws Exception {
134 int largeContentSize = BlobSoyData.MAX_FILE_SIZE + 1;
135 repo.branch("master").commit().add("foo", generateContent(largeContentSize)).create();
136
137 Map<String, ?> data = (Map<String, ?>) buildData("/repo/+/master/foo").get("data");
138 assertThat(data).containsEntry("lines", null);
139 assertThat(data).containsEntry("size", "" + largeContentSize);
140 }
141
142 private static String generateContent(int contentSize) {
143 char[] str = new char[contentSize];
144 for (int i = 0; i < contentSize; i++) {
145 str[i] = (char) ('0' + (i % 78));
146 }
147 return new String(str);
148 }
149
150 @Test
Dave Borowitzb7fd3f32014-05-01 12:31:25 -0700151 public void symlinkHtml() throws Exception {
152 final RevBlob link = repo.blob("foo");
Dave Borowitzcf38c032016-05-02 11:06:23 -0400153 repo.branch("master")
154 .commit()
155 .add("foo", "contents")
156 .edit(
157 new PathEdit("bar") {
158 @Override
159 public void apply(DirCacheEntry ent) {
160 ent.setFileMode(FileMode.SYMLINK);
161 ent.setObjectId(link);
162 }
163 })
164 .create();
Dave Borowitzb7fd3f32014-05-01 12:31:25 -0700165
166 Map<String, ?> data = buildData("/repo/+/master/bar");
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400167 assertThat(data).containsEntry("type", "SYMLINK");
168 assertThat(getBlobData(data)).containsEntry("target", "foo");
Dave Borowitzb7fd3f32014-05-01 12:31:25 -0700169 }
170
171 @Test
172 public void gitlinkHtml() throws Exception {
Dave Borowitzcf38c032016-05-02 11:06:23 -0400173 String gitmodules =
174 "[submodule \"gitiles\"]\n"
175 + " path = gitiles\n"
176 + " url = https://gerrit.googlesource.com/gitiles\n";
Dave Borowitzb7fd3f32014-05-01 12:31:25 -0700177 final String gitilesSha = "2b2f34bba3c2be7e2506ce6b1f040949da350cf9";
Dave Borowitzcf38c032016-05-02 11:06:23 -0400178 repo.branch("master")
179 .commit()
180 .add(".gitmodules", gitmodules)
181 .edit(
182 new PathEdit("gitiles") {
183 @Override
184 public void apply(DirCacheEntry ent) {
185 ent.setFileMode(FileMode.GITLINK);
186 ent.setObjectId(ObjectId.fromString(gitilesSha));
187 }
188 })
189 .create();
Dave Borowitzb7fd3f32014-05-01 12:31:25 -0700190
191 Map<String, ?> data = buildData("/repo/+/master/gitiles");
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400192 assertThat(data).containsEntry("type", "GITLINK");
Dave Borowitzb7fd3f32014-05-01 12:31:25 -0700193
194 Map<String, ?> linkData = getBlobData(data);
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400195 assertThat(linkData).containsEntry("sha", gitilesSha);
196 assertThat(linkData).containsEntry("remoteUrl", "https://gerrit.googlesource.com/gitiles");
197 assertThat(linkData).containsEntry("httpUrl", "https://gerrit.googlesource.com/gitiles");
Dave Borowitzb7fd3f32014-05-01 12:31:25 -0700198 }
199
Dave Borowitz4f568702014-05-01 19:54:57 -0700200 @Test
201 public void blobText() throws Exception {
202 repo.branch("master").commit().add("foo", "contents").create();
Nodir Turakulov4bc26002015-08-18 18:24:37 -0700203 String text = buildBlob("/repo/+/master/foo", "100644");
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400204 assertThat(text).isEqualTo("contents");
Dave Borowitz4f568702014-05-01 19:54:57 -0700205 }
206
207 @Test
Andrew Bonventre199efc42017-05-10 13:57:39 -0700208 public void fileJson() throws Exception {
209 RevBlob blob = repo.blob("contents");
210 repo.branch("master").commit().add("path/to/file", blob).create();
211
212 File file = buildJson(File.class, "/repo/+/master/path/to/file");
213
214 assertThat(file.id).isEqualTo(blob.name());
215 assertThat(file.repo).isEqualTo("repo");
216 assertThat(file.revision).isEqualTo("master");
217 assertThat(file.path).isEqualTo("path/to/file");
218 }
219
220 @Test
Dave Borowitz4f568702014-05-01 19:54:57 -0700221 public void symlinkText() throws Exception {
222 final RevBlob link = repo.blob("foo");
Dave Borowitzcf38c032016-05-02 11:06:23 -0400223 repo.branch("master")
224 .commit()
225 .edit(
226 new PathEdit("baz") {
227 @Override
228 public void apply(DirCacheEntry ent) {
229 ent.setFileMode(FileMode.SYMLINK);
230 ent.setObjectId(link);
231 }
232 })
233 .create();
Nodir Turakulov4bc26002015-08-18 18:24:37 -0700234 String text = buildBlob("/repo/+/master/baz", "120000");
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400235 assertThat(text).isEqualTo("foo");
Dave Borowitz228f3572014-05-02 14:26:25 -0700236 }
237
238 @Test
239 public void treeText() throws Exception {
240 RevBlob blob = repo.blob("contents");
241 RevTree tree = repo.tree(repo.file("foo/bar", blob));
242 repo.branch("master").commit().setTopLevelTree(tree).create();
243
244 String expected = "040000 tree " + repo.get(tree, "foo").name() + "\tfoo\n";
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400245 assertThat(buildBlob("/repo/+/master/", "040000")).isEqualTo(expected);
Dave Borowitz228f3572014-05-02 14:26:25 -0700246
247 expected = "100644 blob " + blob.name() + "\tbar\n";
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400248 assertThat(buildBlob("/repo/+/master/foo", "040000")).isEqualTo(expected);
249 assertThat(buildBlob("/repo/+/master/foo/", "040000")).isEqualTo(expected);
Dave Borowitz228f3572014-05-02 14:26:25 -0700250 }
251
252 @Test
253 public void treeTextEscaped() throws Exception {
254 RevBlob blob = repo.blob("contents");
255 repo.branch("master").commit().add("foo\nbar\rbaz", blob).create();
256
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400257 assertThat(buildBlob("/repo/+/master/", "040000"))
258 .isEqualTo("100644 blob " + blob.name() + "\t\"foo\\nbar\\rbaz\"\n");
Dave Borowitz4f568702014-05-01 19:54:57 -0700259 }
260
261 @Test
262 public void nonBlobText() throws Exception {
Dave Borowitzcf38c032016-05-02 11:06:23 -0400263 String gitmodules =
264 "[submodule \"gitiles\"]\n"
265 + " path = gitiles\n"
266 + " url = https://gerrit.googlesource.com/gitiles\n";
Dave Borowitz4f568702014-05-01 19:54:57 -0700267 final String gitilesSha = "2b2f34bba3c2be7e2506ce6b1f040949da350cf9";
Dave Borowitzcf38c032016-05-02 11:06:23 -0400268 repo.branch("master")
269 .commit()
Dave Borowitz4f568702014-05-01 19:54:57 -0700270 .add("foo/bar", "contents")
271 .add(".gitmodules", gitmodules)
Dave Borowitzcf38c032016-05-02 11:06:23 -0400272 .edit(
273 new PathEdit("gitiles") {
274 @Override
275 public void apply(DirCacheEntry ent) {
276 ent.setFileMode(FileMode.GITLINK);
277 ent.setObjectId(ObjectId.fromString(gitilesSha));
278 }
279 })
280 .create();
Dave Borowitz4f568702014-05-01 19:54:57 -0700281
Nodir Turakulov4bc26002015-08-18 18:24:37 -0700282 assertNotFound("/repo/+/master/nonexistent", "format=text");
283 assertNotFound("/repo/+/master/gitiles", "format=text");
Dave Borowitz4f568702014-05-01 19:54:57 -0700284 }
285
Dave Borowitz2387b142014-05-02 16:56:27 -0700286 @Test
Han-Wen Nienhuys8aefdb82016-05-02 16:49:35 +0200287 public void treeJsonSizes() throws Exception {
288 RevCommit c = repo.parseBody(repo.branch("master").commit().add("baz", "01234567").create());
289
290 Tree tree = buildJson(Tree.class, "/repo/+/master/", "long=1");
291
292 assertThat(tree.id).isEqualTo(c.getTree().name());
293 assertThat(tree.entries).hasSize(1);
294 assertThat(tree.entries.get(0).mode).isEqualTo(0100644);
295 assertThat(tree.entries.get(0).type).isEqualTo("blob");
296 assertThat(tree.entries.get(0).name).isEqualTo("baz");
297 assertThat(tree.entries.get(0).size).isEqualTo(8);
298 }
299
300 @Test
301 public void treeJsonLinkTarget() throws Exception {
302 final ObjectId targetID = repo.blob("target");
303 RevCommit c =
304 repo.parseBody(
305 repo.branch("master")
306 .commit()
307 .edit(
308 new PathEdit("link") {
309 @Override
310 public void apply(DirCacheEntry ent) {
311 ent.setFileMode(FileMode.SYMLINK);
312 ent.setObjectId(targetID);
313 }
314 })
315 .create());
316
317 Tree tree = buildJson(Tree.class, "/repo/+/master/", "long=1");
318
319 assertThat(tree.id).isEqualTo(c.getTree().name());
320 assertThat(tree.entries).hasSize(1);
321
322 TreeJsonData.Entry e = tree.entries.get(0);
323 assertThat(e.mode).isEqualTo(0120000);
324 assertThat(e.type).isEqualTo("blob");
325 assertThat(e.name).isEqualTo("link");
326 assertThat(e.id).isEqualTo(targetID.name());
327 assertThat(e.target).isEqualTo("target");
328 }
329
330 @Test
Han-Wen Nienhuys0dc93872016-05-03 15:21:42 +0200331 public void treeJsonRecursive() throws Exception {
332 RevCommit c =
333 repo.parseBody(
334 repo.branch("master")
335 .commit()
336 .add("foo/baz/bar/a", "bar contents")
337 .add("foo/baz/bar/b", "bar contents")
338 .add("baz", "baz contents")
339 .create());
340 Tree tree = buildJson(Tree.class, "/repo/+/master/", "recursive=1");
341
342 assertThat(tree.id).isEqualTo(c.getTree().name());
343 assertThat(tree.entries).hasSize(3);
344
345 assertThat(tree.entries.get(0).name).isEqualTo("baz");
346 assertThat(tree.entries.get(1).name).isEqualTo("foo/baz/bar/a");
347 assertThat(tree.entries.get(2).name).isEqualTo("foo/baz/bar/b");
348
349 tree = buildJson(Tree.class, "/repo/+/master/foo/baz", "recursive=1");
350
351 assertThat(tree.entries).hasSize(2);
352
353 assertThat(tree.entries.get(0).name).isEqualTo("bar/a");
354 assertThat(tree.entries.get(1).name).isEqualTo("bar/b");
355 }
356
357 @Test
Dave Borowitz2387b142014-05-02 16:56:27 -0700358 public void treeJson() throws Exception {
Dave Borowitzcf38c032016-05-02 11:06:23 -0400359 RevCommit c =
360 repo.parseBody(
361 repo.branch("master")
362 .commit()
363 .add("foo/bar", "bar contents")
364 .add("baz", "baz contents")
365 .create());
Dave Borowitz2387b142014-05-02 16:56:27 -0700366
Dave Borowitza774f592015-10-26 11:41:27 -0400367 Tree tree = buildJson(Tree.class, "/repo/+/master/");
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400368 assertThat(tree.id).isEqualTo(c.getTree().name());
369 assertThat(tree.entries).hasSize(2);
370 assertThat(tree.entries.get(0).mode).isEqualTo(0100644);
371 assertThat(tree.entries.get(0).type).isEqualTo("blob");
372 assertThat(tree.entries.get(0).id).isEqualTo(repo.get(c.getTree(), "baz").name());
373 assertThat(tree.entries.get(0).name).isEqualTo("baz");
374 assertThat(tree.entries.get(1).mode).isEqualTo(040000);
375 assertThat(tree.entries.get(1).type).isEqualTo("tree");
376 assertThat(tree.entries.get(1).id).isEqualTo(repo.get(c.getTree(), "foo").name());
377 assertThat(tree.entries.get(1).name).isEqualTo("foo");
Dave Borowitz2387b142014-05-02 16:56:27 -0700378
Dave Borowitza774f592015-10-26 11:41:27 -0400379 tree = buildJson(Tree.class, "/repo/+/master/foo");
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400380 assertThat(tree.id).isEqualTo(repo.get(c.getTree(), "foo").name());
381 assertThat(tree.entries).hasSize(1);
382 assertThat(tree.entries.get(0).mode).isEqualTo(0100644);
383 assertThat(tree.entries.get(0).type).isEqualTo("blob");
384 assertThat(tree.entries.get(0).id).isEqualTo(repo.get(c.getTree(), "foo/bar").name());
385 assertThat(tree.entries.get(0).name).isEqualTo("bar");
Dave Borowitz2387b142014-05-02 16:56:27 -0700386
Dave Borowitza774f592015-10-26 11:41:27 -0400387 tree = buildJson(Tree.class, "/repo/+/master/foo/");
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400388 assertThat(tree.id).isEqualTo(repo.get(c.getTree(), "foo").name());
389 assertThat(tree.entries).hasSize(1);
390 assertThat(tree.entries.get(0).mode).isEqualTo(0100644);
391 assertThat(tree.entries.get(0).type).isEqualTo("blob");
392 assertThat(tree.entries.get(0).id).isEqualTo(repo.get(c.getTree(), "foo/bar").name());
393 assertThat(tree.entries.get(0).name).isEqualTo("bar");
Dave Borowitz2387b142014-05-02 16:56:27 -0700394 }
395
AJ Ross001ea9b2016-08-23 13:40:04 -0700396 @Test
397 public void allowOrigin() throws Exception {
398 repo.branch("master").commit().add("foo", "contents").create();
399 FakeHttpServletResponse res = buildText("/repo/+/master/foo");
400 assertThat(res.getHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN))
401 .isEqualTo("http://localhost");
402 }
403
404 @Test
405 public void rejectOrigin() throws Exception {
406 repo.branch("master").commit().add("foo", "contents").create();
David Pursehouseccaa85d2017-05-30 10:47:27 +0900407 FakeHttpServletResponse res =
408 buildResponse("/repo/+/master/foo", "format=text", SC_OK, "http://notlocalhost");
AJ Ross001ea9b2016-08-23 13:40:04 -0700409 assertThat(res.getHeader(HttpHeaders.CONTENT_TYPE)).isEqualTo("text/plain");
David Pursehouseccaa85d2017-05-30 10:47:27 +0900410 assertThat(res.getHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)).isEqualTo(null);
AJ Ross001ea9b2016-08-23 13:40:04 -0700411 }
412
Dave Borowitzb7fd3f32014-05-01 12:31:25 -0700413 private Map<String, ?> getBlobData(Map<String, ?> data) {
414 return ((Map<String, Map<String, ?>>) data).get("data");
415 }
416
417 private List<Map<String, ?>> getTreeEntries(Map<String, ?> data) {
418 return ((Map<String, List<Map<String, ?>>>) data.get("data")).get("entries");
419 }
420
Nodir Turakulov4bc26002015-08-18 18:24:37 -0700421 private String buildBlob(String path, String expectedMode) throws Exception {
422 FakeHttpServletResponse res = buildText(path);
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400423 assertThat(res.getHeader(PathServlet.MODE_HEADER)).isEqualTo(expectedMode);
Nodir Turakulov4bc26002015-08-18 18:24:37 -0700424 String base64 = res.getActualBodyString();
425 return new String(BaseEncoding.base64().decode(base64), UTF_8);
Dave Borowitz228f3572014-05-02 14:26:25 -0700426 }
Dave Borowitzb7fd3f32014-05-01 12:31:25 -0700427}