You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
277 lines
10 KiB
Python
277 lines
10 KiB
Python
#!/usr/bin/env vpython3
|
|
# Copyright (c) 2020 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.
|
|
"""Smoke tests for gclient.py.
|
|
|
|
Shell out 'gclient' and simulate the behavior of bisect bots as they transition
|
|
across DEPS changes.
|
|
"""
|
|
|
|
import logging
|
|
import os
|
|
import sys
|
|
import unittest
|
|
|
|
import gclient_smoketest_base
|
|
|
|
ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
sys.path.insert(0, ROOT_DIR)
|
|
|
|
import scm
|
|
from testing_support import fake_repos
|
|
|
|
# TODO: Should fix these warnings.
|
|
# pylint: disable=line-too-long
|
|
|
|
|
|
class SkiaDEPSTransitionSmokeTest(gclient_smoketest_base.GClientSmokeBase):
|
|
"""Simulate the behavior of bisect bots as they transition across the Skia
|
|
DEPS change."""
|
|
|
|
FAKE_REPOS_CLASS = fake_repos.FakeRepoSkiaDEPS
|
|
|
|
def setUp(self):
|
|
super(SkiaDEPSTransitionSmokeTest, self).setUp()
|
|
self.enabled = self.FAKE_REPOS.set_up_git()
|
|
if not self.enabled:
|
|
self.skipTest('git fake repos not available')
|
|
|
|
def testSkiaDEPSChangeGit(self):
|
|
# Create an initial checkout:
|
|
# - Single checkout at the root.
|
|
# - Multiple checkouts in a shared subdirectory.
|
|
self.gclient([
|
|
'config', '--spec', 'solutions=['
|
|
'{"name": "src",'
|
|
' "url": ' + repr(self.git_base) + '+ "repo_2",'
|
|
'}]'
|
|
])
|
|
|
|
checkout_path = os.path.join(self.root_dir, 'src')
|
|
skia = os.path.join(checkout_path, 'third_party', 'skia')
|
|
skia_gyp = os.path.join(skia, 'gyp')
|
|
skia_include = os.path.join(skia, 'include')
|
|
skia_src = os.path.join(skia, 'src')
|
|
|
|
gyp_git_url = self.git_base + 'repo_3'
|
|
include_git_url = self.git_base + 'repo_4'
|
|
src_git_url = self.git_base + 'repo_5'
|
|
skia_git_url = self.FAKE_REPOS.git_base + 'repo_1'
|
|
|
|
pre_hash = self.githash('repo_2', 1)
|
|
post_hash = self.githash('repo_2', 2)
|
|
|
|
# Initial sync. Verify that we get the expected checkout.
|
|
res = self.gclient(
|
|
['sync', '--deps', 'mac', '--revision',
|
|
'src@%s' % pre_hash])
|
|
self.assertEqual(res[2], 0, 'Initial sync failed.')
|
|
self.assertEqual(
|
|
scm.GIT.Capture(['config', 'remote.origin.url'], skia_gyp),
|
|
gyp_git_url)
|
|
self.assertEqual(
|
|
scm.GIT.Capture(['config', 'remote.origin.url'], skia_include),
|
|
include_git_url)
|
|
self.assertEqual(
|
|
scm.GIT.Capture(['config', 'remote.origin.url'], skia_src),
|
|
src_git_url)
|
|
|
|
# Verify that the sync succeeds. Verify that we have the expected
|
|
# merged checkout.
|
|
res = self.gclient(
|
|
['sync', '--deps', 'mac', '--revision',
|
|
'src@%s' % post_hash])
|
|
self.assertEqual(res[2], 0, 'DEPS change sync failed.')
|
|
self.assertEqual(scm.GIT.Capture(['config', 'remote.origin.url'], skia),
|
|
skia_git_url)
|
|
|
|
# Sync again. Verify that we still have the expected merged checkout.
|
|
res = self.gclient(
|
|
['sync', '--deps', 'mac', '--revision',
|
|
'src@%s' % post_hash])
|
|
self.assertEqual(res[2], 0, 'Subsequent sync failed.')
|
|
self.assertEqual(scm.GIT.Capture(['config', 'remote.origin.url'], skia),
|
|
skia_git_url)
|
|
|
|
# Sync back to the original DEPS. Verify that we get the original
|
|
# structure.
|
|
res = self.gclient(
|
|
['sync', '--deps', 'mac', '--revision',
|
|
'src@%s' % pre_hash])
|
|
self.assertEqual(res[2], 0, 'Reverse sync failed.')
|
|
self.assertEqual(
|
|
scm.GIT.Capture(['config', 'remote.origin.url'], skia_gyp),
|
|
gyp_git_url)
|
|
self.assertEqual(
|
|
scm.GIT.Capture(['config', 'remote.origin.url'], skia_include),
|
|
include_git_url)
|
|
self.assertEqual(
|
|
scm.GIT.Capture(['config', 'remote.origin.url'], skia_src),
|
|
src_git_url)
|
|
|
|
# Sync again. Verify that we still have the original structure.
|
|
res = self.gclient(
|
|
['sync', '--deps', 'mac', '--revision',
|
|
'src@%s' % pre_hash])
|
|
self.assertEqual(res[2], 0, 'Subsequent sync #2 failed.')
|
|
self.assertEqual(
|
|
scm.GIT.Capture(['config', 'remote.origin.url'], skia_gyp),
|
|
gyp_git_url)
|
|
self.assertEqual(
|
|
scm.GIT.Capture(['config', 'remote.origin.url'], skia_include),
|
|
include_git_url)
|
|
self.assertEqual(
|
|
scm.GIT.Capture(['config', 'remote.origin.url'], skia_src),
|
|
src_git_url)
|
|
|
|
|
|
class BlinkDEPSTransitionSmokeTest(gclient_smoketest_base.GClientSmokeBase):
|
|
"""Simulate the behavior of bisect bots as they transition across the Blink
|
|
DEPS change."""
|
|
|
|
FAKE_REPOS_CLASS = fake_repos.FakeRepoBlinkDEPS
|
|
|
|
def setUp(self):
|
|
super(BlinkDEPSTransitionSmokeTest, self).setUp()
|
|
self.enabled = self.FAKE_REPOS.set_up_git()
|
|
if not self.enabled:
|
|
self.skipTest('git fake repos not available')
|
|
self.checkout_path = os.path.join(self.root_dir, 'src')
|
|
self.blink = os.path.join(self.checkout_path, 'third_party', 'WebKit')
|
|
self.blink_git_url = self.FAKE_REPOS.git_base + 'repo_2'
|
|
self.pre_merge_sha = self.githash('repo_1', 1)
|
|
self.post_merge_sha = self.githash('repo_1', 2)
|
|
|
|
def CheckStatusPreMergePoint(self):
|
|
self.assertEqual(
|
|
scm.GIT.Capture(['config', 'remote.origin.url'], self.blink),
|
|
self.blink_git_url)
|
|
self.assertTrue(os.path.exists(join(self.blink, '.git')))
|
|
self.assertTrue(os.path.exists(join(self.blink, 'OWNERS')))
|
|
with open(join(self.blink, 'OWNERS')) as f:
|
|
owners_content = f.read()
|
|
self.assertEqual('OWNERS-pre', owners_content, 'OWNERS not updated')
|
|
self.assertTrue(
|
|
os.path.exists(join(self.blink, 'Source', 'exists_always')))
|
|
self.assertTrue(
|
|
os.path.exists(
|
|
join(self.blink, 'Source', 'exists_before_but_not_after')))
|
|
self.assertFalse(
|
|
os.path.exists(
|
|
join(self.blink, 'Source', 'exists_after_but_not_before')))
|
|
|
|
def CheckStatusPostMergePoint(self):
|
|
# Check that the contents still exists
|
|
self.assertTrue(os.path.exists(join(self.blink, 'OWNERS')))
|
|
with open(join(self.blink, 'OWNERS')) as f:
|
|
owners_content = f.read()
|
|
self.assertEqual('OWNERS-post', owners_content,
|
|
'OWNERS not updated')
|
|
self.assertTrue(
|
|
os.path.exists(join(self.blink, 'Source', 'exists_always')))
|
|
# Check that file removed between the branch point are actually deleted.
|
|
self.assertTrue(
|
|
os.path.exists(
|
|
join(self.blink, 'Source', 'exists_after_but_not_before')))
|
|
self.assertFalse(
|
|
os.path.exists(
|
|
join(self.blink, 'Source', 'exists_before_but_not_after')))
|
|
# But not the .git folder
|
|
self.assertFalse(os.path.exists(join(self.blink, '.git')))
|
|
|
|
@unittest.skip('flaky')
|
|
def testBlinkDEPSChangeUsingGclient(self):
|
|
"""Checks that {src,blink} repos are consistent when syncing going back and
|
|
forth using gclient sync src@revision."""
|
|
self.gclient([
|
|
'config', '--spec', 'solutions=['
|
|
'{"name": "src",'
|
|
' "url": "' + self.git_base + 'repo_1",'
|
|
'}]'
|
|
])
|
|
|
|
# Go back and forth two times.
|
|
for _ in range(2):
|
|
res = self.gclient([
|
|
'sync', '--jobs', '1', '--revision',
|
|
'src@%s' % self.pre_merge_sha
|
|
])
|
|
self.assertEqual(res[2], 0, 'DEPS change sync failed.')
|
|
self.CheckStatusPreMergePoint()
|
|
|
|
res = self.gclient([
|
|
'sync', '--jobs', '1', '--revision',
|
|
'src@%s' % self.post_merge_sha
|
|
])
|
|
self.assertEqual(res[2], 0, 'DEPS change sync failed.')
|
|
self.CheckStatusPostMergePoint()
|
|
|
|
@unittest.skip('flaky')
|
|
def testBlinkDEPSChangeUsingGit(self):
|
|
"""Like testBlinkDEPSChangeUsingGclient, but move the main project using
|
|
directly git and not gclient sync."""
|
|
self.gclient([
|
|
'config', '--spec', 'solutions=['
|
|
'{"name": "src",'
|
|
' "url": "' + self.git_base + 'repo_1",'
|
|
' "managed": False,'
|
|
'}]'
|
|
])
|
|
|
|
# Perform an initial sync to bootstrap the repo.
|
|
res = self.gclient(['sync', '--jobs', '1'])
|
|
self.assertEqual(res[2], 0, 'Initial gclient sync failed.')
|
|
|
|
# Go back and forth two times.
|
|
for _ in range(2):
|
|
subprocess2.check_call(
|
|
['git', 'checkout', '-q', self.pre_merge_sha],
|
|
cwd=self.checkout_path)
|
|
res = self.gclient(['sync', '--jobs', '1'])
|
|
self.assertEqual(res[2], 0, 'gclient sync failed.')
|
|
self.CheckStatusPreMergePoint()
|
|
|
|
subprocess2.check_call(
|
|
['git', 'checkout', '-q', self.post_merge_sha],
|
|
cwd=self.checkout_path)
|
|
res = self.gclient(['sync', '--jobs', '1'])
|
|
self.assertEqual(res[2], 0, 'DEPS change sync failed.')
|
|
self.CheckStatusPostMergePoint()
|
|
|
|
@unittest.skip('flaky')
|
|
def testBlinkLocalBranchesArePreserved(self):
|
|
"""Checks that the state of local git branches are effectively preserved
|
|
when going back and forth."""
|
|
self.gclient([
|
|
'config', '--spec', 'solutions=['
|
|
'{"name": "src",'
|
|
' "url": "' + self.git_base + 'repo_1",'
|
|
'}]'
|
|
])
|
|
|
|
# Initialize to pre-merge point.
|
|
self.gclient(['sync', '--revision', 'src@%s' % self.pre_merge_sha])
|
|
self.CheckStatusPreMergePoint()
|
|
|
|
# Create a branch named "foo".
|
|
subprocess2.check_call(['git', 'checkout', '-qB', 'foo'],
|
|
cwd=self.blink)
|
|
|
|
# Cross the pre-merge point.
|
|
self.gclient(['sync', '--revision', 'src@%s' % self.post_merge_sha])
|
|
self.CheckStatusPostMergePoint()
|
|
|
|
# Go backwards and check that we still have the foo branch.
|
|
self.gclient(['sync', '--revision', 'src@%s' % self.pre_merge_sha])
|
|
self.CheckStatusPreMergePoint()
|
|
subprocess2.check_call(
|
|
['git', 'show-ref', '-q', '--verify', 'refs/heads/foo'],
|
|
cwd=self.blink)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
if '-v' in sys.argv:
|
|
logging.basicConfig(level=logging.DEBUG)
|
|
unittest.main()
|