1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 package org.eclipse.jgit.lfs.server.fs;
44
45 import static org.apache.http.HttpStatus.SC_NOT_FOUND;
46 import static org.apache.http.HttpStatus.SC_UNPROCESSABLE_ENTITY;
47 import static org.junit.Assert.assertEquals;
48
49 import java.io.IOException;
50 import java.nio.file.Path;
51 import java.nio.file.Paths;
52 import java.text.MessageFormat;
53
54 import org.apache.http.client.ClientProtocolException;
55 import org.eclipse.jgit.lfs.lib.AnyLongObjectId;
56 import org.eclipse.jgit.lfs.test.LongObjectIdTestUtils;
57 import org.eclipse.jgit.util.FileUtils;
58 import org.junit.Rule;
59 import org.junit.Test;
60 import org.junit.rules.ExpectedException;
61
62 public class DownloadTest extends LfsServerTest {
63
64 @Rule
65 public ExpectedException exception = ExpectedException.none();
66
67 @Test
68 public void testDownload() throws Exception {
69 String TEXT = "test";
70 AnyLongObjectId id = putContent(TEXT);
71 Path f = Paths.get(getTempDirectory().toString(), "download");
72 long len = getContent(id, f);
73 assertEquals(TEXT.length(), len);
74 FileUtils.delete(f.toFile(), FileUtils.RETRY);
75 }
76
77 @Test
78 public void testDownloadInvalidPathInfo()
79 throws ClientProtocolException, IOException {
80 String TEXT = "test";
81 String id = putContent(TEXT).name().substring(0, 60);
82 Path f = Paths.get(getTempDirectory().toString(), "download");
83 String error = String.format(
84 "Invalid pathInfo: '/%s' does not match '/{SHA-256}'", id);
85 exception.expect(RuntimeException.class);
86 exception.expectMessage(
87 formatErrorMessage(SC_UNPROCESSABLE_ENTITY, error));
88 getContent(id, f);
89 }
90
91 @Test
92 public void testDownloadInvalidId()
93 throws ClientProtocolException, IOException {
94 String TEXT = "test";
95 String id = putContent(TEXT).name().replace('f', 'z');
96 Path f = Paths.get(getTempDirectory().toString(), "download");
97 String error = String.format("Invalid id: %s", id);
98 exception.expect(RuntimeException.class);
99 exception.expectMessage(
100 formatErrorMessage(SC_UNPROCESSABLE_ENTITY, error));
101 getContent(id, f);
102 }
103
104 @Test
105 public void testDownloadNotFound()
106 throws ClientProtocolException, IOException {
107 String TEXT = "test";
108 AnyLongObjectId id = LongObjectIdTestUtils.hash(TEXT);
109 Path f = Paths.get(getTempDirectory().toString(), "download");
110 String error = String.format("Object '%s' not found", id.getName());
111 exception.expect(RuntimeException.class);
112 exception.expectMessage(formatErrorMessage(SC_NOT_FOUND, error));
113 getContent(id, f);
114 }
115
116 @SuppressWarnings("boxing")
117 @Test
118 public void testLargeFileDownload() throws Exception {
119 Path f = Paths.get(getTempDirectory().toString(), "largeRandomFile");
120 long expectedLen = createPseudoRandomContentFile(f, 5 * MiB);
121 AnyLongObjectId id = putContent(f);
122 Path f2 = Paths.get(getTempDirectory().toString(), "download");
123 long start = System.nanoTime();
124 long len = getContent(id, f2);
125 System.out.println(
126 MessageFormat.format("downloaded 10 MiB random data in {0}ms",
127 (System.nanoTime() - start) / 1e6));
128 assertEquals(expectedLen, len);
129 FileUtils.delete(f.toFile(), FileUtils.RETRY);
130
131 }
132
133 @SuppressWarnings("boxing")
134 private String formatErrorMessage(int status, String message) {
135 return String.format("Status: %d {\"message\":\"%s\"}", status,
136 message);
137 }
138 }