xref: /JGit/org.eclipse.jgit.lfs.server.test/tst/org/eclipse/jgit/lfs/server/fs/DownloadTest.java (revision 8ada9048c5add754c3b34851b1bd501ce28b3321)
1 /*
2  * Copyright (C) 2015, Matthias Sohn <matthias.sohn@sap.com> and others
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Distribution License v. 1.0 which is available at
6  * https://www.eclipse.org/org/documents/edl-v10.php.
7  *
8  * SPDX-License-Identifier: BSD-3-Clause
9  */
10 package org.eclipse.jgit.lfs.server.fs;
11 
12 import static org.apache.http.HttpStatus.SC_NOT_FOUND;
13 import static org.apache.http.HttpStatus.SC_UNPROCESSABLE_ENTITY;
14 import static org.junit.Assert.assertEquals;
15 import static org.junit.Assert.assertThrows;
16 
17 import java.io.IOException;
18 import java.nio.file.Path;
19 import java.nio.file.Paths;
20 import java.text.MessageFormat;
21 
22 import org.apache.http.client.ClientProtocolException;
23 import org.eclipse.jgit.lfs.lib.AnyLongObjectId;
24 import org.eclipse.jgit.lfs.test.LongObjectIdTestUtils;
25 import org.eclipse.jgit.util.FileUtils;
26 import org.junit.Test;
27 
28 public class DownloadTest extends LfsServerTest {
29 
30 	@Test
testDownload()31 	public void testDownload() throws Exception {
32 		String TEXT = "test";
33 		AnyLongObjectId id = putContent(TEXT);
34 		Path f = Paths.get(getTempDirectory().toString(), "download");
35 		long len = getContent(id, f);
36 		assertEquals(TEXT.length(), len);
37 		FileUtils.delete(f.toFile(), FileUtils.RETRY);
38 	}
39 
40 	@Test
testDownloadInvalidPathInfo()41 	public void testDownloadInvalidPathInfo()
42 			throws ClientProtocolException, IOException {
43 		String TEXT = "test";
44 		String id = putContent(TEXT).name().substring(0, 60);
45 		Path f = Paths.get(getTempDirectory().toString(), "download");
46 		String error = String.format(
47 				"Invalid pathInfo: '/%s' does not match '/{SHA-256}'", id);
48 		assertThrows(formatErrorMessage(SC_UNPROCESSABLE_ENTITY, error),
49 				RuntimeException.class, () -> getContent(id, f));
50 	}
51 
52 	@Test
testDownloadInvalidId()53 	public void testDownloadInvalidId()
54 			throws ClientProtocolException, IOException {
55 		String TEXT = "test";
56 		String id = putContent(TEXT).name().replace('f', 'z');
57 		Path f = Paths.get(getTempDirectory().toString(), "download");
58 		String error = String.format("Invalid id: %s", id);
59 		assertThrows(formatErrorMessage(SC_UNPROCESSABLE_ENTITY, error),
60 				RuntimeException.class, () -> getContent(id, f));
61 	}
62 
63 	@Test
testDownloadNotFound()64 	public void testDownloadNotFound() {
65 		String TEXT = "test";
66 		AnyLongObjectId id = LongObjectIdTestUtils.hash(TEXT);
67 		Path f = Paths.get(getTempDirectory().toString(), "download");
68 		String error = String.format("Object '%s' not found", id.getName());
69 		assertThrows(formatErrorMessage(SC_NOT_FOUND, error),
70 				RuntimeException.class, () -> getContent(id, f));
71 	}
72 
73 	@SuppressWarnings("boxing")
74 	@Test
testLargeFileDownload()75 	public void testLargeFileDownload() throws Exception {
76 		Path f = Paths.get(getTempDirectory().toString(), "largeRandomFile");
77 		long expectedLen = createPseudoRandomContentFile(f, 5 * MiB);
78 		AnyLongObjectId id = putContent(f);
79 		Path f2 = Paths.get(getTempDirectory().toString(), "download");
80 		long start = System.nanoTime();
81 		long len = getContent(id, f2);
82 		System.out.println(
83 				MessageFormat.format("downloaded 10 MiB random data in {0}ms",
84 						(System.nanoTime() - start) / 1e6));
85 		assertEquals(expectedLen, len);
86 		FileUtils.delete(f.toFile(), FileUtils.RETRY);
87 
88 	}
89 
90 	@SuppressWarnings("boxing")
formatErrorMessage(int status, String message)91 	private String formatErrorMessage(int status, String message) {
92 		return String.format("Status: %d {\"message\":\"%s\"}", status,
93 				message);
94 	}
95 }
96