roll_dep_test.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  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. # TODO: Should fix these warnings.
  16. # pylint: disable=line-too-long
  17. class FakeRepos(fake_repos.FakeReposBase):
  18. NB_GIT_REPOS = 2
  19. def populateGit(self):
  20. self._commit_git('repo_2', {
  21. 'origin': 'git/repo_2@1',
  22. })
  23. self._commit_git('repo_2', {
  24. 'origin': 'git/repo_2@2',
  25. })
  26. self._commit_git('repo_2', {
  27. 'origin': 'git/repo_2@3',
  28. })
  29. self._commit_git(
  30. 'repo_1', {
  31. 'DEPS': '\n'.join([
  32. 'deps = {',
  33. ' "src/foo": "file:///%(git_base)srepo_2@%(repo_2_revision)s",',
  34. '}',
  35. 'hooks = [',
  36. ' {"action": ["foo", "--android", "{checkout_android}"]}',
  37. ']',
  38. ]) % {
  39. 'git_base': self.git_base.replace('\\', '\\\\'),
  40. 'repo_2_revision': self.git_hashes['repo_2'][1][0],
  41. },
  42. })
  43. class RollDepTest(fake_repos.FakeReposTestBase):
  44. FAKE_REPOS_CLASS = FakeRepos
  45. def setUp(self):
  46. super(RollDepTest, self).setUp()
  47. # Make sure it doesn't try to auto update when testing!
  48. self.env = os.environ.copy()
  49. self.env['DEPOT_TOOLS_UPDATE'] = '0'
  50. self.env['DEPOT_TOOLS_METRICS'] = '0'
  51. # Suppress Python 3 warnings and other test undesirables.
  52. self.env['GCLIENT_TEST'] = '1'
  53. self.maxDiff = None
  54. self.enabled = self.FAKE_REPOS.set_up_git()
  55. self.src_dir = os.path.join(self.root_dir, 'src')
  56. self.foo_dir = os.path.join(self.src_dir, 'foo')
  57. if self.enabled:
  58. self.call(
  59. [GCLIENT, 'config', self.git_base + 'repo_1', '--name', 'src'],
  60. cwd=self.root_dir)
  61. self.call([GCLIENT, 'sync'], cwd=self.root_dir)
  62. def call(self, cmd, cwd=None):
  63. cwd = cwd or self.src_dir
  64. process = subprocess.Popen(cmd,
  65. cwd=cwd,
  66. stdout=subprocess.PIPE,
  67. stderr=subprocess.PIPE,
  68. env=self.env,
  69. shell=sys.platform.startswith('win'))
  70. stdout, stderr = process.communicate()
  71. logging.debug("XXX: %s\n%s\nXXX" % (' '.join(cmd), stdout))
  72. logging.debug("YYY: %s\n%s\nYYY" % (' '.join(cmd), stderr))
  73. stdout = stdout.decode('utf-8')
  74. stderr = stderr.decode('utf-8')
  75. return (stdout.replace('\r\n',
  76. '\n'), stderr.replace('\r\n',
  77. '\n'), process.returncode)
  78. def testRollsDep(self):
  79. if not self.enabled:
  80. return
  81. stdout, stderr, returncode = self.call([ROLL_DEP, 'src/foo'])
  82. expected_revision = self.githash('repo_2', 3)
  83. self.assertEqual(stderr, '')
  84. self.assertEqual(returncode, 0)
  85. with open(os.path.join(self.src_dir, 'DEPS')) as f:
  86. contents = f.read()
  87. self.assertEqual(self.gitrevparse(self.foo_dir), expected_revision)
  88. self.assertEqual([
  89. 'deps = {',
  90. ' "src/foo": "file:///' + self.git_base.replace('\\', '\\\\') +
  91. 'repo_2@' + expected_revision + '",',
  92. '}',
  93. 'hooks = [',
  94. ' {"action": ["foo", "--android", "{checkout_android}"]}',
  95. ']',
  96. ], contents.splitlines())
  97. commit_message = self.call(['git', 'log', '-n', '1'])[0]
  98. expected_message = 'Roll src/foo/ %s..%s (2 commits)' % (self.githash(
  99. 'repo_2', 1)[:9], self.githash('repo_2', 3)[:9])
  100. self.assertIn(expected_message, stdout)
  101. self.assertIn(expected_message, commit_message)
  102. def testRollsDepReviewers(self):
  103. if not self.enabled:
  104. return
  105. stdout, stderr, returncode = self.call([
  106. ROLL_DEP, 'src/foo', '-r', 'foo@example.com', '-r',
  107. 'bar@example.com,baz@example.com'
  108. ])
  109. self.assertEqual(stderr, '')
  110. self.assertEqual(returncode, 0)
  111. expected_message = 'R=foo@example.com,bar@example.com,baz@example.com'
  112. self.assertIn(expected_message, stdout)
  113. def testRollsDepToSpecificRevision(self):
  114. if not self.enabled:
  115. return
  116. stdout, stderr, returncode = self.call(
  117. [ROLL_DEP, 'src/foo', '--roll-to',
  118. self.githash('repo_2', 2)])
  119. expected_revision = self.githash('repo_2', 2)
  120. self.assertEqual(stderr, '')
  121. self.assertEqual(returncode, 0)
  122. with open(os.path.join(self.src_dir, 'DEPS')) as f:
  123. contents = f.read()
  124. self.assertEqual(self.gitrevparse(self.foo_dir), expected_revision)
  125. self.assertEqual([
  126. 'deps = {',
  127. ' "src/foo": "file:///' + self.git_base.replace('\\', '\\\\') +
  128. 'repo_2@' + expected_revision + '",',
  129. '}',
  130. 'hooks = [',
  131. ' {"action": ["foo", "--android", "{checkout_android}"]}',
  132. ']',
  133. ], contents.splitlines())
  134. commit_message = self.call(['git', 'log', '-n', '1'])[0]
  135. expected_message = 'Roll src/foo/ %s..%s (1 commit)' % (self.githash(
  136. 'repo_2', 1)[:9], self.githash('repo_2', 2)[:9])
  137. self.assertIn(expected_message, stdout)
  138. self.assertIn(expected_message, commit_message)
  139. def testRollsDepLogLimit(self):
  140. if not self.enabled:
  141. return
  142. stdout, stderr, returncode = self.call(
  143. [ROLL_DEP, 'src/foo', '--log-limit', '1'])
  144. expected_revision = self.githash('repo_2', 3)
  145. self.assertEqual(stderr, '')
  146. self.assertEqual(returncode, 0)
  147. with open(os.path.join(self.src_dir, 'DEPS')) as f:
  148. contents = f.read()
  149. self.assertEqual(self.gitrevparse(self.foo_dir), expected_revision)
  150. self.assertEqual([
  151. 'deps = {',
  152. ' "src/foo": "file:///' + self.git_base.replace('\\', '\\\\') +
  153. 'repo_2@' + expected_revision + '",',
  154. '}',
  155. 'hooks = [',
  156. ' {"action": ["foo", "--android", "{checkout_android}"]}',
  157. ']',
  158. ], contents.splitlines())
  159. commit_message = self.call(['git', 'log', '-n', '1'])[0]
  160. expected_message = 'Roll src/foo/ %s..%s (2 commits)' % (self.githash(
  161. 'repo_2', 1)[:9], self.githash('repo_2', 3)[:9])
  162. self.assertIn(expected_message, stdout)
  163. self.assertIn(expected_message, commit_message)
  164. if __name__ == '__main__':
  165. level = logging.DEBUG if '-v' in sys.argv else logging.FATAL
  166. logging.basicConfig(level=level,
  167. format='%(asctime).19s %(levelname)s %(filename)s:'
  168. '%(lineno)s %(message)s')
  169. unittest.main()