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