X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/89c5953f15ff025971e465c86eb6d129ff0a63f9..16f704326f44fd1e5e5e60b936c9b5895d6a6ff8:/sdk/java-v2/src/test/java/org/arvados/client/logic/keep/FileDownloaderTest.java diff --git a/sdk/java-v2/src/test/java/org/arvados/client/logic/keep/FileDownloaderTest.java b/sdk/java-v2/src/test/java/org/arvados/client/logic/keep/FileDownloaderTest.java new file mode 100644 index 0000000000..0fb1f0206c --- /dev/null +++ b/sdk/java-v2/src/test/java/org/arvados/client/logic/keep/FileDownloaderTest.java @@ -0,0 +1,145 @@ +/* + * Copyright (C) The Arvados Authors. All rights reserved. + * + * SPDX-License-Identifier: AGPL-3.0 OR Apache-2.0 + * + */ + +package org.arvados.client.logic.keep; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.arvados.client.api.client.CollectionsApiClient; +import org.arvados.client.api.client.KeepWebApiClient; +import org.arvados.client.api.model.Collection; +import org.arvados.client.common.Characters; +import org.arvados.client.logic.collection.FileToken; +import org.arvados.client.logic.collection.ManifestDecoder; +import org.arvados.client.logic.collection.ManifestStream; +import org.arvados.client.test.utils.FileTestUtils; +import org.arvados.client.utils.FileMerge; +import org.apache.commons.io.FileUtils; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + +import static org.arvados.client.test.utils.FileTestUtils.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class FileDownloaderTest { + + static final ObjectMapper MAPPER = new ObjectMapper().findAndRegisterModules(); + private Collection collectionToDownload; + private ManifestStream manifestStream; + + @Mock + private CollectionsApiClient collectionsApiClient; + @Mock + private KeepClient keepClient; + @Mock + private KeepWebApiClient keepWebApiClient; + @Mock + private ManifestDecoder manifestDecoder; + @InjectMocks + private FileDownloader fileDownloader; + + @Before + public void setUp() throws Exception { + FileTestUtils.createDirectory(FILE_SPLIT_TEST_DIR); + FileTestUtils.createDirectory(FILE_DOWNLOAD_TEST_DIR); + + collectionToDownload = prepareCollection(); + manifestStream = prepareManifestStream(); + } + + @Test + public void downloadingAllFilesFromCollectionWorksProperly() throws Exception { + // given + List files = generatePredefinedFiles(); + byte[] dataChunk = prepareDataChunk(files); + + //having + when(collectionsApiClient.get(collectionToDownload.getUuid())).thenReturn(collectionToDownload); + when(manifestDecoder.decode(collectionToDownload.getManifestText())).thenReturn(Arrays.asList(manifestStream)); + when(keepClient.getDataChunk(manifestStream.getKeepLocators().get(0))).thenReturn(dataChunk); + + //when + List downloadedFiles = fileDownloader.downloadFilesFromCollection(collectionToDownload.getUuid(), FILE_DOWNLOAD_TEST_DIR); + + //then + Assert.assertEquals(3, downloadedFiles.size()); // 3 files downloaded + + File collectionDir = new File(FILE_DOWNLOAD_TEST_DIR + Characters.SLASH + collectionToDownload.getUuid()); + Assert.assertTrue(collectionDir.exists()); // collection directory created + + // 3 files correctly saved + assertThat(downloadedFiles).allMatch(File::exists); + + for(int i = 0; i < downloadedFiles.size(); i ++) { + File downloaded = new File(collectionDir + Characters.SLASH + files.get(i).getName()); + Assert.assertArrayEquals(FileUtils.readFileToByteArray(downloaded), FileUtils.readFileToByteArray(files.get(i))); + } + } + + @Test + public void downloadingSingleFileFromKeepWebWorksCorrectly() throws Exception{ + //given + File file = generatePredefinedFiles().get(0); + + //having + when(collectionsApiClient.get(collectionToDownload.getUuid())).thenReturn(collectionToDownload); + when(manifestDecoder.decode(collectionToDownload.getManifestText())).thenReturn(Arrays.asList(manifestStream)); + when(keepWebApiClient.download(collectionToDownload.getUuid(), file.getName())).thenReturn(FileUtils.readFileToByteArray(file)); + + //when + File downloadedFile = fileDownloader.downloadSingleFileUsingKeepWeb(file.getName(), collectionToDownload.getUuid(), FILE_DOWNLOAD_TEST_DIR); + + //then + Assert.assertTrue(downloadedFile.exists()); + Assert.assertEquals(file.getName(), downloadedFile.getName()); + Assert.assertArrayEquals(FileUtils.readFileToByteArray(downloadedFile), FileUtils.readFileToByteArray(file)); + } + + @After + public void tearDown() throws Exception { + FileTestUtils.cleanDirectory(FILE_SPLIT_TEST_DIR); + FileTestUtils.cleanDirectory(FILE_DOWNLOAD_TEST_DIR); + } + + private Collection prepareCollection() throws IOException { + // collection that will be returned by mocked collectionsApiClient + String filePath = "src/test/resources/org/arvados/client/api/client/collections-download-file.json"; + File jsonFile = new File(filePath); + return MAPPER.readValue(jsonFile, Collection.class); + } + + private ManifestStream prepareManifestStream() throws Exception { + // manifestStream that will be returned by mocked manifestDecoder + List fileTokens = new ArrayList<>(); + fileTokens.add(new FileToken("0:1024:test-file1")); + fileTokens.add(new FileToken("1024:20480:test-file2")); + fileTokens.add(new FileToken("21504:1048576:test-file\\0403")); + + KeepLocator keepLocator = new KeepLocator("163679d58edaadc28db769011728a72c+1070080+A3acf8c1fe582c265d2077702e4a7d74fcc03aba8@5aa4fdeb"); + return new ManifestStream(".", Arrays.asList(keepLocator), fileTokens); + } + + private byte[] prepareDataChunk(List files) throws IOException { + File combinedFile = new File(FILE_SPLIT_TEST_DIR + Characters.SLASH + UUID.randomUUID()); + FileMerge.merge(files, combinedFile); + return FileUtils.readFileToByteArray(combinedFile); + } +}