1*90c8c64dSAndroid Build Coastguard Worker#!/usr/bin/env python2.7 -B 2*90c8c64dSAndroid Build Coastguard Worker 3*90c8c64dSAndroid Build Coastguard Workerimport logs 4*90c8c64dSAndroid Build Coastguard Workerimport ps 5*90c8c64dSAndroid Build Coastguard Worker 6*90c8c64dSAndroid Build Coastguard Workerimport datetime 7*90c8c64dSAndroid Build Coastguard Workerimport StringIO 8*90c8c64dSAndroid Build Coastguard Worker 9*90c8c64dSAndroid Build Coastguard Workerdef test_empty(): 10*90c8c64dSAndroid Build Coastguard Worker """Test parsing no tag and no text, not well formed.""" 11*90c8c64dSAndroid Build Coastguard Worker expected = [ logs.LogLine(None, "03-29 00:46:58.872", "1000", "1815", "1816", "I", "", 12*90c8c64dSAndroid Build Coastguard Worker "") ] 13*90c8c64dSAndroid Build Coastguard Worker text = """[ 03-29 00:46:58.872 1000: 1815: 1816 I/ ] 14*90c8c64dSAndroid Build Coastguard Worker 15*90c8c64dSAndroid Build Coastguard Worker""" 16*90c8c64dSAndroid Build Coastguard Worker check_parsing(expected, text) 17*90c8c64dSAndroid Build Coastguard Worker 18*90c8c64dSAndroid Build Coastguard Worker 19*90c8c64dSAndroid Build Coastguard Workerdef test_none(): 20*90c8c64dSAndroid Build Coastguard Worker """Test parsing no tag and no text.""" 21*90c8c64dSAndroid Build Coastguard Worker expected = [ logs.LogLine(None, "03-29 00:46:58.872", "1000", "1815", "1816", "I", "", 22*90c8c64dSAndroid Build Coastguard Worker "") ] 23*90c8c64dSAndroid Build Coastguard Worker text = """[ 03-29 00:46:58.872 1000: 1815: 1816 I/ ] 24*90c8c64dSAndroid Build Coastguard Worker""" 25*90c8c64dSAndroid Build Coastguard Worker check_parsing(expected, text) 26*90c8c64dSAndroid Build Coastguard Worker 27*90c8c64dSAndroid Build Coastguard Worker 28*90c8c64dSAndroid Build Coastguard Worker 29*90c8c64dSAndroid Build Coastguard Workerdef test_trailing_blank(): 30*90c8c64dSAndroid Build Coastguard Worker """Test parsing text containing an extra intended newline at the end.""" 31*90c8c64dSAndroid Build Coastguard Worker expected = [ logs.LogLine(None, "03-29 00:46:58.872", "1000", "1815", "1816", "I", "abcd", 32*90c8c64dSAndroid Build Coastguard Worker "Newline after\n") ] 33*90c8c64dSAndroid Build Coastguard Worker text = """[ 03-29 00:46:58.872 1000: 1815: 1816 I/abcd ] 34*90c8c64dSAndroid Build Coastguard WorkerNewline after 35*90c8c64dSAndroid Build Coastguard Worker 36*90c8c64dSAndroid Build Coastguard Worker 37*90c8c64dSAndroid Build Coastguard Worker""" 38*90c8c64dSAndroid Build Coastguard Worker check_parsing(expected, text) 39*90c8c64dSAndroid Build Coastguard Worker 40*90c8c64dSAndroid Build Coastguard Worker 41*90c8c64dSAndroid Build Coastguard Workerdef test_blank_between(): 42*90c8c64dSAndroid Build Coastguard Worker """Test parsing text containing a newline in the middle.""" 43*90c8c64dSAndroid Build Coastguard Worker expected = [ logs.LogLine(None, "03-29 00:46:58.872", "1000", "1815", "1816", "I", "abcd", 44*90c8c64dSAndroid Build Coastguard Worker "Message\n\nNewline between") ] 45*90c8c64dSAndroid Build Coastguard Worker text = """[ 03-29 00:46:58.872 1000: 1815: 1816 I/abcd ] 46*90c8c64dSAndroid Build Coastguard WorkerMessage 47*90c8c64dSAndroid Build Coastguard Worker 48*90c8c64dSAndroid Build Coastguard WorkerNewline between 49*90c8c64dSAndroid Build Coastguard Worker 50*90c8c64dSAndroid Build Coastguard Worker""" 51*90c8c64dSAndroid Build Coastguard Worker check_parsing(expected, text) 52*90c8c64dSAndroid Build Coastguard Worker 53*90c8c64dSAndroid Build Coastguard Worker 54*90c8c64dSAndroid Build Coastguard Workerdef test_preceeding_blank(): 55*90c8c64dSAndroid Build Coastguard Worker """Test parsing text containing a newline then text.""" 56*90c8c64dSAndroid Build Coastguard Worker expected = [ logs.LogLine(None, "03-29 00:46:58.872", "1000", "1815", "1816", "I", "abcd", 57*90c8c64dSAndroid Build Coastguard Worker "\nNewline before") ] 58*90c8c64dSAndroid Build Coastguard Worker text = """[ 03-29 00:46:58.872 1000: 1815: 1816 I/abcd ] 59*90c8c64dSAndroid Build Coastguard Worker 60*90c8c64dSAndroid Build Coastguard WorkerNewline before 61*90c8c64dSAndroid Build Coastguard Worker 62*90c8c64dSAndroid Build Coastguard Worker""" 63*90c8c64dSAndroid Build Coastguard Worker check_parsing(expected, text) 64*90c8c64dSAndroid Build Coastguard Worker 65*90c8c64dSAndroid Build Coastguard Worker 66*90c8c64dSAndroid Build Coastguard Workerdef test_one_blank(): 67*90c8c64dSAndroid Build Coastguard Worker """Test parsing text one blank line.""" 68*90c8c64dSAndroid Build Coastguard Worker expected = [ logs.LogLine(None, "03-29 00:46:58.872", "1000", "1815", "1816", "I", "abcd", 69*90c8c64dSAndroid Build Coastguard Worker "\n") ] 70*90c8c64dSAndroid Build Coastguard Worker text = """[ 03-29 00:46:58.872 1000: 1815: 1816 I/abcd ] 71*90c8c64dSAndroid Build Coastguard Worker 72*90c8c64dSAndroid Build Coastguard Worker 73*90c8c64dSAndroid Build Coastguard Worker""" 74*90c8c64dSAndroid Build Coastguard Worker check_parsing(expected, text) 75*90c8c64dSAndroid Build Coastguard Worker 76*90c8c64dSAndroid Build Coastguard Worker 77*90c8c64dSAndroid Build Coastguard Workerdef test_two_blanks(): 78*90c8c64dSAndroid Build Coastguard Worker """Test parsing text two blank lines.""" 79*90c8c64dSAndroid Build Coastguard Worker expected = [ logs.LogLine(None, "03-29 00:46:58.872", "1000", "1815", "1816", "I", "abcd", 80*90c8c64dSAndroid Build Coastguard Worker "\n\n") ] 81*90c8c64dSAndroid Build Coastguard Worker text = """[ 03-29 00:46:58.872 1000: 1815: 1816 I/abcd ] 82*90c8c64dSAndroid Build Coastguard Worker 83*90c8c64dSAndroid Build Coastguard Worker 84*90c8c64dSAndroid Build Coastguard Worker 85*90c8c64dSAndroid Build Coastguard Worker""" 86*90c8c64dSAndroid Build Coastguard Worker check_parsing(expected, text) 87*90c8c64dSAndroid Build Coastguard Worker 88*90c8c64dSAndroid Build Coastguard Worker 89*90c8c64dSAndroid Build Coastguard Workerdef test_two_lines_noblanks(): 90*90c8c64dSAndroid Build Coastguard Worker """Test parsing two lines of text with no blank lines.""" 91*90c8c64dSAndroid Build Coastguard Worker expected = [ logs.LogLine(None, "03-29 00:46:58.872", "1000", "1815", "1816", "I", "abcd", 92*90c8c64dSAndroid Build Coastguard Worker "One\nTwo") ] 93*90c8c64dSAndroid Build Coastguard Worker text = """[ 03-29 00:46:58.872 1000: 1815: 1816 I/abcd ] 94*90c8c64dSAndroid Build Coastguard WorkerOne 95*90c8c64dSAndroid Build Coastguard WorkerTwo 96*90c8c64dSAndroid Build Coastguard Worker 97*90c8c64dSAndroid Build Coastguard Worker""" 98*90c8c64dSAndroid Build Coastguard Worker check_parsing(expected, text) 99*90c8c64dSAndroid Build Coastguard Worker 100*90c8c64dSAndroid Build Coastguard Worker 101*90c8c64dSAndroid Build Coastguard Workerdef test_chatty(): 102*90c8c64dSAndroid Build Coastguard Worker """Test a log with chatty identical messages.""" 103*90c8c64dSAndroid Build Coastguard Worker 104*90c8c64dSAndroid Build Coastguard Worker expected = [ 105*90c8c64dSAndroid Build Coastguard Worker logs.LogLine("system", "03-29 00:46:58.857", "1000", "1815", "1816", "I", "Noisy", "Message"), 106*90c8c64dSAndroid Build Coastguard Worker logs.LogLine("system", "03-29 00:46:58.858", "1000", "1815", "1816", "I", "Noisy", "Message"), 107*90c8c64dSAndroid Build Coastguard Worker logs.LogLine("system", "03-29 00:46:58.858", "1000", "1815", "1816", "I", "Noisy", "Message"), 108*90c8c64dSAndroid Build Coastguard Worker logs.LogLine("system", "03-29 00:46:58.858", "1000", "1815", "1816", "I", "Noisy", "Message"), 109*90c8c64dSAndroid Build Coastguard Worker logs.LogLine("system", "03-29 00:46:58.859", "1000", "1815", "1816", "I", "Noisy", "Message"), 110*90c8c64dSAndroid Build Coastguard Worker ] 111*90c8c64dSAndroid Build Coastguard Worker text = """--------- beginning of system 112*90c8c64dSAndroid Build Coastguard Worker[ 03-29 00:46:58.857 1000: 1815: 1816 I/Noisy ] 113*90c8c64dSAndroid Build Coastguard WorkerMessage 114*90c8c64dSAndroid Build Coastguard Worker 115*90c8c64dSAndroid Build Coastguard Worker[ 03-29 00:46:58.858 1000: 1815: 1816 I/chatty ] 116*90c8c64dSAndroid Build Coastguard Workeruid=1000(system) Thread-6 identical 3 lines 117*90c8c64dSAndroid Build Coastguard Worker 118*90c8c64dSAndroid Build Coastguard Worker[ 03-29 00:46:58.859 1000: 1815: 1816 I/Noisy ] 119*90c8c64dSAndroid Build Coastguard WorkerMessage 120*90c8c64dSAndroid Build Coastguard Worker 121*90c8c64dSAndroid Build Coastguard Worker""" 122*90c8c64dSAndroid Build Coastguard Worker check_parsing(expected, text) 123*90c8c64dSAndroid Build Coastguard Worker 124*90c8c64dSAndroid Build Coastguard Worker 125*90c8c64dSAndroid Build Coastguard Worker 126*90c8c64dSAndroid Build Coastguard Workerdef test_normal(): 127*90c8c64dSAndroid Build Coastguard Worker """Test a realistic (albeit short) log.""" 128*90c8c64dSAndroid Build Coastguard Worker expected = [ 129*90c8c64dSAndroid Build Coastguard Worker logs.LogLine("system", "03-29 00:46:58.857", "1000", "1815", "1816", "I", "Package: ]Manager", 130*90c8c64dSAndroid Build Coastguard Worker "/system/app/KeyChain changed; collecting certs"), 131*90c8c64dSAndroid Build Coastguard Worker logs.LogLine("system", "03-29 00:46:58.872", "1000", "1815", "1816", "I", "PackageManager", 132*90c8c64dSAndroid Build Coastguard Worker "/system/app/HiddenMenu changed; collecting certs"), 133*90c8c64dSAndroid Build Coastguard Worker logs.LogLine("main", "03-29 00:46:58.872", "1000", "1815", "1816", "I", "PackageManager", 134*90c8c64dSAndroid Build Coastguard Worker "/system/app/HiddenMenu changed; collecting certs"), 135*90c8c64dSAndroid Build Coastguard Worker ] 136*90c8c64dSAndroid Build Coastguard Worker 137*90c8c64dSAndroid Build Coastguard Worker text = """--------- beginning of system 138*90c8c64dSAndroid Build Coastguard Worker[ 03-29 00:46:58.857 1000: 1815: 1816 I/Package: ]Manager ] 139*90c8c64dSAndroid Build Coastguard Worker/system/app/KeyChain changed; collecting certs 140*90c8c64dSAndroid Build Coastguard Worker 141*90c8c64dSAndroid Build Coastguard Worker[ 03-29 00:46:58.872 1000: 1815: 1816 I/PackageManager ] 142*90c8c64dSAndroid Build Coastguard Worker/system/app/HiddenMenu changed; collecting certs 143*90c8c64dSAndroid Build Coastguard Worker 144*90c8c64dSAndroid Build Coastguard Worker--------- switch to main 145*90c8c64dSAndroid Build Coastguard Worker[ 03-29 00:46:58.872 1000: 1815: 1816 I/PackageManager ] 146*90c8c64dSAndroid Build Coastguard Worker/system/app/HiddenMenu changed; collecting certs 147*90c8c64dSAndroid Build Coastguard Worker 148*90c8c64dSAndroid Build Coastguard Worker""" 149*90c8c64dSAndroid Build Coastguard Worker check_parsing(expected, text) 150*90c8c64dSAndroid Build Coastguard Worker 151*90c8c64dSAndroid Build Coastguard Worker 152*90c8c64dSAndroid Build Coastguard Worker 153*90c8c64dSAndroid Build Coastguard Workerdef check_parsing(expected, text): 154*90c8c64dSAndroid Build Coastguard Worker """Parse the text and see if it parsed as expected.""" 155*90c8c64dSAndroid Build Coastguard Worker processes = ps.ProcessSet() 156*90c8c64dSAndroid Build Coastguard Worker result = [x for x in logs.ParseLogcat(StringIO.StringIO(text), processes)] 157*90c8c64dSAndroid Build Coastguard Worker if result != expected: 158*90c8c64dSAndroid Build Coastguard Worker raise Exception("test failed.\nexpected:\n[%s]\nactual\n[%s]" % ( 159*90c8c64dSAndroid Build Coastguard Worker ", ".join([str(r) for r in expected]), 160*90c8c64dSAndroid Build Coastguard Worker ", ".join([str(r) for r in result]))) 161*90c8c64dSAndroid Build Coastguard Worker 162*90c8c64dSAndroid Build Coastguard Worker 163*90c8c64dSAndroid Build Coastguard Workerdef main(): 164*90c8c64dSAndroid Build Coastguard Worker test_empty() 165*90c8c64dSAndroid Build Coastguard Worker test_none() 166*90c8c64dSAndroid Build Coastguard Worker test_trailing_blank() 167*90c8c64dSAndroid Build Coastguard Worker test_blank_between() 168*90c8c64dSAndroid Build Coastguard Worker test_preceeding_blank() 169*90c8c64dSAndroid Build Coastguard Worker test_one_blank() 170*90c8c64dSAndroid Build Coastguard Worker test_two_blanks() 171*90c8c64dSAndroid Build Coastguard Worker test_chatty() 172*90c8c64dSAndroid Build Coastguard Worker test_normal() 173*90c8c64dSAndroid Build Coastguard Worker 174*90c8c64dSAndroid Build Coastguard Worker 175*90c8c64dSAndroid Build Coastguard Workerif __name__ == "__main__": 176*90c8c64dSAndroid Build Coastguard Worker main() 177*90c8c64dSAndroid Build Coastguard Worker 178*90c8c64dSAndroid Build Coastguard Worker 179*90c8c64dSAndroid Build Coastguard Worker# vim: set ts=2 sw=2 sts=2 tw=100 nocindent autoindent smartindent expandtab: 180