Skip to content

Commit 421e4dd

Browse files
committed
Add TUS node path input proof
1 parent d5526e5 commit 421e4dd

4 files changed

Lines changed: 140 additions & 4 deletions

File tree

example/build.gradle

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,12 @@ tasks.register('api2DevdockTusProtocolVersionSelection', JavaExec) {
7878
workingDir = rootProject.projectDir
7979
}
8080

81+
tasks.register('api2DevdockTusNodePathInputSource', JavaExec) {
82+
classpath = sourceSets.main.runtimeClasspath
83+
mainClass = 'io.tus.java.example.Api2DevdockTusNodePathInputSource'
84+
workingDir = rootProject.projectDir
85+
}
86+
8187
tasks.register('api2DevdockTusRequestLifecycleHooks', JavaExec) {
8288
classpath = sourceSets.main.runtimeClasspath
8389
mainClass = 'io.tus.java.example.Api2DevdockTusRequestLifecycleHooks'

example/src/main/java/io/tus/java/example/Api2DevdockScenario.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,14 +99,21 @@ static JSONObject conformanceScenario(JSONObject scenario) {
9999

100100
static byte[] conformanceInputSourceBytes(JSONObject conformanceScenario) {
101101
final JSONObject inputSource = conformanceScenario.getJSONObject("inputSource");
102-
final String kind = inputSource.getString("kind");
103-
if (!"blob".equals(kind)) {
104-
throw new IllegalArgumentException("unsupported conformance input source kind " + kind);
102+
if (!inputSource.has("content")) {
103+
throw new IllegalArgumentException(
104+
"unsupported conformance input source kind "
105+
+ inputSource.getString("kind")
106+
+ " without content"
107+
);
105108
}
106109

107110
return inputSource.getString("content").getBytes(StandardCharsets.UTF_8);
108111
}
109112

113+
static String conformanceInputSourceKind(JSONObject conformanceScenario) {
114+
return conformanceScenario.getJSONObject("inputSource").getString("kind");
115+
}
116+
110117
static Map<String, String> conformanceInputStringMapOption(
111118
JSONObject conformanceScenario,
112119
String key

example/src/main/java/io/tus/java/example/Api2DevdockTusConformanceServer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ private JSONArray observedIntegers(Integer[] values) {
200200

201201
private static byte[] inputSourceContent(JSONObject conformanceScenario) {
202202
final JSONObject inputSource = conformanceScenario.optJSONObject("inputSource");
203-
if (inputSource == null || !"blob".equals(inputSource.optString("kind"))) {
203+
if (inputSource == null || !inputSource.has("content")) {
204204
return null;
205205
}
206206

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
package io.tus.java.example;
2+
3+
import io.tus.java.client.ProtocolException;
4+
import io.tus.java.client.TusClient;
5+
import io.tus.java.client.TusUpload;
6+
import io.tus.java.client.TusUploader;
7+
import org.json.JSONArray;
8+
import org.json.JSONObject;
9+
10+
import java.io.File;
11+
import java.io.IOException;
12+
import java.net.URL;
13+
import java.nio.file.Files;
14+
15+
public final class Api2DevdockTusNodePathInputSource {
16+
/**
17+
* Run the API2 devdock TUS node path input source example.
18+
*
19+
* @param args ignored
20+
*/
21+
public static void main(String[] args) {
22+
try {
23+
System.setProperty("http.strictPostRedirect", "true");
24+
25+
final JSONObject scenario = Api2DevdockScenario.loadScenario();
26+
final JSONObject conformanceScenario = Api2DevdockScenario.conformanceScenario(scenario);
27+
final JSONObject result = uploadWithNodePathInputSource(conformanceScenario);
28+
Api2DevdockScenario.writeResult(result);
29+
30+
System.out.println(
31+
"Java TUS SDK devdock scenario "
32+
+ scenario.getString("scenarioId")
33+
+ " read "
34+
+ Api2DevdockScenario.conformanceInputSourceKind(conformanceScenario)
35+
+ " for "
36+
+ result.getString("uploadUrl")
37+
);
38+
} catch (Exception e) {
39+
e.printStackTrace();
40+
System.exit(1);
41+
}
42+
}
43+
44+
private static JSONObject uploadWithNodePathInputSource(JSONObject conformanceScenario)
45+
throws IOException, ProtocolException {
46+
final byte[] content = Api2DevdockScenario.conformanceInputSourceBytes(conformanceScenario);
47+
final String inputKind = Api2DevdockScenario.conformanceInputSourceKind(conformanceScenario);
48+
final URL endpointUrl = new URL(
49+
Api2DevdockScenario.conformanceInputStringOption(
50+
conformanceScenario,
51+
"endpointUrl"
52+
)
53+
);
54+
final JSONArray events = new JSONArray();
55+
56+
try (Api2DevdockTusConformanceServer conformanceServer =
57+
new Api2DevdockTusConformanceServer(conformanceScenario, endpointUrl)) {
58+
final File source = File.createTempFile("api2-java-tus-node-path-input", ".bin");
59+
try {
60+
Files.write(source.toPath(), content);
61+
62+
final TusClient client = new TusClient();
63+
client.setUploadCreationURL(conformanceServer.endpointUrl());
64+
65+
final TusUpload upload = new TusUpload(source);
66+
upload.setMetadata(
67+
Api2DevdockScenario.conformanceInputStringMapOption(
68+
conformanceScenario,
69+
"metadata"
70+
)
71+
);
72+
73+
events.put(new JSONObject()
74+
.put("inputKind", inputKind)
75+
.put("kind", "source-open")
76+
.put("size", upload.getSize()));
77+
78+
final TusUploader uploader = client.createUpload(upload);
79+
uploader.setChunkSize(content.length);
80+
boolean uploadFinished = false;
81+
try {
82+
int uploadedChunkSize;
83+
do {
84+
uploadedChunkSize = uploader.uploadChunk();
85+
} while (uploadedChunkSize > -1);
86+
uploader.finish();
87+
uploadFinished = true;
88+
} catch (IOException | ProtocolException error) {
89+
throw new IOException(
90+
"node path input source conformance failed: "
91+
+ conformanceServer.errorSummary(),
92+
error
93+
);
94+
} finally {
95+
if (uploadFinished) {
96+
events.put(new JSONObject().put("kind", "success"));
97+
}
98+
events.put(new JSONObject().put("kind", "source-close"));
99+
}
100+
101+
if (uploader.getUploadURL() == null) {
102+
throw new IllegalStateException(
103+
"node path input source upload did not expose a URL"
104+
);
105+
}
106+
107+
conformanceServer.assertExhausted();
108+
return conformanceServer.result()
109+
.put("events", events)
110+
.put(
111+
"uploadUrl",
112+
conformanceServer.canonicalUrl(uploader.getUploadURL().toString())
113+
);
114+
} finally {
115+
Files.deleteIfExists(source.toPath());
116+
}
117+
}
118+
}
119+
120+
private Api2DevdockTusNodePathInputSource() {
121+
throw new IllegalStateException("Utility class");
122+
}
123+
}

0 commit comments

Comments
 (0)