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