/*
* Copyright 2014 Yaroslav Mytkalyk
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.docd.purefm.test;
import android.os.Environment;
import android.test.AndroidTestCase;
import com.docd.purefm.file.GenericFile;
import com.docd.purefm.file.JavaFile;
import com.docd.purefm.utils.PFMFileUtils;
import org.apache.commons.io.FileExistsException;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* Tests PFMFileUtils copy and move methods
*/
public final class PFMFileUtilsTest extends AndroidTestCase {
private static final File testDir = new File(Environment.getExternalStorageDirectory(), "_test_PFMFileUtils");
@Override
protected void setUp() throws Exception {
super.setUp();
final String state = Environment.getExternalStorageState();
if (!state.equals(Environment.MEDIA_MOUNTED)) {
throw new RuntimeException("Make sure the external storage is mounted read-write before running this test");
}
try {
FileUtils.forceDelete(testDir);
} catch (IOException e) {
//ignored
}
assertTrue(testDir.mkdirs());
}
@Override
protected void runTest() throws Throwable {
super.runTest();
runTests(false);
runTests(true);
}
private void runTests(final boolean useCommandLine) throws Throwable {
testCopyFileToFileInTheSameDir(useCommandLine);
testCopyFileToFileInDifferentDir(useCommandLine);
testCopyFileToDirectory(useCommandLine);
testMoveFileToFileInTheSameDir(useCommandLine);
testMoveFileToFileInDifferentDir(useCommandLine);
testMoveFileToDirectory(useCommandLine);
testCopyEmptyDirectory(useCommandLine);
testCopyEmptyDirectoryToDirectory(useCommandLine);
testMoveEmptyDirectory(useCommandLine);
testMoveEmptyDirectoryToDirectory(useCommandLine);
}
private void testCopyFileToFileInTheSameDir(final boolean useCommandLine) throws Throwable {
final GenericFile fileToCopy = new JavaFile(testDir, "fileToCopy");
assertTrue(fileToCopy.createNewFile());
final GenericFile targetFile = new JavaFile(testDir, "targetFile");
PFMFileUtils.copyFile(fileToCopy, targetFile, useCommandLine);
assertTrue(fileToCopy.toFile().exists());
assertTrue(targetFile.toFile().exists());
assertTrue(fileToCopy.toFile().isFile());
assertTrue(targetFile.toFile().isFile());
assertTrue(fileToCopy.toFile().delete());
assertTrue(targetFile.toFile().delete());
}
private void testMoveFileToFileInTheSameDir(final boolean useCommandLine) throws Throwable {
final GenericFile fileToMove = new JavaFile(testDir, "fileToMove");
assertTrue(fileToMove.createNewFile());
final GenericFile targetFile = new JavaFile(testDir, "targetFile");
PFMFileUtils.moveFile(fileToMove, targetFile, useCommandLine);
assertFalse(fileToMove.exists());
assertTrue(targetFile.exists());
assertTrue(targetFile.toFile().isFile());
//cleanup
assertTrue(targetFile.toFile().delete());
}
private void testCopyFileToFileInDifferentDir(final boolean useCommandLine)
throws Throwable {
final GenericFile fileToCopy = new JavaFile(testDir, "fileToCopy");
assertTrue(fileToCopy.createNewFile());
final GenericFile targetDir = new JavaFile(testDir, "targetDir");
assertTrue(targetDir.mkdir());
final GenericFile targetFile = new JavaFile(targetDir.toFile(), "targetFile");
PFMFileUtils.copyFile(fileToCopy, targetFile, useCommandLine);
assertTrue(fileToCopy.exists());
assertTrue(targetFile.exists());
assertTrue(fileToCopy.toFile().isFile());
assertTrue(targetFile.toFile().isFile());
//cleanup
assertTrue(fileToCopy.delete());
assertTrue(targetFile.delete());
assertTrue(targetDir.delete());
}
private void testMoveFileToFileInDifferentDir(final boolean useCommandLine)
throws Throwable {
final GenericFile fileToMove = new JavaFile(testDir, "fileToMove");
assertTrue(fileToMove.createNewFile());
final GenericFile targetDir = new JavaFile(testDir, "targetDir");
assertTrue(targetDir.mkdir());
final GenericFile targetFile = new JavaFile(targetDir.toFile(), "targetFile");
PFMFileUtils.moveFile(fileToMove, targetFile, useCommandLine);
assertFalse(fileToMove.toFile().exists());
assertTrue(targetFile.toFile().exists());
assertTrue(targetFile.toFile().isFile());
//test if FileExistsException is thrown
assertTrue(fileToMove.createNewFile());
try {
PFMFileUtils.moveFile(fileToMove, targetFile, useCommandLine);
throw new RuntimeException("FileExistsException is not thrown");
} catch (FileExistsException ignored) {
}
//cleanup
assertTrue(fileToMove.delete());
assertTrue(targetFile.delete());
assertTrue(targetDir.delete());
}
private void testCopyFileToDirectory(final boolean useCommandLine) throws Throwable {
final GenericFile fileToCopy = new JavaFile(testDir, "fileToCopy");
assertTrue(fileToCopy.createNewFile());
final GenericFile targetDir = new JavaFile(testDir, "targetDir");
assertTrue(targetDir.mkdir());
PFMFileUtils.copyFileToDirectory(fileToCopy, targetDir, useCommandLine);
final GenericFile targetFile = new JavaFile(targetDir.toFile(), fileToCopy.getName());
assertTrue(fileToCopy.exists());
assertTrue(targetFile.exists());
assertTrue(fileToCopy.toFile().isFile());
assertTrue(targetFile.toFile().isFile());
//test if IllegalArgumentException is thrown
try {
PFMFileUtils.copyFileToDirectory(fileToCopy, targetFile, useCommandLine);
throw new RuntimeException("Fail: IllegalArgumentException not thrown");
} catch (IllegalArgumentException ignored) {
}
//cleanup
assertTrue(targetFile.delete());
assertTrue(targetDir.delete());
assertTrue(fileToCopy.delete());
}
private void testMoveFileToDirectory(final boolean useCommandLine)
throws Throwable {
final GenericFile fileToMove = new JavaFile(testDir, "fileToMove");
assertTrue(fileToMove.createNewFile());
final GenericFile targetDir = new JavaFile(testDir, "targetDir");
PFMFileUtils.moveToDirectory(fileToMove, targetDir, useCommandLine, true);
final GenericFile targetFile = new JavaFile(targetDir.toFile(), fileToMove.getName());
assertFalse(fileToMove.exists());
assertTrue(targetDir.exists());
assertTrue(targetDir.isDirectory());
assertTrue(targetFile.exists());
assertTrue(targetFile.toFile().isFile());
//test if IOException is thrown
assertTrue(fileToMove.createNewFile());
try {
PFMFileUtils.moveToDirectory(fileToMove, targetFile, useCommandLine, false);
throw new RuntimeException("IOException is not thrown");
} catch (IOException ignored) {
}
assertTrue(targetFile.delete());
assertTrue(targetDir.delete());
//test if FileNotFoundException is thrown
try {
PFMFileUtils.moveToDirectory(fileToMove, targetFile, useCommandLine, false);
throw new RuntimeException("FileNotFoundException is not thrown");
} catch (FileNotFoundException ignored) {
}
//cleanup
assertTrue(fileToMove.delete());
}
//========================= DIRECTORIES ==========================
private void testCopyEmptyDirectory(final boolean useCommandLine)
throws Throwable {
final GenericFile dirToCopy = new JavaFile(testDir, "dirToCopy");
assertTrue(dirToCopy.mkdir());
final GenericFile targetDir = new JavaFile(testDir, "targetDir");
assertTrue(targetDir.mkdir());
final GenericFile copiedDir = new JavaFile(targetDir.toFile(), dirToCopy.getName());
PFMFileUtils.copyDirectory(dirToCopy, copiedDir, useCommandLine);
assertTrue(dirToCopy.exists());
assertTrue(dirToCopy.isDirectory());
assertTrue(copiedDir.exists());
assertTrue(copiedDir.isDirectory());
assertTrue(dirToCopy.delete());
try {
PFMFileUtils.copyDirectory(dirToCopy, copiedDir, useCommandLine);
throw new RuntimeException("FileNotFoundException not thrown");
} catch (FileNotFoundException ignored) {
}
assertTrue(dirToCopy.createNewFile());
try {
PFMFileUtils.copyDirectory(dirToCopy, copiedDir, useCommandLine);
throw new RuntimeException("IOException not thrown");
} catch (IOException ignored) {
}
try {
PFMFileUtils.copyDirectory(copiedDir, copiedDir, useCommandLine);
throw new RuntimeException("IOException not thrown");
} catch (IOException ignored) {
}
//cleanup
assertTrue(dirToCopy.delete());
assertTrue(copiedDir.delete());
assertTrue(targetDir.delete());
}
private void testCopyEmptyDirectoryToDirectory(final boolean useCommandLine)
throws Throwable {
final GenericFile dirToCopy = new JavaFile(testDir, "dirToCopy");
assertTrue(dirToCopy.mkdir());
final GenericFile targetDir = new JavaFile(testDir, "targetDir");
assertTrue(targetDir.mkdir());
PFMFileUtils.copyDirectoryToDirectory(dirToCopy, targetDir, useCommandLine);
final GenericFile copiedDir = new JavaFile(targetDir.toFile(), dirToCopy.getName());
assertTrue(dirToCopy.exists());
assertTrue(dirToCopy.isDirectory());
assertTrue(copiedDir.exists());
assertTrue(copiedDir.isDirectory());
assertTrue(dirToCopy.delete());
assertTrue(copiedDir.delete());
assertTrue(targetDir.delete());
}
private void testMoveEmptyDirectory(final boolean useCommandLine)
throws Throwable {
final GenericFile dirToMove = new JavaFile(testDir, "dirToMove");
assertTrue(dirToMove.mkdir());
final GenericFile targetDir = new JavaFile(testDir, "targetDir");
assertTrue(targetDir.mkdir());
final GenericFile movedDir = new JavaFile(targetDir.toFile(), dirToMove.getName());
PFMFileUtils.moveDirectory(dirToMove, movedDir, useCommandLine);
assertFalse(dirToMove.exists());
assertTrue(movedDir.exists());
assertTrue(movedDir.isDirectory());
assertTrue(movedDir.delete());
assertTrue(targetDir.delete());
}
private void testMoveEmptyDirectoryToDirectory(final boolean useCommandLine)
throws Throwable {
final GenericFile dirToMove = new JavaFile(testDir, "dirToMove");
assertTrue(dirToMove.mkdir());
final GenericFile targetDir = new JavaFile(testDir, "targetDir");
assertTrue(targetDir.mkdir());
PFMFileUtils.moveToDirectory(dirToMove, targetDir, useCommandLine, false);
final GenericFile movedDir = new JavaFile(targetDir.toFile(), dirToMove.getName());
assertFalse(dirToMove.exists());
assertTrue(movedDir.exists());
assertTrue(movedDir.isDirectory());
assertTrue(movedDir.delete());
assertTrue(targetDir.delete());
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
FileUtils.forceDelete(testDir);
}
}