/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.datamanagement.internal;
import static org.junit.Assert.assertEquals;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.junit.After;
import org.junit.BeforeClass;
import org.junit.Test;
import de.rcenvironment.core.utils.common.TempFileService;
import de.rcenvironment.core.utils.common.TempFileServiceAccess;
import de.rcenvironment.core.utils.testing.CommonTestOptions;
/**
* Tests for {@link DataManagementServiceImpl}.
*
* @author Doreen Seider
* @author Robert Mischke (added test size switch)
*/
public class DataManagementServiceImplTest {
private TempFileService tempFileService = TempFileServiceAccess.getInstance();
private List<File> tempFiles = new ArrayList<>();
/**
* Set up.
*/
@BeforeClass
public static void setUpTempFileTestEnvironment() {
TempFileServiceAccess.setupUnitTestEnvironment();
}
/**
* Clean up.
*
* @throws IOException on unexpected error
*/
@After
public void tearDown() throws IOException {
for (File tempFile : tempFiles) {
tempFileService.disposeManagedTempDirOrFile(tempFile);
}
}
/**
* Tests packing and unpacking of tar archives.
*
* @throws IOException on unexpected error
*/
@Test
public void testTarGzUnPacking() throws IOException {
// testing with 1000 files in "extended" testing as this caused a StackOverflowError with older implementation of
// DataManagementServiceImpl#createFileOrDirForTarEntry (see https://mantis.sc.dlr.de/view.php?id=13499)
final int fileCount = CommonTestOptions.selectStandardOrExtendedValue(20, 1000);
DataManagementServiceImpl dmService = new DataManagementServiceImpl();
TempFileServiceAccess.setupUnitTestEnvironment();
File rootDir = tempFileService.createManagedTempDir();
tempFiles.add(rootDir);
File dir = rootDir;
for (int i = 0; i < 5; i++) {
dir = createDirAndBunchOfFiles(dir, fileCount);
}
File archiveFile = tempFileService.createTempFileWithFixedFilename("arc.tar.gz");
tempFiles.add(archiveFile);
dmService.createTarGz(rootDir, archiveFile);
File targetDir = tempFileService.createManagedTempDir();
tempFiles.add(targetDir);
dmService.createDirectoryFromTarGz(archiveFile, targetDir);
File[] targetDirFileList = targetDir.listFiles();
assertEquals(1, targetDirFileList.length);
compareDirectories(rootDir, targetDirFileList[0]);
}
private void compareDirectories(File rootDir, File targetRootDir) throws IOException {
assertEquals(rootDir.getName(), targetRootDir.getName());
List<File> rootDirFileList = Arrays.asList(rootDir.listFiles());
Collections.sort(rootDirFileList);
List<File> targetRootDirFileList = Arrays.asList(targetRootDir.listFiles());
Collections.sort(targetRootDirFileList);
assertEquals(rootDirFileList.size(), targetRootDirFileList.size());
for (int i = 0; i < rootDirFileList.size(); i++) {
File rootDirFile = rootDirFileList.get(i);
File targetRootDirFile = targetRootDirFileList.get(i);
assertEquals(rootDirFile.getName(), targetRootDirFile.getName());
assertEquals(rootDirFile.isDirectory(), targetRootDirFile.isDirectory());
if (!rootDirFile.isDirectory()) {
FileUtils.contentEquals(rootDirFile, targetRootDirFile);
} else {
compareDirectories(rootDirFile, targetRootDirFile);
}
}
}
private File createDirAndBunchOfFiles(File rootDir, int fileCount) throws IOException {
File dir = new File(rootDir, String.valueOf("0"));
dir.mkdirs();
for (int i = 1; i < fileCount; i++) {
File file = new File(rootDir, String.valueOf(i));
file.createNewFile();
}
return dir;
}
}