roll_dep_test.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. #!/usr/bin/env vpython3
  2. # Copyright (c) 2018 The Chromium Authors. All rights reserved.
  3. # Use of this source code is governed by a BSD-style license that can be
  4. # found in the LICENSE file.
  5. import logging
  6. import os
  7. import sys
  8. import subprocess
  9. import unittest
  10. ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  11. sys.path.insert(0, ROOT_DIR)
  12. from testing_support import fake_repos
  13. ROLL_DEP = os.path.join(ROOT_DIR, 'roll-dep')
  14. GCLIENT = os.path.join(ROOT_DIR, 'gclient')
  15. class FakeRepos(fake_repos.FakeReposBase):
  16. NB_GIT_REPOS = 2
  17. def populateGit(self):
  18. self._commit_git('repo_2', {
  19. 'origin': 'git/repo_2@1',
  20. })
  21. self._commit_git('repo_2', {
  22. 'origin': 'git/repo_2@2',
  23. })
  24. self._commit_git('repo_2', {
  25. 'origin': 'git/repo_2@3',
  26. })
  27. self._commit_git(
  28. 'repo_1', {
  29. 'DEPS': '\n'.join([
  30. 'deps = {',
  31. ' "src/foo": "file:///%(git_base)srepo_2@%(repo_2_revision)s",',
  32. '}',
  33. 'hooks = [',
  34. ' {"action": ["foo", "--android", "{checkout_android}"]}',
  35. ']',
  36. ]) % {
  37. 'git_base': self.git_base.replace('\\', '\\\\'),
  38. 'repo_2_revision': self.git_hashes['repo_2'][1][0],
  39. },
  40. })
  41. class RollDepTest(fake_repos.FakeReposTestBase):
  42. FAKE_REPOS_CLASS = FakeRepos
  43. def setUp(self):
  44. super(RollDepTest, self).setUp()
  45. # Make sure it doesn't try to auto update when testing!
  46. self.env = os.environ.copy()
  47. self.env['DEPOT_TOOLS_UPDATE'] = '0'
  48. self.env['DEPOT_TOOLS_METRICS'] = '0'
  49. # Suppress Python 3 warnings and other test undesirables.
  50. self.env['GCLIENT_TEST'] = '1'
  51. self.maxDiff = None
  52. self.enabled = self.FAKE_REPOS.set_up_git()
  53. self.src_dir = os.path.join(self.root_dir, 'src')
  54. self.foo_dir = os.path.join(self.src_dir, 'foo')
  55. if self.enabled:
  56. self.call([GCLIENT, 'config', self.git_base + 'repo_1', '--name', 'src'],
  57. cwd=self.root_dir)
  58. self.call([GCLIENT, 'sync'], cwd=self.root_dir)
  59. def call(self, cmd, cwd=None):
  60. cwd = cwd or self.src_dir
  61. process = subprocess.Popen(cmd, cwd=cwd, stdout=subprocess.PIPE,
  62. stderr=subprocess.PIPE, env=self.env,
  63. shell=sys.platform.startswith('win'))
  64. stdout, stderr = process.communicate()
  65. logging.debug("XXX: %s\n%s\nXXX" % (' '.join(cmd), stdout))
  66. logging.debug("YYY: %s\n%s\nYYY" % (' '.join(cmd), stderr))
  67. stdout = stdout.decode('utf-8')
  68. stderr = stderr.decode('utf-8')
  69. return (stdout.replace('\r\n', '\n'), stderr.replace('\r\n', '\n'),
  70. process.returncode)
  71. def testRollsDep(self):
  72. if not self.enabled:
  73. return
  74. stdout, stderr, returncode = self.call([ROLL_DEP, 'src/foo'])
  75. expected_revision = self.githash('repo_2', 3)
  76. self.assertEqual(stderr, '')
  77. self.assertEqual(returncode, 0)
  78. with open(os.path.join(self.src_dir, 'DEPS')) as f:
  79. contents = f.read()
  80. self.assertEqual(self.gitrevparse(self.foo_dir), expected_revision)
  81. self.assertEqual([
  82. 'deps = {',
  83. ' "src/foo": "file:///' + self.git_base.replace('\\', '\\\\') +
  84. 'repo_2@' + expected_revision + '",',
  85. '}',
  86. 'hooks = [',
  87. ' {"action": ["foo", "--android", "{checkout_android}"]}',
  88. ']',
  89. ], contents.splitlines())
  90. commit_message = self.call(['git', 'log', '-n', '1'])[0]
  91. expected_message = 'Roll src/foo/ %s..%s (2 commits)' % (
  92. self.githash('repo_2', 1)[:9], self.githash('repo_2', 3)[:9])
  93. self.assertIn(expected_message, stdout)
  94. self.assertIn(expected_message, commit_message)
  95. def testRollsDepToSpecificRevision(self):
  96. if not self.enabled:
  97. return
  98. stdout, stderr, returncode = self.call(
  99. [ROLL_DEP, 'src/foo', '--roll-to', self.githash('repo_2', 2)])
  100. expected_revision = self.githash('repo_2', 2)
  101. self.assertEqual(stderr, '')
  102. self.assertEqual(returncode, 0)
  103. with open(os.path.join(self.src_dir, 'DEPS')) as f:
  104. contents = f.read()
  105. self.assertEqual(self.gitrevparse(self.foo_dir), expected_revision)
  106. self.assertEqual([
  107. 'deps = {',
  108. ' "src/foo": "file:///' + self.git_base.replace('\\', '\\\\') +
  109. 'repo_2@' + expected_revision + '",',
  110. '}',
  111. 'hooks = [',
  112. ' {"action": ["foo", "--android", "{checkout_android}"]}',
  113. ']',
  114. ], contents.splitlines())
  115. commit_message = self.call(['git', 'log', '-n', '1'])[0]
  116. expected_message = 'Roll src/foo/ %s..%s (1 commit)' % (
  117. self.githash('repo_2', 1)[:9], self.githash('repo_2', 2)[:9])
  118. self.assertIn(expected_message, stdout)
  119. self.assertIn(expected_message, commit_message)
  120. if __name__ == '__main__':
  121. level = logging.DEBUG if '-v' in sys.argv else logging.FATAL
  122. logging.basicConfig(
  123. level=level,
  124. format='%(asctime).19s %(levelname)s %(filename)s:'
  125. '%(lineno)s %(message)s')
  126. unittest.main()