logtest.py (4260B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\lib\cherrypy\test\logtest.py 2 import sys 3 import time 4 import cherrypy 5 try: 6 import msvcrt 7 8 def getchar(): 9 return msvcrt.getch() 10 11 12 except ImportError: 13 import tty, termios 14 15 def getchar(): 16 fd = sys.stdin.fileno() 17 old_settings = termios.tcgetattr(fd) 18 try: 19 tty.setraw(sys.stdin.fileno()) 20 ch = sys.stdin.read(1) 21 finally: 22 termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) 23 24 return ch 25 26 27 class LogCase(object): 28 logfile = None 29 lastmarker = None 30 markerPrefix = 'test suite marker: ' 31 32 def _handleLogError(self, msg, data, marker, pattern): 33 print '' 34 print ' ERROR: %s' % msg 35 if not self.interactive: 36 raise self.failureException(msg) 37 p = ' Show: [L]og [M]arker [P]attern; [I]gnore, [R]aise, or sys.e[X]it >> ' 38 print p, 39 sys.stdout.flush() 40 while True: 41 i = getchar().upper() 42 if i not in 'MPLIRX': 43 continue 44 print i.upper() 45 if i == 'L': 46 for x, line in enumerate(data): 47 if (x + 1) % self.console_height == 0: 48 print '<-- More -->\r', 49 m = getchar().lower() 50 print ' \r', 51 if m == 'q': 52 break 53 print line.rstrip() 54 55 elif i == 'M': 56 print repr(marker or self.lastmarker) 57 elif i == 'P': 58 print repr(pattern) 59 else: 60 if i == 'I': 61 return 62 if i == 'R': 63 raise self.failureException(msg) 64 elif i == 'X': 65 self.exit() 66 print p, 67 68 def exit(self): 69 sys.exit() 70 71 def emptyLog(self): 72 open(self.logfile, 'wb').write('') 73 74 def markLog(self, key = None): 75 if key is None: 76 key = str(time.time()) 77 self.lastmarker = key 78 open(self.logfile, 'ab+').write('%s%s\n' % (self.markerPrefix, key)) 79 80 def _read_marked_region(self, marker = None): 81 logfile = self.logfile 82 marker = marker or self.lastmarker 83 if marker is None: 84 return open(logfile, 'rb').readlines() 85 data = [] 86 in_region = False 87 for line in open(logfile, 'rb'): 88 if in_region: 89 if line.startswith(self.markerPrefix) and marker not in line: 90 break 91 else: 92 data.append(line) 93 elif marker in line: 94 in_region = True 95 96 return data 97 98 def assertInLog(self, line, marker = None): 99 data = self._read_marked_region(marker) 100 for logline in data: 101 if line in logline: 102 return 103 104 msg = '%r not found in log' % line 105 self._handleLogError(msg, data, marker, line) 106 107 def assertNotInLog(self, line, marker = None): 108 data = self._read_marked_region(marker) 109 for logline in data: 110 if line in logline: 111 msg = '%r found in log' % line 112 self._handleLogError(msg, data, marker, line) 113 114 def assertLog(self, sliceargs, lines, marker = None): 115 data = self._read_marked_region(marker) 116 if isinstance(sliceargs, int): 117 if isinstance(lines, (tuple, list)): 118 lines = lines[0] 119 if lines not in data[sliceargs]: 120 msg = '%r not found on log line %r' % (lines, sliceargs) 121 self._handleLogError(msg, [data[sliceargs]], marker, lines) 122 else: 123 if isinstance(lines, tuple): 124 lines = list(lines) 125 elif isinstance(lines, basestring): 126 raise TypeError("The 'lines' arg must be a list when 'sliceargs' is a tuple.") 127 start, stop = sliceargs 128 for line, logline in zip(lines, data[start:stop]): 129 if line not in logline: 130 msg = '%r not found in log' % line 131 self._handleLogError(msg, data[start:stop], marker, line)