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.junit.Assert.assertEquals;
46 import static org.junit.Assert.assertFalse;
47 import static org.junit.Assert.assertTrue;
48 import static org.junit.Assert.fail;
49
50 import java.nio.file.Files;
51 import java.nio.file.Path;
52 import java.nio.file.Paths;
53 import java.text.MessageFormat;
54 import java.util.ArrayList;
55 import java.util.List;
56 import java.util.concurrent.Callable;
57 import java.util.concurrent.CyclicBarrier;
58 import java.util.concurrent.ExecutorService;
59 import java.util.concurrent.Executors;
60 import java.util.concurrent.TimeUnit;
61
62 import org.eclipse.jgit.lfs.lib.AnyLongObjectId;
63 import org.eclipse.jgit.lfs.lib.LongObjectId;
64 import org.eclipse.jgit.lfs.test.LongObjectIdTestUtils;
65 import org.junit.Test;
66
67 public class UploadTest extends LfsServerTest {
68
69 @Test
70 public void testUpload() throws Exception {
71 String TEXT = "test";
72 AnyLongObjectId id = putContent(TEXT);
73 assertTrue("expect object " + id.name() + " to exist",
74 repository.getSize(id) >= 0);
75 assertEquals("expected object length " + TEXT.length(), TEXT.length(),
76 repository.getSize(id));
77 }
78
79 @Test
80 public void testCorruptUpload() throws Exception {
81 String TEXT = "test";
82 AnyLongObjectId id = LongObjectIdTestUtils.hash("wrongHash");
83 try {
84 putContent(id, TEXT);
85 fail("expected RuntimeException(\"Status 400\")");
86 } catch (RuntimeException e) {
87 assertEquals("Status: 400. Bad Request", e.getMessage());
88 }
89 assertFalse("expect object " + id.name() + " not to exist",
90 repository.getSize(id) >= 0);
91 }
92
93 @SuppressWarnings("boxing")
94 @Test
95 public void testLargeFileUpload() throws Exception {
96 Path f = Paths.get(getTempDirectory().toString(), "largeRandomFile");
97 createPseudoRandomContentFile(f, 5 * MiB);
98 long start = System.nanoTime();
99 LongObjectId id = putContent(f);
100 System.out.println(
101 MessageFormat.format("uploaded 10 MiB random data in {0}ms",
102 (System.nanoTime() - start) / 1e6));
103 assertTrue("expect object " + id.name() + " to exist",
104 repository.getSize(id) >= 0);
105 assertEquals("expected object length " + Files.size(f), Files.size(f),
106 repository.getSize(id));
107 }
108
109 @Test
110 public void testParallelUploads() throws Exception {
111 int count = 10;
112 List<Path> paths = new ArrayList<>(count);
113
114 for (int i = 0; i < count; i++) {
115 Path f = Paths.get(getTempDirectory().toString(),
116 "largeRandomFile_" + i);
117 createPseudoRandomContentFile(f, 1 * MiB);
118 paths.add(f);
119 }
120
121 final CyclicBarrier barrier = new CyclicBarrier(count);
122
123 ExecutorService e = Executors.newFixedThreadPool(count);
124 try {
125 for (Path p : paths) {
126 e.submit(new Callable<Void>() {
127 @Override
128 public Void call() throws Exception {
129 barrier.await();
130 putContent(p);
131 return null;
132 }
133 });
134 }
135 } finally {
136 e.shutdown();
137 e.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
138 }
139 }
140 }