diff --git a/Core/test/qa-functional/src/org/sleuthkit/autopsy/ingest/EmbeddedFileTest.java b/Core/test/qa-functional/src/org/sleuthkit/autopsy/ingest/EmbeddedFileTest.java index fa7226512f..36ecd56d8f 100755 --- a/Core/test/qa-functional/src/org/sleuthkit/autopsy/ingest/EmbeddedFileTest.java +++ b/Core/test/qa-functional/src/org/sleuthkit/autopsy/ingest/EmbeddedFileTest.java @@ -126,4 +126,153 @@ public class EmbeddedFileTest extends NbTestCase { } + public void testBigFolder() { + final int numOfFilesToTest = 1000; + try { + //Get all files under 'big folder' directory except '.' '..' 'slack' files + List results = openCase.getSleuthkitCase().findAllFilesWhere("parent_path LIKE '%big folder/' and name != '.' and name != '..' and extension NOT LIKE '%slack'"); + assertEquals(numOfFilesToTest, results.size()); //There are 1000 files + int numOfFilesTested = 0; + for (AbstractFile file : results) { + String fileName = file.getName(); + //File name should like file1.txt, file2.txt ... file1000.txt + String errMsg = String.format("File name %s doesn't follow the expected naming convention: fileNaturalNumber.txt, eg. file234.txt.", fileName); + assertTrue(errMsg, file.getName().matches("file[1-9]\\d*.txt")); + String hashValue = file.getMd5Hash(); + //All files have the same hash value + assertEquals(HASH_VALUE, hashValue); + numOfFilesTested++; + } + //Make sure 1000 files have been tested + assertEquals(numOfFilesToTest, numOfFilesTested); + } catch (TskCoreException ex) { + Exceptions.printStackTrace(ex); + Assert.fail(ex); + } + + } + + public void testDeepFolder() { + try { + //Get all files under 'deep folder' directory except '.' '..' + List results = openCase.getSleuthkitCase().findAllFilesWhere("parent_path LIKE '%deep folder/' and name != '.' and name != '..'"); + assertEquals(1, results.size()); + StringBuffer dirReached = new StringBuffer(); + ArrayList fileReached = new ArrayList<>(); + checkEachFileInDeepFolder(results.get(0), dirReached, fileReached, 0); + //Check that all 25 folders/files have been reached + assertEquals(DEEP_FOLDER_COUNT, fileReached.size()); + //Make sure the test reached the last directory 'dir25'. The whole directory is dir1/dir2...dir24/dir25/ + assertTrue(dirReached.toString().startsWith("dir1/dir2/")); + assertTrue(dirReached.toString().endsWith("dir24/dir25/")); + //Make sure the test reached the last file.txt in dir1/dir2...dir24/dir25/ + assertTrue(fileReached.get(0).endsWith(dirReached.toString() + "file.txt")); + } catch (TskCoreException ex) { + Exceptions.printStackTrace(ex); + Assert.fail(ex); + } + + } + + public void testEmbeddedFile() { + try { + //Query level3.txt under '/ZIP/embedded/level3.zip/' + List results = openCase.getSleuthkitCase().findAllFilesWhere("name = 'level3.txt' and parent_path = '/ZIP/embedded/level3.zip/'"); + assertEquals(1, results.size()); + + //Query level2.txt under '/ZIP/embedded/level3.zip/level2.zip/' + results = openCase.getSleuthkitCase().findAllFilesWhere("name = 'level2.txt' and parent_path = '/ZIP/embedded/level3.zip/level2.zip/'"); + assertEquals(1, results.size()); + + //Query level1.txt under '/ZIP/embedded/level3.zip/level2.zip/level1.zip/' + results = openCase.getSleuthkitCase().findAllFilesWhere("name = 'level1.txt' and parent_path = '/ZIP/embedded/level3.zip/level2.zip/level1.zip/'"); + assertEquals(1, results.size()); + + //Confirm that we can reach level1.txt from the embedded folder + results = openCase.getSleuthkitCase().findAllFilesWhere("parent_path LIKE '%embedded/' and name != '.' and name != '..' and extension NOT LIKE '%slack%'"); + assertEquals(1, results.size()); + assertTrue(checkFileInEmbeddedFolder(results.get(0))); + } catch (TskCoreException ex) { + Exceptions.printStackTrace(ex); + Assert.fail(ex); + } + + } + + public void testContent() { + final int numOfFilesToTest = 1029; + try { + //All files with txt extension should have the same hash value, + //except the zip file with txt extension and the .txt files extracted from password protected zip shouldn't have hash value + List results = openCase.getSleuthkitCase().findAllFilesWhere( + "extension = 'txt' and name != 'zipFileWithTxtExtension.txt' and parent_path NOT LIKE '%_protected%'"); + assertEquals(numOfFilesToTest, results.size()); + int numOfHashTested = 0; + for (AbstractFile file : results) { + String fileName = file.getName(); + String errMsg = String.format("File name %s doesn't have the extected hash value %s.", fileName, HASH_VALUE); + assertEquals(errMsg, HASH_VALUE, file.getMd5Hash()); + numOfHashTested++; + } + //Make sure the hash value of 1029 files have been tested + assertEquals(numOfFilesToTest, numOfHashTested); + + } catch (TskCoreException ex) { + Exceptions.printStackTrace(ex); + Assert.fail(ex); + } + } + + public void testExtension() { + try { + //Query zipFileWithTxtExtension.txt at extension folder + List results = openCase.getSleuthkitCase().findAllFilesWhere("extension = 'txt' and parent_path = '/ZIP/extension/zipFileWithTxtExtension.txt/'"); + assertEquals(1, results.size()); + assertEquals("file.txt wasn't extracted from the file: zipFileWithTxtExtension.txt", "file.txt", results.get(0).getName()); + } catch (TskCoreException ex) { + Exceptions.printStackTrace(ex); + Assert.fail(ex); + } + } + + private void checkEachFileInDeepFolder(AbstractFile file, StringBuffer dirReached, ArrayList fileReached, int numOfDir) { + String errMsg = String.format("File/Directory name is not as expected name: %s", file.getName()); + if (file.isDir() && !file.getName().equals(".") && !file.getName().equals("..")) { + numOfDir++; + assertEquals(errMsg, String.format("dir%d", numOfDir), file.getName()); + dirReached.append(file.getName()).append("/"); + try { + List children = file.listFiles(); + for (AbstractFile child : children) { + checkEachFileInDeepFolder(child, dirReached, fileReached, numOfDir); + } + } catch (TskCoreException ex) { + Exceptions.printStackTrace(ex); + Assert.fail(ex); + } + } else if (file.isFile() && !file.getName().endsWith("slack")) { + assertEquals(errMsg, "file.txt", file.getName()); + fileReached.add(file.getParentPath() + file.getName()); + } + } + + private boolean checkFileInEmbeddedFolder(AbstractFile file) { + if (file.getName().equals("level1.txt")) { + return true; + } else if (file.getNameExtension().equalsIgnoreCase("zip")) { + try { + List children = file.listFiles(); + for (AbstractFile child : children) { + return checkFileInEmbeddedFolder(child); + } + } catch (TskCoreException ex) { + Exceptions.printStackTrace(ex); + Assert.fail(ex); + } + } else { + assertTrue(file.getNameExtension().equalsIgnoreCase("txt")); + } + + return false; + } }