1import os 2import sys 3 4OldPy = sys.version_info[0] == 2 and sys.version_info[1] < 7 5 6class TestingConfig: 7 """" 8 TestingConfig - Information on the tests inside a suite. 9 """ 10 11 @staticmethod 12 def fromdefaults(litConfig): 13 """ 14 fromdefaults(litConfig) -> TestingConfig 15 16 Create a TestingConfig object with default values. 17 """ 18 # Set the environment based on the command line arguments. 19 environment = { 20 'LIBRARY_PATH' : os.environ.get('LIBRARY_PATH',''), 21 'LD_LIBRARY_PATH' : os.environ.get('LD_LIBRARY_PATH',''), 22 'PATH' : os.pathsep.join(litConfig.path + 23 [os.environ.get('PATH','')]), 24 'SYSTEMROOT' : os.environ.get('SYSTEMROOT',''), 25 'TERM' : os.environ.get('TERM',''), 26 'LLVM_DISABLE_CRASH_REPORT' : '1', 27 } 28 29 if sys.platform == 'win32': 30 environment.update({ 31 'INCLUDE' : os.environ.get('INCLUDE',''), 32 'PATHEXT' : os.environ.get('PATHEXT',''), 33 'PYTHONUNBUFFERED' : '1', 34 'TEMP' : os.environ.get('TEMP',''), 35 'TMP' : os.environ.get('TMP',''), 36 }) 37 38 # The option to preserve TEMP, TMP, and TMPDIR. 39 # This is intended to check how many temporary files would be generated 40 # (and be not cleaned up) in automated builders. 41 if 'LIT_PRESERVES_TMP' in os.environ: 42 environment.update({ 43 'TEMP' : os.environ.get('TEMP',''), 44 'TMP' : os.environ.get('TMP',''), 45 'TMPDIR' : os.environ.get('TMPDIR',''), 46 }) 47 48 # Set the default available features based on the LitConfig. 49 available_features = [] 50 if litConfig.useValgrind: 51 available_features.append('valgrind') 52 if litConfig.valgrindLeakCheck: 53 available_features.append('vg_leak') 54 55 return TestingConfig(None, 56 name = '<unnamed>', 57 suffixes = set(), 58 test_format = None, 59 environment = environment, 60 substitutions = [], 61 unsupported = False, 62 test_exec_root = None, 63 test_source_root = None, 64 excludes = [], 65 available_features = available_features, 66 pipefail = True) 67 68 def load_from_path(self, path, litConfig): 69 """ 70 load_from_path(path, litConfig) 71 72 Load the configuration module at the provided path into the given config 73 object. 74 """ 75 76 # Load the config script data. 77 data = None 78 if not OldPy: 79 f = open(path) 80 try: 81 data = f.read() 82 except: 83 litConfig.fatal('unable to load config file: %r' % (path,)) 84 f.close() 85 86 # Execute the config script to initialize the object. 87 cfg_globals = dict(globals()) 88 cfg_globals['config'] = self 89 cfg_globals['lit_config'] = litConfig 90 cfg_globals['__file__'] = path 91 try: 92 if OldPy: 93 execfile(path, cfg_globals) 94 else: 95 exec(compile(data, path, 'exec'), cfg_globals, None) 96 if litConfig.debug: 97 litConfig.note('... loaded config %r' % path) 98 except SystemExit: 99 e = sys.exc_info()[1] 100 # We allow normal system exit inside a config file to just 101 # return control without error. 102 if e.args: 103 raise 104 except: 105 import traceback 106 litConfig.fatal( 107 'unable to parse config file %r, traceback: %s' % ( 108 path, traceback.format_exc())) 109 110 self.finish(litConfig) 111 112 def __init__(self, parent, name, suffixes, test_format, 113 environment, substitutions, unsupported, 114 test_exec_root, test_source_root, excludes, 115 available_features, pipefail): 116 self.parent = parent 117 self.name = str(name) 118 self.suffixes = set(suffixes) 119 self.test_format = test_format 120 self.environment = dict(environment) 121 self.substitutions = list(substitutions) 122 self.unsupported = unsupported 123 self.test_exec_root = test_exec_root 124 self.test_source_root = test_source_root 125 self.excludes = set(excludes) 126 self.available_features = set(available_features) 127 self.pipefail = pipefail 128 129 def finish(self, litConfig): 130 """finish() - Finish this config object, after loading is complete.""" 131 132 self.name = str(self.name) 133 self.suffixes = set(self.suffixes) 134 self.environment = dict(self.environment) 135 self.substitutions = list(self.substitutions) 136 if self.test_exec_root is not None: 137 # FIXME: This should really only be suite in test suite config 138 # files. Should we distinguish them? 139 self.test_exec_root = str(self.test_exec_root) 140 if self.test_source_root is not None: 141 # FIXME: This should really only be suite in test suite config 142 # files. Should we distinguish them? 143 self.test_source_root = str(self.test_source_root) 144 self.excludes = set(self.excludes) 145 146 @property 147 def root(self): 148 """root attribute - The root configuration for the test suite.""" 149 if self.parent is None: 150 return self 151 else: 152 return self.parent.root 153 154