1import sys 2import os 3import unittest 4 5sys.path.insert(0, os.getcwd()) 6 7import pybootchartgui.parsing as parsing 8import pybootchartgui.process_tree as process_tree 9import pybootchartgui.main as main 10 11if sys.version_info >= (3, 0): 12 long = int 13 14class TestProcessTree(unittest.TestCase): 15 16 def setUp(self): 17 self.name = "Process tree unittest" 18 self.rootdir = os.path.join(os.path.dirname(sys.argv[0]), '../../examples/1/') 19 20 parser = main._mk_options_parser() 21 options, args = parser.parse_args(['--q', self.rootdir]) 22 writer = main._mk_writer(options) 23 trace = parsing.Trace(writer, args, options) 24 25 parsing.parse_file(writer, trace, self.mk_fname('proc_ps.log')) 26 trace.compile(writer) 27 self.processtree = process_tree.ProcessTree(writer, None, trace.ps_stats, \ 28 trace.ps_stats.sample_period, None, options.prune, None, None, False, for_testing = True) 29 30 def mk_fname(self,f): 31 return os.path.join(self.rootdir, f) 32 33 def flatten(self, process_tree): 34 flattened = [] 35 for p in process_tree: 36 flattened.append(p) 37 flattened.extend(self.flatten(p.child_list)) 38 return flattened 39 40 def checkAgainstJavaExtract(self, filename, process_tree): 41 test_data = open(filename) 42 for expected, actual in zip(test_data, self.flatten(process_tree)): 43 tokens = expected.split('\t') 44 self.assertEqual(int(tokens[0]), actual.pid // 1000) 45 self.assertEqual(tokens[1], actual.cmd) 46 self.assertEqual(long(tokens[2]), 10 * actual.start_time) 47 self.assert_(long(tokens[3]) - 10 * actual.duration < 5, "duration") 48 self.assertEqual(int(tokens[4]), len(actual.child_list)) 49 self.assertEqual(int(tokens[5]), len(actual.samples)) 50 test_data.close() 51 52 def testBuild(self): 53 process_tree = self.processtree.process_tree 54 self.checkAgainstJavaExtract(self.mk_fname('extract.processtree.1.log'), process_tree) 55 56 def testMergeLogger(self): 57 self.processtree.merge_logger(self.processtree.process_tree, 'bootchartd', None, False) 58 process_tree = self.processtree.process_tree 59 self.checkAgainstJavaExtract(self.mk_fname('extract.processtree.2.log'), process_tree) 60 61 def testPrune(self): 62 self.processtree.merge_logger(self.processtree.process_tree, 'bootchartd', None, False) 63 self.processtree.prune(self.processtree.process_tree, None) 64 process_tree = self.processtree.process_tree 65 self.checkAgainstJavaExtract(self.mk_fname('extract.processtree.3b.log'), process_tree) 66 67 def testMergeExploders(self): 68 self.processtree.merge_logger(self.processtree.process_tree, 'bootchartd', None, False) 69 self.processtree.prune(self.processtree.process_tree, None) 70 self.processtree.merge_exploders(self.processtree.process_tree, set(['hwup'])) 71 process_tree = self.processtree.process_tree 72 self.checkAgainstJavaExtract(self.mk_fname('extract.processtree.3c.log'), process_tree) 73 74 def testMergeSiblings(self): 75 self.processtree.merge_logger(self.processtree.process_tree, 'bootchartd', None, False) 76 self.processtree.prune(self.processtree.process_tree, None) 77 self.processtree.merge_exploders(self.processtree.process_tree, set(['hwup'])) 78 self.processtree.merge_siblings(self.processtree.process_tree) 79 process_tree = self.processtree.process_tree 80 self.checkAgainstJavaExtract(self.mk_fname('extract.processtree.3d.log'), process_tree) 81 82 def testMergeRuns(self): 83 self.processtree.merge_logger(self.processtree.process_tree, 'bootchartd', None, False) 84 self.processtree.prune(self.processtree.process_tree, None) 85 self.processtree.merge_exploders(self.processtree.process_tree, set(['hwup'])) 86 self.processtree.merge_siblings(self.processtree.process_tree) 87 self.processtree.merge_runs(self.processtree.process_tree) 88 process_tree = self.processtree.process_tree 89 self.checkAgainstJavaExtract(self.mk_fname('extract.processtree.3e.log'), process_tree) 90 91if __name__ == '__main__': 92 unittest.main() 93