#!/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 _update_origin(self):
# Fetch from origin to get/update the origin/master branch
self._execute_git(['fetch', 'origin'])
def setUp(self):
if path.exists(self.base_dir):
shutil.rmtree(self.base_dir)
check_call(["git", "init", self.base_dir])
# Add fake remote with name 'origin'
self._execute_git(['remote', 'add', 'origin', 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 _get_branches(self, hash):
return mergeinfo.get_branches_for_commit(self.base_dir, hash)
def _make_empty_commit(self, message):
self._execute_git(["commit", "--allow-empty", "-m", message])
self._update_origin()
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 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')
branches = self._get_branches(hash_of_first_commit);
self.assertTrue(mergeinfo.is_lkgr(branches))
branches = self._get_branches(hash_of_not_lkgr);
self.assertFalse(mergeinfo.is_lkgr(branches))
def testShowFirstCanary(self):
commits = self._get_commits()
hash_of_first_commit = commits[0]
branches = self._get_branches(hash_of_first_commit);
self.assertEqual(mergeinfo.get_first_canary(branches), 'No Canary coverage')
self._execute_git(['branch', 'remotes/origin/chromium/2345'])
self._execute_git(['branch', 'remotes/origin/chromium/2346'])
branches = self._get_branches(hash_of_first_commit);
self.assertEqual(mergeinfo.get_first_canary(branches), '2345')
def testFirstV8Version(self):
commits = self._get_commits()
hash_of_first_commit = commits[0]
self._execute_git(['branch', 'remotes/origin/chromium/2345'])
self._execute_git(['branch', 'remotes/origin/chromium/2346'])
branches = self._get_branches(hash_of_first_commit);
self.assertEqual(mergeinfo.get_first_v8_version(branches), '--')
self._execute_git(['branch', 'remotes/origin/5.7.1'])
self._execute_git(['branch', 'remotes/origin/5.8.1'])
branches = self._get_branches(hash_of_first_commit);
self.assertEqual(mergeinfo.get_first_v8_version(branches), '5.7.1')
self._execute_git(['branch', 'remotes/origin/5.6.1'])
branches = self._get_branches(hash_of_first_commit);
self.assertEqual(mergeinfo.get_first_v8_version(branches), '5.6.1')
if __name__ == "__main__":
unittest.main()