Mercurial > bitten > bitten-test
changeset 143:236786389dfd
Added file-system backend for report storage.
author | cmlenz |
---|---|
date | Thu, 18 Aug 2005 11:24:32 +0000 |
parents | 5a27ec93100d |
children | 76dea27af878 |
files | bitten/store.py bitten/tests/store.py |
diffstat | 2 files changed, 98 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/bitten/store.py +++ b/bitten/store.py @@ -140,3 +140,63 @@ container.addIndex('', name, index, ctxt) return container return mgr.openContainer(self.path) + + +class FSBackend(Component): + implements(IReportStoreBackend) + + + class FileWrapper(xmlio.ParsedElement): + + _metadata = None + + def __init__(self, path): + self.path = path + from xml.dom import minidom + fd = file(path, 'r') + try: + dom = minidom.parse(fd) + finally: + fd.close() + xmlio.ParsedElement.__init__(self, dom.documentElement) + + def _get_metadata(self): + if self._metadata is None: + step_dir = os.path.dirname(self.path) + build_dir = os.path.dirname(step_dir) + self._metadata = { + 'build': os.path.basename(build_dir), + 'step': os.path.basename(step_dir) + } + return self._metadata + metadata = property(fget=lambda self: self._get_metadata()) + + + def __init__(self): + self.path = os.path.join(self.env.path, 'reports') + + def _get_path(self, build, step, type=None): + if type: + return os.path.join(self.path, build.id, step.name, type) + '.xml' + else: + return os.path.join(self.path, build.id, step.name) + + def store_report(self, build, step, xml): + if not os.path.exists(self.path): + os.mkdir(self.path) + dirname = os.path.join(self.path, str(build.id), step.name) + if not os.path.exists(dirname): + os.makedirs(dirname) + filename = os.path.join(dirname, xml.attr['type'] + '.xml') + fd = file(filename, 'w') + try: + xml.write(fd) + finally: + fd.close() + + def retrieve_reports(self, build, step, type=None): + dirname = os.path.join(self.path, str(build.id), step.name) + if os.path.exists(dirname): + for filename in os.listdir(dirname): + if type is None or filename == type + '.xml': + yield FSBackend.FileWrapper(os.path.join(dirname, filename))
--- a/bitten/tests/store.py +++ b/bitten/tests/store.py @@ -25,7 +25,7 @@ import unittest from trac.test import EnvironmentStub, Mock -from bitten.store import BDBXMLBackend +from bitten.store import BDBXMLBackend, FSBackend from bitten.util import xmlio @@ -63,13 +63,48 @@ self.assertEqual(1, len(reports)) +class FSBackendTestCase(unittest.TestCase): + + def setUp(self): + self.env = EnvironmentStub() + self.env.path = tempfile.mkdtemp('bitten-test') + + def tearDown(self): + shutil.rmtree(self.env.path) + + def test_store_report(self): + store = FSBackend(self.env) + build = Mock(id=42) + step = Mock(name='foo') + xml = xmlio.Element('report', type='test')[xmlio.Element('dummy')] + store.store_report(build, step, xml) + + xml = xmlio.Element('report', type='lint')[xmlio.Element('dummy')] + store.store_report(build, step, xml) + + reports = list(store.retrieve_reports(build, step)) + self.assertEqual(2, len(reports)) + self.assertEqual('42', reports[0].metadata['build']) + self.assertEqual('foo', reports[0].metadata['step']) + self.assertEqual('42', reports[1].metadata['build']) + self.assertEqual('foo', reports[1].metadata['step']) + + reports = list(store.retrieve_reports(build, step, 'test')) + self.assertEqual(1, len(reports)) + + reports = list(store.retrieve_reports(build, step, 'lint')) + self.assertEqual(1, len(reports)) + + def suite(): + suite = unittest.TestSuite() try: import dbxml - return unittest.makeSuite(BDBXMLBackendTestCase, 'test') + suite.addTest(unittest.makeSuite(BDBXMLBackendTestCase, 'test')) except ImportError: print>>sys.stderr, 'Skipping unit tests for BDB XML backend' - return unittest.TestSuite() + suite.addTest(unittest.makeSuite(FSBackendTestCase, 'test')) + return suite if __name__ == '__main__': unittest.main(defaultTest='suite')