cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# -*- coding: utf-8 -*-
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# $Id$
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync"""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncTest Manager - VcsRevisions
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync"""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync__copyright__ = \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync"""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncCopyright (C) 2012-2014 Oracle Corporation
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncThis file is part of VirtualBox Open Source Edition (OSE), as
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncavailable from http://www.virtualbox.org. This file is free software;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncyou can redistribute it and/or modify it under the terms of the GNU
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGeneral Public License (GPL) as published by the Free Software
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncFoundation, in version 2 as it comes in the "COPYING" file of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncVirtualBox OSE distribution. VirtualBox OSE is distributed in the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsynchope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncThe contents of this file may alternatively be used under the terms
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncof the Common Development and Distribution License Version 1.0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync(CDDL) only, as it comes in the "COPYING.CDDL" file of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncVirtualBox OSE distribution, in which case the provisions of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncCDDL are applicable instead of those of the GPL.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncYou may elect to license modified versions of this file under the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncterms and conditions of either the GPL or the CDDL or both.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync"""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync__version__ = "$Revision$"
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# Standard python imports.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncimport unittest;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# Validation Kit imports.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfrom testmanager.core.base import ModelDataBase, ModelDataBaseTestCase, ModelLogicBase, TMExceptionBase;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncclass VcsRevisionData(ModelDataBase):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync A version control system (VCS) revision.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #kasIdAttr = ['sRepository',iRevision];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_sRepository = 'VcsRevision_sRepository';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_iRevision = 'VcsRevision_iRevision';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_tsCreated = 'VcsRevision_tsCreated';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_sAuthor = 'VcsRevision_sAuthor';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_sMessage = 'VcsRevision_sMessage';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync kasAllowNullAttributes = [ ];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def __init__(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ModelDataBase.__init__(self);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Initialize with defaults.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # See the database for explanations of each of these fields.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sRepository = None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.iRevision = None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.tsCreated = None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sAuthor = None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sMessage = None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def initFromDbRow(self, aoRow):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Re-initializes the object from a SELECT * FROM VcsRevisions row.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns self. Raises exception if aoRow is None.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if aoRow is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync raise TMExceptionBase('VcsRevision not found.');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sRepository = aoRow[0];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.iRevision = aoRow[1];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.tsCreated = aoRow[2];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sAuthor = aoRow[3];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sMessage = aoRow[4];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def initFromDbWithRepoAndRev(self, oDb, sRepository, iRevision):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Initialize from the database, given the tree and revision of a row.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oDb.execute('SELECT * FROM VcsRevisions WHERE sRepository = %s AND iRevision = %u', (sRepository, iRevision,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoRow = oDb.fetchOne()
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if aoRow is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync raise TMExceptionBase('sRepository = %s iRevision = %u not found' % (sRepository, iRevision, ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self.initFromDbRow(aoRow);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def initFromValues(self, sRepository, iRevision, tsCreated, sAuthor, sMessage):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Reinitializes form a set of values.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sRepository = sRepository;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.iRevision = iRevision;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.tsCreated = tsCreated;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sAuthor = sAuthor;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sMessage = sMessage;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncclass VcsRevisionLogic(ModelLogicBase): # pylint: disable=R0903
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync VCS revisions database logic.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Standard methods.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def fetchForListing(self, iStart, cMaxRows, tsNow):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Fetches VCS revisions for listing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns an array (list) of VcsRevisionData items, empty list if none.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Raises exception on error.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync _ = tsNow;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.execute('SELECT *\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'FROM VcsRevisions\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'ORDER BY tsCreated, sRepository, iRevision\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'LIMIT %s OFFSET %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync , (cMaxRows, iStart,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoRows = [];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for _ in range(self._oDb.getRowCount()):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoRows.append(VcsRevisionData().initFromDbRow(self._oDb.fetchOne()));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return aoRows;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def tryFetch(self, sRepository, iRevision):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Tries to fetch the specified tree revision record.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns VcsRevisionData instance if found, None if not found.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Raises exception on input and database errors.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.execute('SELECT * FROM VcsRevisions WHERE sRepository = %s AND iRevision = %s',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ( sRepository, iRevision, ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aaoRows = self._oDb.fetchAll();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if len(aaoRows) == 1:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return VcsRevisionData().initFromDbRow(aaoRows[0]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if len(aaoRows) != 0:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync raise TMExceptionBase('VcsRevisions has a primary key problem: %u duplicates' % (len(aaoRows),));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return None
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Other methods.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addVcsRevision(self, oData, fCommit = False):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Adds (or updates) a tree revision record.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Raises exception on input and database errors.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Check VcsRevisionData before do anything
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dDataErrors = oData.validateAndConvert(self._oDb);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if len(dDataErrors) > 0:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync raise TMExceptionBase('Invalid data passed to addCvsRevision(): %s' % (dDataErrors,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Does it already exist?
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oOldData = self.tryFetch(oData.sRepository, oData.iRevision);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if oOldData is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # New row.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.execute('INSERT INTO VcsRevisions (sRepository, iRevision, tsCreated, sAuthor, sMessage)\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'VALUES (%s, %s, %s, %s, %s)\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync , ( oData.sRepository,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.iRevision,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.tsCreated,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.sAuthor,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.sMessage,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync elif not oOldData.isEqual(oData):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Update old row.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.execute('UPDATE VcsRevisions\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' SET tsCreated = %s,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sAuthor = %s,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sMessage = %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'WHERE sRepository = %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' AND iRevision = %s'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync , ( oData.tsCreated,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.sAuthor,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.sMessage,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.sRepository,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.iRevision,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.maybeCommit(fCommit);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return oData;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def getLastRevision(self, sRepository):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Get the last known revision number for the given repository, returns 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if the repository is not known to us:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.execute('SELECT iRevision\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'FROM VcsRevisions\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'WHERE sRepository = %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'ORDER BY iRevision DESC\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'LIMIT 1\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync , ( sRepository, ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if self._oDb.getRowCount() == 0:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return 0;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._oDb.fetchOne()[0];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def fetchTimeline(self, sRepository, iRevision, cEntriesBack):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Fetches a VCS timeline portion for a repository.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns an array (list) of VcsRevisionData items, empty list if none.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Raises exception on error.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.execute('SELECT *\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'FROM VcsRevisions\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'WHERE sRepository = %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' AND iRevision > %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' AND iRevision <= %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'ORDER BY iRevision DESC\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'LIMIT %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync , ( sRepository, iRevision - cEntriesBack*2 + 1, iRevision, cEntriesBack));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoRows = [];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for _ in range(self._oDb.getRowCount()):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoRows.append(VcsRevisionData().initFromDbRow(self._oDb.fetchOne()));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return aoRows;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# Unit testing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# pylint: disable=C0111
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncclass VcsRevisionDataTestCase(ModelDataBaseTestCase):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def setUp(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.aoSamples = [VcsRevisionData(),];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncif __name__ == '__main__':
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync unittest.main();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # not reached.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync