diff --git a/pom.xml b/pom.xml index dea9a71..de031b4 100644 --- a/pom.xml +++ b/pom.xml @@ -30,7 +30,7 @@ dev.vality file-storage-proto - 1.48-4569cea + 1.49-f01d2d9 dev.vality diff --git a/src/test/java/dev/vality/file/storage/FileStorageTest.java b/src/test/java/dev/vality/file/storage/FileStorageTest.java index 387b785..16ec721 100644 --- a/src/test/java/dev/vality/file/storage/FileStorageTest.java +++ b/src/test/java/dev/vality/file/storage/FileStorageTest.java @@ -1,14 +1,16 @@ package dev.vality.file.storage; -import dev.vality.file.storage.service.exception.StorageException; import dev.vality.woody.api.flow.error.WRuntimeException; import dev.vality.woody.thrift.impl.http.THSpawnClientBuilder; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPut; +import org.apache.http.entity.ByteArrayEntity; import org.apache.http.entity.FileEntity; import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; import org.apache.thrift.TException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -20,7 +22,6 @@ import org.springframework.test.context.TestPropertySource; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStreamWriter; import java.io.RandomAccessFile; import java.net.*; import java.nio.ByteBuffer; @@ -304,51 +305,6 @@ public abstract class FileStorageTest { assertTrue(true); } - private void uploadTestData(NewFileResult fileResult, String fileName, String testData) throws IOException { - // запись данных методом put - URL uploadUrl = new URL(fileResult.getUploadUrl()); - - HttpURLConnection uploadUrlConnection = getHttpURLConnection(uploadUrl, "PUT", fileName, true); - - OutputStreamWriter out = new OutputStreamWriter(uploadUrlConnection.getOutputStream()); - out.write(testData); - out.close(); - - // чтобы завершить загрузку вызываем getResponseCode - assertEquals(HttpStatus.OK.value(), uploadUrlConnection.getResponseCode()); - } - - private Path getFileFromResources() throws URISyntaxException { - ClassLoader classLoader = this.getClass().getClassLoader(); - - URL url = Objects.requireNonNull(classLoader.getResource("respect")); - return Paths.get(url.toURI()); - } - - private Path getFileFromResources(String name) throws URISyntaxException { - ClassLoader classLoader = this.getClass().getClassLoader(); - - URL url = Objects.requireNonNull(classLoader.getResource(name)); - return Paths.get(url.toURI()); - } - - public static HttpURLConnection getHttpURLConnection(URL url, String method, boolean doOutput) throws IOException { - return getHttpURLConnection(url, method, null, doOutput); - } - - public static HttpURLConnection getHttpURLConnection(URL url, String method, String fileName, boolean doOutput) - throws IOException { - HttpURLConnection connection = (HttpURLConnection) url.openConnection(); - connection.setDoOutput(doOutput); - connection.setRequestMethod(method); - if (fileName != null) { - connection.setRequestProperty( - "Content-Disposition", - "attachment;filename=" + URLEncoder.encode(fileName, StandardCharsets.UTF_8.name())); - } - return connection; - } - @Test public void multipartUploadTest() throws Exception { var exception = assertThrows(WRuntimeException.class, @@ -377,6 +333,99 @@ public abstract class FileStorageTest { assertNotNull(result.getUploadUrl()); } + @Test + public void getMultipartFileData() throws Exception { + dev.vality.msgpack.Value value = new dev.vality.msgpack.Value(); + String fileName = "test_registry.csv"; + value.setStr(fileName); + Map metadata = Map.of("filename", value); + CreateMultipartUploadResult createResult = fileStorageClient.createMultipartUpload(metadata); + assertNotNull(createResult.getFileDataId()); + assertNotNull(createResult.getMultipartUploadId()); + + List completedParts = new ArrayList<>(); + processMultipartUpload(createResult, completedParts); + + var completeRequest = new CompleteMultipartUploadRequest() + .setMultipartUploadId(createResult.getMultipartUploadId()) + .setFileDataId(createResult.getFileDataId()) + .setCompletedParts(completedParts); + + CompleteMultipartUploadResult result = fileStorageClient.completeMultipartUpload(completeRequest); + + FileData multipartFileData = fileStorageClient.getFileData(createResult.getFileDataId()); + + assertEquals(createResult.getFileDataId(), multipartFileData.getFileDataId()); + assertEquals(fileName, multipartFileData.getFileName()); + assertNotNull(multipartFileData.getCreatedAt()); + assertNotNull(multipartFileData.getMetadata()); + } + + @Test + public void generateMultipartDownloadUrl() throws Exception { + dev.vality.msgpack.Value value = new dev.vality.msgpack.Value(); + String fileName = "test_registry.csv"; + value.setStr(fileName); + Map metadata = Map.of("filename", value); + CreateMultipartUploadResult createResult = fileStorageClient.createMultipartUpload(metadata); + assertNotNull(createResult.getFileDataId()); + assertNotNull(createResult.getMultipartUploadId()); + + List completedParts = new ArrayList<>(); + processMultipartUpload(createResult, completedParts); + + var completeRequest = new CompleteMultipartUploadRequest() + .setMultipartUploadId(createResult.getMultipartUploadId()) + .setFileDataId(createResult.getFileDataId()) + .setCompletedParts(completedParts); + + fileStorageClient.completeMultipartUpload(completeRequest); + + String expiredTime = Instant.now().toString(); + String url = fileStorageClient.generateDownloadUrl(createResult.getFileDataId(), expiredTime); + + assertNotNull(url); + } + + private void uploadTestData(NewFileResult fileResult, String fileName, String testData) throws IOException { + // запись данных методом put + try (var client = HttpClients.createDefault()) { + var requestPut = new HttpPut(fileResult.getUploadUrl()); + var encode = URLEncoder.encode(fileName, StandardCharsets.UTF_8); + requestPut.setHeader("Content-Disposition", "attachment;filename=" + encode); + requestPut.setEntity(new ByteArrayEntity(testData.getBytes(StandardCharsets.UTF_8))); + try (var response = client.execute(requestPut)) { + var httpEntity = response.getEntity(); + assertEquals(HttpStatus.OK.value(), response.getStatusLine().getStatusCode()); + EntityUtils.consume(httpEntity); + } + } + } + + private Path getFileFromResources(String name) throws URISyntaxException { + ClassLoader classLoader = this.getClass().getClassLoader(); + + URL url = Objects.requireNonNull(classLoader.getResource(name)); + return Paths.get(url.toURI()); + } + + private static HttpURLConnection getHttpURLConnection(URL url, String method, boolean doOutput) throws IOException { + return getHttpURLConnection(url, method, null, doOutput); + } + + private static HttpURLConnection getHttpURLConnection(URL url, String method, String fileName, boolean doOutput) + throws IOException { + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setDoOutput(doOutput); + connection.setRequestMethod(method); + if (fileName != null) { + connection.setRequestProperty( + "Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, StandardCharsets.UTF_8.name())); + } + return connection; + } + private void processMultipartUpload(CreateMultipartUploadResult createResult, List completedParts) throws URISyntaxException { int partNumber = 1; @@ -410,58 +459,4 @@ public abstract class FileStorageTest { e.printStackTrace(); } } - - @Test - void getMultipartFileData() throws Exception { - dev.vality.msgpack.Value value = new dev.vality.msgpack.Value(); - String fileName = "test_registry.csv"; - value.setStr(fileName); - Map metadata = Map.of("filename", value); - CreateMultipartUploadResult createResult = fileStorageClient.createMultipartUpload(metadata); - assertNotNull(createResult.getFileDataId()); - assertNotNull(createResult.getMultipartUploadId()); - - List completedParts = new ArrayList<>(); - processMultipartUpload(createResult, completedParts); - - var completeRequest = new CompleteMultipartUploadRequest() - .setMultipartUploadId(createResult.getMultipartUploadId()) - .setFileDataId(createResult.getFileDataId()) - .setCompletedParts(completedParts); - - CompleteMultipartUploadResult result = fileStorageClient.completeMultipartUpload(completeRequest); - - FileData multipartFileData = fileStorageClient.getFileData(createResult.getFileDataId()); - - assertEquals(createResult.getFileDataId(), multipartFileData.getFileDataId()); - assertEquals(fileName, multipartFileData.getFileName()); - assertNotNull(multipartFileData.getCreatedAt()); - assertNotNull(multipartFileData.getMetadata()); - } - - @Test - void generateMultipartDownloadUrl() throws Exception { - dev.vality.msgpack.Value value = new dev.vality.msgpack.Value(); - String fileName = "test_registry.csv"; - value.setStr(fileName); - Map metadata = Map.of("filename", value); - CreateMultipartUploadResult createResult = fileStorageClient.createMultipartUpload(metadata); - assertNotNull(createResult.getFileDataId()); - assertNotNull(createResult.getMultipartUploadId()); - - List completedParts = new ArrayList<>(); - processMultipartUpload(createResult, completedParts); - - var completeRequest = new CompleteMultipartUploadRequest() - .setMultipartUploadId(createResult.getMultipartUploadId()) - .setFileDataId(createResult.getFileDataId()) - .setCompletedParts(completedParts); - - fileStorageClient.completeMultipartUpload(completeRequest); - - String expiredTime = Instant.now().toString(); - String url = fileStorageClient.generateDownloadUrl(createResult.getFileDataId(), expiredTime); - - assertNotNull(url); - } }