# 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)
|