| Index: infra/services/gnumbd/test/gnumbd_smoketests_main.py
|
| diff --git a/infra/services/gnumbd/test/gnumbd_smoketests_main.py b/infra/services/gnumbd/test/gnumbd_smoketests_main.py
|
| deleted file mode 100644
|
| index de284f5561af33b84829ab25515a0b43df349013..0000000000000000000000000000000000000000
|
| --- a/infra/services/gnumbd/test/gnumbd_smoketests_main.py
|
| +++ /dev/null
|
| @@ -1,213 +0,0 @@
|
| -# Copyright 2014 The Chromium Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -import collections
|
| -import json
|
| -import logging
|
| -import os
|
| -import sys
|
| -import tempfile
|
| -
|
| -from cStringIO import StringIO
|
| -
|
| -from infra.services.gnumbd import inner_loop as gnumbd
|
| -
|
| -from infra.services.gnumbd.support import config_ref, data, git
|
| -
|
| -from infra.services.gnumbd.test import gnumbd_smoketests
|
| -
|
| -# should already be on path
|
| -import expect_tests # pylint: disable=F0401
|
| -
|
| -BASE_PATH = os.path.dirname(os.path.abspath(__file__))
|
| -
|
| -
|
| -# TODO(iannucci): Make these first class data library objects
|
| -class GitEntry(object):
|
| - typ = None
|
| - mode = None
|
| -
|
| - def intern(self, repo):
|
| - raise NotImplementedError() # pragma: no cover
|
| -
|
| -
|
| -class GitFile(GitEntry):
|
| - typ = 'blob'
|
| -
|
| - def __init__(self, content, mode=0644):
|
| - super(GitFile, self).__init__()
|
| - self.content = content
|
| - assert mode in (0644, 0664, 0755)
|
| - self.mode = '0100%o' % mode
|
| -
|
| - def intern(self, repo):
|
| - return repo.intern(self.content)
|
| -
|
| -
|
| -class GitTree(GitEntry):
|
| - typ = 'tree'
|
| - mode = '0040000'
|
| -
|
| - def __init__(self, entries):
|
| - super(GitTree, self).__init__()
|
| - assert all(
|
| - isinstance(k, str) and isinstance(v, GitEntry)
|
| - for k, v in entries.iteritems()
|
| - )
|
| - self.entries = entries
|
| -
|
| - def intern(self, repo):
|
| - with tempfile.TemporaryFile() as tf:
|
| - for path, entry in self.entries.iteritems():
|
| - tf.write('%s %s %s\t%s' %
|
| - (entry.mode, entry.typ, entry.intern(repo), path))
|
| - tf.seek(0)
|
| - return repo.run('mktree', '-z', stdin=tf).strip()
|
| -
|
| -class TestRef(git.Ref):
|
| - def synthesize_commit(self, message, number=None, tree=None, svn=False,
|
| - footers=None):
|
| - footers = footers or collections.OrderedDict()
|
| - if number is not None:
|
| - if svn:
|
| - footers[gnumbd.GIT_SVN_ID] = [
|
| - 'svn://repo/path@%s 0039d316-1c4b-4281-b951-d872f2087c98' % number]
|
| - else:
|
| - footers[gnumbd.COMMIT_POSITION] = [
|
| - gnumbd.FMT_COMMIT_POSITION(self, number)]
|
| -
|
| - commit = self.repo.synthesize_commit(self.commit, message, footers=footers,
|
| - tree=tree)
|
| - self.update_to(commit)
|
| - return commit
|
| -
|
| -
|
| -class TestClock(object):
|
| - def __init__(self):
|
| - self._time = 1402589336
|
| -
|
| - def time(self):
|
| - self._time += 10
|
| - return self._time
|
| -
|
| -
|
| -class TestConfigRef(config_ref.ConfigRef):
|
| - def update(self, **values):
|
| - new_config = self.current
|
| - new_config.update(values)
|
| - self.ref.synthesize_commit(
|
| - 'update(%r)' % values.keys(),
|
| - tree=GitTree({'config.json': GitFile(json.dumps(new_config))}))
|
| -
|
| -
|
| -class TestRepo(git.Repo):
|
| - def __init__(self, short_name, tmpdir, clock, mirror_of=None):
|
| - super(TestRepo, self).__init__(mirror_of or 'local test repo')
|
| - self._short_name = short_name
|
| - self.repos_dir = tmpdir
|
| -
|
| - if mirror_of is None:
|
| - self._repo_path = tempfile.mkdtemp(dir=self.repos_dir, suffix='.git')
|
| - self.run('init', '--bare')
|
| -
|
| - self._clock = clock
|
| -
|
| - # pylint: disable=W0212
|
| - repo_path = property(lambda self: self._repo_path)
|
| -
|
| - def __getitem__(self, refstr):
|
| - return TestRef(self, refstr)
|
| -
|
| - def synthesize_commit(self, parent, message, tree=None, footers=None):
|
| - tree = tree or GitTree({'file': GitFile('contents')})
|
| - tree = tree.intern(self) if isinstance(tree, GitTree) else tree
|
| - assert isinstance(tree, str)
|
| -
|
| - parents = [parent.hsh] if parent is not git.INVALID else []
|
| -
|
| - timestamp = data.CommitTimestamp(self._clock.time(), '+', 8, 0)
|
| - user = data.CommitUser('Test User', 'test_user@example.com', timestamp)
|
| -
|
| - return self.get_commit(self.intern(data.CommitData(
|
| - tree, parents, user, user, (), message.splitlines(),
|
| - data.CommitData.merge_lines([], footers or {})
|
| - ), 'commit'))
|
| -
|
| - def snap(self, include_committer=False, include_config=False):
|
| - ret = {}
|
| - if include_committer:
|
| - fmt = '%H%x00committer %cn <%ce> %ci%n%n%B%x00%x00'
|
| - else:
|
| - fmt = '%H%x00%B%x00%x00'
|
| - for ref in (r.ref for r in self.refglob('*')):
|
| - if ref == gnumbd.DEFAULT_CONFIG_REF and not include_config:
|
| - continue
|
| - log = self.run('log', ref, '--format=%s' % fmt)
|
| - ret[ref] = collections.OrderedDict(
|
| - (commit, message.splitlines())
|
| - for commit, message in (
|
| - r.split('\0') for r in log.split('\0\0\n') if r)
|
| - )
|
| - return ret
|
| -
|
| - def __repr__(self):
|
| - return 'TestRepo(%r)' % self._short_name
|
| -
|
| -
|
| -def RunTest(tmpdir, test_name):
|
| - ret = []
|
| - clock = TestClock()
|
| - origin = TestRepo('origin', tmpdir, clock)
|
| - local = TestRepo('local', tmpdir, clock, origin.repo_path)
|
| -
|
| - cref = TestConfigRef(origin[gnumbd.DEFAULT_CONFIG_REF])
|
| - cref.update(enabled_refglobs=['refs/heads/*'], interval=0)
|
| -
|
| - def checkpoint(message, include_committer=False, include_config=False):
|
| - ret.append([message, {'origin': origin.snap(include_committer,
|
| - include_config)}])
|
| -
|
| - def run(include_log=True):
|
| - stdout = sys.stdout
|
| - stderr = sys.stderr
|
| -
|
| - if include_log:
|
| - logout = StringIO()
|
| - root_logger = logging.getLogger()
|
| - log_level = root_logger.getEffectiveLevel()
|
| - shandler = logging.StreamHandler(logout)
|
| - shandler.setFormatter(
|
| - logging.Formatter('%(levelname)s: %(message)s'))
|
| - root_logger.addHandler(shandler)
|
| - root_logger.setLevel(logging.INFO)
|
| -
|
| - try:
|
| - sys.stderr = sys.stdout = open(os.devnull, 'w')
|
| - local.reify()
|
| - gnumbd.inner_loop(local, cref, clock)
|
| - except Exception: # pragma: no cover
|
| - import traceback
|
| - ret.append(traceback.format_exc().splitlines())
|
| - finally:
|
| - sys.stdout = stdout
|
| - sys.stderr = stderr
|
| -
|
| - if include_log:
|
| - root_logger.removeHandler(shandler)
|
| - root_logger.setLevel(log_level)
|
| - ret.append({'log output': logout.getvalue().splitlines()})
|
| -
|
| - gnumbd_smoketests.GNUMBD_TESTS[test_name](
|
| - origin, local, cref, run, checkpoint)
|
| -
|
| - return expect_tests.Result(ret)
|
| -
|
| -
|
| -def GenTests(tmpdir):
|
| - for test_name, test in gnumbd_smoketests.GNUMBD_TESTS.iteritems():
|
| - yield expect_tests.Test(
|
| - __package__ + '.' + test_name,
|
| - expect_tests.FuncCall(RunTest, tmpdir, test_name),
|
| - os.path.join(BASE_PATH, 'gnumbd_smoketests.expected'),
|
| - test_name, 'yaml', break_funcs=[test])
|
|
|