Removed redundant attributes in TestConfiguration and consolidated places they were used.

This commit is contained in:
Jeff Wallace 2013-07-09 14:10:39 -04:00
parent 1460a8c7cf
commit f346032d72

View File

@ -61,7 +61,7 @@ import srcupdater
# in a global class. # in a global class.
# - Command line arguments are in Args (named args) # - Command line arguments are in Args (named args)
# - Global Test Configuration is in TestConfiguration(named test_config) # - Global Test Configuration is in TestConfiguration(named test_config)
# - Queried information from the databases is in DatabaseDiff (named database) # - Queried information from the databases is in TskDbDiff (named database)
# Feel free to add additional global classes or add to the existing ones, # Feel free to add additional global classes or add to the existing ones,
# but do not overwrite any existing variables as they are used frequently. # but do not overwrite any existing variables as they are used frequently.
# #
@ -171,8 +171,6 @@ class TestConfiguration:
self.input_dir = Emailer.make_local_path("..","input") # Path : the Path to the input directory self.input_dir = Emailer.make_local_path("..","input") # Path : the Path to the input directory
self.gold = Emailer.make_path("..", "output", "gold") # Path : the Path to the gold directory self.gold = Emailer.make_path("..", "output", "gold") # Path : the Path to the gold directory
self.img_gold = Emailer.make_path(self.gold, 'tmp') self.img_gold = Emailer.make_path(self.gold, 'tmp')
self.gold_parse = ""
self.img_gold_parse = ""
self.common_log = "AutopsyErrors.txt" self.common_log = "AutopsyErrors.txt"
self.test_db_file = "autopsy.db" self.test_db_file = "autopsy.db"
self.Img_Test_Folder = "AutopsyTestCase" self.Img_Test_Folder = "AutopsyTestCase"
@ -326,11 +324,8 @@ class TestConfiguration:
self.global_csv = parsed.getElementsByTagName("global_csv")[0].getAttribute("value").encode().decode("utf_8") self.global_csv = parsed.getElementsByTagName("global_csv")[0].getAttribute("value").encode().decode("utf_8")
self.global_csv = Emailer.make_local_path(self.global_csv) self.global_csv = Emailer.make_local_path(self.global_csv)
if parsed.getElementsByTagName("golddir"): if parsed.getElementsByTagName("golddir"):
self.gold_parse = parsed.getElementsByTagName("golddir")[0].getAttribute("value").encode().decode("utf_8") self.gold = parsed.getElementsByTagName("golddir")[0].getAttribute("value").encode().decode("utf_8")
self.img_gold_parse = Emailer.make_path(self.gold_parse, 'tmp') self.img_gold = Emailer.make_path(self.gold, 'tmp')
else:
self.gold_parse = self.gold
self.img_gold_parse = Emailer.make_path(self.gold_parse, 'tmp')
# Generate the top navbar of the HTML for easy access to all images # Generate the top navbar of the HTML for easy access to all images
images = [] images = []
@ -376,7 +371,7 @@ class TestConfiguration:
# Contains methods to compare two databases and internally # Contains methods to compare two databases and internally
# stores some of the results. # # stores some of the results. #
#---------------------------------------------------------# #---------------------------------------------------------#
class DatabaseDiff: class TskDbDiff:
def __init__(self, case): def __init__(self, case):
self.gold_artifacts = [] self.gold_artifacts = []
self.autopsy_artifacts = [] self.autopsy_artifacts = []
@ -453,7 +448,7 @@ class DatabaseDiff:
self.autopsy_attributes = autopsy_attributes self.autopsy_attributes = autopsy_attributes
# Counts number of objects and saves them into database. # Counts number of objects and saves them into database.
# @@@ Does not need to connect again. Should be storing connection in DatabaseDiff # @@@ Does not need to connect again. Should be storing connection in TskDbDiff
# See also for _generate_autopsy_attributes # See also for _generate_autopsy_attributes
def _count_output_objects(self): def _count_output_objects(self):
if self.autopsy_objects == 0: if self.autopsy_objects == 0:
@ -470,8 +465,6 @@ class DatabaseDiff:
def _count_gold_artifacts(self): def _count_gold_artifacts(self):
if not self.gold_artifacts: if not self.gold_artifacts:
gold_db_file = Emailer.make_path(test_config.img_gold, self.test_data.image_name, test_config.test_db_file) gold_db_file = Emailer.make_path(test_config.img_gold, self.test_data.image_name, test_config.test_db_file)
if(not Emailer.file_exists(gold_db_file)):
gold_db_file = Emailer.make_path(test_config.img_gold_parse, self.test_data.image_name, test_config.test_db_file)
gold_con = sqlite3.connect(gold_db_file) gold_con = sqlite3.connect(gold_db_file)
gold_cur = gold_con.cursor() gold_cur = gold_con.cursor()
gold_cur.execute("SELECT COUNT(*) FROM blackboard_artifact_types") gold_cur.execute("SELECT COUNT(*) FROM blackboard_artifact_types")
@ -488,8 +481,6 @@ class DatabaseDiff:
def _count_gold_attributes(self): def _count_gold_attributes(self):
if self.gold_attributes == 0: if self.gold_attributes == 0:
gold_db_file = Emailer.make_path(test_config.img_gold, self.test_data.image_name, test_config.test_db_file) gold_db_file = Emailer.make_path(test_config.img_gold, self.test_data.image_name, test_config.test_db_file)
if(not Emailer.file_exists(gold_db_file)):
gold_db_file = Emailer.make_path(test_config.img_gold_parse, self.test_data.image_name, test_config.test_db_file)
gold_con = sqlite3.connect(gold_db_file) gold_con = sqlite3.connect(gold_db_file)
gold_cur = gold_con.cursor() gold_cur = gold_con.cursor()
gold_cur.execute("SELECT COUNT(*) FROM blackboard_attributes") gold_cur.execute("SELECT COUNT(*) FROM blackboard_attributes")
@ -498,8 +489,6 @@ class DatabaseDiff:
def _count_gold_objects(self): def _count_gold_objects(self):
if self.gold_objects == 0: if self.gold_objects == 0:
gold_db_file = Emailer.make_path(test_config.img_gold, self.test_data.image_name, test_config.test_db_file) gold_db_file = Emailer.make_path(test_config.img_gold, self.test_data.image_name, test_config.test_db_file)
if(not Emailer.file_exists(gold_db_file)):
gold_db_file = Emailer.make_path(test_config.img_gold_parse, self.test_data.image_name, test_config.test_db_file)
gold_con = sqlite3.connect(gold_db_file) gold_con = sqlite3.connect(gold_db_file)
gold_cur = gold_con.cursor() gold_cur = gold_con.cursor()
gold_cur.execute("SELECT COUNT(*) FROM tsk_objects") gold_cur.execute("SELECT COUNT(*) FROM tsk_objects")
@ -583,8 +572,6 @@ class DatabaseDiff:
# Get connection to gold DB and count artifacts, etc. # Get connection to gold DB and count artifacts, etc.
gold_db_file = Emailer.make_path(test_config.img_gold, self.test_data.image_name, test_config.test_db_file) gold_db_file = Emailer.make_path(test_config.img_gold, self.test_data.image_name, test_config.test_db_file)
if(not Emailer.file_exists(gold_db_file)):
gold_db_file = Emailer.make_path(test_config.img_gold_parse, self.test_data.image_name, test_config.test_db_file)
try: try:
self._count_gold_objects() self._count_gold_objects()
self._count_gold_artifacts() self._count_gold_artifacts()
@ -596,7 +583,7 @@ class DatabaseDiff:
# 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(self.test_data, "Error: DatabaseDiff file does not exist at:") printerror(self.test_data, "Error: TskDbDiff file does not exist at:")
printerror(self.test_data, autopsy_db_file + "\n") printerror(self.test_data, autopsy_db_file + "\n")
return return
if not Emailer.file_exists(gold_db_file): if not Emailer.file_exists(gold_db_file):
@ -768,19 +755,19 @@ class DatabaseDiff:
autopsy_cur = autopsy_con.cursor() autopsy_cur = autopsy_con.cursor()
# Try to query the databases. Ignore any exceptions, the function will # Try to query the databases. Ignore any exceptions, the function will
# return an error later on if these do fail # return an error later on if these do fail
DatabaseDiff._dump_output_db_bb(autopsy_con,autopsy_db_file, test_data) TskDbDiff._dump_output_db_bb(autopsy_con,autopsy_db_file, test_data)
DatabaseDiff._dump_output_db_nonbb(test_data) TskDbDiff._dump_output_db_nonbb(test_data)
#-------------------------------------------------# #-------------------------------------------------#
# Functions relating to comparing outputs # # Functions relating to comparing outputs #
#-------------------------------------------------# #-------------------------------------------------#
class TestDiffer: class TestResultsDiffer:
# Compares results for a single test. Autopsy has already been run. # Compares results for a single test. Autopsy has already been run.
# test_data: TestData object # test_data: TestData object
# databaseDiff: DatabaseDiff object created based on test_data # databaseDiff: TskDbDiff object created based on test_data
def run_diff(test_data, databaseDiff): def run_diff(test_data, databaseDiff):
try: try:
gold_path = test_config.gold gold_path = test_config.gold
@ -789,29 +776,25 @@ class TestDiffer:
# Open gold archive file # Open gold archive file
img_archive = Emailer.make_path("..", "output", "gold", test_data.image_name+"-archive.zip") img_archive = Emailer.make_path("..", "output", "gold", test_data.image_name+"-archive.zip")
if(not Emailer.file_exists(img_archive)):
img_archive = Emailer.make_path(test_config.gold_parse, test_data.image_name+"-archive.zip")
gold_path = test_config.gold_parse
img_gold = Emailer.make_path(gold_path, "tmp", test_data.image_name)
extrctr = zipfile.ZipFile(img_archive, 'r', compression=zipfile.ZIP_DEFLATED) extrctr = zipfile.ZipFile(img_archive, 'r', compression=zipfile.ZIP_DEFLATED)
extrctr.extractall(gold_path) extrctr.extractall(gold_path)
extrctr.close extrctr.close
time.sleep(2) time.sleep(2)
# Lists of tests to run # Lists of tests to run
TestDiffer._compare_errors(test_data) TestResultsDiffer._compare_errors(test_data)
# Compare database count to gold # Compare database count to gold
databaseDiff.compare_basic_counts() databaseDiff.compare_basic_counts()
# Compare smart blackboard results # Compare smart blackboard results
TestDiffer._compare_text(test_data.sorted_data_file, "SortedData", test_data) TestResultsDiffer._compare_text(test_data.sorted_data_file, "SortedData", test_data)
# Compare the rest of the database (non-BB) # Compare the rest of the database (non-BB)
TestDiffer._compare_text(test_data.test_dbdump, "DBDump", test_data) TestResultsDiffer._compare_text(test_data.test_dbdump, "DBDump", test_data)
# Compare html output # Compare html output
TestDiffer._compare_to_gold_html(test_data) TestResultsDiffer._compare_to_gold_html(test_data)
# Clean up tmp folder # Clean up tmp folder
del_dir(img_gold) del_dir(img_gold)
@ -832,8 +815,6 @@ class TestDiffer:
# test_data: Test being performed # test_data: Test being performed
def _compare_text(output_file, gold_file, test_data): def _compare_text(output_file, gold_file, test_data):
gold_dir = Emailer.make_path(test_config.img_gold, test_data.image_name, test_data.image_name + gold_file + ".txt") gold_dir = Emailer.make_path(test_config.img_gold, test_data.image_name, test_data.image_name + gold_file + ".txt")
if(not Emailer.file_exists(gold_dir)):
gold_dir = Emailer.make_path(test_config.img_gold_parse, test_data.image_name, test_data.image_name + gold_file + ".txt")
if(not Emailer.file_exists(output_file)): if(not Emailer.file_exists(output_file)):
return return
srtd_data = codecs.open(output_file, "r", "utf_8") srtd_data = codecs.open(output_file, "r", "utf_8")
@ -858,8 +839,6 @@ class TestDiffer:
# Compare merged error log files # Compare merged error log files
def _compare_errors(test_data): def _compare_errors(test_data):
gold_dir = Emailer.make_path(test_config.img_gold, test_data.image_name, test_data.image_name + "SortedErrors.txt") gold_dir = Emailer.make_path(test_config.img_gold, test_data.image_name, test_data.image_name + "SortedErrors.txt")
if(not Emailer.file_exists(gold_dir)):
gold_dir = Emailer.make_path(test_config.img_gold_parse, test_data.image_name, test_data.image_name + "SortedErrors.txt")
common_log = codecs.open(test_data.sorted_log, "r", "utf_8") common_log = codecs.open(test_data.sorted_log, "r", "utf_8")
gold_log = codecs.open(gold_dir, "r", "utf_8") gold_log = codecs.open(gold_dir, "r", "utf_8")
gold_dat = gold_log.read() gold_dat = gold_log.read()
@ -885,8 +864,6 @@ class TestDiffer:
# the regression test against the gold standard html report # the regression test against the gold standard html report
def _compare_to_gold_html(test_data): def _compare_to_gold_html(test_data):
gold_html_file = Emailer.make_path(test_config.img_gold, test_data.image_name, "Report", "index.html") gold_html_file = Emailer.make_path(test_config.img_gold, test_data.image_name, "Report", "index.html")
if(not Emailer.file_exists(gold_html_file)):
gold_html_file = Emailer.make_path(test_config.img_gold_parse, test_data.image_name, "Report", "index.html")
htmlfolder = "" htmlfolder = ""
for fs in os.listdir(Emailer.make_path(test_config.output_dir, test_data.image_name, test_config.Img_Test_Folder, "Reports")): for fs in os.listdir(Emailer.make_path(test_config.output_dir, test_data.image_name, test_config.Img_Test_Folder, "Reports")):
if os.path.isdir(Emailer.make_path(test_config.output_dir, test_data.image_name, test_config.Img_Test_Folder, "Reports", fs)): if os.path.isdir(Emailer.make_path(test_config.output_dir, test_data.image_name, test_config.Img_Test_Folder, "Reports", fs)):
@ -915,11 +892,6 @@ class TestDiffer:
for fs in os.listdir(Emailer.make_path(test_config.img_gold, test_data.image_name)): for fs in os.listdir(Emailer.make_path(test_config.img_gold, test_data.image_name)):
if (fs.endswith(".html")): if (fs.endswith(".html")):
ListNewHTML.append(Emailer.make_path(test_config.img_gold, test_data.image_name, fs)) ListNewHTML.append(Emailer.make_path(test_config.img_gold, test_data.image_name, fs))
if(not test_config.img_gold_parse == "" or test_config.img_gold == test_case.img_gold_parse):
if(Emailer.file_exists(Emailer.make_path(test_config.img_gold_parse, test_data.image_name))):
for fs in os.listdir(Emailer.make_path(test_config.img_gold_parse,test_data.image_name)):
if (fs.endswith(".html")):
ListNewHTML.append(Emailer.make_path(test_config.img_gold_parse, test_data.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(test_data, "The reports did not have the same number of files. One of the reports may have been corrupted") printerror(test_data, "The reports did not have the same number of files. One of the reports may have been corrupted")
@ -929,7 +901,7 @@ class TestDiffer:
total = {"Gold": 0, "New": 0} total = {"Gold": 0, "New": 0}
for x in range(0, len(ListGoldHTML)): for x in range(0, len(ListGoldHTML)):
count = TestDiffer._compare_report_files(ListGoldHTML[x], ListNewHTML[x]) count = TestResultsDiffer._compare_report_files(ListGoldHTML[x], ListNewHTML[x])
total["Gold"]+=count[0] total["Gold"]+=count[0]
total["New"]+=count[1] total["New"]+=count[1]
okay = "The test report matches the gold report." okay = "The test report matches the gold report."
@ -958,8 +930,8 @@ class TestDiffer:
a = a[a.find("<ul>"):] a = a[a.find("<ul>"):]
b = b[b.find("<ul>"):] b = b[b.find("<ul>"):]
a_list = TestDiffer._split(a, 50) a_list = TestResultsDiffer._split(a, 50)
b_list = TestDiffer._split(b, 50) b_list = TestResultsDiffer._split(b, 50)
if not len(a_list) == len(b_list): if not len(a_list) == len(b_list):
ex = (len(a_list), len(b_list)) ex = (len(a_list), len(b_list))
return ex return ex
@ -994,6 +966,7 @@ class TestData:
# Error tracking # Error tracking
self.printerror = [] self.printerror = []
self.printout = [] self.printout = []
def reset(self): def reset(self):
self.image = "" self.image = ""
self.image_file = "" self.image_file = ""
@ -1710,6 +1683,11 @@ class TestRunner:
logres =[] logres =[]
for test_data in test_data_list: for test_data in test_data_list:
TestRunner._run_autopsy_ingest(test_data)
if test_config.args.rebuild:
TestRunner.rebuild(test_data)
else:
logres.append(TestRunner._run_test(test_data)) logres.append(TestRunner._run_test(test_data))
Reports.write_html_foot() Reports.write_html_foot()
@ -1761,11 +1739,11 @@ class TestRunner:
test_data_list.append(test_data) test_data_list.append(test_data)
return test_data_list return test_data_list
#TODO: figure out return type of _run_test (logres) # TestData -> void
# TestData -> ??? def _run_autopsy_ingest(test_data):
def _run_test(test_data):
""" """
Run Autopsy ingest for the image in test_data and run necessary comparisons Run Autopsy ingest for the image in the given test data and
generate the necessary logs for rebuilding or diff.
""" """
global parsed global parsed
global imgfail global imgfail
@ -1782,30 +1760,34 @@ class TestRunner:
TestRunner._run_ant(test_data) TestRunner._run_ant(test_data)
time.sleep(2) # Give everything a second to process time.sleep(2) # Give everything a second to process
# Autopsy has finished running, we will now process the results
# Dump the database before we diff or use it for rebuild # Dump the database before we diff or use it for rebuild
DatabaseDiff.dump_output_db(test_data) TskDbDiff.dump_output_db(test_data)
# merges logs into a single log for later diff / rebuild # merges logs into a single log for later diff / rebuild
copy_logs(test_data) copy_logs(test_data)
Logs.generate_log_data(test_data) Logs.generate_log_data(test_data)
# Look for core exceptions
# @@@ Should be moved to TestDiffer, but it didn't know about logres -- need to look into that
logres = Logs.search_common_log("TskCoreException", test_data)
TestRunner._handle_solr(test_data) TestRunner._handle_solr(test_data)
TestRunner._handle_exception(test_data) TestRunner._handle_exception(test_data)
#TODO: figure out return type of _run_test (logres)
# TestData -> ???
def _run_test(test_data):
"""
Run Autopsy ingest for the image in test_data and run necessary comparisons
"""
# Look for core exceptions
# @@@ Should be moved to TestResultsDiffer, but it didn't know about logres -- need to look into that
logres = Logs.search_common_log("TskCoreException", test_data)
# @@@ We only need to create this here so that it can be passed into the # @@@ We only need to create this here so that it can be passed into the
# Report because it stores results. Results should be stored somewhere else # Report because it stores results. Results should be stored somewhere else
# and then this can get pushed into only the diffing code. # and then this can get pushed into only the diffing code.
databaseDiff = DatabaseDiff(test_data) databaseDiff = TskDbDiff(test_data)
# Now either diff or rebuild # Now either diff or rebuild
if not test_config.args.rebuild: if not test_config.args.rebuild:
TestDiffer.run_diff(test_data, databaseDiff) TestResultsDiffer.run_diff(test_data, databaseDiff)
# If running in rebuild mode (-r) # If running in rebuild mode (-r)
else: else:
TestRunner.rebuild(test_data) TestRunner.rebuild(test_data)
@ -1817,7 +1799,6 @@ class TestRunner:
clear_dir(Emailer.make_path(test_config.output_dir, test_data.image_name, test_config.Img_Test_Folder, "ModuleOutput", "keywordsearch")) clear_dir(Emailer.make_path(test_config.output_dir, test_data.image_name, test_config.Img_Test_Folder, "ModuleOutput", "keywordsearch"))
if(failedbool): if(failedbool):
attachl.append(test_data.common_log_path) attachl.append(test_data.common_log_path)
test_config.reset()
return logres return logres
# TestData -> void # TestData -> void
@ -1847,20 +1828,17 @@ class TestRunner:
def rebuild(test_data): def rebuild(test_data):
# Errors to print # Errors to print
errors = [] errors = []
if(test_config.gold_parse == "" ):
test_config.gold_parse = test_config.gold
test_config.img_gold_parse = test_config.img_gold
# Delete the current gold standards # Delete the current gold standards
gold_dir = test_config.img_gold_parse gold_dir = test_config.img_gold
clear_dir(test_config.img_gold_parse) clear_dir(test_config.img_gold)
tmpdir = Emailer.make_path(gold_dir, test_data.image_name) tmpdir = Emailer.make_path(gold_dir, test_data.image_name)
dbinpth = Emailer.make_path(test_config.output_dir, test_data.image_name, test_config.Img_Test_Folder, test_case.test_db_file) dbinpth = Emailer.make_path(test_config.output_dir, test_data.image_name, test_config.Img_Test_Folder, test_case.test_db_file)
dboutpth = Emailer.make_path(tmpdir, test_config.test_db_file) dboutpth = Emailer.make_path(tmpdir, test_config.test_db_file)
dataoutpth = Emailer.make_path(tmpdir, test_data.image_name + "SortedData.txt") dataoutpth = Emailer.make_path(tmpdir, test_data.image_name + "SortedData.txt")
dbdumpinpth = test_data.test_dbdump dbdumpinpth = test_data.test_dbdump
dbdumpoutpth = Emailer.make_path(tmpdir, test_data.image_name + "DBDump.txt") dbdumpoutpth = Emailer.make_path(tmpdir, test_data.image_name + "DBDump.txt")
if not os.path.exists(test_config.img_gold_parse): if not os.path.exists(test_config.img_gold):
os.makedirs(test_config.img_gold_parse) os.makedirs(test_config.img_gold)
if not os.path.exists(gold_dir): if not os.path.exists(gold_dir):
os.makedirs(gold_dir) os.makedirs(gold_dir)
if not os.path.exists(tmpdir): if not os.path.exists(tmpdir):
@ -1907,7 +1885,7 @@ class TestRunner:
TestRunner.zipdir(img_gold, comprssr) TestRunner.zipdir(img_gold, comprssr)
comprssr.close() comprssr.close()
os.chdir(oldcwd) os.chdir(oldcwd)
del_dir(test_config.img_gold_parse) del_dir(test_config.img_gold)
okay = "Sucessfully rebuilt all gold standards." okay = "Sucessfully rebuilt all gold standards."
print_report(test_data, errors, "REBUILDING", okay) print_report(test_data, errors, "REBUILDING", okay)