1*4882a593Smuzhiyunimport sys, os, re, struct, operator, math 2*4882a593Smuzhiyunfrom collections import defaultdict 3*4882a593Smuzhiyunimport unittest 4*4882a593Smuzhiyun 5*4882a593Smuzhiyunsys.path.insert(0, os.getcwd()) 6*4882a593Smuzhiyun 7*4882a593Smuzhiyunimport pybootchartgui.parsing as parsing 8*4882a593Smuzhiyunimport pybootchartgui.main as main 9*4882a593Smuzhiyun 10*4882a593Smuzhiyundebug = False 11*4882a593Smuzhiyun 12*4882a593Smuzhiyundef floatEq(f1, f2): 13*4882a593Smuzhiyun return math.fabs(f1-f2) < 0.00001 14*4882a593Smuzhiyun 15*4882a593Smuzhiyunbootchart_dir = os.path.join(os.path.dirname(sys.argv[0]), '../../examples/1/') 16*4882a593Smuzhiyunparser = main._mk_options_parser() 17*4882a593Smuzhiyunoptions, args = parser.parse_args(['--q', bootchart_dir]) 18*4882a593Smuzhiyunwriter = main._mk_writer(options) 19*4882a593Smuzhiyun 20*4882a593Smuzhiyunclass TestBCParser(unittest.TestCase): 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun def setUp(self): 23*4882a593Smuzhiyun self.name = "My first unittest" 24*4882a593Smuzhiyun self.rootdir = bootchart_dir 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun def mk_fname(self,f): 27*4882a593Smuzhiyun return os.path.join(self.rootdir, f) 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun def testParseHeader(self): 30*4882a593Smuzhiyun trace = parsing.Trace(writer, args, options) 31*4882a593Smuzhiyun state = parsing.parse_file(writer, trace, self.mk_fname('header')) 32*4882a593Smuzhiyun self.assertEqual(6, len(state.headers)) 33*4882a593Smuzhiyun self.assertEqual(2, parsing.get_num_cpus(state.headers)) 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun def test_parseTimedBlocks(self): 36*4882a593Smuzhiyun trace = parsing.Trace(writer, args, options) 37*4882a593Smuzhiyun state = parsing.parse_file(writer, trace, self.mk_fname('proc_diskstats.log')) 38*4882a593Smuzhiyun self.assertEqual(141, len(state.disk_stats)) 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun def testParseProcPsLog(self): 41*4882a593Smuzhiyun trace = parsing.Trace(writer, args, options) 42*4882a593Smuzhiyun state = parsing.parse_file(writer, trace, self.mk_fname('proc_ps.log')) 43*4882a593Smuzhiyun samples = state.ps_stats 44*4882a593Smuzhiyun processes = samples.process_map 45*4882a593Smuzhiyun sorted_processes = [processes[k] for k in sorted(processes.keys())] 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun ps_data = open(self.mk_fname('extract2.proc_ps.log')) 48*4882a593Smuzhiyun for index, line in enumerate(ps_data): 49*4882a593Smuzhiyun tokens = line.split(); 50*4882a593Smuzhiyun process = sorted_processes[index] 51*4882a593Smuzhiyun if debug: 52*4882a593Smuzhiyun print(tokens[0:4]) 53*4882a593Smuzhiyun print(process.pid / 1000, process.cmd, process.ppid, len(process.samples)) 54*4882a593Smuzhiyun print('-------------------') 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun self.assertEqual(tokens[0], str(process.pid // 1000)) 57*4882a593Smuzhiyun self.assertEqual(tokens[1], str(process.cmd)) 58*4882a593Smuzhiyun self.assertEqual(tokens[2], str(process.ppid // 1000)) 59*4882a593Smuzhiyun self.assertEqual(tokens[3], str(len(process.samples))) 60*4882a593Smuzhiyun ps_data.close() 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun def testparseProcDiskStatLog(self): 63*4882a593Smuzhiyun trace = parsing.Trace(writer, args, options) 64*4882a593Smuzhiyun state_with_headers = parsing.parse_file(writer, trace, self.mk_fname('header')) 65*4882a593Smuzhiyun state_with_headers.headers['system.cpu'] = 'xxx (2)' 66*4882a593Smuzhiyun samples = parsing.parse_file(writer, state_with_headers, self.mk_fname('proc_diskstats.log')).disk_stats 67*4882a593Smuzhiyun self.assertEqual(141, len(samples)) 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun diskstats_data = open(self.mk_fname('extract.proc_diskstats.log')) 70*4882a593Smuzhiyun for index, line in enumerate(diskstats_data): 71*4882a593Smuzhiyun tokens = line.split('\t') 72*4882a593Smuzhiyun sample = samples[index] 73*4882a593Smuzhiyun if debug: 74*4882a593Smuzhiyun print(line.rstrip()) 75*4882a593Smuzhiyun print(sample) 76*4882a593Smuzhiyun print('-------------------') 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun self.assertEqual(tokens[0], str(sample.time)) 79*4882a593Smuzhiyun self.assert_(floatEq(float(tokens[1]), sample.read)) 80*4882a593Smuzhiyun self.assert_(floatEq(float(tokens[2]), sample.write)) 81*4882a593Smuzhiyun self.assert_(floatEq(float(tokens[3]), sample.util)) 82*4882a593Smuzhiyun diskstats_data.close() 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun def testparseProcStatLog(self): 85*4882a593Smuzhiyun trace = parsing.Trace(writer, args, options) 86*4882a593Smuzhiyun samples = parsing.parse_file(writer, trace, self.mk_fname('proc_stat.log')).cpu_stats 87*4882a593Smuzhiyun self.assertEqual(141, len(samples)) 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun stat_data = open(self.mk_fname('extract.proc_stat.log')) 90*4882a593Smuzhiyun for index, line in enumerate(stat_data): 91*4882a593Smuzhiyun tokens = line.split('\t') 92*4882a593Smuzhiyun sample = samples[index] 93*4882a593Smuzhiyun if debug: 94*4882a593Smuzhiyun print(line.rstrip()) 95*4882a593Smuzhiyun print(sample) 96*4882a593Smuzhiyun print('-------------------') 97*4882a593Smuzhiyun self.assert_(floatEq(float(tokens[0]), sample.time)) 98*4882a593Smuzhiyun self.assert_(floatEq(float(tokens[1]), sample.user)) 99*4882a593Smuzhiyun self.assert_(floatEq(float(tokens[2]), sample.sys)) 100*4882a593Smuzhiyun self.assert_(floatEq(float(tokens[3]), sample.io)) 101*4882a593Smuzhiyun stat_data.close() 102*4882a593Smuzhiyun 103*4882a593Smuzhiyunif __name__ == '__main__': 104*4882a593Smuzhiyun unittest.main() 105*4882a593Smuzhiyun 106