| Index: tools/release/test_mergeinfo.py
|
| diff --git a/tools/release/test_mergeinfo.py b/tools/release/test_mergeinfo.py
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..4959b6de0dc2365f82cb6022f9446c2ce65a2aab
|
| --- /dev/null
|
| +++ b/tools/release/test_mergeinfo.py
|
| @@ -0,0 +1,192 @@
|
| +#!/usr/bin/env python
|
| +# Copyright 2015 the V8 project 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 mergeinfo
|
| +import shutil
|
| +import unittest
|
| +
|
| +from collections import namedtuple
|
| +from os import path
|
| +from subprocess import Popen, PIPE, check_call
|
| +
|
| +TEST_CONFIG = {
|
| + "GIT_REPO": "/tmp/test-v8-search-related-commits",
|
| +}
|
| +
|
| +class TestMergeInfo(unittest.TestCase):
|
| +
|
| + base_dir = TEST_CONFIG["GIT_REPO"]
|
| +
|
| + def _execute_git(self, git_args):
|
| +
|
| + fullCommand = ["git", "-C", self.base_dir] + git_args
|
| + p = Popen(args=fullCommand, stdin=PIPE,
|
| + stdout=PIPE, stderr=PIPE)
|
| + output, err = p.communicate()
|
| + rc = p.returncode
|
| + if rc != 0:
|
| + raise Exception(err)
|
| + return output
|
| +
|
| + def setUp(self):
|
| + if path.exists(self.base_dir):
|
| + shutil.rmtree(self.base_dir)
|
| +
|
| + check_call(["git", "init", self.base_dir])
|
| +
|
| + # Initial commit
|
| + message = '''Initial commit'''
|
| +
|
| + self._make_empty_commit(message)
|
| +
|
| + def tearDown(self):
|
| + if path.exists(self.base_dir):
|
| + shutil.rmtree(self.base_dir)
|
| +
|
| + def _assert_correct_standard_result(
|
| + self, result, all_commits, hash_of_first_commit):
|
| + self.assertEqual(len(result), 1, "Master commit not found")
|
| + self.assertTrue(
|
| + result.get(hash_of_first_commit),
|
| + "Master commit is wrong")
|
| +
|
| + self.assertEqual(
|
| + len(result[hash_of_first_commit]),
|
| + 1,
|
| + "Child commit not found")
|
| + self.assertEqual(
|
| + all_commits[2],
|
| + result[hash_of_first_commit][0],
|
| + "Child commit wrong")
|
| +
|
| + def _get_commits(self):
|
| + commits = self._execute_git(
|
| + ["log", "--format=%H", "--reverse"]).splitlines()
|
| + return commits
|
| +
|
| + def _make_empty_commit(self, message):
|
| + self._execute_git(["commit", "--allow-empty", "-m", message])
|
| + return self._get_commits()[-1]
|
| +
|
| + def testCanDescribeCommit(self):
|
| + commits = self._get_commits()
|
| + hash_of_first_commit = commits[0]
|
| +
|
| + result = mergeinfo.describe_commit(
|
| + self.base_dir,
|
| + hash_of_first_commit).splitlines()
|
| +
|
| + self.assertEqual(
|
| + result[0],
|
| + 'commit ' + hash_of_first_commit)
|
| +
|
| + def testCanDescribeCommitSingleLine(self):
|
| + commits = self._get_commits()
|
| + hash_of_first_commit = commits[0]
|
| +
|
| + result = mergeinfo.describe_commit(
|
| + self.base_dir,
|
| + hash_of_first_commit, True).splitlines()
|
| +
|
| + self.assertEqual(
|
| + str(result[0]),
|
| + str(hash_of_first_commit[0:7]) + ' Initial commit')
|
| +
|
| + def testSearchFollowUpCommits(self):
|
| + commits = self._get_commits()
|
| + hash_of_first_commit = commits[0]
|
| +
|
| + message = 'Follow-up commit of ' + hash_of_first_commit
|
| + self._make_empty_commit(message)
|
| + self._make_empty_commit(message)
|
| + self._make_empty_commit(message)
|
| + commits = self._get_commits()
|
| + message = 'Not related commit'
|
| + self._make_empty_commit(message)
|
| +
|
| + followups = mergeinfo.get_followup_commits(
|
| + self.base_dir,
|
| + hash_of_first_commit)
|
| + self.assertEqual(set(followups), set(commits[1:]))
|
| +
|
| + def testSearchMerges(self):
|
| + self._execute_git(['branch', 'test'])
|
| + self._execute_git(['checkout', 'master'])
|
| + message = 'real initial commit'
|
| + self._make_empty_commit(message)
|
| + commits = self._get_commits()
|
| + hash_of_first_commit = commits[0]
|
| +
|
| + self._execute_git(['checkout', 'test'])
|
| + message = 'Not related commit'
|
| + self._make_empty_commit(message)
|
| +
|
| + # This should be found
|
| + message = 'Merge ' + hash_of_first_commit
|
| + hash_of_hit = self._make_empty_commit(message)
|
| +
|
| + # This should be ignored
|
| + message = 'Cr-Branched-From: ' + hash_of_first_commit
|
| + hash_of_ignored = self._make_empty_commit(message)
|
| +
|
| + self._execute_git(['checkout', 'master'])
|
| +
|
| + followups = mergeinfo.get_followup_commits(
|
| + self.base_dir,
|
| + hash_of_first_commit)
|
| +
|
| + # Check if follow ups and merges are not overlapping
|
| + self.assertEqual(len(followups), 0)
|
| +
|
| + message = 'Follow-up commit of ' + hash_of_first_commit
|
| + hash_of_followup = self._make_empty_commit(message)
|
| +
|
| + merges = mergeinfo.get_merge_commits(self.base_dir, hash_of_first_commit)
|
| + # Check if follow up is ignored
|
| + self.assertTrue(hash_of_followup not in merges)
|
| +
|
| + # Check for proper return of merges
|
| + self.assertTrue(hash_of_hit in merges)
|
| + self.assertTrue(hash_of_ignored not in merges)
|
| +
|
| + def testIsRolling(self):
|
| + commits = self._get_commits()
|
| + hash_of_first_commit = commits[0]
|
| + self._make_empty_commit('This one is the roll head')
|
| + self._execute_git(['branch', 'remotes/origin/roll'])
|
| + hash_of_not_rolled = self._make_empty_commit('This one is not yet rolled')
|
| +
|
| + self.assertTrue(mergeinfo.is_rolling(
|
| + self.base_dir, hash_of_first_commit))
|
| + self.assertFalse(mergeinfo.is_rolling(
|
| + self.base_dir, hash_of_not_rolled))
|
| +
|
| + def testIsLkgr(self):
|
| + commits = self._get_commits()
|
| + hash_of_first_commit = commits[0]
|
| + self._make_empty_commit('This one is the lkgr head')
|
| + self._execute_git(['branch', 'remotes/origin/lkgr'])
|
| + hash_of_not_lkgr = self._make_empty_commit('This one is not yet lkgr')
|
| +
|
| + self.assertTrue(mergeinfo.is_lkgr(
|
| + self.base_dir, hash_of_first_commit))
|
| + self.assertFalse(mergeinfo.is_lkgr(
|
| + self.base_dir, hash_of_not_lkgr))
|
| +
|
| + def testShowFirstCanary(self):
|
| + commits = self._get_commits()
|
| + hash_of_first_commit = commits[0]
|
| +
|
| + self.assertEqual(mergeinfo.get_first_canary(
|
| + self.base_dir, hash_of_first_commit), 'No Canary coverage')
|
| +
|
| + self._execute_git(['branch', 'remotes/origin/chromium/2345'])
|
| + self._execute_git(['branch', 'remotes/origin/chromium/2346'])
|
| +
|
| + self.assertEqual(mergeinfo.get_first_canary(
|
| + self.base_dir, hash_of_first_commit), '2345')
|
| +
|
| +if __name__ == "__main__":
|
| + unittest.main()
|
|
|