Index: tools/heapcheck/heapcheck_test.py
|
===================================================================
|
--- tools/heapcheck/heapcheck_test.py (revision 38464)
|
+++ tools/heapcheck/heapcheck_test.py (working copy)
|
@@ -19,6 +19,7 @@
|
|
class HeapcheckWrapper(object):
|
TMP_FILE = 'heapcheck.log'
|
+ SANITY_TEST_SUPPRESSION = "Heapcheck sanity test"
|
|
def __init__(self, supp_files):
|
self._mode = 'strict'
|
@@ -58,21 +59,30 @@
|
# the purify_test.py script.)
|
return True
|
|
- def Analyze(self, log_lines):
|
+ def Analyze(self, log_lines, check_sanity=False):
|
"""Analyzes the app's output and applies suppressions to the reports.
|
|
Analyze() searches the logs for leak reports and tries to apply
|
suppressions to them. Unsuppressed reports and other log messages are
|
dumped as is.
|
|
+ If |check_sanity| is True, the list of suppressed reports is searched for a
|
+ report starting with SANITY_TEST_SUPPRESSION. If there isn't one, Analyze
|
+ returns 2 regardless of the unsuppressed reports.
|
+
|
Args:
|
- log_lines: An iterator over the app's log lines.
|
+ log_lines: An iterator over the app's log lines.
|
+ check_sanity: A flag that determines whether we should check the tool's
|
+ sanity.
|
Returns:
|
- 1, if unsuppressed reports remain in the output, 0 otherwise.
|
+ 2, if the sanity check fails,
|
+ 1, if unsuppressed reports remain in the output and the sanity check
|
+ passes,
|
+ 0, if all the errors are suppressed and the sanity check passes.
|
"""
|
leak_report = re.compile(
|
'Leak of ([0-9]*) bytes in ([0-9]*) objects allocated from:')
|
- stack_line = re.compile('\s*@\s*0x[0-9a-fA-F]*\s*(\S*)')
|
+ stack_line = re.compile('\s*@\s*[0-9a-fA-F]*\s*(\S*)')
|
return_code = 0
|
# leak signature: [number of bytes, number of objects]
|
cur_leak_signature = None
|
@@ -122,6 +132,7 @@
|
else:
|
print line
|
# Print the list of suppressions used.
|
+ is_sane = False
|
if used_suppressions:
|
print
|
print '-----------------------------------------------------'
|
@@ -129,6 +140,8 @@
|
print ' count bytes objects name'
|
histo = {}
|
for description in used_suppressions:
|
+ if description.startswith(HeapcheckWrapper.SANITY_TEST_SUPPRESSION):
|
+ is_sane = True
|
hits, bytes, objects = used_suppressions[description]
|
line = '%8d %8d %8d %s' % (hits, bytes, objects, description)
|
if hits in histo:
|
@@ -141,21 +154,24 @@
|
for line in histo[count]:
|
print line
|
print '-----------------------------------------------------'
|
+ if is_sane:
|
+ return return_code
|
+ else:
|
+ logging.error("Sanity check failed")
|
+ return 2
|
|
- return return_code
|
-
|
- def RunTestsAndAnalyze(self):
|
+ def RunTestsAndAnalyze(self, check_sanity):
|
self.Execute()
|
log_file = file(self.TMP_FILE, 'r')
|
- ret = self.Analyze(log_file)
|
+ ret = self.Analyze(log_file, check_sanity)
|
log_file.close()
|
return ret
|
|
- def Main(self, args):
|
+ def Main(self, args, check_sanity=False):
|
self._args = args
|
start = datetime.datetime.now()
|
retcode = -1
|
- retcode = self.RunTestsAndAnalyze()
|
+ retcode = self.RunTestsAndAnalyze(check_sanity)
|
end = datetime.datetime.now()
|
seconds = (end - start).seconds
|
hours = seconds / 3600
|
@@ -166,6 +182,8 @@
|
return retcode
|
|
|
-def RunTool(args, supp_files):
|
+def RunTool(args, supp_files, module):
|
tool = HeapcheckWrapper(supp_files)
|
- return tool.Main(args[1:])
|
+ MODULES_TO_SANITY_CHECK = ["base"]
|
+ check_sanity = module in MODULES_TO_SANITY_CHECK
|
+ return tool.Main(args[1:], check_sanity)
|
|