1be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbarimport os 27a13cc625bbc0d23bfb2450e87a4be7d7f98be15NAKAMURA Takumiimport sys 3be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar 4be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbarclass TestingConfig: 5be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar """" 6be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar TestingConfig - Information on the tests inside a suite. 7be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar """ 8be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar 9be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar @staticmethod 10be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar def frompath(path, parent, litConfig, mustExist, config = None): 11be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar if config is None: 12be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar # Set the environment based on the command line arguments. 13be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar environment = { 147201c9f1f12a91bad33311be0e812ce3cd924799Duncan Sands 'LIBRARY_PATH' : os.environ.get('LIBRARY_PATH',''), 152d4e4af45e074b6d712ac6fc6ab3e63456e1e24eDuncan Sands 'LD_LIBRARY_PATH' : os.environ.get('LD_LIBRARY_PATH',''), 16be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar 'PATH' : os.pathsep.join(litConfig.path + 17be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar [os.environ.get('PATH','')]), 18be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar 'SYSTEMROOT' : os.environ.get('SYSTEMROOT',''), 1908713b37c367b9db29058092c46b41981a74ceffArgyrios Kyrtzidis 'LLVM_DISABLE_CRASH_REPORT' : '1', 20be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar } 21be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar 227a13cc625bbc0d23bfb2450e87a4be7d7f98be15NAKAMURA Takumi if sys.platform == 'win32': 237a13cc625bbc0d23bfb2450e87a4be7d7f98be15NAKAMURA Takumi environment.update({ 24f5677777ca9761399572b2cd800886b8aa35e921NAKAMURA Takumi 'INCLUDE' : os.environ.get('INCLUDE',''), 257a13cc625bbc0d23bfb2450e87a4be7d7f98be15NAKAMURA Takumi 'PATHEXT' : os.environ.get('PATHEXT',''), 267a13cc625bbc0d23bfb2450e87a4be7d7f98be15NAKAMURA Takumi 'PYTHONUNBUFFERED' : '1', 274749cc5a3d198ea31b14c552a35a80d09ec53fa4NAKAMURA Takumi 'TEMP' : os.environ.get('TEMP',''), 284749cc5a3d198ea31b14c552a35a80d09ec53fa4NAKAMURA Takumi 'TMP' : os.environ.get('TMP',''), 297a13cc625bbc0d23bfb2450e87a4be7d7f98be15NAKAMURA Takumi }) 307a13cc625bbc0d23bfb2450e87a4be7d7f98be15NAKAMURA Takumi 31be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar config = TestingConfig(parent, 32be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar name = '<unnamed>', 33be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar suffixes = set(), 34be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar test_format = None, 35be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar environment = environment, 36be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar substitutions = [], 37be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar unsupported = False, 38be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar on_clone = None, 39be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar test_exec_root = None, 40be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar test_source_root = None, 41b937549e517fcb03032bab3441d6ced37fc4db8dDaniel Dunbar excludes = [], 42b937549e517fcb03032bab3441d6ced37fc4db8dDaniel Dunbar available_features = []) 43be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar 44be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar if os.path.exists(path): 45be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar # FIXME: Improve detection and error reporting of errors in the 46be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar # config file. 47be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar f = open(path) 48be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar cfg_globals = dict(globals()) 49be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar cfg_globals['config'] = config 50be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar cfg_globals['lit'] = litConfig 51be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar cfg_globals['__file__'] = path 52be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar try: 53be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar exec f in cfg_globals 54d0b3da1ea266774f97c63b5ec163de964c5711bfAndrew Trick if litConfig.debug: 55d0b3da1ea266774f97c63b5ec163de964c5711bfAndrew Trick litConfig.note('... loaded config %r' % path) 56be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar except SystemExit,status: 57be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar # We allow normal system exit inside a config file to just 58be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar # return control without error. 59be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar if status.args: 60be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar raise 61be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar f.close() 62d0b3da1ea266774f97c63b5ec163de964c5711bfAndrew Trick else: 63d0b3da1ea266774f97c63b5ec163de964c5711bfAndrew Trick if mustExist: 64d0b3da1ea266774f97c63b5ec163de964c5711bfAndrew Trick litConfig.fatal('unable to load config from %r ' % path) 65d0b3da1ea266774f97c63b5ec163de964c5711bfAndrew Trick elif litConfig.debug: 66d0b3da1ea266774f97c63b5ec163de964c5711bfAndrew Trick litConfig.note('... config not found - %r' %path) 67be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar 68be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar config.finish(litConfig) 69be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar return config 70be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar 71be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar def __init__(self, parent, name, suffixes, test_format, 72be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar environment, substitutions, unsupported, on_clone, 73b937549e517fcb03032bab3441d6ced37fc4db8dDaniel Dunbar test_exec_root, test_source_root, excludes, 74b937549e517fcb03032bab3441d6ced37fc4db8dDaniel Dunbar available_features): 75be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar self.parent = parent 76be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar self.name = str(name) 77be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar self.suffixes = set(suffixes) 78be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar self.test_format = test_format 79be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar self.environment = dict(environment) 80be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar self.substitutions = list(substitutions) 81be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar self.unsupported = unsupported 82be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar self.on_clone = on_clone 83be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar self.test_exec_root = test_exec_root 84be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar self.test_source_root = test_source_root 85be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar self.excludes = set(excludes) 86b937549e517fcb03032bab3441d6ced37fc4db8dDaniel Dunbar self.available_features = set(available_features) 87be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar 88be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar def clone(self, path): 89be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar # FIXME: Chain implementations? 90be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar # 91be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar # FIXME: Allow extra parameters? 92be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar cfg = TestingConfig(self, self.name, self.suffixes, self.test_format, 93be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar self.environment, self.substitutions, 94be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar self.unsupported, self.on_clone, 95be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar self.test_exec_root, self.test_source_root, 96b937549e517fcb03032bab3441d6ced37fc4db8dDaniel Dunbar self.excludes, self.available_features) 97be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar if cfg.on_clone: 98be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar cfg.on_clone(self, cfg, path) 99be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar return cfg 100be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar 101be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar def finish(self, litConfig): 102be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar """finish() - Finish this config object, after loading is complete.""" 103be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar 104be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar self.name = str(self.name) 105be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar self.suffixes = set(self.suffixes) 106be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar self.environment = dict(self.environment) 107be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar self.substitutions = list(self.substitutions) 108be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar if self.test_exec_root is not None: 109be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar # FIXME: This should really only be suite in test suite config 110be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar # files. Should we distinguish them? 111be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar self.test_exec_root = str(self.test_exec_root) 112be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar if self.test_source_root is not None: 113be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar # FIXME: This should really only be suite in test suite config 114be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar # files. Should we distinguish them? 115be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar self.test_source_root = str(self.test_source_root) 116be7ada718139b8c840a38ba34c4af492b6a05f9fDaniel Dunbar self.excludes = set(self.excludes) 117cc85160672e3b2d5ec363cc4e151e5b944a60454Eli Bendersky 118cc85160672e3b2d5ec363cc4e151e5b944a60454Eli Bendersky @property 119cc85160672e3b2d5ec363cc4e151e5b944a60454Eli Bendersky def root(self): 120cc85160672e3b2d5ec363cc4e151e5b944a60454Eli Bendersky """root attribute - The root configuration for the test suite.""" 1210417d7dca09b0beb7f27045b0ab9e93096905c74Eli Bendersky if self.parent is None: 1220417d7dca09b0beb7f27045b0ab9e93096905c74Eli Bendersky return self 1230417d7dca09b0beb7f27045b0ab9e93096905c74Eli Bendersky else: 1240417d7dca09b0beb7f27045b0ab9e93096905c74Eli Bendersky return self.parent.root 125cc85160672e3b2d5ec363cc4e151e5b944a60454Eli Bendersky 126