1 # 2 # Copyright (C) 2016 The Android Open Source Project 3 # 4 # Licensed under the Apache License, Version 2.0 (the "License"); 5 # you may not use this file except in compliance with the License. 6 # You may obtain a copy of the License at 7 # 8 # http://www.apache.org/licenses/LICENSE-2.0 9 # 10 # Unless required by applicable law or agreed to in writing, software 11 # distributed under the License is distributed on an "AS IS" BASIS, 12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 # See the License for the specific language governing permissions and 14 # limitations under the License. 15 # 16 """This module is where all the test signal classes and related utilities live. 17 """ 18 19 import functools 20 import json 21 22 23 def GeneratedTest(func): 24 """A decorator used to suppress result reporting for the test case that 25 kicks off a group of generated test cases. 26 27 Returns: 28 What the decorated function returns. 29 """ 30 31 @functools.wraps(func) 32 def wrapper(*args, **kwargs): 33 func(*args, **kwargs) 34 raise TestSilent("Result reporting for %s is suppressed" % 35 func.__name__) 36 37 return wrapper 38 39 40 class TestSignalError(Exception): 41 """Raised when an error occurs inside a test signal.""" 42 43 44 class TestSignal(Exception): 45 """Base class for all test result control signals.""" 46 47 def __init__(self, details, extras=None): 48 if not isinstance(details, str): 49 raise TestSignalError("Message has to be a string.") 50 super(TestSignal, self).__init__(details) 51 self.details = details 52 try: 53 json.dumps(extras) 54 self.extras = extras 55 except TypeError: 56 raise TestSignalError(("Extras must be json serializable. %s " 57 "is not.") % extras) 58 59 def __str__(self): 60 return "Details=%s, Extras=%s" % (self.details, self.extras) 61 62 63 class TestFailure(TestSignal): 64 """Raised when a test has failed.""" 65 66 67 class TestPass(TestSignal): 68 """Raised when a test has passed.""" 69 70 71 class TestSkip(TestSignal): 72 """Raised when a test has been skipped.""" 73 74 75 class TestSilent(TestSignal): 76 """Raised when a test should not be reported. This should only be used for 77 generated test cases. 78 """ 79 80 81 class TestAbortClass(TestSignal): 82 """Raised when all subsequent test cases within the same test class should 83 be aborted. 84 """ 85 86 87 class TestAbortAll(TestSignal): 88 """Raised when all subsequent test cases should be aborted.""" 89 90 91 class ControllerError(Exception): 92 """Raised when an error occured in controller classes.""" 93