123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- #!/usr/bin/env vpython3
- # Copyright (c) 2018 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 logging
- import os
- import sys
- import subprocess
- import unittest
- ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
- sys.path.insert(0, ROOT_DIR)
- from testing_support import fake_repos
- ROLL_DEP = os.path.join(ROOT_DIR, 'roll-dep')
- GCLIENT = os.path.join(ROOT_DIR, 'gclient')
- class FakeRepos(fake_repos.FakeReposBase):
- NB_GIT_REPOS = 2
- def populateGit(self):
- self._commit_git('repo_2', {
- 'origin': 'git/repo_2@1',
- })
- self._commit_git('repo_2', {
- 'origin': 'git/repo_2@2',
- })
- self._commit_git('repo_2', {
- 'origin': 'git/repo_2@3',
- })
- self._commit_git(
- 'repo_1', {
- 'DEPS': '\n'.join([
- 'deps = {',
- ' "src/foo": "file:///%(git_base)srepo_2@%(repo_2_revision)s",',
- '}',
- 'hooks = [',
- ' {"action": ["foo", "--android", "{checkout_android}"]}',
- ']',
- ]) % {
- 'git_base': self.git_base.replace('\\', '\\\\'),
- 'repo_2_revision': self.git_hashes['repo_2'][1][0],
- },
- })
- class RollDepTest(fake_repos.FakeReposTestBase):
- FAKE_REPOS_CLASS = FakeRepos
- def setUp(self):
- super(RollDepTest, self).setUp()
- # Make sure it doesn't try to auto update when testing!
- self.env = os.environ.copy()
- self.env['DEPOT_TOOLS_UPDATE'] = '0'
- self.env['DEPOT_TOOLS_METRICS'] = '0'
- # Suppress Python 3 warnings and other test undesirables.
- self.env['GCLIENT_TEST'] = '1'
- self.maxDiff = None
- self.enabled = self.FAKE_REPOS.set_up_git()
- self.src_dir = os.path.join(self.root_dir, 'src')
- self.foo_dir = os.path.join(self.src_dir, 'foo')
- if self.enabled:
- self.call([GCLIENT, 'config', self.git_base + 'repo_1', '--name', 'src'],
- cwd=self.root_dir)
- self.call([GCLIENT, 'sync'], cwd=self.root_dir)
- def call(self, cmd, cwd=None):
- cwd = cwd or self.src_dir
- process = subprocess.Popen(cmd, cwd=cwd, stdout=subprocess.PIPE,
- stderr=subprocess.PIPE, env=self.env,
- shell=sys.platform.startswith('win'))
- stdout, stderr = process.communicate()
- logging.debug("XXX: %s\n%s\nXXX" % (' '.join(cmd), stdout))
- logging.debug("YYY: %s\n%s\nYYY" % (' '.join(cmd), stderr))
- stdout = stdout.decode('utf-8')
- stderr = stderr.decode('utf-8')
- return (stdout.replace('\r\n', '\n'), stderr.replace('\r\n', '\n'),
- process.returncode)
- def testRollsDep(self):
- if not self.enabled:
- return
- stdout, stderr, returncode = self.call([ROLL_DEP, 'src/foo'])
- expected_revision = self.githash('repo_2', 3)
- self.assertEqual(stderr, '')
- self.assertEqual(returncode, 0)
- with open(os.path.join(self.src_dir, 'DEPS')) as f:
- contents = f.read()
- self.assertEqual(self.gitrevparse(self.foo_dir), expected_revision)
- self.assertEqual([
- 'deps = {',
- ' "src/foo": "file:///' + self.git_base.replace('\\', '\\\\') +
- 'repo_2@' + expected_revision + '",',
- '}',
- 'hooks = [',
- ' {"action": ["foo", "--android", "{checkout_android}"]}',
- ']',
- ], contents.splitlines())
- commit_message = self.call(['git', 'log', '-n', '1'])[0]
- expected_message = 'Roll src/foo/ %s..%s (2 commits)' % (
- self.githash('repo_2', 1)[:9], self.githash('repo_2', 3)[:9])
- self.assertIn(expected_message, stdout)
- self.assertIn(expected_message, commit_message)
- def testRollsDepToSpecificRevision(self):
- if not self.enabled:
- return
- stdout, stderr, returncode = self.call(
- [ROLL_DEP, 'src/foo', '--roll-to', self.githash('repo_2', 2)])
- expected_revision = self.githash('repo_2', 2)
- self.assertEqual(stderr, '')
- self.assertEqual(returncode, 0)
- with open(os.path.join(self.src_dir, 'DEPS')) as f:
- contents = f.read()
- self.assertEqual(self.gitrevparse(self.foo_dir), expected_revision)
- self.assertEqual([
- 'deps = {',
- ' "src/foo": "file:///' + self.git_base.replace('\\', '\\\\') +
- 'repo_2@' + expected_revision + '",',
- '}',
- 'hooks = [',
- ' {"action": ["foo", "--android", "{checkout_android}"]}',
- ']',
- ], contents.splitlines())
- commit_message = self.call(['git', 'log', '-n', '1'])[0]
- expected_message = 'Roll src/foo/ %s..%s (1 commit)' % (
- self.githash('repo_2', 1)[:9], self.githash('repo_2', 2)[:9])
- self.assertIn(expected_message, stdout)
- self.assertIn(expected_message, commit_message)
- if __name__ == '__main__':
- level = logging.DEBUG if '-v' in sys.argv else logging.FATAL
- logging.basicConfig(
- level=level,
- format='%(asctime).19s %(levelname)s %(filename)s:'
- '%(lineno)s %(message)s')
- unittest.main()
|