package gov.loc.repository.bagit.verify;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import gov.loc.repository.bagit.PrivateConstructorTest;
import gov.loc.repository.bagit.domain.Bag;
import gov.loc.repository.bagit.exceptions.FileNotInPayloadDirectoryException;
import gov.loc.repository.bagit.exceptions.MissingBagitFileException;
import gov.loc.repository.bagit.exceptions.MissingPayloadDirectoryException;
import gov.loc.repository.bagit.exceptions.MissingPayloadManifestException;
import gov.loc.repository.bagit.reader.BagReader;
public class MandatoryVerifierTest extends PrivateConstructorTest {
@Rule
public TemporaryFolder folder= new TemporaryFolder();
private Path rootDir = Paths.get(new File("src/test/resources/bags/v0_97/bag").toURI());
private BagReader reader = new BagReader();
@Test
public void testClassIsWellDefined() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException{
assertUtilityClassWellDefined(MandatoryVerifier.class);
}
@Test(expected=FileNotInPayloadDirectoryException.class)
public void testErrorWhenFetchItemsDontExist() throws Exception{
rootDir = Paths.get(new File("src/test/resources/bad-fetch-bag").toURI());
Bag bag = reader.read(rootDir);
MandatoryVerifier.checkFetchItemsExist(bag.getItemsToFetch(), bag.getRootDir());
}
@Test(expected=MissingPayloadDirectoryException.class)
public void testErrorWhenMissingPayloadDirectory() throws Exception{
copyBagToTestFolder();
Bag bag = reader.read(Paths.get(folder.getRoot().toURI()));
File dataDir = new File(folder.getRoot(), "data");
deleteDirectory(Paths.get(dataDir.toURI()));
MandatoryVerifier.checkPayloadDirectoryExists(bag);
}
@Test(expected=MissingPayloadManifestException.class)
public void testErrorWhenMissingPayloadManifest() throws Exception{
copyBagToTestFolder();
Bag bag = reader.read(Paths.get(folder.getRoot().toURI()));
File manifestFile = new File(folder.getRoot(), "manifest-md5.txt");
manifestFile.delete();
MandatoryVerifier.checkIfAtLeastOnePayloadManifestsExist(bag.getRootDir(), bag.getVersion());
}
@Test(expected=MissingBagitFileException.class)
public void testErrorWhenMissingBagitTextFile() throws Exception{
copyBagToTestFolder();
Bag bag = reader.read(Paths.get(folder.getRoot().toURI()));
File bagitFile = new File(folder.getRoot(), "bagit.txt");
bagitFile.delete();
MandatoryVerifier.checkBagitFileExists(bag.getRootDir(), bag.getVersion());
}
private void copyBagToTestFolder() throws Exception{
Files.walk(rootDir).forEach(path ->{
try {
Files.copy(path, Paths.get(path.toString().replace(
rootDir.toString(),
folder.getRoot().toString())));
} catch (Exception e) {}});
}
private void deleteDirectory(Path directory) throws Exception{
Files.walkFileTree(directory, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
Files.delete(dir);
return FileVisitResult.CONTINUE;
}
});
}
}