wrappers.py revision 12882:dd87d7f2f3e5
15443Sgblack@eecs.umich.edu# Copyright (c) 2017 Mark D. Hill and David A. Wood
25443Sgblack@eecs.umich.edu# All rights reserved.
35443Sgblack@eecs.umich.edu#
45443Sgblack@eecs.umich.edu# Redistribution and use in source and binary forms, with or without
55443Sgblack@eecs.umich.edu# modification, are permitted provided that the following conditions are
65443Sgblack@eecs.umich.edu# met: redistributions of source code must retain the above copyright
75443Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer;
85443Sgblack@eecs.umich.edu# redistributions in binary form must reproduce the above copyright
95443Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer in the
105443Sgblack@eecs.umich.edu# documentation and/or other materials provided with the distribution;
115443Sgblack@eecs.umich.edu# neither the name of the copyright holders nor the names of its
125443Sgblack@eecs.umich.edu# contributors may be used to endorse or promote products derived from
135443Sgblack@eecs.umich.edu# this software without specific prior written permission.
145443Sgblack@eecs.umich.edu#
155443Sgblack@eecs.umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
165443Sgblack@eecs.umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
175443Sgblack@eecs.umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
185443Sgblack@eecs.umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
195443Sgblack@eecs.umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
205443Sgblack@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
215443Sgblack@eecs.umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
225443Sgblack@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
235443Sgblack@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
245443Sgblack@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
255443Sgblack@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
265443Sgblack@eecs.umich.edu#
275443Sgblack@eecs.umich.edu# Authors: Sean Wilson
285443Sgblack@eecs.umich.edu
295443Sgblack@eecs.umich.edu'''
305443Sgblack@eecs.umich.eduModule contains wrappers for test items that have been
315443Sgblack@eecs.umich.eduloaded by the testlib :class:`testlib.loader.Loader`.
325443Sgblack@eecs.umich.edu'''
335443Sgblack@eecs.umich.eduimport itertools
345443Sgblack@eecs.umich.edu
355443Sgblack@eecs.umich.eduimport log
368229Snate@binkert.orgimport uid
375606Snate@binkert.orgfrom state import Status, Result
385606Snate@binkert.org
395443Sgblack@eecs.umich.educlass TestCaseMetadata():
406216Snate@binkert.org    def __init__(self, name, uid, path, result, status, suite_uid):
419356Snilay@cs.wisc.edu        self.name = name
428232Snate@binkert.org        self.uid = uid
439356Snilay@cs.wisc.edu        self.path = path
445443Sgblack@eecs.umich.edu        self.status = status
455443Sgblack@eecs.umich.edu        self.result = result
465443Sgblack@eecs.umich.edu        self.suite_uid = suite_uid
475606Snate@binkert.org
485443Sgblack@eecs.umich.edu
495635Sgblack@eecs.umich.educlass TestSuiteMetadata():
505443Sgblack@eecs.umich.edu    def __init__(self, name, uid, tags, path, status, result):
515443Sgblack@eecs.umich.edu        self.name = name
525443Sgblack@eecs.umich.edu        self.uid = uid
535443Sgblack@eecs.umich.edu        self.tags = tags
545443Sgblack@eecs.umich.edu        self.path = path
555443Sgblack@eecs.umich.edu        self.status = status
565443Sgblack@eecs.umich.edu        self.result = result
575443Sgblack@eecs.umich.edu
585443Sgblack@eecs.umich.edu
595443Sgblack@eecs.umich.educlass LibraryMetadata():
605443Sgblack@eecs.umich.edu    def __init__(self, name, result, status):
615443Sgblack@eecs.umich.edu        self.name = name
625443Sgblack@eecs.umich.edu        self.result = result
635443Sgblack@eecs.umich.edu        self.status = status
645443Sgblack@eecs.umich.edu
655443Sgblack@eecs.umich.edu
665443Sgblack@eecs.umich.educlass LoadedTestable(object):
675443Sgblack@eecs.umich.edu    '''
685443Sgblack@eecs.umich.edu    Base class for loaded test items.
695443Sgblack@eecs.umich.edu
705443Sgblack@eecs.umich.edu    :property:`result` and :property:`status` setters
715443Sgblack@eecs.umich.edu    notify testlib via the :func:`log_result` and :func:`log_status`
725443Sgblack@eecs.umich.edu    of the updated status.
735443Sgblack@eecs.umich.edu    '''
745443Sgblack@eecs.umich.edu    def __init__(self, obj):
755443Sgblack@eecs.umich.edu        self.obj = obj
765443Sgblack@eecs.umich.edu        self.metadata = self._generate_metadata()
775443Sgblack@eecs.umich.edu
785443Sgblack@eecs.umich.edu    @property
795443Sgblack@eecs.umich.edu    def status(self):
805443Sgblack@eecs.umich.edu        return self.metadata.status
815443Sgblack@eecs.umich.edu
825443Sgblack@eecs.umich.edu    @status.setter
835443Sgblack@eecs.umich.edu    def status(self, status):
845443Sgblack@eecs.umich.edu        self.log_status(status)
855443Sgblack@eecs.umich.edu        self.metadata.status = status
865443Sgblack@eecs.umich.edu
875443Sgblack@eecs.umich.edu    @property
885443Sgblack@eecs.umich.edu    def result(self):
895443Sgblack@eecs.umich.edu        return self.metadata.result
905443Sgblack@eecs.umich.edu
915443Sgblack@eecs.umich.edu    @result.setter
925443Sgblack@eecs.umich.edu    def result(self, result):
935443Sgblack@eecs.umich.edu        self.log_result(result)
945443Sgblack@eecs.umich.edu        self.metadata.result = result
955642Sgblack@eecs.umich.edu
965443Sgblack@eecs.umich.edu    @property
975443Sgblack@eecs.umich.edu    def uid(self):
985443Sgblack@eecs.umich.edu        return self.metadata.uid
995443Sgblack@eecs.umich.edu
1005443Sgblack@eecs.umich.edu    @property
1015444Sgblack@eecs.umich.edu    def name(self):
1025444Sgblack@eecs.umich.edu        return self.metadata.name
1036067Sgblack@eecs.umich.edu
1046067Sgblack@eecs.umich.edu    @property
10510642Scdirik@micron.com    def fixtures(self):
10610642Scdirik@micron.com        return self.obj.fixtures
1075443Sgblack@eecs.umich.edu
1085443Sgblack@eecs.umich.edu    @fixtures.setter
1095443Sgblack@eecs.umich.edu    def fixtures(self, fixtures):
1105443Sgblack@eecs.umich.edu        self.obj.fixtures = fixtures
1115443Sgblack@eecs.umich.edu
1125443Sgblack@eecs.umich.edu    @property
1135642Sgblack@eecs.umich.edu    def runner(self):
1145642Sgblack@eecs.umich.edu        return self.obj.runner
1155443Sgblack@eecs.umich.edu
1165443Sgblack@eecs.umich.edu    # TODO Change log to provide status_update, result_update for all types.
11710642Scdirik@micron.com    def log_status(self, status):
11810642Scdirik@micron.com        log.test_log.status_update(self, status)
11910642Scdirik@micron.com
1206067Sgblack@eecs.umich.edu    def log_result(self, result):
1216067Sgblack@eecs.umich.edu        log.test_log.result_update(self, result)
1225443Sgblack@eecs.umich.edu
1235443Sgblack@eecs.umich.edu    def __iter__(self):
1245443Sgblack@eecs.umich.edu        return iter(())
1255443Sgblack@eecs.umich.edu
1265443Sgblack@eecs.umich.edu
1275443Sgblack@eecs.umich.educlass LoadedTest(LoadedTestable):
1285443Sgblack@eecs.umich.edu    def __init__(self, test_obj, loaded_suite, path):
12910642Scdirik@micron.com        self.parent_suite = loaded_suite
13010642Scdirik@micron.com        self._path = path
13110642Scdirik@micron.com        LoadedTestable.__init__(self, test_obj)
1325443Sgblack@eecs.umich.edu
1335443Sgblack@eecs.umich.edu    def test(self, *args, **kwargs):
1345443Sgblack@eecs.umich.edu        self.obj.test(*args, **kwargs)
1355443Sgblack@eecs.umich.edu
1365443Sgblack@eecs.umich.edu    def _generate_metadata(self):
1375443Sgblack@eecs.umich.edu        return TestCaseMetadata( **{
1385443Sgblack@eecs.umich.edu            'name':self.obj.name,
1395443Sgblack@eecs.umich.edu            'path': self._path,
1405443Sgblack@eecs.umich.edu            'uid': uid.TestUID(self._path,
1415443Sgblack@eecs.umich.edu                               self.obj.name,
1425443Sgblack@eecs.umich.edu                               self.parent_suite.name),
1435443Sgblack@eecs.umich.edu            'status': Status.Unscheduled,
1445443Sgblack@eecs.umich.edu            'result': Result(Result.NotRun),
1455443Sgblack@eecs.umich.edu            'suite_uid': self.parent_suite.metadata.uid
1465443Sgblack@eecs.umich.edu        })
1475606Snate@binkert.org
1485606Snate@binkert.org
1495606Snate@binkert.orgclass LoadedSuite(LoadedTestable):
1505443Sgblack@eecs.umich.edu    def __init__(self, suite_obj, path):
1515642Sgblack@eecs.umich.edu        self._path = path
1525443Sgblack@eecs.umich.edu        LoadedTestable.__init__(self, suite_obj)
1535443Sgblack@eecs.umich.edu        self.tests = self._wrap_children(suite_obj)
1545443Sgblack@eecs.umich.edu
1555443Sgblack@eecs.umich.edu    def _wrap_children(self, suite_obj):
1566067Sgblack@eecs.umich.edu        return [LoadedTest(test, self, self.metadata.path)
1576067Sgblack@eecs.umich.edu                for test in suite_obj]
1586067Sgblack@eecs.umich.edu
1595443Sgblack@eecs.umich.edu    def _generate_metadata(self):
1605443Sgblack@eecs.umich.edu        return TestSuiteMetadata( **{
1615443Sgblack@eecs.umich.edu            'name': self.obj.name,
1625443Sgblack@eecs.umich.edu            'tags':self.obj.tags,
1635443Sgblack@eecs.umich.edu            'path': self._path,
1645443Sgblack@eecs.umich.edu            'uid': uid.SuiteUID(self._path, self.obj.name),
1655443Sgblack@eecs.umich.edu            'status': Status.Unscheduled,
1665443Sgblack@eecs.umich.edu            'result': Result(Result.NotRun)
1675443Sgblack@eecs.umich.edu        })
1685443Sgblack@eecs.umich.edu
1695443Sgblack@eecs.umich.edu    def __iter__(self):
1705443Sgblack@eecs.umich.edu        return iter(self.tests)
1715443Sgblack@eecs.umich.edu
1725443Sgblack@eecs.umich.edu    @property
1735443Sgblack@eecs.umich.edu    def tags(self):
1745443Sgblack@eecs.umich.edu        return self.metadata.tags
1755443Sgblack@eecs.umich.edu
1765443Sgblack@eecs.umich.edu
1775443Sgblack@eecs.umich.educlass LoadedLibrary(LoadedTestable):
1785443Sgblack@eecs.umich.edu    '''
1795443Sgblack@eecs.umich.edu    Wraps a collection of all loaded test suites and
1805443Sgblack@eecs.umich.edu    provides utility functions for accessing fixtures.
1815443Sgblack@eecs.umich.edu    '''
1825443Sgblack@eecs.umich.edu    def __init__(self, suites, global_fixtures):
1835443Sgblack@eecs.umich.edu        LoadedTestable.__init__(self, suites)
1845443Sgblack@eecs.umich.edu        self.global_fixtures = global_fixtures
1855443Sgblack@eecs.umich.edu
1865443Sgblack@eecs.umich.edu    def _generate_metadata(self):
1875443Sgblack@eecs.umich.edu        return LibraryMetadata( **{
1885443Sgblack@eecs.umich.edu            'name': 'Test Library',
1895443Sgblack@eecs.umich.edu            'status': Status.Unscheduled,
1905443Sgblack@eecs.umich.edu            'result': Result(Result.NotRun)
1915443Sgblack@eecs.umich.edu        })
19210642Scdirik@micron.com
19310642Scdirik@micron.com    def __iter__(self):
19410642Scdirik@micron.com        '''
1955443Sgblack@eecs.umich.edu        :returns: an iterator over contained :class:`TestSuite` objects.
1965443Sgblack@eecs.umich.edu        '''
1975635Sgblack@eecs.umich.edu        return iter(self.obj)
1985443Sgblack@eecs.umich.edu
1995443Sgblack@eecs.umich.edu    def all_fixture_tuples(self):
2005443Sgblack@eecs.umich.edu        return itertools.chain(
2015443Sgblack@eecs.umich.edu                self.global_fixtures,
2025443Sgblack@eecs.umich.edu                *(suite.fixtures for suite in self.obj))
2035443Sgblack@eecs.umich.edu
2045642Sgblack@eecs.umich.edu    def all_fixtures(self):
2055642Sgblack@eecs.umich.edu        '''
2065642Sgblack@eecs.umich.edu        :returns: an interator overall all global, suite,
2075642Sgblack@eecs.umich.edu          and test fixtures
2085642Sgblack@eecs.umich.edu        '''
2095642Sgblack@eecs.umich.edu        return itertools.chain(itertools.chain(
2105443Sgblack@eecs.umich.edu                self.global_fixtures,
2115635Sgblack@eecs.umich.edu                *(suite.fixtures for suite in self.obj)),
2125642Sgblack@eecs.umich.edu            *(self.test_fixtures(suite) for suite in self.obj)
2135642Sgblack@eecs.umich.edu        )
2145642Sgblack@eecs.umich.edu
2155642Sgblack@eecs.umich.edu    def test_fixtures(self, suite):
2165635Sgblack@eecs.umich.edu        '''
2175635Sgblack@eecs.umich.edu        :returns: an interator over all fixtures of each
2185443Sgblack@eecs.umich.edu          test contained in the given suite
2195606Snate@binkert.org        '''
2205443Sgblack@eecs.umich.edu        return itertools.chain(*(test.fixtures for test in suite))
2215443Sgblack@eecs.umich.edu
2225443Sgblack@eecs.umich.edu    @property
2235443Sgblack@eecs.umich.edu    def fixtures(self):
2245635Sgblack@eecs.umich.edu        return self.global_fixtures
2255635Sgblack@eecs.umich.edu
2265635Sgblack@eecs.umich.edu    @property
2275635Sgblack@eecs.umich.edu    def uid(self):
2285635Sgblack@eecs.umich.edu        return self.name
2295635Sgblack@eecs.umich.edu
2305635Sgblack@eecs.umich.edu    @property
2315635Sgblack@eecs.umich.edu    def suites(self):
2325635Sgblack@eecs.umich.edu        return self.obj
2335635Sgblack@eecs.umich.edu
2345635Sgblack@eecs.umich.edu    @suites.setter
2355635Sgblack@eecs.umich.edu    def suites(self, suites):
2365635Sgblack@eecs.umich.edu        self.obj = suites
2375635Sgblack@eecs.umich.edu