mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-15 01:07:42 +00:00
Refactored regression.py
Signed-off-by: Smoss <Smoss117@gmail.com>
This commit is contained in:
parent
4ebeef74d5
commit
1068085622
@ -68,7 +68,6 @@ import org.sleuthkit.autopsy.keywordsearch.*;
|
|||||||
* known_bad_path: Path to a database of known bad hashes
|
* known_bad_path: Path to a database of known bad hashes
|
||||||
* keyword_path: Path to a keyword list xml file
|
* keyword_path: Path to a keyword list xml file
|
||||||
* ignore_unalloc: Boolean whether to ignore unallocated space or not
|
* ignore_unalloc: Boolean whether to ignore unallocated space or not
|
||||||
* mugen_mode: whether or not this test will run certain keyword settings.
|
|
||||||
*
|
*
|
||||||
* Without these properties set, the test will fail to run correctly.
|
* Without these properties set, the test will fail to run correctly.
|
||||||
* To run this test correctly, you should use the script 'regression.py'
|
* To run this test correctly, you should use the script 'regression.py'
|
||||||
|
@ -65,7 +65,6 @@ class Args:
|
|||||||
self.verbose = False
|
self.verbose = False
|
||||||
self.exception = False
|
self.exception = False
|
||||||
self.exception_string = ""
|
self.exception_string = ""
|
||||||
self.contin = False
|
|
||||||
self.gold_creation = False
|
self.gold_creation = False
|
||||||
self.fr = False
|
self.fr = False
|
||||||
|
|
||||||
@ -80,61 +79,55 @@ class Args:
|
|||||||
if(arg == "-f"):
|
if(arg == "-f"):
|
||||||
try:
|
try:
|
||||||
arg = sys.argv.pop(0)
|
arg = sys.argv.pop(0)
|
||||||
printout("Running on a single file:")
|
print("Running on a single file:")
|
||||||
printout(path_fix(arg) + "\n")
|
print(path_fix(arg) + "\n")
|
||||||
self.single = True
|
self.single = True
|
||||||
self.single_file = path_fix(arg)
|
self.single_file = path_fix(arg)
|
||||||
except:
|
except:
|
||||||
printerror("Error: No single file given.\n")
|
print("Error: No single file given.\n")
|
||||||
return False
|
return False
|
||||||
elif(arg == "-r" or arg == "--rebuild"):
|
elif(arg == "-r" or arg == "--rebuild"):
|
||||||
printout("Running in rebuild mode.\n")
|
print("Running in rebuild mode.\n")
|
||||||
self.rebuild = True
|
self.rebuild = True
|
||||||
elif(arg == "-l" or arg == "--list"):
|
elif(arg == "-l" or arg == "--list"):
|
||||||
try:
|
try:
|
||||||
arg = sys.argv.pop(0)
|
arg = sys.argv.pop(0)
|
||||||
nxtproc.append(arg)
|
nxtproc.append(arg)
|
||||||
printout("Running from configuration file:")
|
print("Running from configuration file:")
|
||||||
printout(arg + "\n")
|
print(arg + "\n")
|
||||||
self.list = True
|
self.list = True
|
||||||
self.config_file = arg
|
self.config_file = arg
|
||||||
except:
|
except:
|
||||||
printerror("Error: No configuration file given.\n")
|
print("Error: No configuration file given.\n")
|
||||||
return False
|
return False
|
||||||
elif(arg == "-u" or arg == "--unallocated"):
|
elif(arg == "-u" or arg == "--unallocated"):
|
||||||
printout("Ignoring unallocated space.\n")
|
print("Ignoring unallocated space.\n")
|
||||||
self.unallocated = True
|
self.unallocated = True
|
||||||
elif(arg == "-k" or arg == "--keep"):
|
elif(arg == "-k" or arg == "--keep"):
|
||||||
printout("Keeping the Solr index.\n")
|
print("Keeping the Solr index.\n")
|
||||||
self.keep = True
|
self.keep = True
|
||||||
elif(arg == "-v" or arg == "--verbose"):
|
elif(arg == "-v" or arg == "--verbose"):
|
||||||
printout("Running in verbose mode:")
|
print("Running in verbose mode:")
|
||||||
printout("Printing all thrown exceptions.\n")
|
print("Printing all thrown exceptions.\n")
|
||||||
self.verbose = True
|
self.verbose = True
|
||||||
elif(arg == "-e" or arg == "--exception"):
|
elif(arg == "-e" or arg == "--exception"):
|
||||||
try:
|
try:
|
||||||
arg = sys.argv.pop(0)
|
arg = sys.argv.pop(0)
|
||||||
nxtproc.append(arg)
|
nxtproc.append(arg)
|
||||||
printout("Running in exception mode: ")
|
print("Running in exception mode: ")
|
||||||
printout("Printing all exceptions with the string '" + arg + "'\n")
|
print("Printing all exceptions with the string '" + arg + "'\n")
|
||||||
self.exception = True
|
self.exception = True
|
||||||
self.exception_string = arg
|
self.exception_string = arg
|
||||||
except:
|
except:
|
||||||
printerror("Error: No exception string given.")
|
print("Error: No exception string given.")
|
||||||
elif arg == "-h" or arg == "--help":
|
elif arg == "-h" or arg == "--help":
|
||||||
printout(usage())
|
print(usage())
|
||||||
return False
|
return False
|
||||||
elif arg == "-c" or arg == "--continuous":
|
|
||||||
printout("Running until interrupted")
|
|
||||||
self.contin = True
|
|
||||||
elif arg == "-g" or arg == "--gold":
|
|
||||||
printout("Creating gold standards")
|
|
||||||
self.gold_creation = True
|
|
||||||
elif arg == "-fr" or arg == "--forcerun":
|
elif arg == "-fr" or arg == "--forcerun":
|
||||||
printout("Not downloading new images")
|
print("Not downloading new images")
|
||||||
self.fr = True
|
self.fr = True
|
||||||
else:
|
else:
|
||||||
printout(usage())
|
print(usage())
|
||||||
return False
|
return False
|
||||||
# Return the args were sucessfully parsed
|
# Return the args were sucessfully parsed
|
||||||
return True
|
return True
|
||||||
@ -158,10 +151,6 @@ class TestAutopsy:
|
|||||||
self.csv = ""
|
self.csv = ""
|
||||||
self.global_csv = ""
|
self.global_csv = ""
|
||||||
self.html_log = ""
|
self.html_log = ""
|
||||||
# Error tracking
|
|
||||||
self.printerror = []
|
|
||||||
self.printout = []
|
|
||||||
self.report_passed = False
|
|
||||||
# Ant info:
|
# Ant info:
|
||||||
self.known_bad_path = ""
|
self.known_bad_path = ""
|
||||||
self.keyword_path = ""
|
self.keyword_path = ""
|
||||||
@ -174,7 +163,7 @@ class TestAutopsy:
|
|||||||
self.indexed_chunks = 0
|
self.indexed_chunks = 0
|
||||||
# Infinite Testing info
|
# Infinite Testing info
|
||||||
timer = 0
|
timer = 0
|
||||||
|
self.images = []
|
||||||
# Set the timeout to something huge
|
# Set the timeout to something huge
|
||||||
# The entire tester should not timeout before this number in ms
|
# The entire tester should not timeout before this number in ms
|
||||||
# However it only seems to take about half this time
|
# However it only seems to take about half this time
|
||||||
@ -210,7 +199,6 @@ class TestAutopsy:
|
|||||||
# Error tracking
|
# Error tracking
|
||||||
self.printerror = []
|
self.printerror = []
|
||||||
self.printout = []
|
self.printout = []
|
||||||
self.report_passed = False
|
|
||||||
|
|
||||||
# Set the timeout to something huge
|
# Set the timeout to something huge
|
||||||
# The entire tester should not timeout before this number in ms
|
# The entire tester should not timeout before this number in ms
|
||||||
@ -372,8 +360,8 @@ class Database:
|
|||||||
autopsy_cur1.execute("SELECT blackboard_attributes.source, blackboard_attribute_types.display_name, blackboard_attributes.value_type, blackboard_attributes.value_text, blackboard_attributes.value_int32, blackboard_attributes.value_int64, blackboard_attributes.value_double FROM blackboard_attributes INNER JOIN blackboard_attribute_types ON blackboard_attributes.attribute_type_id = blackboard_attribute_types.attribute_type_id WHERE artifact_id =? ORDER BY blackboard_attributes.source, blackboard_attribute_types.display_name, blackboard_attributes.value_type, blackboard_attributes.value_text, blackboard_attributes.value_int32, blackboard_attributes.value_int64, blackboard_attributes.value_double", key)
|
autopsy_cur1.execute("SELECT blackboard_attributes.source, blackboard_attribute_types.display_name, blackboard_attributes.value_type, blackboard_attributes.value_text, blackboard_attributes.value_int32, blackboard_attributes.value_int64, blackboard_attributes.value_double FROM blackboard_attributes INNER JOIN blackboard_attribute_types ON blackboard_attributes.attribute_type_id = blackboard_attribute_types.attribute_type_id WHERE artifact_id =? ORDER BY blackboard_attributes.source, blackboard_attribute_types.display_name, blackboard_attributes.value_type, blackboard_attributes.value_text, blackboard_attributes.value_int32, blackboard_attributes.value_int64, blackboard_attributes.value_double", key)
|
||||||
attributes = autopsy_cur1.fetchall()
|
attributes = autopsy_cur1.fetchall()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
printerror(str(e))
|
printerror(test_img, str(e))
|
||||||
printerror(str(rw[3]))
|
printerror(test_img, str(rw[3]))
|
||||||
errorem += "Artifact with id#" + str(rw[3]) + " encountered an error.\n"
|
errorem += "Artifact with id#" + str(rw[3]) + " encountered an error.\n"
|
||||||
looptry = False
|
looptry = False
|
||||||
test_img.artifact_fail += 1
|
test_img.artifact_fail += 1
|
||||||
@ -387,14 +375,14 @@ class Database:
|
|||||||
numvals += 1
|
numvals += 1
|
||||||
if(numvals > 1):
|
if(numvals > 1):
|
||||||
errorem += test_img.image_name + ":There were too many values for attribute type: " + attr[1] + " for artifact with id #" + str(rw[3]) + ".\n"
|
errorem += test_img.image_name + ":There were too many values for attribute type: " + attr[1] + " for artifact with id #" + str(rw[3]) + ".\n"
|
||||||
printerror("There were too many values for attribute type: " + attr[1] + " for artifact with id #" + str(rw[3]) + " for image " + test_img.image_name + ".")
|
printerror(test_img, "There were too many values for attribute type: " + attr[1] + " for artifact with id #" + str(rw[3]) + " for image " + test_img.image_name + ".")
|
||||||
failedbool = True
|
failedbool = True
|
||||||
if(not appnd):
|
if(not appnd):
|
||||||
attachl.append(autopsy_db_file)
|
attachl.append(autopsy_db_file)
|
||||||
appnd = True
|
appnd = True
|
||||||
if(not attr[0] == src):
|
if(not attr[0] == src):
|
||||||
errorem += test_img.image_name + ":There were inconsistents sources for artifact with id #" + str(rw[3]) + ".\n"
|
errorem += test_img.image_name + ":There were inconsistents sources for artifact with id #" + str(rw[3]) + ".\n"
|
||||||
printerror("There were inconsistents sources for artifact with id #" + str(rw[3]) + " for image " + test_img.image_name + ".")
|
printerror(test_img, "There were inconsistents sources for artifact with id #" + str(rw[3]) + " for image " + test_img.image_name + ".")
|
||||||
failedbool = True
|
failedbool = True
|
||||||
if(not appnd):
|
if(not appnd):
|
||||||
attachl.append(autopsy_db_file)
|
attachl.append(autopsy_db_file)
|
||||||
@ -409,16 +397,16 @@ class Database:
|
|||||||
try:
|
try:
|
||||||
database_log.write(inpval)
|
database_log.write(inpval)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
printerror("Inner exception" + outp)
|
printerror(test_img, "Inner exception" + outp)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
printerror(str(e))
|
printerror(test_img, str(e))
|
||||||
database_log.write('" />')
|
database_log.write('" />')
|
||||||
database_log.write(' <artifact/>\n')
|
database_log.write(' <artifact/>\n')
|
||||||
rw = autopsy_cur2.fetchone()
|
rw = autopsy_cur2.fetchone()
|
||||||
srtcmdlst = ["sort", test_img.autopsy_data_file, "-o", test_img.sorted_data_file]
|
srtcmdlst = ["sort", test_img.autopsy_data_file, "-o", test_img.sorted_data_file]
|
||||||
subprocess.call(srtcmdlst)
|
subprocess.call(srtcmdlst)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
printerror('outer exception: ' + str(e))
|
printerror(test_img, 'outer exception: ' + str(e))
|
||||||
if(test_img.artifact_fail > 0):
|
if(test_img.artifact_fail > 0):
|
||||||
errorem += test_img.image_name + ":There were " + str(test_img.artifact_count) + " artifacts and " + str(test_img.artifact_fail) + " threw an exception while loading.\n"
|
errorem += test_img.image_name + ":There were " + str(test_img.artifact_count) + " artifacts and " + str(test_img.artifact_fail) + " threw an exception while loading.\n"
|
||||||
|
|
||||||
@ -439,9 +427,9 @@ class Database:
|
|||||||
try:
|
try:
|
||||||
database_log.write(line + "\n")
|
database_log.write(line + "\n")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
printerror("Inner dump Exception:" + str(e))
|
printerror(test_img, "Inner dump Exception:" + str(e))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
printerror("Outer dump Exception:" + str(e))
|
printerror(test_img, "Outer dump Exception:" + str(e))
|
||||||
|
|
||||||
# Using the global test_case's variables, compare the database file made by the
|
# Using the global test_case's variables, compare the database file made by the
|
||||||
# regression test to the gold standard database file
|
# regression test to the gold standard database file
|
||||||
@ -461,17 +449,17 @@ class Database:
|
|||||||
database._generate_gold_artifacts()
|
database._generate_gold_artifacts()
|
||||||
database._generate_gold_attributes()
|
database._generate_gold_attributes()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
printerror("Way out:" + str(e))
|
printerror(test_img, "Way out:" + str(e))
|
||||||
# This is where we return if a file doesn't exist, because we don't want to
|
# This is where we return if a file doesn't exist, because we don't want to
|
||||||
# compare faulty databases, but we do however want to try to run all queries
|
# compare faulty databases, but we do however want to try to run all queries
|
||||||
# regardless of the other database
|
# regardless of the other database
|
||||||
if not Emailer.file_exists(autopsy_db_file):
|
if not Emailer.file_exists(autopsy_db_file):
|
||||||
printerror("Error: Database file does not exist at:")
|
printerror(test_img, "Error: Database file does not exist at:")
|
||||||
printerror(autopsy_db_file + "\n")
|
printerror(test_img, autopsy_db_file + "\n")
|
||||||
return
|
return
|
||||||
if not Emailer.file_exists(gold_db_file):
|
if not Emailer.file_exists(gold_db_file):
|
||||||
printerror("Error: Gold database file does not exist at:")
|
printerror(test_img, "Error: Gold database file does not exist at:")
|
||||||
printerror(gold_db_file + "\n")
|
printerror(test_img, gold_db_file + "\n")
|
||||||
return
|
return
|
||||||
# compare size of bb artifacts, attributes, and tsk objects
|
# compare size of bb artifacts, attributes, and tsk objects
|
||||||
gold_con = sqlite3.connect(gold_db_file)
|
gold_con = sqlite3.connect(gold_db_file)
|
||||||
@ -487,7 +475,7 @@ class Database:
|
|||||||
database._generate_autopsy_artifacts()
|
database._generate_autopsy_artifacts()
|
||||||
database._generate_autopsy_attributes()
|
database._generate_autopsy_attributes()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
printerror("Way out:" + str(e))
|
printerror(test_img, "Way out:" + str(e))
|
||||||
# Testing tsk_objects
|
# Testing tsk_objects
|
||||||
exceptions.append(Database._compare_tsk_objects(test_img, database))
|
exceptions.append(Database._compare_tsk_objects(test_img, database))
|
||||||
# Testing blackboard_artifacts
|
# Testing blackboard_artifacts
|
||||||
@ -499,9 +487,9 @@ class Database:
|
|||||||
database.attribute_comparison = exceptions[2]
|
database.attribute_comparison = exceptions[2]
|
||||||
|
|
||||||
okay = "All counts match."
|
okay = "All counts match."
|
||||||
print_report(exceptions[0], "COMPARE TSK OBJECTS", okay)
|
print_report(test_img, exceptions[0], "COMPARE TSK OBJECTS", okay)
|
||||||
print_report(exceptions[1], "COMPARE ARTIFACTS", okay)
|
print_report(test_img, exceptions[1], "COMPARE ARTIFACTS", okay)
|
||||||
print_report(exceptions[2], "COMPARE ATTRIBUTES", okay)
|
print_report(test_img, exceptions[2], "COMPARE ATTRIBUTES", okay)
|
||||||
|
|
||||||
def get_Data(test_img):
|
def get_Data(test_img):
|
||||||
autopsy_db_file = Emailer.make_path(test_case.output_dir, test_img.image_name,
|
autopsy_db_file = Emailer.make_path(test_case.output_dir, test_img.image_name,
|
||||||
@ -535,7 +523,7 @@ class Database:
|
|||||||
exceptions.append(error)
|
exceptions.append(error)
|
||||||
return exceptions
|
return exceptions
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
printerror(str(e))
|
printerror(test_img, str(e))
|
||||||
exceptions.append("Error: Unable to compare blackboard_artifacts.\n")
|
exceptions.append("Error: Unable to compare blackboard_artifacts.\n")
|
||||||
return exceptions
|
return exceptions
|
||||||
|
|
||||||
@ -612,7 +600,7 @@ class TestDiffer:
|
|||||||
global failedbool
|
global failedbool
|
||||||
attachl.append(diff_dir)
|
attachl.append(diff_dir)
|
||||||
errorem += test_img.image_name + ":There was a database TestDifference in the file " + gld + ".\n"
|
errorem += test_img.image_name + ":There was a database TestDifference in the file " + gld + ".\n"
|
||||||
printerror("There was a TestDifference in the Database data for " + test_img.image_name + " for the file " + gld + ".\n")
|
printerror(test_img, "There was a TestDifference in the Database data for " + test_img.image_name + " for the file " + gld + ".\n")
|
||||||
failedbool = True
|
failedbool = True
|
||||||
global imgfail
|
global imgfail
|
||||||
imgfail = True
|
imgfail = True
|
||||||
@ -637,7 +625,7 @@ class TestDiffer:
|
|||||||
attachl.append(test_img.sorted_log)
|
attachl.append(test_img.sorted_log)
|
||||||
attachl.append(diff_dir)
|
attachl.append(diff_dir)
|
||||||
errorem += test_img.image_name + ":There was a TestDifference in the exceptions Log.\n"
|
errorem += test_img.image_name + ":There was a TestDifference in the exceptions Log.\n"
|
||||||
printerror("Exceptions didn't match.\n")
|
printerror(test_img, "Exceptions didn't match.\n")
|
||||||
failedbool = True
|
failedbool = True
|
||||||
global imgfail
|
global imgfail
|
||||||
imgfail = True
|
imgfail = True
|
||||||
@ -658,12 +646,12 @@ class TestDiffer:
|
|||||||
try:
|
try:
|
||||||
autopsy_html_file = get_file_in_dir(autopsy_html_path, "index.html")
|
autopsy_html_file = get_file_in_dir(autopsy_html_path, "index.html")
|
||||||
if not Emailer.file_exists(gold_html_file):
|
if not Emailer.file_exists(gold_html_file):
|
||||||
printerror("Error: No gold html report exists at:")
|
printerror(test_img, "Error: No gold html report exists at:")
|
||||||
printerror(gold_html_file + "\n")
|
printerror(test_img, gold_html_file + "\n")
|
||||||
return
|
return
|
||||||
if not Emailer.file_exists(autopsy_html_file):
|
if not Emailer.file_exists(autopsy_html_file):
|
||||||
printerror("Error: No test_case html report exists at:")
|
printerror(test_img, "Error: No test_case html report exists at:")
|
||||||
printerror(autopsy_html_file + "\n")
|
printerror(test_img, autopsy_html_file + "\n")
|
||||||
return
|
return
|
||||||
#Find all gold .html files belonging to this test_case
|
#Find all gold .html files belonging to this test_case
|
||||||
ListGoldHTML = []
|
ListGoldHTML = []
|
||||||
@ -683,7 +671,7 @@ class TestDiffer:
|
|||||||
ListNewHTML.append(Emailer.make_path(test_case.img_gold_parse, test_img.image_name, fs))
|
ListNewHTML.append(Emailer.make_path(test_case.img_gold_parse, test_img.image_name, fs))
|
||||||
#ensure both reports have the same number of files and are in the same order
|
#ensure both reports have the same number of files and are in the same order
|
||||||
if(len(ListGoldHTML) != len(ListNewHTML)):
|
if(len(ListGoldHTML) != len(ListNewHTML)):
|
||||||
printerror("The reports did not have the same number of files. One of the reports may have been corrupted")
|
printerror(test_img, "The reports did not have the same number of files. One of the reports may have been corrupted")
|
||||||
else:
|
else:
|
||||||
ListGoldHTML.sort()
|
ListGoldHTML.sort()
|
||||||
ListNewHTML.sort()
|
ListNewHTML.sort()
|
||||||
@ -695,18 +683,18 @@ class TestDiffer:
|
|||||||
total["New"]+=count[1]
|
total["New"]+=count[1]
|
||||||
okay = "The test report matches the gold report."
|
okay = "The test report matches the gold report."
|
||||||
errors=["Gold report had " + str(total["Gold"]) +" errors", "New report had " + str(total["New"]) + " errors."]
|
errors=["Gold report had " + str(total["Gold"]) +" errors", "New report had " + str(total["New"]) + " errors."]
|
||||||
print_report(errors, "REPORT COMPARISON", okay)
|
print_report(test_img, errors, "REPORT COMPARISON", okay)
|
||||||
if total["Gold"] == total["New"]:
|
if total["Gold"] == total["New"]:
|
||||||
test_img.report_passed = True
|
test_img.report_passed = True
|
||||||
else:
|
else:
|
||||||
printerror("The reports did not match each other.\n " + errors[0] +" and the " + errors[1])
|
printerror(test_img, "The reports did not match each other.\n " + errors[0] +" and the " + errors[1])
|
||||||
except FileNotFoundException as e:
|
except FileNotFoundException as e:
|
||||||
e.print_error()
|
e.print_error()
|
||||||
except DirNotFoundException as e:
|
except DirNotFoundException as e:
|
||||||
e.print_error()
|
e.print_error()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
printerror("Error: Unknown fatal error comparing reports.")
|
printerror(test_img, "Error: Unknown fatal error comparing reports.")
|
||||||
printerror(str(e) + "\n")
|
printerror(test_img, str(e) + "\n")
|
||||||
logging.critical(traceback.format_exc())
|
logging.critical(traceback.format_exc())
|
||||||
|
|
||||||
class TestData:
|
class TestData:
|
||||||
@ -729,6 +717,10 @@ class TestData:
|
|||||||
self.artifact_fail = 0
|
self.artifact_fail = 0
|
||||||
self.heap_space = ""
|
self.heap_space = ""
|
||||||
self.service_times = ""
|
self.service_times = ""
|
||||||
|
self.report_passed = False
|
||||||
|
# Error tracking
|
||||||
|
self.printerror = []
|
||||||
|
self.printout = []
|
||||||
def reset(self):
|
def reset(self):
|
||||||
self.image = ""
|
self.image = ""
|
||||||
self.image_file = ""
|
self.image_file = ""
|
||||||
@ -748,11 +740,18 @@ class TestData:
|
|||||||
self.artifact_fail = 0
|
self.artifact_fail = 0
|
||||||
self.heap_space = ""
|
self.heap_space = ""
|
||||||
self.service_times = ""
|
self.service_times = ""
|
||||||
|
# Error tracking
|
||||||
|
self.printerror = []
|
||||||
|
self.printout = []
|
||||||
|
|
||||||
class Reports:
|
class Reports:
|
||||||
def generate_reports(csv_path, database, test_img):
|
def generate_reports(csv_path, database, test_img):
|
||||||
Reports._generate_html(database, test_img)
|
Reports._generate_html(database, test_img)
|
||||||
Reports._generate_csv(csv_path, database, test_img)
|
if test_case.global_csv:
|
||||||
|
Reports._generate_csv(test_case.global_csv, database, test_img)
|
||||||
|
else:
|
||||||
|
Reports._generate_csv(csv_path, database, test_img)
|
||||||
|
|
||||||
# Generates the HTML log file
|
# Generates the HTML log file
|
||||||
def _generate_html(database, test_img):
|
def _generate_html(database, test_img):
|
||||||
# If the file doesn't exist yet, this is the first test_case to run for
|
# If the file doesn't exist yet, this is the first test_case to run for
|
||||||
@ -781,7 +780,7 @@ class Reports:
|
|||||||
<h2><a name='" + test_img.image_name + "-errors'>Errors and Warnings</a></h2>\
|
<h2><a name='" + test_img.image_name + "-errors'>Errors and Warnings</a></h2>\
|
||||||
<hr color='#FF0000'>"
|
<hr color='#FF0000'>"
|
||||||
# For each error we have logged in the test_case
|
# For each error we have logged in the test_case
|
||||||
for error in test_case.printerror:
|
for error in test_img.printerror:
|
||||||
# Replace < and > to avoid any html display errors
|
# Replace < and > to avoid any html display errors
|
||||||
errors += "<p>" + error.replace("<", "<").replace(">", ">") + "</p>"
|
errors += "<p>" + error.replace("<", "<").replace(">", ">") + "</p>"
|
||||||
# If there is a \n, we probably want a <br /> in the html
|
# If there is a \n, we probably want a <br /> in the html
|
||||||
@ -858,7 +857,7 @@ class Reports:
|
|||||||
<h2><a name='" + test_img.image_name + "-general'>General Output</a></h2>\
|
<h2><a name='" + test_img.image_name + "-general'>General Output</a></h2>\
|
||||||
<hr color='#282828'>"
|
<hr color='#282828'>"
|
||||||
# For each printout in the test_case's list
|
# For each printout in the test_case's list
|
||||||
for out in test_case.printout:
|
for out in test_img.printout:
|
||||||
output += "<p>" + out + "</p>"
|
output += "<p>" + out + "</p>"
|
||||||
# If there was a \n it probably means we want a <br /> in the html
|
# If there was a \n it probably means we want a <br /> in the html
|
||||||
if "\n" in out:
|
if "\n" in out:
|
||||||
@ -872,9 +871,9 @@ class Reports:
|
|||||||
html.write(output)
|
html.write(output)
|
||||||
html.close()
|
html.close()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
printerror("Error: Unknown fatal error when creating HTML log at:")
|
printerror(test_img, "Error: Unknown fatal error when creating HTML log at:")
|
||||||
printerror(test_case.html_log)
|
printerror(test_img, test_case.html_log)
|
||||||
printerror(str(e) + "\n")
|
printerror(test_img, str(e) + "\n")
|
||||||
logging.critical(traceback.format_exc())
|
logging.critical(traceback.format_exc())
|
||||||
|
|
||||||
# Writed the top of the HTML log file
|
# Writed the top of the HTML log file
|
||||||
@ -923,6 +922,7 @@ class Reports:
|
|||||||
name = test_case.get_image_name(full_name)
|
name = test_case.get_image_name(full_name)
|
||||||
links.append("<a href='#" + name + "(0)'>" + name + "</a>")
|
links.append("<a href='#" + name + "(0)'>" + name + "</a>")
|
||||||
html.write("<p align='center'>" + (" | ".join(links)) + "</p>")
|
html.write("<p align='center'>" + (" | ".join(links)) + "</p>")
|
||||||
|
|
||||||
# Generate the CSV log file
|
# Generate the CSV log file
|
||||||
def _generate_csv(csv_path, database, test_img):
|
def _generate_csv(csv_path, database, test_img):
|
||||||
try:
|
try:
|
||||||
@ -930,7 +930,6 @@ class Reports:
|
|||||||
# first run, and we need to add the column names
|
# first run, and we need to add the column names
|
||||||
if not Emailer.file_exists(csv_path):
|
if not Emailer.file_exists(csv_path):
|
||||||
Reports.csv_header(csv_path)
|
Reports.csv_header(csv_path)
|
||||||
|
|
||||||
# Now add on the fields to a new row
|
# Now add on the fields to a new row
|
||||||
csv = open(csv_path, "a")
|
csv = open(csv_path, "a")
|
||||||
|
|
||||||
@ -964,9 +963,8 @@ class Reports:
|
|||||||
vars.append( database.get_artifact_comparison() )
|
vars.append( database.get_artifact_comparison() )
|
||||||
vars.append( database.get_attribute_comparison() )
|
vars.append( database.get_attribute_comparison() )
|
||||||
vars.append( Emailer.make_local_path("gold", test_img.image_name, "standard.html") )
|
vars.append( Emailer.make_local_path("gold", test_img.image_name, "standard.html") )
|
||||||
vars.append( str(test_case.report_passed) )
|
vars.append( str(test_img.report_passed) )
|
||||||
vars.append( test_case.ant_to_string() )
|
vars.append( test_case.ant_to_string() )
|
||||||
|
|
||||||
# Join it together with a ", "
|
# Join it together with a ", "
|
||||||
output = "|".join(vars)
|
output = "|".join(vars)
|
||||||
output += "\n"
|
output += "\n"
|
||||||
@ -974,9 +972,9 @@ class Reports:
|
|||||||
csv.write(output)
|
csv.write(output)
|
||||||
csv.close()
|
csv.close()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
printerror("Error: Unknown fatal error when creating CSV file at:")
|
printerror(test_img, "Error: Unknown fatal error when creating CSV file at:")
|
||||||
printerror(csv_path)
|
printerror(test_img, csv_path)
|
||||||
printerror(str(e) + "\n")
|
printerror(test_img, str(e) + "\n")
|
||||||
print(traceback.format_exc())
|
print(traceback.format_exc())
|
||||||
logging.critical(traceback.format_exc())
|
logging.critical(traceback.format_exc())
|
||||||
|
|
||||||
@ -1031,14 +1029,14 @@ class Logs:
|
|||||||
try:
|
try:
|
||||||
Logs._fill_test_case_data(test_img)
|
Logs._fill_test_case_data(test_img)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
printerror("Error: Unknown fatal error when filling test_case data.")
|
printerror(test_img, "Error: Unknown fatal error when filling test_case data.")
|
||||||
printerror(str(e) + "\n")
|
printerror(test_img, str(e) + "\n")
|
||||||
logging.critical(traceback.format_exc())
|
logging.critical(traceback.format_exc())
|
||||||
# If running in verbose mode (-v)
|
# If running in verbose mode (-v)
|
||||||
if test_case.args.verbose:
|
if test_case.args.verbose:
|
||||||
errors = Logs._report_all_errors()
|
errors = Logs._report_all_errors()
|
||||||
okay = "No warnings or errors in any log files."
|
okay = "No warnings or errors in any log files."
|
||||||
print_report(errors, "VERBOSE", okay)
|
print_report(test_img, errors, "VERBOSE", okay)
|
||||||
# Generate the "common log": a log of all exceptions and warnings
|
# Generate the "common log": a log of all exceptions and warnings
|
||||||
# from each log file generated by Autopsy
|
# from each log file generated by Autopsy
|
||||||
def _generate_common_log(test_img):
|
def _generate_common_log(test_img):
|
||||||
@ -1066,12 +1064,13 @@ class Logs:
|
|||||||
log.close()
|
log.close()
|
||||||
common_log.write("\n")
|
common_log.write("\n")
|
||||||
common_log.close()
|
common_log.close()
|
||||||
|
print(test_img.sorted_log)
|
||||||
srtcmdlst = ["sort", test_case.common_log_path, "-o", test_img.sorted_log]
|
srtcmdlst = ["sort", test_case.common_log_path, "-o", test_img.sorted_log]
|
||||||
subprocess.call(srtcmdlst)
|
subprocess.call(srtcmdlst)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
printerror("Error: Unable to generate the common log.")
|
printerror(test_img, "Error: Unable to generate the common log.")
|
||||||
printerror(str(e) + "\n")
|
printerror(test_img, str(e) + "\n")
|
||||||
printerror(traceback.format_exc())
|
printerror(test_img, traceback.format_exc())
|
||||||
logging.critical(traceback.format_exc())
|
logging.critical(traceback.format_exc())
|
||||||
|
|
||||||
# Fill in the global test_case's variables that require the log files
|
# Fill in the global test_case's variables that require the log files
|
||||||
@ -1088,8 +1087,8 @@ class Logs:
|
|||||||
# Set the test_case ending time based off the "create" time (when the file was copied)
|
# Set the test_case ending time based off the "create" time (when the file was copied)
|
||||||
test_img.end_date = time.ctime(os.path.getmtime(log_path))
|
test_img.end_date = time.ctime(os.path.getmtime(log_path))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
printerror("Error: Unable to open autopsy.log.0.")
|
printerror(test_img, "Error: Unable to open autopsy.log.0.")
|
||||||
printerror(str(e) + "\n")
|
printerror(test_img, str(e) + "\n")
|
||||||
logging.warning(traceback.format_exc())
|
logging.warning(traceback.format_exc())
|
||||||
# Set the test_case total test time
|
# Set the test_case total test time
|
||||||
# Start date must look like: "Jul 16, 2012 12:57:53 PM"
|
# Start date must look like: "Jul 16, 2012 12:57:53 PM"
|
||||||
@ -1119,8 +1118,8 @@ class Logs:
|
|||||||
chunks_line = search_log_set("autopsy", "Indexed file chunks count:", test_img)[0]
|
chunks_line = search_log_set("autopsy", "Indexed file chunks count:", test_img)[0]
|
||||||
test_case.indexed_chunks = int(chunks_line.rstrip().split(": ")[2])
|
test_case.indexed_chunks = int(chunks_line.rstrip().split(": ")[2])
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
printerror("Error: Unable to find the required information to fill test_case data.")
|
printerror(test_img, "Error: Unable to find the required information to fill test_case data.")
|
||||||
printerror(str(e) + "\n")
|
printerror(test_img, str(e) + "\n")
|
||||||
logging.critical(traceback.format_exc())
|
logging.critical(traceback.format_exc())
|
||||||
print(traceback.format_exc())
|
print(traceback.format_exc())
|
||||||
try:
|
try:
|
||||||
@ -1138,11 +1137,9 @@ class Logs:
|
|||||||
times += words[i]
|
times += words[i]
|
||||||
service_list.append(times)
|
service_list.append(times)
|
||||||
test_img.service_times = "; ".join(service_list)
|
test_img.service_times = "; ".join(service_list)
|
||||||
except FileNotFoundException as e:
|
|
||||||
e.print_error()
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
printerror("Error: Unknown fatal error when finding service times.")
|
printerror(test_img, "Error: Unknown fatal error when finding service times.")
|
||||||
printerror(str(e) + "\n")
|
printerror(test_img, str(e) + "\n")
|
||||||
logging.critical(traceback.format_exc())
|
logging.critical(traceback.format_exc())
|
||||||
|
|
||||||
# Returns all the errors found in the common log in a list
|
# Returns all the errors found in the common log in a list
|
||||||
@ -1150,8 +1147,8 @@ class Logs:
|
|||||||
try:
|
try:
|
||||||
return get_warnings() + get_exceptions()
|
return get_warnings() + get_exceptions()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
printerror("Error: Unknown fatal error when reporting all errors.")
|
printerror(test_img, "Error: Unknown fatal error when reporting all errors.")
|
||||||
printerror(str(e) + "\n")
|
printerror(test_img, str(e) + "\n")
|
||||||
logging.warning(traceback.format_exc())
|
logging.warning(traceback.format_exc())
|
||||||
# Searches the common log for any instances of a specific string.
|
# Searches the common log for any instances of a specific string.
|
||||||
def search_common_log(string, test_img):
|
def search_common_log(string, test_img):
|
||||||
@ -1226,26 +1223,26 @@ def search_log_set(type, string, test_img):
|
|||||||
|
|
||||||
# Print a report for the given errors with the report name as name
|
# Print a report for the given errors with the report name as name
|
||||||
# and if no errors are found, print the okay message
|
# and if no errors are found, print the okay message
|
||||||
def print_report(errors, name, okay):
|
def print_report(test_img, errors, name, okay):
|
||||||
if errors:
|
if errors:
|
||||||
printerror("--------< " + name + " >----------")
|
printerror(test_img, "--------< " + name + " >----------")
|
||||||
for error in errors:
|
for error in errors:
|
||||||
printerror(str(error))
|
printerror(test_img, str(error))
|
||||||
printerror("--------< / " + name + " >--------\n")
|
printerror(test_img, "--------< / " + name + " >--------\n")
|
||||||
else:
|
else:
|
||||||
printout("-----------------------------------------------------------------")
|
printout(test_img, "-----------------------------------------------------------------")
|
||||||
printout("< " + name + " - " + okay + " />")
|
printout(test_img, "< " + name + " - " + okay + " />")
|
||||||
printout("-----------------------------------------------------------------\n")
|
printout(test_img, "-----------------------------------------------------------------\n")
|
||||||
|
|
||||||
# Used instead of the print command when printing out an error
|
# Used instead of the print command when printing out an error
|
||||||
def printerror(string):
|
def printerror(test_img, string):
|
||||||
print(string)
|
print(string)
|
||||||
test_case.printerror.append(string)
|
test_img.printerror.append(string)
|
||||||
|
|
||||||
# Used instead of the print command when printing out anything besides errors
|
# Used instead of the print command when printing out anything besides errors
|
||||||
def printout(string):
|
def printout(test_img, string):
|
||||||
print(string)
|
print(string)
|
||||||
test_case.printout.append(string)
|
test_img.printout.append(string)
|
||||||
|
|
||||||
#----------------------------------#
|
#----------------------------------#
|
||||||
# Helper functions #
|
# Helper functions #
|
||||||
@ -1281,8 +1278,8 @@ def copy_logs(test_img):
|
|||||||
log_dir = os.path.join("..", "..", "Testing","build","test","qa-functional","work","userdir0","var","log")
|
log_dir = os.path.join("..", "..", "Testing","build","test","qa-functional","work","userdir0","var","log")
|
||||||
shutil.copytree(log_dir, Emailer.make_local_path(test_case.output_dir, test_img.image_name, "logs"))
|
shutil.copytree(log_dir, Emailer.make_local_path(test_case.output_dir, test_img.image_name, "logs"))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
printerror("Error: Failed to copy the logs.")
|
printerror(test_img,"Error: Failed to copy the logs.")
|
||||||
printerror(str(e) + "\n")
|
printerror(test_img,str(e) + "\n")
|
||||||
logging.warning(traceback.format_exc())
|
logging.warning(traceback.format_exc())
|
||||||
# Clears all the files from a directory and remakes it
|
# Clears all the files from a directory and remakes it
|
||||||
def clear_dir(dir):
|
def clear_dir(dir):
|
||||||
@ -1292,8 +1289,8 @@ def clear_dir(dir):
|
|||||||
os.makedirs(dir)
|
os.makedirs(dir)
|
||||||
return True;
|
return True;
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
printerror("Error: Cannot clear the given directory:")
|
printerror(test_img,"Error: Cannot clear the given directory:")
|
||||||
printerror(dir + "\n")
|
printerror(test_img,dir + "\n")
|
||||||
print(str(e))
|
print(str(e))
|
||||||
return False;
|
return False;
|
||||||
|
|
||||||
@ -1303,17 +1300,16 @@ def del_dir(dir):
|
|||||||
shutil.rmtree(dir)
|
shutil.rmtree(dir)
|
||||||
return True;
|
return True;
|
||||||
except:
|
except:
|
||||||
printerror("Error: Cannot delete the given directory:")
|
printerror(test_img,"Error: Cannot delete the given directory:")
|
||||||
printerror(dir + "\n")
|
printerror(test_img,dir + "\n")
|
||||||
return False;
|
return False;
|
||||||
#Copies a given file from "ffrom" to "to"
|
#Copies a given file from "ffrom" to "to"
|
||||||
def copy_file(ffrom, to):
|
def copy_file(ffrom, to):
|
||||||
try :
|
try :
|
||||||
if not Emailer.file_exists(ffrom):
|
|
||||||
raise FileNotFoundException(ffrom)
|
|
||||||
shutil.copy(ffrom, to)
|
shutil.copy(ffrom, to)
|
||||||
except:
|
except Exception as e:
|
||||||
raise FileNotFoundException(to)
|
print(str(e))
|
||||||
|
print(traceback.format_exc())
|
||||||
|
|
||||||
# Copies a directory file from "ffrom" to "to"
|
# Copies a directory file from "ffrom" to "to"
|
||||||
def copy_dir(ffrom, to):
|
def copy_dir(ffrom, to):
|
||||||
@ -1399,8 +1395,8 @@ class FileNotFoundException(Exception):
|
|||||||
self.strerror = "FileNotFoundException: " + file
|
self.strerror = "FileNotFoundException: " + file
|
||||||
|
|
||||||
def print_error(self):
|
def print_error(self):
|
||||||
printerror("Error: File could not be found at:")
|
printerror(test_img,"Error: File could not be found at:")
|
||||||
printerror(self.file + "\n")
|
printerror(test_img,self.file + "\n")
|
||||||
def error(self):
|
def error(self):
|
||||||
error = "Error: File could not be found at:\n" + self.file + "\n"
|
error = "Error: File could not be found at:\n" + self.file + "\n"
|
||||||
return error
|
return error
|
||||||
@ -1413,8 +1409,8 @@ class DirNotFoundException(Exception):
|
|||||||
self.strerror = "DirNotFoundException: " + dir
|
self.strerror = "DirNotFoundException: " + dir
|
||||||
|
|
||||||
def print_error(self):
|
def print_error(self):
|
||||||
printerror("Error: Directory could not be found at:")
|
printerror(test_img, "Error: Directory could not be found at:")
|
||||||
printerror(self.dir + "\n")
|
printerror(test_img, self.dir + "\n")
|
||||||
def error(self):
|
def error(self):
|
||||||
error = "Error: Directory could not be found at:\n" + self.dir + "\n"
|
error = "Error: Directory could not be found at:\n" + self.dir + "\n"
|
||||||
return error
|
return error
|
||||||
@ -1441,31 +1437,39 @@ class Test_Runner:
|
|||||||
logging.basicConfig(filename=log_name, level=logging.DEBUG)
|
logging.basicConfig(filename=log_name, level=logging.DEBUG)
|
||||||
# If user wants to do a single file and a list (contradictory?)
|
# If user wants to do a single file and a list (contradictory?)
|
||||||
if test_case.args.single and test_case.args.list:
|
if test_case.args.single and test_case.args.list:
|
||||||
printerror("Error: Cannot run both from config file and on a single file.")
|
printerror(test_img, "Error: Cannot run both from config file and on a single file.")
|
||||||
return
|
return
|
||||||
# If working from a configuration file
|
# If working from a configuration file
|
||||||
if test_case.args.list:
|
if test_case.args.list:
|
||||||
if not Emailer.file_exists(test_case.args.config_file):
|
if not Emailer.file_exists(test_case.args.config_file):
|
||||||
printerror("Error: Configuration file does not exist at:")
|
printerror(test_img, "Error: Configuration file does not exist at:")
|
||||||
printerror(test_case.args.config_file)
|
printerror(test_img, test_case.args.config_file)
|
||||||
return
|
return
|
||||||
logres = Test_Runner.run_config_test(test_case.args.config_file,test_img)
|
Test_Runner._fill_case_data(test_case.args.config_file,test_img)
|
||||||
# Else if working on a single file
|
# Else if working on a single file
|
||||||
elif test_case.args.single:
|
elif test_case.args.single:
|
||||||
if not Emailer.file_exists(test_case.args.single_file):
|
if not Emailer.file_exists(test_case.args.single_file):
|
||||||
printerror("Error: Image file does not exist at:")
|
printerror(test_img, "Error: Image file does not exist at:")
|
||||||
printerror(test_case.args.single_file)
|
printerror(test_img, test_case.args.single_file)
|
||||||
return
|
return
|
||||||
logres = Test_Runner.run_test(test_case.args.single_file, 0, test_img)
|
Test_case.images.append(test_case.args.single_file,)
|
||||||
# If user has not selected a single file, and does not want to ignore
|
# If user has not selected a single file, and does not want to ignore
|
||||||
# the input directory, continue on to parsing ../input
|
# the input directory, continue on to parsing ../input
|
||||||
if (not test_case.args.single) and (not test_case.args.ignore) and (not test_case.args.list):
|
if (not test_case.args.single) and (not test_case.args.ignore) and (not test_case.args.list):
|
||||||
test_case.args.config_file = "config.xml"
|
test_case.args.config_file = "config.xml"
|
||||||
if not Emailer.file_exists(test_case.args.config_file):
|
if not Emailer.file_exists(test_case.args.config_file):
|
||||||
printerror("Error: Configuration file does not exist at:")
|
printerror(test_img, "Error: Configuration file does not exist at:")
|
||||||
printerror(test_case.args.config_file)
|
printerror(test_img, test_case.args.config_file)
|
||||||
return
|
return
|
||||||
logres = Test_Runner.run_config_test(test_case.args.config_file, test_img)
|
Test_Runner._fill_case_data(test_case.args.config_file, test_img)
|
||||||
|
logres =[]
|
||||||
|
for img in test_case.images:
|
||||||
|
if Emailer.file_exists(img):
|
||||||
|
logres.append(Test_Runner._run_ingest(str(img), 0, test_img))
|
||||||
|
else:
|
||||||
|
printerror(test_img, "Warning: Image file listed in configuration does not exist:")
|
||||||
|
printrttot(value + "\n")
|
||||||
|
test_img.reset()
|
||||||
Reports.write_html_foot()
|
Reports.write_html_foot()
|
||||||
html.close()
|
html.close()
|
||||||
if (len(logres)>0):
|
if (len(logres)>0):
|
||||||
@ -1489,7 +1493,7 @@ class Test_Runner:
|
|||||||
Emailer.send_email(parsed, errorem, attachl, passFail)
|
Emailer.send_email(parsed, errorem, attachl, passFail)
|
||||||
|
|
||||||
# Iterates through an XML configuration file to find all given elements
|
# Iterates through an XML configuration file to find all given elements
|
||||||
def run_config_test(config_file, test_img):
|
def _fill_case_data(config_file, test_img):
|
||||||
try:
|
try:
|
||||||
global parsed
|
global parsed
|
||||||
global errorem
|
global errorem
|
||||||
@ -1515,9 +1519,9 @@ class Test_Runner:
|
|||||||
for element in parsed.getElementsByTagName("image"):
|
for element in parsed.getElementsByTagName("image"):
|
||||||
value = element.getAttribute("value").encode().decode("utf_8")
|
value = element.getAttribute("value").encode().decode("utf_8")
|
||||||
if Emailer.file_exists(value):
|
if Emailer.file_exists(value):
|
||||||
values.append(value)
|
test_case.images.append(value)
|
||||||
else:
|
else:
|
||||||
printout("File: " + value + " doesn't exist")
|
printout(test_img, "File: " + value + " doesn't exist")
|
||||||
count = len(values)
|
count = len(values)
|
||||||
archives = Emailer.make_path(test_case.gold, "..")
|
archives = Emailer.make_path(test_case.gold, "..")
|
||||||
arcount = 0
|
arcount = 0
|
||||||
@ -1525,54 +1529,24 @@ class Test_Runner:
|
|||||||
if not(file == 'tmp'):
|
if not(file == 'tmp'):
|
||||||
arcount+=1
|
arcount+=1
|
||||||
if (count > arcount):
|
if (count > arcount):
|
||||||
printout("******Alert: There are more input images than gold standards, some images will not be properly tested.\n")
|
print("******Alert: There are more input images than gold standards, some images will not be properly tested.\n")
|
||||||
elif not (arcount == count):
|
elif not (arcount == count):
|
||||||
printout("******Alert: There are more gold standards than input images, this will not check all gold Standards.\n")
|
print("******Alert: There are more gold standards than input images, this will not check all gold Standards.\n")
|
||||||
Reports.html_add_images(values)
|
Reports.html_add_images(values)
|
||||||
images = []
|
|
||||||
# Run the test for each file in the configuration
|
|
||||||
if(test_case.args.contin):
|
|
||||||
#set all times an image has been processed to 0
|
|
||||||
for element in parsed.getElementsByTagName("image"):
|
|
||||||
value = element.getAttribute("value").encode().decode("utf_8")
|
|
||||||
images.append(str(value))
|
|
||||||
#Begin infiniloop
|
|
||||||
if(newDay()):
|
|
||||||
global daycount
|
|
||||||
setDay()
|
|
||||||
srcupdater.compile(errorem, attachl, parsed)
|
|
||||||
if(daycount > 0):
|
|
||||||
printout("starting process")
|
|
||||||
outputer = open("ScriptLog.txt", "a")
|
|
||||||
pid = subprocess.Popen(nxtproc,
|
|
||||||
stdout = outputer,
|
|
||||||
stderr = outputer)
|
|
||||||
sys.exit()
|
|
||||||
daycount += 1
|
|
||||||
for img in values:
|
|
||||||
if Emailer.file_exists(img):
|
|
||||||
logres.append(Test_Runner.run_test(str(img), 0, test_img))
|
|
||||||
else:
|
|
||||||
printerror("Warning: Image file listed in configuration does not exist:")
|
|
||||||
printrttot(value + "\n")
|
|
||||||
test_img.reset()
|
|
||||||
return logres
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
printerror("Error: There was an error running with the configuration file.")
|
printerror(test_img, "Error: There was an error running with the configuration file.")
|
||||||
printerror(str(e) + "\n")
|
printerror(test_img, str(e) + "\n")
|
||||||
logging.critical(traceback.format_exc())
|
logging.critical(traceback.format_exc())
|
||||||
print(traceback.format_exc())
|
print(traceback.format_exc())
|
||||||
|
|
||||||
# Runs the test on the single given file.
|
def _run_ingest(image_file, count, test_img):
|
||||||
# The path must be guarenteed to be a correct path.
|
|
||||||
def run_test(image_file, count, test_img):
|
|
||||||
global parsed
|
global parsed
|
||||||
global imgfail
|
global imgfail
|
||||||
global failedbool
|
global failedbool
|
||||||
imgfail = False
|
imgfail = False
|
||||||
if image_type(image_file) == IMGTYPE.UNKNOWN:
|
if image_type(image_file) == IMGTYPE.UNKNOWN:
|
||||||
printerror("Error: Image type is unrecognized:")
|
printerror(test_img, "Error: Image type is unrecognized:")
|
||||||
printerror(image_file + "\n")
|
printerror(test_img, image_file + "\n")
|
||||||
return
|
return
|
||||||
|
|
||||||
# Set the test_case to work for this test
|
# Set the test_case to work for this test
|
||||||
@ -1600,14 +1574,14 @@ class Test_Runner:
|
|||||||
test_case.known_bad_path = Emailer.make_path(test_case.input_dir, "notablehashes.txt-md5.idx")
|
test_case.known_bad_path = Emailer.make_path(test_case.input_dir, "notablehashes.txt-md5.idx")
|
||||||
test_case.keyword_path = Emailer.make_path(test_case.input_dir, "notablekeywords.xml")
|
test_case.keyword_path = Emailer.make_path(test_case.input_dir, "notablekeywords.xml")
|
||||||
test_case.nsrl_path = Emailer.make_path(test_case.input_dir, "nsrl.txt-md5.idx")
|
test_case.nsrl_path = Emailer.make_path(test_case.input_dir, "nsrl.txt-md5.idx")
|
||||||
|
|
||||||
logging.debug("--------------------")
|
logging.debug("--------------------")
|
||||||
logging.debug(test_img.image_name)
|
logging.debug(test_img.image_name)
|
||||||
logging.debug("--------------------")
|
logging.debug("--------------------")
|
||||||
Test_Runner.run_ant(test_img)
|
Test_Runner._run_ant(test_img)
|
||||||
time.sleep(2) # Give everything a second to process
|
time.sleep(2) # Give everything a second to process
|
||||||
test_case.common_log_path = Emailer.make_local_path(test_case.output_dir, test_img.image_name, test_img.image_name+test_case.common_log)
|
test_case.common_log_path = Emailer.make_local_path(test_case.output_dir, test_img.image_name, test_img.image_name+test_case.common_log)
|
||||||
# After the java has ran:
|
# After the java has ran:
|
||||||
|
Database.get_Data(test_img)
|
||||||
copy_logs(test_img)
|
copy_logs(test_img)
|
||||||
test_img.sorted_log = Emailer.make_local_path(test_case.output_dir, test_img.image_name, test_img.image_name + "SortedErrors.txt")
|
test_img.sorted_log = Emailer.make_local_path(test_case.output_dir, test_img.image_name, test_img.image_name + "SortedErrors.txt")
|
||||||
Logs.generate_log_data(test_img)
|
Logs.generate_log_data(test_img)
|
||||||
@ -1616,43 +1590,23 @@ class Test_Runner:
|
|||||||
if not test_case.args.keep:
|
if not test_case.args.keep:
|
||||||
solr_index = Emailer.make_path(test_case.output_dir, test_img.image_name, test_case.Img_Test_Folder, "ModuleOutput", "KeywordSearch")
|
solr_index = Emailer.make_path(test_case.output_dir, test_img.image_name, test_case.Img_Test_Folder, "ModuleOutput", "KeywordSearch")
|
||||||
if clear_dir(solr_index):
|
if clear_dir(solr_index):
|
||||||
print_report([], "DELETE SOLR INDEX", "Solr index deleted.")
|
print_report(test_img, [], "DELETE SOLR INDEX", "Solr index deleted.")
|
||||||
elif test_case.args.keep:
|
elif test_case.args.keep:
|
||||||
print_report([], "KEEP SOLR INDEX", "Solr index has been kept.")
|
print_report(test_img, [], "KEEP SOLR INDEX", "Solr index has been kept.")
|
||||||
# If running in exception mode (-e)
|
# If running in exception mode (-e)
|
||||||
if test_case.args.exception:
|
if test_case.args.exception:
|
||||||
exceptions = search_logs(test_case.args.exception_string, test_img)
|
exceptions = search_logs(test_case.args.exception_string, test_img)
|
||||||
okay = "No warnings or exceptions found containing text '" + test_case.args.exception_string + "'."
|
okay = "No warnings or exceptions found containing text '" + test_case.args.exception_string + "'."
|
||||||
print_report(exceptions, "EXCEPTION", okay)
|
print_report(test_img, exceptions, "EXCEPTION", okay)
|
||||||
database = Database(test_img)
|
database = Database(test_img)
|
||||||
# Now test in comparison to the gold standards
|
# Now test in comparison to the gold standards
|
||||||
if not test_case.args.gold_creation:
|
if not test_case.args.rebuild:
|
||||||
try:
|
Test_Runner._run_test(image_file, database, test_img)
|
||||||
Database.get_Data(test_img)
|
# If running in rebuild mode (-r)
|
||||||
gold_path = test_case.gold
|
else:
|
||||||
img_gold = Emailer.make_path(test_case.gold, "tmp", test_img.image_name)
|
Test_Runner.rebuild(test_img)
|
||||||
img_archive = Emailer.make_path("..", "output", "gold", test_img.image_name+"-archive.zip")
|
|
||||||
if(not Emailer.file_exists(img_archive)):
|
|
||||||
img_archive = Emailer.make_path(test_case.gold_parse, test_img.image_name+"-archive.zip")
|
|
||||||
gold_path = test_case.gold_parse
|
|
||||||
img_gold = Emailer.make_path(gold_path, "tmp", test_img.image_name)
|
|
||||||
extrctr = zipfile.ZipFile(img_archive, 'r', compression=zipfile.ZIP_DEFLATED)
|
|
||||||
extrctr.extractall(gold_path)
|
|
||||||
extrctr.close
|
|
||||||
time.sleep(2)
|
|
||||||
Database.compare_to_gold_db(test_img, database)
|
|
||||||
TestDiffer.run_diff(test_img)
|
|
||||||
del_dir(img_gold)
|
|
||||||
except Exception as e:
|
|
||||||
printerror("Tests failed due to an error, try rebuilding or creating gold standards.\n")
|
|
||||||
printerror(str(e) + "\n")
|
|
||||||
# Make the CSV log and the html log viewer
|
# Make the CSV log and the html log viewer
|
||||||
Reports.generate_reports(test_case.csv, database, test_img)
|
Reports.generate_reports(test_case.csv, database, test_img)
|
||||||
if test_case.global_csv:
|
|
||||||
Reports.generate_reports(test_case.global_csv, database, test_img)
|
|
||||||
# If running in rebuild mode (-r)
|
|
||||||
if test_case.args.rebuild or test_case.args.gold_creation:
|
|
||||||
Test_Runner.rebuild(test_img)
|
|
||||||
# Reset the test_case and return the tests sucessfully finished
|
# Reset the test_case and return the tests sucessfully finished
|
||||||
clear_dir(Emailer.make_path(test_case.output_dir, test_img.image_name, test_case.Img_Test_Folder, "ModuleOutput", "keywordsearch"))
|
clear_dir(Emailer.make_path(test_case.output_dir, test_img.image_name, test_case.Img_Test_Folder, "ModuleOutput", "keywordsearch"))
|
||||||
if(failedbool):
|
if(failedbool):
|
||||||
@ -1660,6 +1614,29 @@ class Test_Runner:
|
|||||||
test_case.reset()
|
test_case.reset()
|
||||||
return logres
|
return logres
|
||||||
|
|
||||||
|
# Runs the test on the single given file.
|
||||||
|
# The path must be guarenteed to be a correct path.
|
||||||
|
def _run_test(image_file, database, test_img):
|
||||||
|
try:
|
||||||
|
gold_path = test_case.gold
|
||||||
|
img_gold = Emailer.make_path(test_case.gold, "tmp", test_img.image_name)
|
||||||
|
img_archive = Emailer.make_path("..", "output", "gold", test_img.image_name+"-archive.zip")
|
||||||
|
if(not Emailer.file_exists(img_archive)):
|
||||||
|
img_archive = Emailer.make_path(test_case.gold_parse, test_img.image_name+"-archive.zip")
|
||||||
|
gold_path = test_case.gold_parse
|
||||||
|
img_gold = Emailer.make_path(gold_path, "tmp", test_img.image_name)
|
||||||
|
extrctr = zipfile.ZipFile(img_archive, 'r', compression=zipfile.ZIP_DEFLATED)
|
||||||
|
extrctr.extractall(gold_path)
|
||||||
|
extrctr.close
|
||||||
|
time.sleep(2)
|
||||||
|
Database.compare_to_gold_db(test_img, database)
|
||||||
|
TestDiffer.run_diff(test_img)
|
||||||
|
del_dir(img_gold)
|
||||||
|
except Exception as e:
|
||||||
|
printerror(test_img, "Tests failed due to an error, try rebuilding or creating gold standards.\n")
|
||||||
|
printerror(test_img, str(e) + "\n")
|
||||||
|
print(traceback.format_exc())
|
||||||
|
|
||||||
# Rebuilds the gold standards by copying the test-generated database
|
# Rebuilds the gold standards by copying the test-generated database
|
||||||
# and html report files into the gold directory
|
# and html report files into the gold directory
|
||||||
def rebuild(test_img):
|
def rebuild(test_img):
|
||||||
@ -1685,12 +1662,15 @@ class Test_Runner:
|
|||||||
os.makedirs(tmpdir)
|
os.makedirs(tmpdir)
|
||||||
try:
|
try:
|
||||||
copy_file(dbinpth, dboutpth)
|
copy_file(dbinpth, dboutpth)
|
||||||
copy_file(test_img.sorted_data_file, dataoutpth)
|
if Emailer.file_exists(test_img.sorted_data_file):
|
||||||
|
copy_file(test_img.sorted_data_file, dataoutpth)
|
||||||
copy_file(dbdumpinpth, dbdumpoutpth)
|
copy_file(dbdumpinpth, dbdumpoutpth)
|
||||||
error_pth = Emailer.make_path(tmpdir, test_img.image_name+"SortedErrors.txt")
|
error_pth = Emailer.make_path(tmpdir, test_img.image_name+"SortedErrors.txt")
|
||||||
copy_file(test_img.sorted_log, error_pth)
|
copy_file(test_img.sorted_log, error_pth)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
printerror(str(e))
|
printerror(test_img, str(e))
|
||||||
|
print(str(e))
|
||||||
|
print(traceback.format_exc())
|
||||||
# Rebuild the HTML report
|
# Rebuild the HTML report
|
||||||
htmlfolder = ""
|
htmlfolder = ""
|
||||||
for fs in os.listdir(os.path.join(os.getcwd(),test_case.output_dir, test_img.image_name, test_case.Img_Test_Folder, "Reports")):
|
for fs in os.listdir(os.path.join(os.getcwd(),test_case.output_dir, test_img.image_name, test_case.Img_Test_Folder, "Reports")):
|
||||||
@ -1711,7 +1691,7 @@ class Test_Runner:
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
errors.append("Error: Unknown fatal error when rebuilding the gold html report.")
|
errors.append("Error: Unknown fatal error when rebuilding the gold html report.")
|
||||||
errors.append(str(e) + "\n")
|
errors.append(str(e) + "\n")
|
||||||
traceback.print_exc
|
print(traceback.format_exc())
|
||||||
oldcwd = os.getcwd()
|
oldcwd = os.getcwd()
|
||||||
zpdir = gold_dir
|
zpdir = gold_dir
|
||||||
os.chdir(zpdir)
|
os.chdir(zpdir)
|
||||||
@ -1724,7 +1704,7 @@ class Test_Runner:
|
|||||||
os.chdir(oldcwd)
|
os.chdir(oldcwd)
|
||||||
del_dir(test_case.img_gold_parse)
|
del_dir(test_case.img_gold_parse)
|
||||||
okay = "Sucessfully rebuilt all gold standards."
|
okay = "Sucessfully rebuilt all gold standards."
|
||||||
print_report(errors, "REBUILDING", okay)
|
print_report(test_img, errors, "REBUILDING", okay)
|
||||||
|
|
||||||
def zipdir(path, zip):
|
def zipdir(path, zip):
|
||||||
for root, dirs, files in os.walk(path):
|
for root, dirs, files in os.walk(path):
|
||||||
@ -1733,7 +1713,7 @@ class Test_Runner:
|
|||||||
|
|
||||||
# Tests Autopsy with RegressionTest.java by by running
|
# Tests Autopsy with RegressionTest.java by by running
|
||||||
# the build.xml file through ant
|
# the build.xml file through ant
|
||||||
def run_ant(test_img):
|
def _run_ant(test_img):
|
||||||
# Set up the directories
|
# Set up the directories
|
||||||
test_case_path = os.path.join(test_case.output_dir, test_img.image_name)
|
test_case_path = os.path.join(test_case.output_dir, test_img.image_name)
|
||||||
if Emailer.dir_exists(test_case_path):
|
if Emailer.dir_exists(test_case_path):
|
||||||
@ -1754,16 +1734,15 @@ class Test_Runner:
|
|||||||
test_case.ant.append("-Dgold_path=" + Emailer.make_path(test_case.gold))
|
test_case.ant.append("-Dgold_path=" + Emailer.make_path(test_case.gold))
|
||||||
test_case.ant.append("-Dout_path=" + Emailer.make_local_path(test_case.output_dir, test_img.image_name))
|
test_case.ant.append("-Dout_path=" + Emailer.make_local_path(test_case.output_dir, test_img.image_name))
|
||||||
test_case.ant.append("-Dignore_unalloc=" + "%s" % test_case.args.unallocated)
|
test_case.ant.append("-Dignore_unalloc=" + "%s" % test_case.args.unallocated)
|
||||||
test_case.ant.append("-Dcontin_mode=" + str(test_case.args.contin))
|
|
||||||
test_case.ant.append("-Dtest.timeout=" + str(test_case.timeout))
|
test_case.ant.append("-Dtest.timeout=" + str(test_case.timeout))
|
||||||
|
|
||||||
printout("Ingesting Image:\n" + test_img.image_file + "\n")
|
printout(test_img, "Ingesting Image:\n" + test_img.image_file + "\n")
|
||||||
printout("CMD: " + " ".join(test_case.ant))
|
printout(test_img, "CMD: " + " ".join(test_case.ant))
|
||||||
printout("Starting test...\n")
|
printout(test_img, "Starting test...\n")
|
||||||
antoutpth = Emailer.make_local_path(test_case.output_dir, "antRunOutput.txt")
|
antoutpth = Emailer.make_local_path(test_case.output_dir, "antRunOutput.txt")
|
||||||
antout = open(antoutpth, "a")
|
antout = open(antoutpth, "a")
|
||||||
if SYS is OS.CYGWIN:
|
if SYS is OS.CYGWIN:
|
||||||
subprocess.call(test_case.ant, stdout=antout)
|
subprocess.call(test_case.ant, stdout=subprocess.PIPE)
|
||||||
elif SYS is OS.WIN:
|
elif SYS is OS.WIN:
|
||||||
theproc = subprocess.Popen(test_case.ant, shell = True, stdout=subprocess.PIPE)
|
theproc = subprocess.Popen(test_case.ant, shell = True, stdout=subprocess.PIPE)
|
||||||
theproc.communicate()
|
theproc.communicate()
|
||||||
@ -1789,7 +1768,6 @@ def main():
|
|||||||
errorem = ""
|
errorem = ""
|
||||||
args = Args()
|
args = Args()
|
||||||
test_case = TestAutopsy(args)
|
test_case = TestAutopsy(args)
|
||||||
printout("")
|
|
||||||
attachl = []
|
attachl = []
|
||||||
passed = False
|
passed = False
|
||||||
# The arguments were given wrong:
|
# The arguments were given wrong:
|
||||||
@ -1808,14 +1786,6 @@ def main():
|
|||||||
theproc.communicate()
|
theproc.communicate()
|
||||||
# Otherwise test away!
|
# Otherwise test away!
|
||||||
Test_Runner.execute_test()
|
Test_Runner.execute_test()
|
||||||
while args.contin:
|
|
||||||
redo = False
|
|
||||||
attachl = []
|
|
||||||
errorem = "The test standard didn't match the gold standard.\n"
|
|
||||||
failedbool = False
|
|
||||||
passed = False
|
|
||||||
Test_Runner.execute_test()
|
|
||||||
case = TestAutopsy()
|
|
||||||
|
|
||||||
class OS:
|
class OS:
|
||||||
LINUX, MAC, WIN, CYGWIN = range(4)
|
LINUX, MAC, WIN, CYGWIN = range(4)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user