/* * ProActive Parallel Suite(TM): * The Open Source library for parallel and distributed * Workflows & Scheduling, Orchestration, Cloud Automation * and Big Data Analysis on Enterprise Grids & Clouds. * * Copyright (c) 2007 - 2017 ActiveEon * Contact: contact@activeeon.com * * This library is free software: you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation: version 3 of * the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * If needed, contact us to obtain a release under GPL Version 2 or 3 * or a different license than the AGPL. */ package functionaltests; import static functionaltests.RestFuncTHelper.getRestServerUrl; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertFalse; import static org.ow2.proactive.scheduler.rest.ds.IDataSpaceClient.Dataspace.USER; import java.io.File; import java.io.IOException; import java.net.URI; import java.net.URL; import java.util.List; import java.util.Random; import org.apache.commons.io.FileUtils; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.ow2.proactive.authentication.ConnectionInfo; import org.ow2.proactive.scheduler.common.exception.NotConnectedException; import org.ow2.proactive.scheduler.common.exception.PermissionException; import org.ow2.proactive.scheduler.rest.ds.*; import org.ow2.proactive_grid_cloud_portal.common.FileType; import org.ow2.proactive_grid_cloud_portal.dataspace.dto.ListFile; import com.google.common.io.Files; public class DataTransferTest extends AbstractRestFuncTestCase { private static final int FILE_SIZE = 100; public static final String TEMP_FILE_TXT_NAME = "tempFile.txt"; public static final String TEMP_DIR_NAME = "tempDir"; public static final String TEMP_DIR2_NAME = "tempDir2"; public static final String TEMP_FILE_TMP_NAME = "tempFile.tmp"; public static final String TEMP_FILE_ZIP_NAME = "test1.zip"; public static final String TEMP_FILE_TGZ_NAME = "test1.tgz"; public static final String TEMP_FILE_TMP_PATH = TEMP_DIR_NAME + "/" + TEMP_FILE_TMP_NAME; static URL zipFileUrl = DataTransferTest.class.getResource("/functionaltests/files/test1.zip"); static URL tgzFileUrl = DataTransferTest.class.getResource("/functionaltests/files/test2.tgz"); @Rule public TemporaryFolder tmpDir = new TemporaryFolder(); @BeforeClass public static void beforeClass() throws Exception { init(); } @Test public void testUploadSingleFile() throws Exception { File tmpFile = tmpDir.newFile(TEMP_FILE_TMP_NAME); Files.write(randomFileContents(), tmpFile); // use standard client IDataSpaceClient client = clientInstance(); LocalFileSource source = new LocalFileSource(tmpFile); RemoteDestination dest = new RemoteDestination(USER, "testUploadSingleFile/" + TEMP_FILE_TMP_NAME); assertTrue(client.upload(source, dest)); String destDirPath = URI.create(getScheduler().getUserSpaceURIs().get(0)).getPath(); File destFile = new File(destDirPath, "testUploadSingleFile/" + TEMP_FILE_TMP_NAME); assertTrue(Files.equal(tmpFile, destFile)); // use RemoteSpace API FileUtils.deleteQuietly(destFile); client.getUserSpace().pushFile(tmpFile, "testUploadSingleFile/" + TEMP_FILE_TMP_NAME); assertTrue(Files.equal(tmpFile, destFile)); } @Test public void testUploadTgzFile() throws Exception { testUploadArchiveFile(TEMP_FILE_ZIP_NAME, zipFileUrl, "testUploadZipFile"); } @Test public void testUploadZipFile() throws Exception { testUploadArchiveFile(TEMP_FILE_TGZ_NAME, tgzFileUrl, "testUploadTgzFile"); } private void testUploadArchiveFile(String archiveFileName, URL archiveFileSource, String testFolderName) throws Exception { File tmpZipFile = tmpDir.newFile(archiveFileName); FileUtils.copyInputStreamToFile(archiveFileSource.openStream(), tmpZipFile); // use standard client IDataSpaceClient client = clientInstance(); LocalFileSource source = new LocalFileSource(tmpZipFile); RemoteDestination dest = new RemoteDestination(USER, testFolderName + "/" + archiveFileName); assertTrue(client.upload(source, dest)); String destDirPath = URI.create(getScheduler().getUserSpaceURIs().get(0)).getPath(); File destFile = new File(destDirPath, testFolderName + "/" + archiveFileName); assertTrue(Files.equal(tmpZipFile, destFile)); // use RemoteSpace API FileUtils.deleteQuietly(destFile); client.getUserSpace().pushFile(tmpZipFile, testFolderName + "/" + archiveFileName); assertTrue(Files.equal(tmpZipFile, destFile)); } @Test public void testUploadAllFilesInDirectory() throws Exception { // entire folder TestFilesToUploadCreator testFiles = new TestFilesToUploadCreator().invoke(); File tempTextFile = testFiles.getTempTextFile(); File tempFile = testFiles.getTempFile(); // use standard client IDataSpaceClient client = clientInstance(); LocalDirSource source = new LocalDirSource(tmpDir.getRoot()); RemoteDestination dest = new RemoteDestination(USER, "testUploadAllFilesInDirectory"); assertTrue(client.upload(source, dest)); String destRootUri = URI.create(getScheduler().getUserSpaceURIs().get(0)).getPath(); assertTrue(Files.equal(tempTextFile, new File(destRootUri, "testUploadAllFilesInDirectory/" + TEMP_FILE_TXT_NAME))); assertTrue(Files.equal(tempFile, new File(destRootUri, "testUploadAllFilesInDirectory/" + TEMP_FILE_TMP_PATH))); // use RemoteSpace API FileUtils.deleteDirectory(new File(destRootUri, "testUploadAllFilesInDirectory")); client.getUserSpace().pushFile(tmpDir.getRoot(), "testUploadAllFilesInDirectory"); assertTrue(Files.equal(tempTextFile, new File(destRootUri, "testUploadAllFilesInDirectory/" + TEMP_FILE_TXT_NAME))); assertTrue(Files.equal(tempFile, new File(destRootUri, "testUploadAllFilesInDirectory/" + TEMP_FILE_TMP_PATH))); } @Test public void testUploadSelectedFilesUsingGlobPattern() throws Exception { TestFilesToUploadCreator testFiles = new TestFilesToUploadCreator().invoke(); File tempTextFile = testFiles.getTempTextFile(); File tempFile = testFiles.getTempFile(); // use standard client IDataSpaceClient client = clientInstance(); LocalDirSource source = new LocalDirSource(tmpDir.getRoot()); source.setIncludes("*.txt"); RemoteDestination dest = new RemoteDestination(USER, "testUploadSelectedFilesUsingGlobPattern"); assertTrue(client.upload(source, dest)); String destRootUri = URI.create(getScheduler().getUserSpaceURIs().get(0)).getPath(); File[] destRootFiles = new File(destRootUri, "testUploadSelectedFilesUsingGlobPattern").listFiles(); assertEquals(1, destRootFiles.length); assertTrue(Files.equal(tempTextFile, destRootFiles[0])); // use RemoteSpace API FileUtils.deleteDirectory(new File(destRootUri, "testUploadSelectedFilesUsingGlobPattern")); client.getUserSpace().pushFiles(tmpDir.getRoot(), "*.txt", "testUploadSelectedFilesUsingGlobPattern"); destRootFiles = new File(destRootUri, "testUploadSelectedFilesUsingGlobPattern").listFiles(); assertEquals(1, destRootFiles.length); assertTrue(Files.equal(tempTextFile, destRootFiles[0])); } @Test public void testUploadSelectedFilesUsingFilenames() throws Exception { TestFilesToUploadCreator testFiles = new TestFilesToUploadCreator().invoke(); File tempTextFile = testFiles.getTempTextFile(); File tempFile = testFiles.getTempFile(); // use standard client IDataSpaceClient client = clientInstance(); LocalDirSource source = new LocalDirSource(tmpDir.getRoot()); source.setIncludes("**/" + TEMP_FILE_TMP_NAME); RemoteDestination dest = new RemoteDestination(USER, "testUploadSelectedFilesUsingFilenames"); assertTrue(client.upload(source, dest)); String destRootUri = URI.create(getScheduler().getUserSpaceURIs().get(0)).getPath(); File[] destRootFiles = new File(destRootUri, "testUploadSelectedFilesUsingFilenames").listFiles(); assertEquals(1, destRootFiles.length); assertTrue(Files.equal(tempFile, destRootFiles[0])); // use RemoteSpace API FileUtils.deleteDirectory(new File(destRootUri, "testUploadSelectedFilesUsingFilenames")); client.getUserSpace().pushFiles(tmpDir.getRoot(), "**/" + TEMP_FILE_TMP_NAME, "testUploadSelectedFilesUsingFilenames"); destRootFiles = new File(destRootUri, "testUploadSelectedFilesUsingFilenames").listFiles(); assertEquals(1, destRootFiles.length); assertTrue(Files.equal(tempFile, destRootFiles[0])); } @Test public void testDownloadFile() throws Exception { String srcDirPath = URI.create(getScheduler().getUserSpaceURIs().get(0)).getPath(); File srcFile = new File(srcDirPath, TEMP_FILE_TMP_NAME); if (srcFile.exists()) { assertTrue(srcFile.delete()); } Files.write(randomFileContents(), srcFile); File tmpFile = tmpDir.newFile(TEMP_FILE_TMP_NAME); if (tmpFile.exists()) { assertTrue(tmpFile.delete()); } // use standard client IDataSpaceClient client = clientInstance(); RemoteSource source = new RemoteSource(USER, TEMP_FILE_TMP_NAME); LocalDestination dest = new LocalDestination(tmpFile); assertTrue(client.download(source, dest)); assertTrue(Files.equal(srcFile, tmpFile)); // use RemoteSpace API FileUtils.deleteQuietly(tmpFile); File downloadedFile = client.getUserSpace().pullFile(TEMP_FILE_TMP_NAME, tmpFile); assertTrue(Files.equal(srcFile, downloadedFile)); } @Test public void testDownloadZipFile() throws Exception { testDownloadArchiveFile(TEMP_FILE_ZIP_NAME, zipFileUrl); } @Test public void testDownloadTgzFile() throws Exception { testDownloadArchiveFile(TEMP_FILE_TGZ_NAME, tgzFileUrl); } private void testDownloadArchiveFile(String archiveFileName, URL archiveSource) throws Exception { String srcDirPath = URI.create(getScheduler().getUserSpaceURIs().get(0)).getPath(); File srcFile = new File(srcDirPath, archiveFileName); if (srcFile.exists()) { assertTrue(srcFile.delete()); } FileUtils.copyInputStreamToFile(archiveSource.openStream(), srcFile); File tmpFile = tmpDir.newFile(archiveFileName); if (tmpFile.exists()) { assertTrue(tmpFile.delete()); } // use standard client IDataSpaceClient client = clientInstance(); RemoteSource source = new RemoteSource(USER, archiveFileName); LocalDestination dest = new LocalDestination(tmpFile); assertTrue(client.download(source, dest)); assertTrue(Files.equal(srcFile, tmpFile)); // use RemoteSpace API FileUtils.deleteQuietly(tmpFile); File downloadedFile = client.getUserSpace().pullFile(archiveFileName, tmpFile); assertTrue(Files.equal(srcFile, downloadedFile)); } @Test public void testDownloadAllFilesInDirectory() throws Exception { String srcDirPath = URI.create(getScheduler().getUserSpaceURIs().get(0)).getPath(); String dirName = "testDownloadAllFilesInDirectory"; TestFilesToDownloadCreator testFilesToDownloadCreator = new TestFilesToDownloadCreator(srcDirPath, dirName).invoke(); File srcTextFile = testFilesToDownloadCreator.getSrcTextFile(); File srcTempFile = testFilesToDownloadCreator.getSrcTempFile(); File destTempDir = tmpDir.newFolder(TEMP_DIR_NAME); // use standard client IDataSpaceClient client = clientInstance(); RemoteSource source = new RemoteSource(USER, "testDownloadAllFilesInDirectory"); LocalDestination dest = new LocalDestination(destTempDir); assertTrue(client.download(source, dest)); assertTrue(Files.equal(srcTextFile, new File(destTempDir, TEMP_FILE_TXT_NAME))); assertTrue(Files.equal(srcTempFile, new File(destTempDir, TEMP_FILE_TMP_PATH))); // use RemoteSpace API File destTempDir2 = tmpDir.newFolder(TEMP_DIR2_NAME); client.getUserSpace().pullFile("testDownloadAllFilesInDirectory", destTempDir2); assertTrue(Files.equal(srcTextFile, new File(destTempDir2, TEMP_FILE_TXT_NAME))); assertTrue(Files.equal(srcTempFile, new File(destTempDir2, TEMP_FILE_TMP_PATH))); } @Test public void testDownloadSelectedFilesUsingGlobPattern() throws Exception { String srcDirPath = URI.create(getScheduler().getUserSpaceURIs().get(0)).getPath(); String dirName = "testDownloadSelectedFilesUsingGlobPattern"; TestFilesToDownloadCreator testFilesToDownloadCreator = new TestFilesToDownloadCreator(srcDirPath, dirName).invoke(); File srcTextFile = testFilesToDownloadCreator.getSrcTextFile(); File srcTempFile = testFilesToDownloadCreator.getSrcTempFile(); File destTempDir = tmpDir.newFolder(TEMP_DIR_NAME); // use standard client IDataSpaceClient client = clientInstance(); RemoteSource source = new RemoteSource(USER, dirName); source.setIncludes("*.txt"); LocalDestination dest = new LocalDestination(destTempDir); assertTrue(client.download(source, dest)); File[] listFiles = destTempDir.listFiles(); assertEquals(1, listFiles.length); assertTrue(Files.equal(srcTextFile, listFiles[0])); // use RemoteSpace API File destTempDir2 = tmpDir.newFolder(TEMP_DIR2_NAME); client.getUserSpace().pullFiles(dirName, "*.txt", destTempDir2); listFiles = destTempDir2.listFiles(); assertEquals(1, listFiles.length); assertTrue(Files.equal(srcTextFile, listFiles[0])); } @Test public void testListFilesNonRecursive() throws Exception { System.out.println("testListFilesNonRecursive"); createFilesInUserSpace("testListFilesNonRecursive"); // use standard client IDataSpaceClient client = clientInstance(); RemoteSource source = new RemoteSource(USER, "testListFilesNonRecursive"); source.setIncludes("*"); ListFile listFile = client.list(source); List<String> directories = listFile.getDirectoryListing(); System.out.println("Directories : " + directories); assertEquals(1, directories.size()); assertEquals(TEMP_DIR_NAME, directories.get(0)); List<String> files = listFile.getFileListing(); System.out.println("Files : " + files); assertEquals(1, files.size()); assertEquals(TEMP_FILE_TXT_NAME, files.get(0)); // use RemoteSpace API List<String> foundFiles = client.getUserSpace().listFiles("testListFilesNonRecursive", "*"); System.out.println("Full : " + foundFiles); assertEquals(2, foundFiles.size()); assertArrayEquals(new String[] { TEMP_DIR_NAME, TEMP_FILE_TXT_NAME }, foundFiles.toArray(new String[0])); } private void createFilesInUserSpace(String testListFilesNonRecursive) throws NotConnectedException, PermissionException, IOException { String srcDirPath = URI.create(getScheduler().getUserSpaceURIs().get(0)).getPath(); new TestFilesToDownloadCreator(srcDirPath, testListFilesNonRecursive).invoke(); } @Test public void testListFilesRecursive() throws Exception { System.out.println("testListFilesRecursive"); createFilesInUserSpace("testListFilesRecursive"); // use standard client IDataSpaceClient client = clientInstance(); RemoteSource source = new RemoteSource(USER, "testListFilesRecursive"); source.setIncludes("**"); ListFile listFile = client.list(source); List<String> directories = listFile.getDirectoryListing(); System.out.println("Directories : " + directories); assertEquals(1, directories.size()); assertEquals(DataTransferTest.TEMP_DIR_NAME, directories.get(0)); List<String> files = listFile.getFileListing(); System.out.println("Files : " + files); assertEquals(2, files.size()); assertEquals(TEMP_FILE_TMP_PATH, files.get(0)); assertEquals(TEMP_FILE_TXT_NAME, files.get(1)); // use RemoteSpace API List<String> foundFiles = client.getUserSpace().listFiles("testListFilesRecursive", "**"); System.out.println("Full : " + foundFiles); assertEquals(3, foundFiles.size()); assertArrayEquals(new String[] { TEMP_DIR_NAME, TEMP_FILE_TMP_PATH, TEMP_FILE_TXT_NAME }, foundFiles.toArray(new String[0])); } @Test public void testListFilesRecursiveWithPattern() throws Exception { System.out.println("testListFilesRecursiveWithPattern"); createFilesInUserSpace("testListFilesRecursiveWithPattern"); // use standard client IDataSpaceClient client = clientInstance(); RemoteSource source = new RemoteSource(USER, "testListFilesRecursiveWithPattern"); source.setIncludes("**/*.tmp"); ListFile listFile = client.list(source); List<String> directories = listFile.getDirectoryListing(); System.out.println("Directories : " + directories); assertEquals(0, directories.size()); List<String> files = listFile.getFileListing(); System.out.println("Files : " + files); assertEquals(1, files.size()); assertEquals(TEMP_FILE_TMP_PATH, files.get(0)); // use RemoteSpace API List<String> foundFiles = client.getUserSpace().listFiles("testListFilesRecursiveWithPattern", "**/*.tmp"); System.out.println("Full : " + foundFiles); assertEquals(1, foundFiles.size()); assertArrayEquals(new String[] { TEMP_FILE_TMP_PATH }, foundFiles.toArray(new String[0])); } @Test public void testDeleteFile() throws Exception { URI srcDirPath = URI.create(getScheduler().getUserSpaceURIs().get(0)); File srcFile = new File(new File(srcDirPath), TEMP_FILE_TMP_NAME); if (srcFile.exists()) { assertTrue(srcFile.delete()); } Files.write(randomFileContents(), srcFile); // use standard client IDataSpaceClient client = clientInstance(); RemoteSource source = new RemoteSource(USER, TEMP_FILE_TMP_NAME); assertTrue(client.delete(source)); assertFalse(srcFile.exists()); // use RemoteSpace API Files.write(randomFileContents(), srcFile); client.getUserSpace().deleteFile(TEMP_FILE_TMP_NAME); assertFalse(srcFile.exists()); } @Test public void testCreateFile() throws Exception { URI srcDirPath = URI.create(getScheduler().getUserSpaceURIs().get(0)); String filename = TEMP_FILE_TMP_NAME; RemoteSource source = new RemoteSource(USER, filename); source.setType(FileType.FILE); IDataSpaceClient client = clientInstance(); assertTrue(client.create(source)); File expectedFile = new File(srcDirPath.getPath(), filename); assertTrue(expectedFile.exists()); assertTrue(expectedFile.isFile()); } @Test public void testCreateFolder() throws Exception { URI srcDirPath = URI.create(getScheduler().getUserSpaceURIs().get(0)); String folderName = "testcreatefolder"; RemoteSource source = new RemoteSource(USER, folderName); source.setType(FileType.FOLDER); IDataSpaceClient client = clientInstance(); assertTrue(client.create(source)); File expectedFile = new File(srcDirPath.getPath(), folderName); assertTrue(expectedFile.exists()); assertTrue(expectedFile.isDirectory()); } @Test(expected = Exception.class) public void testCreateFolderWithoutSpecifyingFileType() throws Exception { String folderName = "testcreatefolder"; RemoteSource source = new RemoteSource(USER, folderName); // file is not specified IDataSpaceClient client = clientInstance(); assertTrue(client.create(source)); } private byte[] randomFileContents() { byte[] fileContents = new byte[FILE_SIZE]; new Random().nextBytes(fileContents); return fileContents; } private IDataSpaceClient clientInstance() throws Exception { DataSpaceClient client = new DataSpaceClient(); client.init(new ConnectionInfo(getRestServerUrl(), getLogin(), getPassword(), null, true)); return client; } private class TestFilesToUploadCreator { private File tempTextFile; private File tempFile; public File getTempTextFile() { return tempTextFile; } public File getTempFile() { return tempFile; } public TestFilesToUploadCreator invoke() throws IOException { tempTextFile = tmpDir.newFile(TEMP_FILE_TXT_NAME); Files.write("some text ...".getBytes(), tempTextFile); File tempDir = tmpDir.newFolder(DataTransferTest.TEMP_DIR_NAME); tempFile = new File(tempDir, TEMP_FILE_TMP_NAME); Files.createParentDirs(tempFile); Files.write(randomFileContents(), tempFile); return this; } } private class TestFilesToDownloadCreator { private String srcDirPath; private String dirName; private File srcTextFile; private File srcTempFile; public TestFilesToDownloadCreator(String srcDirPath, String dirName) { this.srcDirPath = srcDirPath; this.dirName = dirName; } public File getSrcTextFile() { return srcTextFile; } public File getSrcTempFile() { return srcTempFile; } public TestFilesToDownloadCreator invoke() throws IOException { File srcDir = new File(srcDirPath, dirName); if (srcDir.exists()) { FileUtils.deleteDirectory(srcDir); } srcTextFile = new File(srcDir, TEMP_FILE_TXT_NAME); Files.createParentDirs(srcTextFile); Files.write("some text ...".getBytes(), srcTextFile); File srcTempDir = new File(srcDir, TEMP_DIR_NAME); srcTempFile = new File(srcTempDir, TEMP_FILE_TMP_NAME); Files.createParentDirs(srcTempFile); Files.write(randomFileContents(), srcTempFile); return this; } } }