From 9d6e8736b7d37a55bf364402620f87585b258318 Mon Sep 17 00:00:00 2001
From: Brian Carrier <carrier@sleuthkit.org>
Date: Fri, 14 Jun 2013 17:40:47 -0400
Subject: [PATCH] Updated Datamodel regression tests.  Cleaned up.  Removed old
 TSkModules

---
 .gitignore                                    |   3 +
 .../org/sleuthkit/datamodel/BottomUpTest.java |  13 +-
 .../sleuthkit/datamodel/CPPtoJavaCompare.java | 122 +++++++++--
 .../datamodel/DataModelTestSuite.java         | 194 +++++++-----------
 .../org/sleuthkit/datamodel/ImgTraverser.java |  38 ++--
 .../datamodel/SequentialTraversal.java        |   8 +-
 .../sleuthkit/datamodel/TopDownTraversal.java |  52 +++--
 .../output/gold/nps-2009-canon2-gen6_BU.txt   |  50 -----
 .../output/gold/nps-2009-canon2-gen6_CPP.txt  |  45 ----
 .../gold/nps-2009-canon2-gen6_CPP_Exc.txt     |   0
 .../gold/nps-2009-canon2-gen6_CPP_SRT.txt     |  45 ----
 .../gold/nps-2009-canon2-gen6_Seq_Exc.txt     |   0
 .../gold/nps-2009-canon2-gen6_TD_Exc.txt      |   0
 .../java/test/output/gold/ntfs1-gen2_BU.txt   |  43 ----
 .../java/test/output/gold/ntfs1-gen2_CPP.txt  |   0
 .../test/output/gold/ntfs1-gen2_CPP_Exc.txt   |   0
 .../test/output/gold/ntfs1-gen2_CPP_SRT.txt   |   0
 .../test/output/gold/ntfs1-gen2_Seq_Exc.txt   |   0
 .../test/output/gold/ntfs1-gen2_TD_Exc.txt    |   0
 framework/TskModules/c_ZIPExtractionModule    |   1 -
 20 files changed, 250 insertions(+), 364 deletions(-)
 delete mode 100644 bindings/java/test/output/gold/nps-2009-canon2-gen6_BU.txt
 delete mode 100644 bindings/java/test/output/gold/nps-2009-canon2-gen6_CPP.txt
 mode change 100644 => 100755 bindings/java/test/output/gold/nps-2009-canon2-gen6_CPP_Exc.txt
 delete mode 100644 bindings/java/test/output/gold/nps-2009-canon2-gen6_CPP_SRT.txt
 mode change 100644 => 100755 bindings/java/test/output/gold/nps-2009-canon2-gen6_Seq_Exc.txt
 mode change 100644 => 100755 bindings/java/test/output/gold/nps-2009-canon2-gen6_TD_Exc.txt
 delete mode 100644 bindings/java/test/output/gold/ntfs1-gen2_BU.txt
 delete mode 100644 bindings/java/test/output/gold/ntfs1-gen2_CPP.txt
 mode change 100644 => 100755 bindings/java/test/output/gold/ntfs1-gen2_CPP_Exc.txt
 delete mode 100644 bindings/java/test/output/gold/ntfs1-gen2_CPP_SRT.txt
 mode change 100644 => 100755 bindings/java/test/output/gold/ntfs1-gen2_Seq_Exc.txt
 mode change 100644 => 100755 bindings/java/test/output/gold/ntfs1-gen2_TD_Exc.txt
 delete mode 160000 framework/TskModules/c_ZIPExtractionModule

diff --git a/.gitignore b/.gitignore
index d217a9f05..dbd4f463e 100755
--- a/.gitignore
+++ b/.gitignore
@@ -7,6 +7,9 @@
 /bindings/java/dist
 /bindings/java/test/output/results
 /bindings/java/test/output/gold/dummy
+/bindings/java/test/output/gold/*_BU.txt
+/bindings/java/test/output/gold/*_CPP.txt
+/bindings/java/test/output/gold/*_CPP_SRT.txt
 /bindings/java/test/input
 /bindings/java/nbproject/genfiles.properties
 /bindings/java/nbproject/nbjdk.properties
diff --git a/bindings/java/test/org/sleuthkit/datamodel/BottomUpTest.java b/bindings/java/test/org/sleuthkit/datamodel/BottomUpTest.java
index 1890c4130..09ebae050 100644
--- a/bindings/java/test/org/sleuthkit/datamodel/BottomUpTest.java
+++ b/bindings/java/test/org/sleuthkit/datamodel/BottomUpTest.java
@@ -19,6 +19,7 @@
 package org.sleuthkit.datamodel;
 
 import java.io.FileNotFoundException;
+import java.io.OutputStreamWriter;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -30,12 +31,12 @@
 
 /**
  *
- * Verifies that getParent works as intended.
+ * Verifies that getParent works as intended by verifying that it gets the
+ * same structure as we got from the TopDown tests. Does not compare against
+ * a gold standard. 
  */
 @RunWith(Parameterized.class)
 public class BottomUpTest {
-
-	static final String BU = "_BU";
 	private List<String> imagePaths;
 
 	public BottomUpTest(List<String> imagePaths) {
@@ -67,11 +68,11 @@ public static Collection<Object[]> testImageData() {
 	@Test
 	public void testBottomUpDiff() {
 		String title = DataModelTestSuite.getImgName(imagePaths.get(0));
-		String exFile = DataModelTestSuite.buildPath(DataModelTestSuite.getRsltPath(), title, BU, ".txt");
+		String exFile = DataModelTestSuite.buildPath(DataModelTestSuite.getRsltPath(), title, DataModelTestSuite.BTTMUP, ".txt");
 		try {
 			java.io.File dbFile = new java.io.File(DataModelTestSuite.getRsltPath());
 			String tempDirPath = dbFile.getAbsolutePath();
-			String dbPath = DataModelTestSuite.buildPath(tempDirPath, title, BU, ".db");
+			String dbPath = DataModelTestSuite.buildPath(tempDirPath, title, DataModelTestSuite.BTTMUP, ".db");
 			dbFile.delete();
 			SleuthkitCase sk = SleuthkitCase.newCase(dbPath);
 			String timezone = "";
@@ -85,6 +86,8 @@ public void testBottomUpDiff() {
 				DataModelTestSuite.writeExceptions(exFile, inp);
 			}
 			process.commit();
+			
+			// open the "leaf file" generated by the TopDown test and verify that getParent() follows the same sequence
 			java.io.File lvs = new java.io.File(dbFile.getAbsolutePath() + java.io.File.separator + title);
 			Scanner climber;
 			climber = new Scanner(lvs);
diff --git a/bindings/java/test/org/sleuthkit/datamodel/CPPtoJavaCompare.java b/bindings/java/test/org/sleuthkit/datamodel/CPPtoJavaCompare.java
index dc1ccfc5a..f42894004 100644
--- a/bindings/java/test/org/sleuthkit/datamodel/CPPtoJavaCompare.java
+++ b/bindings/java/test/org/sleuthkit/datamodel/CPPtoJavaCompare.java
@@ -20,12 +20,14 @@
 
 import java.io.BufferedOutputStream;
 import java.io.FileOutputStream;
+import java.io.FileWriter;
 import java.io.IOException;
 import java.io.OutputStreamWriter;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.Scanner;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import static org.junit.Assert.*;
@@ -64,32 +66,119 @@ public static Collection<Object[]> testImageData() {
 		return data;
 	}
 
+	
 	/**
 	 * Runs the test
 	 */
 	@Test
-	public void CPPtoJavaCompare() {
+	public void testCppToJavaDiff() {
 		try {
+			// generate the C++ output and store it in gold standard -- even though it won't be checked in -- redesign this!
+			String standardPathCPP = DataModelTestSuite.standardFilePath(imagePaths, DataModelTestSuite.CPP);
+			runTskGetTimes(standardPathCPP, imagePaths);
+			
+			// perform test
 			List<Boolean> test = basicTest();
-			assertEquals("Generated results (" + oldStandardPath + ") differ with gold standard (" + testStandardPath + ") .", test.get(0), true);
+			
+			// compare exceptions
+			assertEquals("Generated exceptions  (" + outputExceptionsPath + ") differ with gold standards (" + goldExceptionsPath + ") .", test.get(0), true);
+			
+			//compare sorted output instead of unsorted output
+			String goldFilePathSorted = DataModelTestSuite.sortedFlPth(goldFilePath);
+			String outputFilePathSorted = DataModelTestSuite.sortedFlPth(outputFilePath);
+			List<Boolean> ret = new ArrayList<Boolean>(1);
+			ret.add(DataModelTestSuite.comparecontent(goldFilePathSorted, outputFilePathSorted));			
+			assertEquals("Java output (" + outputFilePathSorted + ") differ with C++ results (" + goldFilePathSorted + ") .", ret.get(0), true);			
 		} catch (Exception ex) {
 			fail("Couldn't open gold standard file.");
 		}
 	}
-
+	
+	
 	/**
-	 * Extends basicTest to compare the sorted files and not the output files
+	 * Runs tsk_gettimes to create a standard for comparing DataModel and TSK
+	 * output.
+	 *
+	 * @param outputFile The path to the file to put the tsk data in. Sorted results will be stored in separate file. 
+	 * @param img the path to the image, is a list for compatability reasons
 	 */
-	@Override
-	public List<Boolean> basicTest() {
-		super.basicTest();
-		oldStandardPath = DataModelTestSuite.sortedFlPth(oldStandardPath);
-		testStandardPath = DataModelTestSuite.sortedFlPth(testStandardPath);
-		List<Boolean> ret = new ArrayList<Boolean>(1);
-		ret.add(DataModelTestSuite.comparecontent(oldStandardPath, testStandardPath));
-		return ret;
+	 private static void runTskGetTimes(String outputFile, List<String> img) {
+		String tsk_loc;
+		java.io.File  up = new java.io.File(System.getProperty("user.dir"));
+		up = up.getParentFile();
+		up = up.getParentFile();
+		if (System.getProperty("os.name").contains("Windows")) {
+			tsk_loc = up.getAbsolutePath() + "\\win32\\Release\\tsk_gettimes.exe";
+		} else {
+			tsk_loc = up.getAbsolutePath() + "/tools/autotools/tsk_gettimes";
+		}
+		
+		// verify it exists
+		java.io.File f = new java.io.File(tsk_loc);
+		assertTrue("cannot find tsk_gettimes method", f.exists());
+		
+		String[] cmd = {tsk_loc, img.get(0)};
+		try {
+			Process p = Runtime.getRuntime().exec(cmd);
+			Scanner read = new Scanner(p.getInputStream());
+			Scanner error1 = new Scanner(p.getErrorStream());
+			FileWriter out = new FileWriter(outputFile);
+			while (read.hasNextLine()) {
+				String line = read.nextLine();
+				line = line.replace(" (deleted)", "");
+				line = line.replace("(null)", "");
+				//removes unknown data attached to metaAddr
+				String[] linecontents = line.split("\\|");
+				String metaaddrcon = linecontents[2];
+				String mtad = metaaddrcon.split("\\-")[0];
+				line = line.replace(metaaddrcon, mtad);
+				out.append(line);
+				out.flush();
+				out.append("\n");
+			}
+			DataModelTestSuite.runSort(outputFile);
+		} catch (Exception ex) {
+			logg.log(Level.SEVERE, "Failed to run CPP program", ex);
+		}
+		
+		java.io.File xfile = new java.io.File(DataModelTestSuite.exceptionPath(outputFile));
+		try {
+			xfile.createNewFile();
+		} catch (IOException ex) {
+			logg.log(Level.SEVERE, "Failed to create exceptions file", ex);
+		}
+	}
+	 
+	 /**
+	 * gets the metadata from a datamodel file object
+	 *
+	 * @param fi
+	 * @return
+	 * @throws TskCoreException
+	 */
+	private static String convertToBodyFileFormat(FsContent fi) throws TskCoreException {
+		String[] path = fi.getUniquePath().split("/", 3);
+		String name;
+		if (path[2].contains("vol_")) {
+			String[] pthget = path[2].split("_", 2);
+			name = pthget[pthget.length - 1];
+		} else {
+			name = path[2];
+		}
+		name = name.replaceAll("[^\\x20-\\x7e]", "");
+		String prpnd;
+		if (fi.isFile()) {
+			prpnd = "r/";
+		} else {
+			prpnd = "d/";
+		}
+		if (fi.isVirtual() && !fi.isDir()) {
+			prpnd = "v/";
+		}
+		return ("0|" + name + "|" + fi.metaAddr + "|" + fi.getMetaTypeAsString() + "/" + fi.getModesAsString() + "|" + fi.getUid() + "|0|" + fi.getSize() + "|" + fi.getAtime() + "|" + fi.getMtime() + "|" + fi.getCtime() + "|" + fi.getCrtime());
 	}
 
+
 	/**
 	 * Traverses through an image and generates a TSK gettimes like
 	 * representation
@@ -109,7 +198,7 @@ public OutputStreamWriter traverse(SleuthkitCase sk, String path) {
 			} catch (TskCoreException ex) {
 				List<Exception> inp = new ArrayList<Exception>();
 				inp.add(ex);
-				DataModelTestSuite.writeExceptions(testStandardPath, inp);
+				DataModelTestSuite.writeExceptions(outputFilePath, inp);
 			}
 		} catch (IOException ex) {
 			logg.log(Level.SEVERE, "Failed to Traverse", ex);
@@ -118,7 +207,7 @@ public OutputStreamWriter traverse(SleuthkitCase sk, String path) {
 	}
 
 	/**
-	 * Traverses through an image and generates a TSK gettimes like
+	 * Recursively traverses through an image and generates a TSK gettimes like
 	 * representation
 	 *
 	 * @param lc the list of content to be traversed
@@ -129,17 +218,18 @@ private void tskTraverse(List<Content> lc, Appendable reslt) {
 			try {
 				if (c instanceof FsContent && !c.getUniquePath().endsWith(".") && !c.getUniquePath().endsWith("/")) {
 					try {
-						reslt.append(DataModelTestSuite.getFsCData((FsContent) c));
+						reslt.append(convertToBodyFileFormat((FsContent) c));
 						reslt.append("\n");
 					} catch (IOException ex) {
 						logg.log(Level.SEVERE, "Failed to Traverse", ex);
 					}
 				}
+				// recurse into childern
 				tskTraverse(c.getChildren(), reslt);
 			} catch (TskCoreException ex) {
 				List<Exception> inp = new ArrayList<Exception>();
 				inp.add(ex);
-				DataModelTestSuite.writeExceptions(testStandardPath, inp);
+				DataModelTestSuite.writeExceptions(outputFilePath, inp);
 			}
 		}
 	}
diff --git a/bindings/java/test/org/sleuthkit/datamodel/DataModelTestSuite.java b/bindings/java/test/org/sleuthkit/datamodel/DataModelTestSuite.java
index a8c87cc88..be12057cc 100644
--- a/bindings/java/test/org/sleuthkit/datamodel/DataModelTestSuite.java
+++ b/bindings/java/test/org/sleuthkit/datamodel/DataModelTestSuite.java
@@ -31,6 +31,7 @@
 import java.util.Scanner;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import static org.junit.Assert.*;
 import org.junit.BeforeClass;
 import org.junit.runner.RunWith;
 import org.junit.runners.Suite;
@@ -38,6 +39,7 @@
 /**
  *
  * Runs all regression tests and contains utility methods for the tests
+ * The default ant target sets properties for the various folders. 
  */
 @RunWith(Suite.class)
 @Suite.SuiteClasses({org.sleuthkit.datamodel.TopDownTraversal.class, org.sleuthkit.datamodel.SequentialTraversal.class, org.sleuthkit.datamodel.CrossCompare.class, org.sleuthkit.datamodel.BottomUpTest.class, org.sleuthkit.datamodel.CPPtoJavaCompare.class})
@@ -49,10 +51,10 @@ public class DataModelTestSuite {
 	static final String RSLT = "rslt";
 	static final String SEQ = "_Seq";
 	static final String TD = "_TD";
-	static final String BTTMUP = "_BU";
+	static final String BTTMUP = "_BU";	// update .gitignore if this changes
 	static final String EX = "_Exc";
 	static final String TST = "types";
-	static final String CPP = "_CPP";
+	static final String CPP = "_CPP"; // update .gitignore if this changes
 	static final int READ_BUFFER_SIZE = 8192;
 	static final String HASH_ALGORITHM = "MD5";
 	private static final Logger logg = Logger.getLogger(DataModelTestSuite.class.getName());
@@ -71,44 +73,47 @@ public static void setUpClass() throws Exception {
 	}
 
 	/**
-	 * Generates a list of the traversals to be used for standard creations
+	 * Generates a list of the traversals to be used for standard creations.
+	 * Not all tests need to be rebuilt. 
 	 *
 	 * @return
 	 */
-	public static List<ImgTraverser> getTests() {
+	public static List<ImgTraverser> getTestsToRebuild() {
 		List<ImgTraverser> ret = new ArrayList<ImgTraverser>();
 		ret.add(new SequentialTraversal(null));
 		ret.add(new TopDownTraversal(null));
+		
 		return ret;
 	}
 
 	/**
 	 * Creates the Sleuth Kit database for an image, then generates a string
-	 * representation of the given traversal type of the resulting database to
-	 * use as a standard for comparison, and saves the the standard to a file.
+	 * representation of the given traversal testType of the resulting database to
+	 * use as a standard for comparison, and saves the the standard to a file.  Sorts
+	 * the data and saves both the unsorted and sorted files
 	 *
-	 * @param standardPath The path to save the standard file to (will be
+	 * @param outputPath The path to save the standard file to (will be
 	 * overwritten if it already exists)
 	 * @param tempDirPath An existing directory to create the test database in
 	 * @param imagePaths The path(s) to the image file(s)
-	 * @param type The type of traversal to run.
-	 * @param exFile The exceptions file, will be used for logging purposes
+	 * @param testType The testType of traversal (i.e. test) to run.
+	 * @param outputExceptionsPath The exceptions file, will be used for logging purposes
 	 */
-	public static void createStandard(String standardPath, String tempDirPath, List<String> imagePaths, ImgTraverser type) {
-		java.io.File standardFile = new java.io.File(standardPath);
-		String exFile = standardFile.getAbsolutePath().replace(".txt", EX + ".txt");
+	public static void createOutput(String outputPath, String tempDirPath, List<String> imagePaths, ImgTraverser testType) {
+		java.io.File standardFile = new java.io.File(outputPath);
+
 		List<Exception> inp = new ArrayList<Exception>();
 		try {
+			// make the database
 			String firstImageFile = getImgName(imagePaths.get(0));
-			String dbPath = buildPath(tempDirPath, firstImageFile, type.testName, ".db");
+			String dbPath = buildPath(tempDirPath, firstImageFile, testType.testName, ".db");
 			standardFile.createNewFile();
 			java.io.File dbFile = new java.io.File(dbPath);
 			dbFile.delete();
 			SleuthkitCase sk = SleuthkitCase.newCase(dbPath);
+
 			String timezone = "";
 			SleuthkitJNI.CaseDbHandle.AddImageProcess process = sk.makeAddImageProcess(timezone, true, false);
-			java.io.File xfile = new java.io.File(exFile);
-			xfile.createNewFile();
 			try {
 				process.run(imagePaths.toArray(new String[imagePaths.size()]));
 			} catch (TskDataException ex) {
@@ -116,9 +121,13 @@ public static void createStandard(String standardPath, String tempDirPath, List<
 			}
 			writeExceptions(standardFile.getAbsolutePath(), inp);
 			process.commit();
-			OutputStreamWriter standardWriter = type.traverse(sk, standardFile.getAbsolutePath());
+			
+			// dump the database based on the specific test testType
+			OutputStreamWriter standardWriter = testType.traverse(sk, standardFile.getAbsolutePath());
 			standardWriter.flush();
 			sk.close();
+			
+			// sort the data for later comparison (if needed)
 			runSort(standardFile.getAbsolutePath());
 		} catch (IOException ex) {
 			logg.log(Level.SEVERE, "Couldn't create Standard", ex);
@@ -157,14 +166,15 @@ public boolean accept(java.io.File f) {
 	}
 
 	/**
-	 * Get the path for a standard corresponding to the given image path.
+	 * Get the path for a gold standard file for a given image and test.
 	 *
-	 * @param imagePaths path of the image to get a standard for
+	 * @param imagePaths image being tested
+	 * @param type Test type
 	 * @return path to put/find the standard at
 	 */
-	static String standardPath(List<String> imagePaths, String type) {
+	static String standardFilePath(List<String> imagePaths, String type) {
 		String firstImage = getImgName(imagePaths.get(0));
-		String standardPath = goldStandardPath() + java.io.File.separator + firstImage + type + ".txt";
+		String standardPath = standardRootDirPath() + java.io.File.separator + firstImage + type + ".txt";
 		return standardPath;
 	}
 
@@ -188,53 +198,7 @@ public boolean accept(java.io.File f) {
 		}
 	}
 
-	/**
-	 * Runs tsk_gettimes to create a standard for comparing DataModel and TSK
-	 * output.
-	 *
-	 * @param standardPath The path to the file to put the tsk data in
-	 * @param img the path to the image, is a list for compatability reasons
-	 */
-	 private static void getTSKData(String standardPath, List<String> img) {
-		String tsk_loc;
-		java.io.File  up = new java.io.File(System.getProperty("user.dir"));
-		up = up.getParentFile();
-		up = up.getParentFile();
-		if (System.getProperty("os.name").contains("Windows")) {
-			tsk_loc = up.getAbsolutePath() + "\\win32\\Release\\tsk_gettimes";
-		} else {
-			tsk_loc = up.getAbsolutePath() + "/tools/autotools/tsk_gettimes";
-		}
-		String[] cmd = {tsk_loc, img.get(0)};
-		try {
-			Process p = Runtime.getRuntime().exec(cmd);
-			Scanner read = new Scanner(p.getInputStream());
-			Scanner error1 = new Scanner(p.getErrorStream());
-			FileWriter out = new FileWriter(standardPath);
-			while (read.hasNextLine()) {
-				String line = read.nextLine();
-				line = line.replace(" (deleted)", "");
-				line = line.replace("(null)", "");
-				//removes unknown data attached to metaAddr
-				String[] linecontents = line.split("\\|");
-				String metaaddrcon = linecontents[2];
-				String mtad = metaaddrcon.split("\\-")[0];
-				line = line.replace(metaaddrcon, mtad);
-				out.append(line);
-				out.flush();
-				out.append("\n");
-			}
-			runSort(standardPath);
-		} catch (Exception ex) {
-			logg.log(Level.SEVERE, "Failed to run CPP program", ex);
-		}
-		java.io.File xfile = new java.io.File(standardPath.replace(".txt", DataModelTestSuite.EX + ".txt"));
-		try {
-			xfile.createNewFile();
-		} catch (IOException ex) {
-			logg.log(Level.SEVERE, "Failed to create exceptions file", ex);
-		}
-	}
+	
 
 	/**
 	 * Strips the file extension from the given string
@@ -275,6 +239,7 @@ public static String getImgName(String img) {
 		return stripExtension(imgSp[imgSp.length - 1]);
 	}
 
+	
 	/**
 	 * Gets the location results are stored in.
 	 *
@@ -289,7 +254,7 @@ public static String getRsltPath() {
 	 *
 	 * @return
 	 */
-	private static String getSortPath() {
+	private static String getSortCmdPath() {
 		if (!System.getProperty("os.name").contains("Windows")) {
 			return "sort";
 		} else {
@@ -302,7 +267,7 @@ private static String getSortPath() {
 	 *
 	 * @return
 	 */
-	private static String getDiffPath() {
+	private static String getDiffCmdPath() {
 		if (!System.getProperty("os.name").contains("Windows")) {
 			return "diff";
 		} else {
@@ -313,14 +278,13 @@ private static String getDiffPath() {
 	/**
 	 * Writes the given exception to the given file
 	 *
-	 * @param filename the path of the file that exceptions are being stored for
+	 * @param filename the path of the test output file that exceptions correspond to
 	 * @param ex the exception to be written
 	 */
 	protected static void writeExceptions(String filename, List<Exception> ex) {
-		filename = filename.replace(".txt", EX + ".txt");
-		FileWriter exWriter;
+		String exceptionFileName = exceptionPath(filename);
 		try {
-			exWriter = new FileWriter(filename, true);
+			FileWriter exWriter = new FileWriter(exceptionFileName, true);
 			for(Exception exc: ex)
 			{
 				exWriter.append(exc.toString());
@@ -337,18 +301,18 @@ protected static void writeExceptions(String filename, List<Exception> ex) {
 	 *
 	 * @return
 	 */
-	private static String goldStandardPath() {
+	private static String standardRootDirPath() {
 		return System.getProperty(GOLD, ("test" + java.io.File.separator + "output" + java.io.File.separator + "gold"));
 	}
 
 	/**
-	 * Reads the data for a given content object, used to create hashes
+	 * Reads the data for a given content object and adds the MD5 to the result object
 	 *
 	 * @param c the content object to be read
-	 * @param result the appendable to append the results to
+	 * @param result the appendable to text of the MD5 to
 	 * @param StrgFile the file path that the content is being read for
 	 */
-	public static void readContent(Content c, Appendable result, String StrgFile) {
+	public static void hashContent(Content c, Appendable result, String StrgFile) {
 		long size = c.getSize();
 		byte[] readBuffer = new byte[READ_BUFFER_SIZE];
 		try {
@@ -388,38 +352,9 @@ private static String toHex(byte[] bytes) {
 		return hex.toString();
 	}
 
+	
 	/**
-	 * gets the metadata from a datamodel file object
-	 *
-	 * @param fi
-	 * @return
-	 * @throws TskCoreException
-	 */
-	protected static String getFsCData(FsContent fi) throws TskCoreException {
-		String[] path = fi.getUniquePath().split("/", 3);
-		String name;
-		if (path[2].contains("vol_")) {
-			String[] pthget = path[2].split("_", 2);
-			name = pthget[pthget.length - 1];
-		} else {
-			name = path[2];
-		}
-		name = name.replaceAll("[^\\x20-\\x7e]", "");
-		String prpnd;
-		if (fi.isFile()) {
-			prpnd = "r/";
-		} else {
-			prpnd = "d/";
-		}
-		if (fi.isVirtual() && !fi.isDir()) {
-			prpnd = "v/";
-		}
-		return ("0|" + name + "|" + fi.metaAddr + "|" + fi.getMetaTypeAsString() + "/" + fi.getModesAsString() + "|" + fi.getUid() + "|0|" + fi.getSize() + "|" + fi.getAtime() + "|" + fi.getMtime() + "|" + fi.getCtime() + "|" + fi.getCrtime());
-	}
-
-	/**
-	 * Calls {@link #createStandard(String, String, String[]) createStandard}
-	 * with default arguments
+	 * This is used only to regenerate the gold standards. It does not run tests. 
 	 *
 	 * @param args Ignored
 	 */
@@ -437,37 +372,42 @@ public static void main(String[] args) {
 				throw new RuntimeException("Run make install on tsk");
 			}
 		}
+		
 		String tempDirPath = System.getProperty("java.io.tmpdir");
 		tempDirPath = tempDirPath.substring(0, tempDirPath.length() - 1);
-		java.io.File pth = new java.io.File(DataModelTestSuite.goldStandardPath());
+		
+		
+		java.io.File goldStandardDirPath = new java.io.File(DataModelTestSuite.standardRootDirPath());
+		// delete the exception files
 		FileFilter testExFilter = new FileFilter() {
 			@Override
 			public boolean accept(java.io.File f) {
 				return f.getName().contains(EX);
 			}
 		};
-		for (java.io.File del : pth.listFiles(testExFilter)) {
+		for (java.io.File del : goldStandardDirPath.listFiles(testExFilter)) {
 			del.delete();
 		}
-		List<ImgTraverser> tests = DataModelTestSuite.getTests();
+		
+		// cycle through each image and test to generate output
+		List<ImgTraverser> tests = DataModelTestSuite.getTestsToRebuild();
 		List<List<String>> imagePaths = DataModelTestSuite.getImagePaths();
 		for (List<String> paths : imagePaths) {
 			for (ImgTraverser tstrn : tests) {
-				String standardPath = DataModelTestSuite.standardPath(paths, tstrn.testName);
-				System.out.println("Creating " + tstrn.testName + " standard for: " + paths.get(0));
-				DataModelTestSuite.createStandard(standardPath, tempDirPath, paths, tstrn);
+				// run the test and save the output to the gold standard folder
+				String standardPath = DataModelTestSuite.standardFilePath(paths, tstrn.testName);
+				System.out.println("Rebuilding " + tstrn.testName + " standard for: " + paths.get(0));
+				DataModelTestSuite.createOutput(standardPath, tempDirPath, paths, tstrn);
 			}
-			String standardPathCPP = DataModelTestSuite.standardPath(paths, CPP);
-			DataModelTestSuite.getTSKData(standardPathCPP, paths);
 		}
 	}
 
 	/**
-	 * Compares the content of two files to determine if they are equal, if they
-	 * are it removes the file from the results folder
+	 * Compares the content of two files to determine if they are equal
 	 *
 	 * @param original is the first file to be compared
 	 * @param results is the second file to be compared
+	 * @returns true if both files are equal
 	 */
 	protected static boolean comparecontent(String original, String results) {
 		try {
@@ -496,13 +436,13 @@ protected static boolean comparecontent(String original, String results) {
 	}
 
 	/**
-	 * runs sort on the given file
+	 * runs sort on the given file and saves to sortedFlPth() named file
 	 *
 	 * @param inp
 	 */
-	private static void runSort(String inp) {
+	public static void runSort(String inp) {
 		String outp = sortedFlPth(inp);
-		String cygpath = getSortPath();
+		String cygpath = getSortCmdPath();
 		String[] cmd = {cygpath, inp, "-o", outp};
 		try {
 			Runtime.getRuntime().exec(cmd).waitFor();
@@ -524,6 +464,16 @@ private static void runSort(String inp) {
 	protected static String sortedFlPth(String path) {
 		return path.replace(".txt", "_SRT.txt");
 	}
+	
+	/**
+	 * Returns the name of the exception file given the name of the test output file.
+	 * 
+	 * @param path Path to the test output file
+	 * @return  String to exception file for the test
+	 */
+	public static String exceptionPath(String path) {
+		return path.replace(".txt", DataModelTestSuite.EX + ".txt");
+	}
 
 	/**
 	 * Runs the Cygwin Diff algorithm on two files, is currently unused
@@ -532,7 +482,7 @@ protected static String sortedFlPth(String path) {
 	 * @param path2 is the path to the second file
 	 */
 	private static void runDiff(String path1, String path2) {
-		String diffPath = getDiffPath();
+		String diffPath = getDiffCmdPath();
 		String outputLoc = path2.replace(".txt", "_Diff.txt");
 		String[] cmd = {diffPath, path1, path2};
 		try {
diff --git a/bindings/java/test/org/sleuthkit/datamodel/ImgTraverser.java b/bindings/java/test/org/sleuthkit/datamodel/ImgTraverser.java
index 60a798559..eacb5b6fb 100644
--- a/bindings/java/test/org/sleuthkit/datamodel/ImgTraverser.java
+++ b/bindings/java/test/org/sleuthkit/datamodel/ImgTraverser.java
@@ -29,31 +29,37 @@
 public abstract class ImgTraverser{
 
 	protected List<String> imagePaths;
-	protected String exFile;
-	protected String testStandardPath;
-	protected String oldStandardPath;
-	protected String oldExceptionsPath;
+	protected String outputFilePath;	// where output of current test is being stored
+	protected String outputExceptionsPath; // exceptions of current test
+	protected String goldFilePath;	// gold paths for test and exception data
+	protected String goldExceptionsPath;
 	protected String testName;
 
 	/**
-	 * sets up the variables for a basic test, method can be called for any
-	 * traversal test
+	 * Run a test and compare the unsorted results. 
 	 *
-	 * @return
+	 * @return List of test results.  Entry 0 is content and 1 is for exceptions.  True if test passed. 
 	 */
 	public List<Boolean> basicTest() {
 		String title = DataModelTestSuite.getImgName(imagePaths.get(0));
-		java.io.File testFolder = new java.io.File(DataModelTestSuite.getRsltPath());
-		java.io.File testStandard = new java.io.File(DataModelTestSuite.buildPath(testFolder.getAbsolutePath(), title, this.testName, ".txt"));
-		testStandardPath = testStandard.getPath();
-		exFile = testStandardPath.replace(".txt", DataModelTestSuite.EX + ".txt");
-		oldStandardPath = DataModelTestSuite.standardPath(imagePaths, this.testName);
-		DataModelTestSuite.createStandard(testStandardPath, testFolder.getAbsolutePath(), imagePaths, this);
-		oldExceptionsPath = oldStandardPath.replace(".txt", DataModelTestSuite.EX + ".txt");
+		
+		// get paths to store output of test and exceptions
+		java.io.File outputFolder = new java.io.File(DataModelTestSuite.getRsltPath());
+		java.io.File outputFile = new java.io.File(DataModelTestSuite.buildPath(outputFolder.getAbsolutePath(), title, this.testName, ".txt"));
+		outputFilePath = outputFile.getPath();
+		outputExceptionsPath = DataModelTestSuite.exceptionPath(outputFilePath);
+		goldFilePath = DataModelTestSuite.standardFilePath(imagePaths, this.testName);
+		goldExceptionsPath = DataModelTestSuite.exceptionPath(goldFilePath);
+		
+		// Generate the sorted output needed for the test
+		DataModelTestSuite.createOutput(outputFilePath, outputFolder.getAbsolutePath(), imagePaths, this);
+		
+		// compare the unsorted results
 		List<Boolean> ret = new ArrayList<Boolean>(2);
-		ret.add(DataModelTestSuite.comparecontent(oldExceptionsPath, exFile));
-		ret.add(DataModelTestSuite.comparecontent(oldStandardPath, testStandardPath));
+		ret.add(DataModelTestSuite.comparecontent(goldExceptionsPath, outputExceptionsPath));
+		ret.add(DataModelTestSuite.comparecontent(goldFilePath, outputFilePath));
 		return ret;
 	}
+	
 	abstract public OutputStreamWriter traverse(SleuthkitCase sk, String path);
 }
diff --git a/bindings/java/test/org/sleuthkit/datamodel/SequentialTraversal.java b/bindings/java/test/org/sleuthkit/datamodel/SequentialTraversal.java
index b370c7eda..35b645709 100644
--- a/bindings/java/test/org/sleuthkit/datamodel/SequentialTraversal.java
+++ b/bindings/java/test/org/sleuthkit/datamodel/SequentialTraversal.java
@@ -72,8 +72,8 @@ public static Collection<Object[]> testImageData() {
 	public void testSequentialDiff() {
 		try {
 			List<Boolean> test = basicTest();
-			assertEquals("Generated results (" + exFile + ") differ with gold standard (" + oldExceptionsPath + ") .", test.get(0), true);
-			assertEquals("Generated results (" + testStandardPath + ") differ with gold standard (" + oldStandardPath + ") .", test.get(1), true);
+			assertEquals("Generated results (" + outputExceptionsPath + ") differ with gold standard (" + goldExceptionsPath + ") .", test.get(0), true);
+			assertEquals("Generated results (" + outputFilePath + ") differ with gold standard (" + goldFilePath + ") .", test.get(1), true);
 		} catch (Exception ex) {
 			fail("Couldn't open gold standard file.");
 		}
@@ -85,7 +85,7 @@ public void testSequentialDiff() {
 	 *
 	 * @param sk the sleuthkit case used for the traversal
 	 * @param path the location of the output file
-	 * @param exFile the exFile to store exceptions, is only used for
+	 * @param outputExceptionsPath the outputExceptionsPath to store exceptions, is only used for
 	 * compatability with basic test
 	 * @return the file writer to be closed by testStandard
 	 */
@@ -101,7 +101,7 @@ public OutputStreamWriter traverse(SleuthkitCase sk, String path) {
 				while ((c = sk.getContentById(x)) != null) {
 					reslt.append(((AbstractContent) c).toString(false).replaceAll("paths \\[([A-z]:)?.+?\\]", ""));
 					if (c instanceof File) {
-						DataModelTestSuite.readContent(c, reslt, exFile);
+						DataModelTestSuite.hashContent(c, reslt, outputExceptionsPath);
 					}
 					reslt.append("\n");
 					x++;
diff --git a/bindings/java/test/org/sleuthkit/datamodel/TopDownTraversal.java b/bindings/java/test/org/sleuthkit/datamodel/TopDownTraversal.java
index 171e955db..63fbae363 100644
--- a/bindings/java/test/org/sleuthkit/datamodel/TopDownTraversal.java
+++ b/bindings/java/test/org/sleuthkit/datamodel/TopDownTraversal.java
@@ -38,6 +38,7 @@
  *
  * Verifies that the current version of TSK produces the same output of previous
  * versions by doing a TopDown Depth first traversal of the given images.
+ * Also generates the leaf file that is used by the BottomUp Test
  */
 @RunWith(Parameterized.class)
 public class TopDownTraversal extends ImgTraverser {
@@ -74,8 +75,8 @@ public static Collection<Object[]> testImageData() {
 	public void testTopDownDiff() {
 		try {
 			List<Boolean> test = basicTest();
-			assertEquals("Generated results (" + exFile + ") differ with gold standard (" + oldExceptionsPath + ") .", test.get(0), true);
-			assertEquals("Generated results (" + testStandardPath + ") differ with gold standard (" + oldStandardPath + ") .", test.get(1), true);
+			assertEquals("Generated results (" + outputExceptionsPath + ") differ with gold standard (" + goldExceptionsPath + ") .", test.get(0), true);
+			assertEquals("Generated results (" + outputFilePath + ") differ with gold standard (" + goldFilePath + ") .", test.get(1), true);
 		} catch (Exception ex) {
 			fail("Couldn't open gold standard file.");
 		}
@@ -83,11 +84,11 @@ public void testTopDownDiff() {
 
 	/**
 	 * Traverses through an image and generates a top down representation the
-	 * image
+	 * image and generates the leaf files for BU Testing
 	 *
 	 * @param sk the sleuthkit case used for the traversal
 	 * @param path the location of the output file
-	 * @param exFile the exFile to store exceptions
+	 * @param outputExceptionsPath the outputExceptionsPath to store exceptions
 	 * @return the file writer to be closed by testStandard
 	 */
 	@Override
@@ -98,13 +99,17 @@ public OutputStreamWriter traverse(SleuthkitCase sk, String path) {
 		} catch (TskCoreException ex) {
 			List<Exception> inp = new ArrayList<Exception>();
 			inp.add(ex);
-			DataModelTestSuite.writeExceptions(testStandardPath, inp);
+			DataModelTestSuite.writeExceptions(outputFilePath, inp);
 		}
 		List<Long> lp = new ArrayList<Long>();
 		try {
 			Charset chr = Charset.forName("UTF-8");
+			// file to save the per-file info to.
 			OutputStreamWriter reslt = new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(path),8192*4), chr);
+			
+			// file to save the leaf into, which will be used by the BottomUp Test
 			OutputStreamWriter levs = new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(path.replace(this.testName + ".txt", DataModelTestSuite.BTTMUP + ".txt")), 8192*4),chr);
+			
 			List<Exception> inp = topDownDF(lc, lp, reslt, levs);
 			levs.flush();
 			DataModelTestSuite.writeExceptions(path, inp);
@@ -121,39 +126,52 @@ public OutputStreamWriter traverse(SleuthkitCase sk, String path) {
 	 *
 	 * @param lc the list of content to be traversed
 	 * @param lp the list of a content's parents
-	 * @param reslt the filewriter to append output to
-	 * @param levs the filewriter to append leaves to
+	 * @param resultOutput the filewriter to append output to
+	 * @param leafListOutput the filewriter to append leaves to (trace of each leaf to root dir)
+	 * @returns list of exceptions
 	 */
-	private List<Exception> topDownDF(List<Content> lc, List<Long> lp, Appendable reslt, Appendable levs) {
-		List<Exception> inp = new ArrayList<Exception>();
+	private List<Exception> topDownDF(List<Content> lc, List<Long> lp, Appendable resultOutput, Appendable leafListOutput) {
+		List<Exception> exceptionList = new ArrayList<Exception>();
 		for (Content c : lc) {
+			
+			// write data about this object to resultOutput
+			// string version of this object
 			try {
-				reslt.append(((AbstractContent) c).toString(false).replaceAll("paths \\[([A-z]:)?.+?\\]", ""));
+				resultOutput.append(((AbstractContent) c).toString(false).replaceAll("paths \\[([A-z]:)?.+?\\]", ""));
 			} catch (IOException ex) {
 				logg.log(Level.SEVERE, "Failed to Traverse", ex);
 			}
+			
+			// calculate the hash value for the output -- writes the output to resultOutput
 			if (c instanceof File) {
-				DataModelTestSuite.readContent(c, reslt, testStandardPath);
+				DataModelTestSuite.hashContent(c, resultOutput, outputFilePath);
 			}
 			try {
-				reslt.append("\n");
+				resultOutput.append("\n");
 			} catch (IOException ex) {
 				logg.log(Level.SEVERE, "Failed to Traverse", ex);
 			}
+			
+			// add this node to the bottom of the parent list
 			lp.add(0, c.getId());
+			
 			try {
+				// if we are a leaf, write out the path to the node
 				if (c.getChildren().isEmpty()) {
-					levs.append(lp.toString() + "\n");
-				} else {
-					inp.addAll(topDownDF(c.getChildren(), new ArrayList<Long>(lp), reslt, levs));
+					leafListOutput.append(lp.toString() + "\n");
+				}
+				// recurse into the children
+				else {
+					exceptionList.addAll(topDownDF(c.getChildren(), new ArrayList<Long>(lp), resultOutput, leafListOutput));
 				}
 			} catch (IOException ex) {
 				logg.log(Level.SEVERE, "Failed to Traverse", ex);
 			} catch (TskCoreException ex) {
-				inp.add(ex);
+				exceptionList.add(ex);
 			}
+			// pop it off the list
 			lp.remove(0);
 		}
-		return inp;
+		return exceptionList;
 	}
 }
\ No newline at end of file
diff --git a/bindings/java/test/output/gold/nps-2009-canon2-gen6_BU.txt b/bindings/java/test/output/gold/nps-2009-canon2-gen6_BU.txt
deleted file mode 100644
index 632ae4b57..000000000
--- a/bindings/java/test/output/gold/nps-2009-canon2-gen6_BU.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-[60, 3, 2, 1]
-[7, 6, 5, 4, 2, 1]
-[9, 8, 6, 5, 4, 2, 1]
-[10, 8, 6, 5, 4, 2, 1]
-[12, 11, 8, 6, 5, 4, 2, 1]
-[13, 11, 8, 6, 5, 4, 2, 1]
-[14, 11, 8, 6, 5, 4, 2, 1]
-[15, 11, 8, 6, 5, 4, 2, 1]
-[16, 11, 8, 6, 5, 4, 2, 1]
-[17, 11, 8, 6, 5, 4, 2, 1]
-[18, 11, 8, 6, 5, 4, 2, 1]
-[19, 11, 8, 6, 5, 4, 2, 1]
-[20, 11, 8, 6, 5, 4, 2, 1]
-[21, 11, 8, 6, 5, 4, 2, 1]
-[22, 11, 8, 6, 5, 4, 2, 1]
-[23, 11, 8, 6, 5, 4, 2, 1]
-[24, 11, 8, 6, 5, 4, 2, 1]
-[25, 11, 8, 6, 5, 4, 2, 1]
-[26, 11, 8, 6, 5, 4, 2, 1]
-[27, 11, 8, 6, 5, 4, 2, 1]
-[28, 11, 8, 6, 5, 4, 2, 1]
-[29, 11, 8, 6, 5, 4, 2, 1]
-[30, 11, 8, 6, 5, 4, 2, 1]
-[31, 11, 8, 6, 5, 4, 2, 1]
-[32, 11, 8, 6, 5, 4, 2, 1]
-[33, 11, 8, 6, 5, 4, 2, 1]
-[34, 11, 8, 6, 5, 4, 2, 1]
-[35, 11, 8, 6, 5, 4, 2, 1]
-[36, 11, 8, 6, 5, 4, 2, 1]
-[37, 11, 8, 6, 5, 4, 2, 1]
-[38, 11, 8, 6, 5, 4, 2, 1]
-[39, 11, 8, 6, 5, 4, 2, 1]
-[40, 11, 8, 6, 5, 4, 2, 1]
-[41, 11, 8, 6, 5, 4, 2, 1]
-[42, 11, 8, 6, 5, 4, 2, 1]
-[43, 11, 8, 6, 5, 4, 2, 1]
-[44, 11, 8, 6, 5, 4, 2, 1]
-[45, 11, 8, 6, 5, 4, 2, 1]
-[46, 11, 8, 6, 5, 4, 2, 1]
-[47, 11, 8, 6, 5, 4, 2, 1]
-[48, 11, 8, 6, 5, 4, 2, 1]
-[49, 11, 8, 6, 5, 4, 2, 1]
-[51, 50, 8, 6, 5, 4, 2, 1]
-[52, 50, 8, 6, 5, 4, 2, 1]
-[53, 50, 8, 6, 5, 4, 2, 1]
-[54, 6, 5, 4, 2, 1]
-[55, 6, 5, 4, 2, 1]
-[56, 6, 5, 4, 2, 1]
-[57, 6, 5, 4, 2, 1]
-[59, 58, 6, 5, 4, 2, 1]
diff --git a/bindings/java/test/output/gold/nps-2009-canon2-gen6_CPP.txt b/bindings/java/test/output/gold/nps-2009-canon2-gen6_CPP.txt
deleted file mode 100644
index 84a0a2df3..000000000
--- a/bindings/java/test/output/gold/nps-2009-canon2-gen6_CPP.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-0|vol2/CANON_DC    (Volume Label Entry)|3|r/rrwxrwxrwx|0|0|0|0|1230059544|0|0
-0|vol2/DCIM|4|d/drwxrwxrwx|0|0|16384|1230008400|1230059558|0|1230059558
-0|vol2/DCIM/100CANON|517|d/drwxrwxrwx|0|0|16384|1230008400|1230059558|0|1230059558
-0|vol2/DCIM/100CANON/IMG_0044.JPG|1029|r/rrwxrwxrwx|0|0|105195|1230094800|1230168104|0|1230168104
-0|vol2/DCIM/100CANON/IMG_0042.JPG|1030|r/rrwxrwxrwx|0|0|1361807|1230008400|1230060488|0|1230060488
-0|vol2/DCIM/100CANON/IMG_0003.JPG|1031|r/rrwxrwxrwx|0|0|840101|1230008400|1230059572|0|1230059572
-0|vol2/DCIM/100CANON/IMG_0043.JPG|1032|r/rrwxrwxrwx|0|0|2834018|1230008400|1230060638|0|1230060638
-0|vol2/DCIM/100CANON/IMG_0045.JPG|1033|r/rrwxrwxrwx|0|0|110686|1230094800|1230168116|0|1230168116
-0|vol2/DCIM/100CANON/IMG_0046.JPG|1034|r/rrwxrwxrwx|0|0|116135|1230094800|1230168130|0|1230168130
-0|vol2/DCIM/100CANON/IMG_0007.JPG|1035|r/rrwxrwxrwx|0|0|865313|1230008400|1230059592|0|1230059592
-0|vol2/DCIM/100CANON/IMG_0047.JPG|1036|r/rrwxrwxrwx|0|0|120441|1230094800|1230168136|0|1230168136
-0|vol2/DCIM/100CANON/IMG_0009.JPG|1037|r/rrwxrwxrwx|0|0|840692|1230008400|1230059602|0|1230059602
-0|vol2/DCIM/100CANON/IMG_0038.JPG|1038|r/rrwxrwxrwx|0|0|1296150|1230008400|1230060166|0|1230060166
-0|vol2/DCIM/100CANON/IMG_0011.JPG|1039|r/rrwxrwxrwx|0|0|771052|1230008400|1230059610|0|1230059610
-0|vol2/DCIM/100CANON/IMG_0048.JPG|1040|r/rrwxrwxrwx|0|0|124906|1230094800|1230168142|0|1230168142
-0|vol2/DCIM/100CANON/IMG_0013.JPG|1041|r/rrwxrwxrwx|0|0|842160|1230008400|1230059620|0|1230059620
-0|vol2/DCIM/100CANON/IMG_0049.JPG|1042|r/rrwxrwxrwx|0|0|114940|1230094800|1230168148|0|1230168148
-0|vol2/DCIM/100CANON/IMG_0050.JPG|1043|r/rrwxrwxrwx|0|0|127191|1230094800|1230168156|0|1230168156
-0|vol2/DCIM/100CANON/IMG_0016.JPG|1044|r/rrwxrwxrwx|0|0|853839|1230008400|1230059636|0|1230059636
-0|vol2/DCIM/100CANON/IMG_0017.JPG|1045|r/rrwxrwxrwx|0|0|795574|1230008400|1230059640|0|1230059640
-0|vol2/DCIM/100CANON/IMG_0018.JPG|1046|r/rrwxrwxrwx|0|0|784455|1230008400|1230059646|0|1230059646
-0|vol2/DCIM/100CANON/IMG_0019.JPG|1047|r/rrwxrwxrwx|0|0|864257|1230008400|1230059650|0|1230059650
-0|vol2/DCIM/100CANON/IMG_0051.JPG|1048|r/rrwxrwxrwx|0|0|130418|1230094800|1230168162|0|1230168162
-0|vol2/DCIM/100CANON/IMG_0021.JPG|1049|r/rrwxrwxrwx|0|0|819599|1230008400|1230059660|0|1230059660
-0|vol2/DCIM/100CANON/IMG_0022.JPG|1050|r/rrwxrwxrwx|0|0|728696|1230008400|1230059666|0|1230059666
-0|vol2/DCIM/100CANON/IMG_0023.JPG|1051|r/rrwxrwxrwx|0|0|858798|1230008400|1230059670|0|1230059670
-0|vol2/DCIM/100CANON/IMG_0024.JPG|1052|r/rrwxrwxrwx|0|0|838434|1230008400|1230059676|0|1230059676
-0|vol2/DCIM/100CANON/_MG_0025.JPG|1053|r/rrwxrwxrwx|0|0|791333|1230008400|1230059680|0|1230059680
-0|vol2/DCIM/100CANON/IMG_0026.JPG|1054|r/rrwxrwxrwx|0|0|768385|1230008400|1230059686|0|1230059686
-0|vol2/DCIM/100CANON/IMG_0027.JPG|1055|r/rrwxrwxrwx|0|0|840253|1230008400|1230059690|0|1230059690
-0|vol2/DCIM/100CANON/IMG_0028.JPG|1056|r/rrwxrwxrwx|0|0|815636|1230008400|1230059694|0|1230059694
-0|vol2/DCIM/100CANON/IMG_0029.JPG|1057|r/rrwxrwxrwx|0|0|861552|1230008400|1230059698|0|1230059698
-0|vol2/DCIM/100CANON/_MG_0030.JPG|1058|r/rrwxrwxrwx|0|0|867833|1230008400|1230059702|0|1230059702
-0|vol2/DCIM/100CANON/IMG_0031.JPG|1059|r/rrwxrwxrwx|0|0|749202|1230008400|1230059708|0|1230059708
-0|vol2/DCIM/100CANON/IMG_0032.JPG|1060|r/rrwxrwxrwx|0|0|879834|1230008400|1230059714|0|1230059714
-0|vol2/DCIM/100CANON/IMG_0033.JPG|1061|r/rrwxrwxrwx|0|0|845375|1230008400|1230059718|0|1230059718
-0|vol2/DCIM/100CANON/IMG_0034.JPG|1062|r/rrwxrwxrwx|0|0|812465|1230008400|1230059722|0|1230059722
-0|vol2/DCIM/100CANON/_MG_0035.JPG|1063|r/rrwxrwxrwx|0|0|820105|1230008400|1230059728|0|1230059728
-0|vol2/DCIM/100CANON/IMG_0036.JPG|1064|r/rrwxrwxrwx|0|0|882337|1230008400|1230059736|0|1230059736
-0|vol2/DCIM/CANONMSC|518|d/drwxrwxrwx|0|0|16384|1230008400|1230060098|0|1230060098
-0|vol2/DCIM/CANONMSC/M0100.CTG|943621|r/rrwxrwxrwx|0|0|164|1230094800|1230168064|0|1230168064
-0|vol2/$MBR|971779|v/v---------|0|0|512|0|0|0|0
-0|vol2/$FAT1|971780|v/v---------|0|0|3072|0|0|0|0
-0|vol2/$FAT2|971781|v/v---------|0|0|3072|0|0|0|0
-0|vol2/$OrphanFiles|971782|d/d---------|0|0|0|0|0|0|0
\ No newline at end of file
diff --git a/bindings/java/test/output/gold/nps-2009-canon2-gen6_CPP_Exc.txt b/bindings/java/test/output/gold/nps-2009-canon2-gen6_CPP_Exc.txt
old mode 100644
new mode 100755
diff --git a/bindings/java/test/output/gold/nps-2009-canon2-gen6_CPP_SRT.txt b/bindings/java/test/output/gold/nps-2009-canon2-gen6_CPP_SRT.txt
deleted file mode 100644
index 24398d5c2..000000000
--- a/bindings/java/test/output/gold/nps-2009-canon2-gen6_CPP_SRT.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-0|vol2/$FAT1|971780|v/v---------|0|0|3072|0|0|0|0
-0|vol2/$FAT2|971781|v/v---------|0|0|3072|0|0|0|0
-0|vol2/$MBR|971779|v/v---------|0|0|512|0|0|0|0
-0|vol2/$OrphanFiles|971782|d/d---------|0|0|0|0|0|0|0
-0|vol2/CANON_DC    (Volume Label Entry)|3|r/rrwxrwxrwx|0|0|0|0|1230059544|0|0
-0|vol2/DCIM/100CANON/IMG_0003.JPG|1031|r/rrwxrwxrwx|0|0|840101|1230008400|1230059572|0|1230059572
-0|vol2/DCIM/100CANON/IMG_0007.JPG|1035|r/rrwxrwxrwx|0|0|865313|1230008400|1230059592|0|1230059592
-0|vol2/DCIM/100CANON/IMG_0009.JPG|1037|r/rrwxrwxrwx|0|0|840692|1230008400|1230059602|0|1230059602
-0|vol2/DCIM/100CANON/IMG_0011.JPG|1039|r/rrwxrwxrwx|0|0|771052|1230008400|1230059610|0|1230059610
-0|vol2/DCIM/100CANON/IMG_0013.JPG|1041|r/rrwxrwxrwx|0|0|842160|1230008400|1230059620|0|1230059620
-0|vol2/DCIM/100CANON/IMG_0016.JPG|1044|r/rrwxrwxrwx|0|0|853839|1230008400|1230059636|0|1230059636
-0|vol2/DCIM/100CANON/IMG_0017.JPG|1045|r/rrwxrwxrwx|0|0|795574|1230008400|1230059640|0|1230059640
-0|vol2/DCIM/100CANON/IMG_0018.JPG|1046|r/rrwxrwxrwx|0|0|784455|1230008400|1230059646|0|1230059646
-0|vol2/DCIM/100CANON/IMG_0019.JPG|1047|r/rrwxrwxrwx|0|0|864257|1230008400|1230059650|0|1230059650
-0|vol2/DCIM/100CANON/IMG_0021.JPG|1049|r/rrwxrwxrwx|0|0|819599|1230008400|1230059660|0|1230059660
-0|vol2/DCIM/100CANON/IMG_0022.JPG|1050|r/rrwxrwxrwx|0|0|728696|1230008400|1230059666|0|1230059666
-0|vol2/DCIM/100CANON/IMG_0023.JPG|1051|r/rrwxrwxrwx|0|0|858798|1230008400|1230059670|0|1230059670
-0|vol2/DCIM/100CANON/IMG_0024.JPG|1052|r/rrwxrwxrwx|0|0|838434|1230008400|1230059676|0|1230059676
-0|vol2/DCIM/100CANON/IMG_0026.JPG|1054|r/rrwxrwxrwx|0|0|768385|1230008400|1230059686|0|1230059686
-0|vol2/DCIM/100CANON/IMG_0027.JPG|1055|r/rrwxrwxrwx|0|0|840253|1230008400|1230059690|0|1230059690
-0|vol2/DCIM/100CANON/IMG_0028.JPG|1056|r/rrwxrwxrwx|0|0|815636|1230008400|1230059694|0|1230059694
-0|vol2/DCIM/100CANON/IMG_0029.JPG|1057|r/rrwxrwxrwx|0|0|861552|1230008400|1230059698|0|1230059698
-0|vol2/DCIM/100CANON/IMG_0031.JPG|1059|r/rrwxrwxrwx|0|0|749202|1230008400|1230059708|0|1230059708
-0|vol2/DCIM/100CANON/IMG_0032.JPG|1060|r/rrwxrwxrwx|0|0|879834|1230008400|1230059714|0|1230059714
-0|vol2/DCIM/100CANON/IMG_0033.JPG|1061|r/rrwxrwxrwx|0|0|845375|1230008400|1230059718|0|1230059718
-0|vol2/DCIM/100CANON/IMG_0034.JPG|1062|r/rrwxrwxrwx|0|0|812465|1230008400|1230059722|0|1230059722
-0|vol2/DCIM/100CANON/IMG_0036.JPG|1064|r/rrwxrwxrwx|0|0|882337|1230008400|1230059736|0|1230059736
-0|vol2/DCIM/100CANON/IMG_0038.JPG|1038|r/rrwxrwxrwx|0|0|1296150|1230008400|1230060166|0|1230060166
-0|vol2/DCIM/100CANON/IMG_0042.JPG|1030|r/rrwxrwxrwx|0|0|1361807|1230008400|1230060488|0|1230060488
-0|vol2/DCIM/100CANON/IMG_0043.JPG|1032|r/rrwxrwxrwx|0|0|2834018|1230008400|1230060638|0|1230060638
-0|vol2/DCIM/100CANON/IMG_0044.JPG|1029|r/rrwxrwxrwx|0|0|105195|1230094800|1230168104|0|1230168104
-0|vol2/DCIM/100CANON/IMG_0045.JPG|1033|r/rrwxrwxrwx|0|0|110686|1230094800|1230168116|0|1230168116
-0|vol2/DCIM/100CANON/IMG_0046.JPG|1034|r/rrwxrwxrwx|0|0|116135|1230094800|1230168130|0|1230168130
-0|vol2/DCIM/100CANON/IMG_0047.JPG|1036|r/rrwxrwxrwx|0|0|120441|1230094800|1230168136|0|1230168136
-0|vol2/DCIM/100CANON/IMG_0048.JPG|1040|r/rrwxrwxrwx|0|0|124906|1230094800|1230168142|0|1230168142
-0|vol2/DCIM/100CANON/IMG_0049.JPG|1042|r/rrwxrwxrwx|0|0|114940|1230094800|1230168148|0|1230168148
-0|vol2/DCIM/100CANON/IMG_0050.JPG|1043|r/rrwxrwxrwx|0|0|127191|1230094800|1230168156|0|1230168156
-0|vol2/DCIM/100CANON/IMG_0051.JPG|1048|r/rrwxrwxrwx|0|0|130418|1230094800|1230168162|0|1230168162
-0|vol2/DCIM/100CANON/_MG_0025.JPG|1053|r/rrwxrwxrwx|0|0|791333|1230008400|1230059680|0|1230059680
-0|vol2/DCIM/100CANON/_MG_0030.JPG|1058|r/rrwxrwxrwx|0|0|867833|1230008400|1230059702|0|1230059702
-0|vol2/DCIM/100CANON/_MG_0035.JPG|1063|r/rrwxrwxrwx|0|0|820105|1230008400|1230059728|0|1230059728
-0|vol2/DCIM/100CANON|517|d/drwxrwxrwx|0|0|16384|1230008400|1230059558|0|1230059558
-0|vol2/DCIM/CANONMSC/M0100.CTG|943621|r/rrwxrwxrwx|0|0|164|1230094800|1230168064|0|1230168064
-0|vol2/DCIM/CANONMSC|518|d/drwxrwxrwx|0|0|16384|1230008400|1230060098|0|1230060098
-0|vol2/DCIM|4|d/drwxrwxrwx|0|0|16384|1230008400|1230059558|0|1230059558
diff --git a/bindings/java/test/output/gold/nps-2009-canon2-gen6_Seq_Exc.txt b/bindings/java/test/output/gold/nps-2009-canon2-gen6_Seq_Exc.txt
old mode 100644
new mode 100755
diff --git a/bindings/java/test/output/gold/nps-2009-canon2-gen6_TD_Exc.txt b/bindings/java/test/output/gold/nps-2009-canon2-gen6_TD_Exc.txt
old mode 100644
new mode 100755
diff --git a/bindings/java/test/output/gold/ntfs1-gen2_BU.txt b/bindings/java/test/output/gold/ntfs1-gen2_BU.txt
deleted file mode 100644
index 68f6b8856..000000000
--- a/bindings/java/test/output/gold/ntfs1-gen2_BU.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-[4, 3, 2, 1]
-[5, 3, 2, 1]
-[6, 3, 2, 1]
-[7, 3, 2, 1]
-[8, 3, 2, 1]
-[10, 9, 3, 2, 1]
-[11, 9, 3, 2, 1]
-[12, 3, 2, 1]
-[13, 3, 2, 1]
-[14, 3, 2, 1]
-[15, 3, 2, 1]
-[16, 3, 2, 1]
-[17, 3, 2, 1]
-[18, 3, 2, 1]
-[20, 19, 3, 2, 1]
-[21, 19, 3, 2, 1]
-[22, 19, 3, 2, 1]
-[23, 19, 3, 2, 1]
-[24, 19, 3, 2, 1]
-[25, 19, 3, 2, 1]
-[26, 19, 3, 2, 1]
-[27, 3, 2, 1]
-[28, 3, 2, 1]
-[29, 3, 2, 1]
-[30, 3, 2, 1]
-[32, 31, 3, 2, 1]
-[33, 31, 3, 2, 1]
-[34, 31, 3, 2, 1]
-[35, 31, 3, 2, 1]
-[36, 31, 3, 2, 1]
-[37, 31, 3, 2, 1]
-[38, 31, 3, 2, 1]
-[40, 39, 3, 2, 1]
-[41, 39, 3, 2, 1]
-[42, 39, 3, 2, 1]
-[43, 39, 3, 2, 1]
-[44, 39, 3, 2, 1]
-[45, 39, 3, 2, 1]
-[46, 39, 3, 2, 1]
-[48, 47, 3, 2, 1]
-[49, 47, 3, 2, 1]
-[50, 3, 2, 1]
-[52, 51, 3, 2, 1]
diff --git a/bindings/java/test/output/gold/ntfs1-gen2_CPP.txt b/bindings/java/test/output/gold/ntfs1-gen2_CPP.txt
deleted file mode 100644
index e69de29bb..000000000
diff --git a/bindings/java/test/output/gold/ntfs1-gen2_CPP_Exc.txt b/bindings/java/test/output/gold/ntfs1-gen2_CPP_Exc.txt
old mode 100644
new mode 100755
diff --git a/bindings/java/test/output/gold/ntfs1-gen2_CPP_SRT.txt b/bindings/java/test/output/gold/ntfs1-gen2_CPP_SRT.txt
deleted file mode 100644
index e69de29bb..000000000
diff --git a/bindings/java/test/output/gold/ntfs1-gen2_Seq_Exc.txt b/bindings/java/test/output/gold/ntfs1-gen2_Seq_Exc.txt
old mode 100644
new mode 100755
diff --git a/bindings/java/test/output/gold/ntfs1-gen2_TD_Exc.txt b/bindings/java/test/output/gold/ntfs1-gen2_TD_Exc.txt
old mode 100644
new mode 100755
diff --git a/framework/TskModules/c_ZIPExtractionModule b/framework/TskModules/c_ZIPExtractionModule
deleted file mode 160000
index 4622d3ddc..000000000
--- a/framework/TskModules/c_ZIPExtractionModule
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 4622d3ddc229f81b32a430233e46aa90ce3335a5
-- 
GitLab