# Copyright (C) 2014 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from __future__ import print_function import collections import sys class Logger(object): class Level(object): NoOutput, Error, Info = range(3) class Color(object): Default, Blue, Gray, Purple, Red, Green = range(6) @staticmethod def terminalCode(color, out=sys.stdout): if not out.isatty(): return '' elif color == Logger.Color.Blue: return '\033[94m' elif color == Logger.Color.Gray: return '\033[37m' elif color == Logger.Color.Purple: return '\033[95m' elif color == Logger.Color.Red: return '\033[91m' elif color == Logger.Color.Green: return '\033[32m' else: return '\033[0m' Verbosity = Level.Info @staticmethod def log(text, level=Level.Info, color=Color.Default, newLine=True, out=sys.stdout): if level <= Logger.Verbosity: text = Logger.Color.terminalCode(color, out) + text + \ Logger.Color.terminalCode(Logger.Color.Default, out) if newLine: print(text, file=out) else: print(text, end="", file=out) out.flush() @staticmethod def fail(msg, file=None, line=-1, lineText=None, variables=None): Logger.log("error: ", Logger.Level.Error, color=Logger.Color.Red, newLine=False, out=sys.stderr) Logger.log(msg, Logger.Level.Error, out=sys.stderr) if lineText: loc = "" if file: loc += file + ":" if line > 0: loc += str(line) + ":" if loc: loc += " " Logger.log(loc, Logger.Level.Error, color=Logger.Color.Gray, newLine=False, out=sys.stderr) Logger.log(lineText, Logger.Level.Error, out=sys.stderr) if variables: longestName = 0 for var in variables: longestName = max(longestName, len(var)) for var in collections.OrderedDict(sorted(variables.items())): padding = ' ' * (longestName - len(var)) Logger.log(var, Logger.Level.Error, color=Logger.Color.Green, newLine=False, out=sys.stderr) Logger.log(padding, Logger.Level.Error, newLine=False, out=sys.stderr) Logger.log(" = ", Logger.Level.Error, newLine=False, out=sys.stderr) Logger.log(variables[var], Logger.Level.Error, out=sys.stderr) sys.exit(1) @staticmethod def startTest(name): Logger.log("TEST ", color=Logger.Color.Purple, newLine=False) Logger.log(name + "... ", newLine=False) @staticmethod def testPassed(): Logger.log("PASS", color=Logger.Color.Blue) @staticmethod def testFailed(msg, assertion, variables): Logger.log("FAIL", color=Logger.Color.Red) Logger.fail(msg, assertion.fileName, assertion.lineNo, assertion.originalText, variables)