tb3/tests/helpers.py | 18 ++++---- tb3/tests/tb3/repostate.py | 1 tb3/tests/tb3/scheduler.py | 91 ++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 100 insertions(+), 10 deletions(-)
New commits: commit 33e930f6109cdfb9a678cd8d61d05a19bd453f77 Author: Bjoern Michaelsen <[email protected]> Date: Tue Aug 6 12:57:52 2013 +0200 refactor bisect runs a bit diff --git a/tb3/tests/tb3/scheduler.py b/tb3/tests/tb3/scheduler.py index 9e923a5..29d2553 100755 --- a/tb3/tests/tb3/scheduler.py +++ b/tb3/tests/tb3/scheduler.py @@ -132,51 +132,42 @@ class TestBisectRuns(TestScheduler): real_state = self.__get_fake_buildresult(commit) stored_state = self.repohistory.get_commit_state(commit).state return (real_state, stored_state) + def __get_commit_range(self, begin, end): + if begin == end: + return [] + commits = self.git('rev-list', '%s..%s' % (begin, end)).strip('\n').split('\n') + return [commit for commit in commits if len(commit) == 40] + + def __check_consisitency(self): - for commit in self.__get_all_commits(): - real_state = self.__get_fake_buildresult(commit) - stored_state = self.repohistory.get_commit_state(commit) - if real_state == 'GOOD': - if not stored_state.state in ['UNKNOWN', 'GOOD', 'ASSUMED_GOOD', 'POSSIBLY_BREAKING']: - print('%s is really %s, but stored as %s' % (commit, real_state, stored_state.state)) - else: - if not stored_state.state in ['UNKNOWN', 'BAD', 'POSSIBLY_BREAKING', 'BREAKING', 'ASSUMED_BAD']: - print('%s is really %s, but stored as %s' % (commit, real_state, stored_state.state)) (real_state, stored_state) = self.__get_states(self.preb1) self.assertIn(real_state, ['GOOD']) self.assertIn(stored_state, ['GOOD']) - if self.preb1 != self.state.get_last_good(): - commits = self.git('rev-list', '%s..%s^' % (self.preb1, self.state.get_last_good())).strip('\n').split('\n') - for commit in self.git('rev-list', '%s..%s^' % (self.preb1, self.state.get_last_good())).strip('\n').split('\n'): - if len(commit) == 40: - (real_state, stored_state) = self.__get_states(commit) - self.assertIn(real_state, ['GOOD']) - self.assertIn(stored_state, ['ASSUMED_GOOD', 'GOOD']) + for commit in self.__get_commit_range(self.preb1, self.state.get_last_good()): + (real_state, stored_state) = self.__get_states(commit) + self.assertIn(real_state, ['GOOD']) + self.assertIn(stored_state, ['ASSUMED_GOOD', 'GOOD']) (real_state, stored_state) = self.__get_states(self.state.get_last_good()) self.assertIn(real_state, ['GOOD']) self.assertIn(stored_state, ['GOOD']) - for commit in self.git('rev-list', '%s..%s^' % (self.state.get_last_good(), self.postb2)).strip('\n').split('\n'): - if len(commit) == 40: - (real_state, stored_state) = self.__get_states(commit) - self.assertIn(real_state, ['GOOD']) - self.assertIn(stored_state, ['POSSIBLY_BREAKING']) + for commit in self.__get_commit_range(self.state.get_last_good(), "%s^" % self.postb2): + (real_state, stored_state) = self.__get_states(commit) + self.assertIn(real_state, ['GOOD']) + self.assertIn(stored_state, ['POSSIBLY_BREAKING']) (real_state, stored_state) = self.__get_states(self.postb2) self.assertIn(real_state, ['BAD']) self.assertIn(stored_state, ['POSSIBLY_BREAKING', 'BAD', 'BREAKING']) - commits = self.git('rev-list', '%s..%s^' % (self.postb2, self.state.get_first_bad())).strip('\n').split('\n') - for commit in commits: - if len(commit) == 40: - (real_state, stored_state) = self.__get_states(commit) - self.assertIn(real_state, ['BAD']) - self.assertIn(stored_state, ['POSSIBLY_BREAKING']) + for commit in self.__get_commit_range(self.postb2, "%s^" % self.state.get_first_bad()): + (real_state, stored_state) = self.__get_states(commit) + self.assertIn(real_state, ['BAD']) + self.assertIn(stored_state, ['POSSIBLY_BREAKING']) (real_state, stored_state) = self.__get_states(self.state.get_first_bad()) self.assertIn(real_state, ['BAD']) self.assertIn(stored_state, ['BAD', 'BREAKING']) - if self.state.get_first_bad() != self.head: - for commit in self.git('rev-list', '%s..%s' % (self.state.get_first_bad(), self.head)).strip('\n').split('\n'): - (real_state, stored_state) = self.__get_states(commit) - self.assertIn(real_state, ['BAD']) - self.assertIn(stored_state, ['BAD', 'ASSUMED_BAD']) + for commit in self.__get_commit_range(self.state.get_first_bad(), self.head): + (real_state, stored_state) = self.__get_states(commit) + self.assertIn(real_state, ['BAD']) + self.assertIn(stored_state, ['BAD', 'ASSUMED_BAD']) (real_state, stored_state) = self.__get_states(self.head) self.assertIn(real_state, ['BAD']) self.assertIn(stored_state, ['BAD']) commit b5ef69c4299c2124e1e24b9ab953da4db63c9569 Author: Bjoern Michaelsen <[email protected]> Date: Tue Aug 6 12:52:48 2013 +0200 test bisect runs diff --git a/tb3/tests/helpers.py b/tb3/tests/helpers.py index a82d5d9..cd8053d 100755 --- a/tb3/tests/helpers.py +++ b/tb3/tests/helpers.py @@ -12,33 +12,33 @@ import os.path import sh import tempfile -def createTestRepo(): +def createTestRepo(commitmultiplier=1): testdir = tempfile.mkdtemp() git = sh.git.bake('--no-pager',_cwd=testdir) git.init() touch = sh.touch.bake(_cwd=testdir) - for commit in range(0,10): + for commit in range(0,10*commitmultiplier): touch('commit%d' % commit) git.add('commit%d' % commit) git.commit('.', '-m', 'commit %d' % commit) if commit == 0: git.tag('pre-branchoff-1') - elif commit == 3: + elif commit == 3*commitmultiplier: git.tag('pre-branchoff-2') - elif commit == 5: + elif commit== 5*commitmultiplier: git.tag('branchpoint') - elif commit == 7: + elif commit == 7*commitmultiplier: git.tag('post-branchoff-1') - elif commit == 9: + elif commit == 9*commitmultiplier: git.tag('post-branchoff-2') git.checkout('-b', 'branch', 'branchpoint') - for commit in range(5,10): + for commit in range(commitmultiplier,10*commitmultiplier): touch('branch%d' % commit) git.add('branch%d' % commit) git.commit('.', '-m', 'branch %d' % commit) - if commit == 7: + if commit == 7*commitmultiplier: git.tag('post-branchoff-on-branch-1') - elif commit == 9: + elif commit == 9*commitmultiplier: git.tag('post-branchoff-on-branch-2') return (testdir, git) # vim: set et sw=4 ts=4: diff --git a/tb3/tests/tb3/repostate.py b/tb3/tests/tb3/repostate.py index 8656697..e159245 100755 --- a/tb3/tests/tb3/repostate.py +++ b/tb3/tests/tb3/repostate.py @@ -154,6 +154,7 @@ class TestRepoUpdater(unittest.TestCase): self.updater.set_finished(self.head, 'testbuilder', 'BAD', 'foo') self.assertEqual(self.history.get_commit_state('%s^' % self.head).state, 'ASSUMED_BAD') + if __name__ == '__main__': unittest.main() # vim: set et sw=4 ts=4: diff --git a/tb3/tests/tb3/scheduler.py b/tb3/tests/tb3/scheduler.py index 64c075e..9e923a5 100755 --- a/tb3/tests/tb3/scheduler.py +++ b/tb3/tests/tb3/scheduler.py @@ -19,6 +19,9 @@ import tb3.scheduler import tb3.repostate class TestScheduler(unittest.TestCase): + def __init__(self, *args, **kwargs): + super(TestScheduler, self).__init__(*args, **kwargs) + self.testrepomultiplier = 1 def __resolve_ref(self, refname): return self.git('show-ref', refname).split(' ')[0] def _show_log(self, commit): @@ -41,7 +44,7 @@ class TestScheduler(unittest.TestCase): self.assertRegex(commit_msg, expected_message) return proposals[0] def setUp(self): - (self.testdir, self.git) = helpers.createTestRepo() + (self.testdir, self.git) = helpers.createTestRepo(self.testrepomultiplier) self.state = tb3.repostate.RepoState('linux', 'master', self.testdir) self.repohistory = tb3.repostate.RepoHistory('linux', self.testdir) self.updater = tb3.repostate.RepoStateUpdater('linux', 'master', self.testdir) @@ -109,6 +112,101 @@ class TestBisectScheduler(TestScheduler): self.updater.set_scheduled(best_proposal.commit, 'box', datetime.timedelta(hours=4)) best_proposal = self._get_best_proposal(self.scheduler, datetime.datetime.now(), 'commit [36]', 8, False) +class TestBisectRuns(TestScheduler): + def __init__(self, *args, **kwargs): + super(TestBisectRuns, self).__init__(*args, **kwargs) + self.testrepomultiplier = 10 + def __resolve_ref(self, refname): + return self.git('show-ref', refname).split(' ')[0] + def __is_pre_postb2(self, commit): + if commit == self.postb2: + return False + return self.git('merge-base', '--is-ancestor', commit, self.postb2, _ok_code=[0,1]).exit_code == 0 + def __get_fake_buildresult(self, commit): + if self.__is_pre_postb2(commit): + return 'GOOD' + return 'BAD' + def __get_all_commits(self): + return self.git('rev-list', '%s..%s' % (self.preb1, self.head)).strip('\n').split('\n') + def __get_states(self, commit): + real_state = self.__get_fake_buildresult(commit) + stored_state = self.repohistory.get_commit_state(commit).state + return (real_state, stored_state) + def __check_consisitency(self): + for commit in self.__get_all_commits(): + real_state = self.__get_fake_buildresult(commit) + stored_state = self.repohistory.get_commit_state(commit) + if real_state == 'GOOD': + if not stored_state.state in ['UNKNOWN', 'GOOD', 'ASSUMED_GOOD', 'POSSIBLY_BREAKING']: + print('%s is really %s, but stored as %s' % (commit, real_state, stored_state.state)) + else: + if not stored_state.state in ['UNKNOWN', 'BAD', 'POSSIBLY_BREAKING', 'BREAKING', 'ASSUMED_BAD']: + print('%s is really %s, but stored as %s' % (commit, real_state, stored_state.state)) + (real_state, stored_state) = self.__get_states(self.preb1) + self.assertIn(real_state, ['GOOD']) + self.assertIn(stored_state, ['GOOD']) + if self.preb1 != self.state.get_last_good(): + commits = self.git('rev-list', '%s..%s^' % (self.preb1, self.state.get_last_good())).strip('\n').split('\n') + for commit in self.git('rev-list', '%s..%s^' % (self.preb1, self.state.get_last_good())).strip('\n').split('\n'): + if len(commit) == 40: + (real_state, stored_state) = self.__get_states(commit) + self.assertIn(real_state, ['GOOD']) + self.assertIn(stored_state, ['ASSUMED_GOOD', 'GOOD']) + (real_state, stored_state) = self.__get_states(self.state.get_last_good()) + self.assertIn(real_state, ['GOOD']) + self.assertIn(stored_state, ['GOOD']) + for commit in self.git('rev-list', '%s..%s^' % (self.state.get_last_good(), self.postb2)).strip('\n').split('\n'): + if len(commit) == 40: + (real_state, stored_state) = self.__get_states(commit) + self.assertIn(real_state, ['GOOD']) + self.assertIn(stored_state, ['POSSIBLY_BREAKING']) + (real_state, stored_state) = self.__get_states(self.postb2) + self.assertIn(real_state, ['BAD']) + self.assertIn(stored_state, ['POSSIBLY_BREAKING', 'BAD', 'BREAKING']) + commits = self.git('rev-list', '%s..%s^' % (self.postb2, self.state.get_first_bad())).strip('\n').split('\n') + for commit in commits: + if len(commit) == 40: + (real_state, stored_state) = self.__get_states(commit) + self.assertIn(real_state, ['BAD']) + self.assertIn(stored_state, ['POSSIBLY_BREAKING']) + (real_state, stored_state) = self.__get_states(self.state.get_first_bad()) + self.assertIn(real_state, ['BAD']) + self.assertIn(stored_state, ['BAD', 'BREAKING']) + if self.state.get_first_bad() != self.head: + for commit in self.git('rev-list', '%s..%s' % (self.state.get_first_bad(), self.head)).strip('\n').split('\n'): + (real_state, stored_state) = self.__get_states(commit) + self.assertIn(real_state, ['BAD']) + self.assertIn(stored_state, ['BAD', 'ASSUMED_BAD']) + (real_state, stored_state) = self.__get_states(self.head) + self.assertIn(real_state, ['BAD']) + self.assertIn(stored_state, ['BAD']) + def test_bisect_regression(self): + self.updater.set_finished(self.preb1, 'testbuilder', self.__get_fake_buildresult(self.preb1), 'foo') + self.updater.set_finished(self.head, 'testbuilder', self.__get_fake_buildresult(self.head), 'foo') + self.state.set_last_good(self.preb1) + self.state.set_first_bad(self.head) + self.state.set_last_bad(self.head) + self.scheduler = tb3.scheduler.BisectScheduler('linux', 'master', self.testdir) + now = datetime.datetime.now() + duration = datetime.timedelta(hours=1) + all_commits = self.scheduler.get_commits(self.preb1, self.head) + for step in range(100): + try: + proposals = self.scheduler.get_proposals(now) + first_commit = proposals[0].commit + self.updater.set_scheduled(first_commit, 'box', duration) + proposals = self.scheduler.get_proposals(now) + second_commit = proposals[0].commit + self.updater.set_scheduled(second_commit, 'box', duration) + self.updater.set_finished(first_commit, 'testbuilder', self.__get_fake_buildresult(first_commit), 'foo') + self.updater.set_finished(second_commit, 'testbuilder', self.__get_fake_buildresult(second_commit), 'foo') + self.__check_consisitency() + except IndexError: + pass + (real_state, stored_state) = self.__get_states(self.postb2) + self.assertIn(real_state, ['BAD']) + self.assertIn(stored_state, ['BREAKING']) + class TestMergeScheduler(TestScheduler): def test_get_proposal(self): self.state.set_last_good(self.preb1) _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
