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.
		
		
		
		
		
			
		
			
				
	
	
		
			164 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			164 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Python
		
	
#!/usr/bin/env vpython3
 | 
						|
# Copyright (c) 2021 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 run git tests.
 | 
						|
"""
 | 
						|
 | 
						|
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 subprocess2
 | 
						|
from testing_support.fake_repos import join, write
 | 
						|
 | 
						|
 | 
						|
class GClientSmokeGITMutates(gclient_smoketest_base.GClientSmokeBase):
 | 
						|
    """testRevertAndStatus mutates the git repo so move it to its own suite."""
 | 
						|
    def setUp(self):
 | 
						|
        super(GClientSmokeGITMutates, self).setUp()
 | 
						|
        self.enabled = self.FAKE_REPOS.set_up_git()
 | 
						|
        if not self.enabled:
 | 
						|
            self.skipTest('git fake repos not available')
 | 
						|
 | 
						|
    # TODO(crbug.com/1024683): Enable for windows.
 | 
						|
    @unittest.skipIf(sys.platform == 'win32', 'not yet fixed on win')
 | 
						|
    def testRevertAndStatus(self):
 | 
						|
        # Commit new change to repo to make repo_2's hash use a custom_var.
 | 
						|
        cur_deps = self.FAKE_REPOS.git_hashes['repo_1'][-1][1]['DEPS']
 | 
						|
        repo_2_hash = self.FAKE_REPOS.git_hashes['repo_2'][1][0][:7]
 | 
						|
        new_deps = cur_deps.replace('repo_2@%s\'' % repo_2_hash,
 | 
						|
                                    'repo_2@\' + Var(\'r2hash\')')
 | 
						|
        new_deps = 'vars = {\'r2hash\': \'%s\'}\n%s' % (repo_2_hash, new_deps)
 | 
						|
        self.FAKE_REPOS._commit_git('repo_1', {  # pylint: disable=protected-access
 | 
						|
          'DEPS': new_deps,
 | 
						|
          'origin': 'git/repo_1@3\n',
 | 
						|
        })
 | 
						|
 | 
						|
        config_template = ''.join([
 | 
						|
            'solutions = [{'
 | 
						|
            '  "name"        : "src",'
 | 
						|
            '  "url"         : %(git_base)r + "repo_1",'
 | 
						|
            '  "deps_file"   : "DEPS",'
 | 
						|
            '  "managed"     : True,'
 | 
						|
            '  "custom_vars" : %(custom_vars)s,'
 | 
						|
            '}]'
 | 
						|
        ])
 | 
						|
 | 
						|
        self.gclient([
 | 
						|
            'config', '--spec', config_template % {
 | 
						|
                'git_base': self.git_base,
 | 
						|
                'custom_vars': {}
 | 
						|
            }
 | 
						|
        ])
 | 
						|
 | 
						|
        # Tested in testSync.
 | 
						|
        self.gclient(['sync', '--deps', 'mac'])
 | 
						|
        write(join(self.root_dir, 'src', 'repo2', 'hi'), 'Hey!')
 | 
						|
 | 
						|
        out = self.parseGclient(['status', '--deps', 'mac', '--jobs', '1'], [])
 | 
						|
        # TODO(maruel): http://crosbug.com/3584 It should output the unversioned
 | 
						|
        # files.
 | 
						|
        self.assertEqual(0, len(out))
 | 
						|
 | 
						|
        # Revert implies --force implies running hooks without looking at
 | 
						|
        # pattern matching. For each expected path, 'git reset' and 'git clean'
 | 
						|
        # are run, so there should be two results for each. The last two results
 | 
						|
        # should reflect writing git_hooked1 and git_hooked2. There's only one
 | 
						|
        # result for the third because it is clean and has no output for 'git
 | 
						|
        # clean'.
 | 
						|
        out = self.parseGclient(['revert', '--deps', 'mac', '--jobs', '1'],
 | 
						|
                                ['running', 'running'])
 | 
						|
        self.assertEqual(2, len(out))
 | 
						|
        tree = self.mangle_git_tree(('repo_1@3', 'src'),
 | 
						|
                                    ('repo_2@1', 'src/repo2'),
 | 
						|
                                    ('repo_3@2', 'src/repo2/repo_renamed'))
 | 
						|
        tree['src/git_hooked1'] = 'git_hooked1'
 | 
						|
        tree['src/git_hooked2'] = 'git_hooked2'
 | 
						|
        self.assertTree(tree)
 | 
						|
 | 
						|
        # Make a new commit object in the origin repo, to force reset to fetch.
 | 
						|
        self.FAKE_REPOS._commit_git(
 | 
						|
            'repo_2',
 | 
						|
            {  # pylint: disable=protected-access
 | 
						|
                'origin': 'git/repo_2@3\n',
 | 
						|
            })
 | 
						|
 | 
						|
        self.gclient([
 | 
						|
            'config', '--spec', config_template % {
 | 
						|
                'git_base': self.git_base,
 | 
						|
                'custom_vars': {
 | 
						|
                    'r2hash': self.FAKE_REPOS.git_hashes['repo_2'][-1][0]
 | 
						|
                }
 | 
						|
            }
 | 
						|
        ])
 | 
						|
        out = self.parseGclient(['revert', '--deps', 'mac', '--jobs', '1'],
 | 
						|
                                ['running', 'running'])
 | 
						|
        self.assertEqual(2, len(out))
 | 
						|
        tree = self.mangle_git_tree(('repo_1@3', 'src'),
 | 
						|
                                    ('repo_2@3', 'src/repo2'),
 | 
						|
                                    ('repo_3@2', 'src/repo2/repo_renamed'))
 | 
						|
        tree['src/git_hooked1'] = 'git_hooked1'
 | 
						|
        tree['src/git_hooked2'] = 'git_hooked2'
 | 
						|
        self.assertTree(tree)
 | 
						|
 | 
						|
        results = self.gclient(['status', '--deps', 'mac', '--jobs', '1'])
 | 
						|
        out = results[0].splitlines(False)
 | 
						|
        # TODO(maruel): http://crosbug.com/3584 It should output the unversioned
 | 
						|
        # files.
 | 
						|
        self.assertEqual(0, len(out))
 | 
						|
 | 
						|
    def testSyncNoHistory(self):
 | 
						|
        # Create an extra commit in repo_2 and point DEPS to its hash.
 | 
						|
        cur_deps = self.FAKE_REPOS.git_hashes['repo_1'][-1][1]['DEPS']
 | 
						|
        repo_2_hash_old = self.FAKE_REPOS.git_hashes['repo_2'][1][0][:7]
 | 
						|
        self.FAKE_REPOS._commit_git('repo_2', {  # pylint: disable=protected-access
 | 
						|
          'last_file': 'file created in last commit',
 | 
						|
        })
 | 
						|
        repo_2_hash_new = self.FAKE_REPOS.git_hashes['repo_2'][-1][0]
 | 
						|
        new_deps = cur_deps.replace(repo_2_hash_old, repo_2_hash_new)
 | 
						|
        self.assertNotEqual(new_deps, cur_deps)
 | 
						|
        self.FAKE_REPOS._commit_git('repo_1', {  # pylint: disable=protected-access
 | 
						|
          'DEPS': new_deps,
 | 
						|
          'origin': 'git/repo_1@4\n',
 | 
						|
        })
 | 
						|
 | 
						|
        config_template = ''.join([
 | 
						|
            'solutions = [{'
 | 
						|
            '  "name"        : "src",'
 | 
						|
            '  "url"         : %(git_base)r + "repo_1",'
 | 
						|
            '  "deps_file"   : "DEPS",'
 | 
						|
            '  "managed"     : True,'
 | 
						|
            '}]'
 | 
						|
        ])
 | 
						|
 | 
						|
        self.gclient(
 | 
						|
            ['config', '--spec', config_template % {
 | 
						|
                'git_base': self.git_base
 | 
						|
            }])
 | 
						|
 | 
						|
        self.gclient(['sync', '--no-history', '--deps', 'mac'])
 | 
						|
        repo2_root = join(self.root_dir, 'src', 'repo2')
 | 
						|
 | 
						|
        # Check that repo_2 is actually shallow and its log has only one entry.
 | 
						|
        rev_lists = subprocess2.check_output(['git', 'rev-list', 'HEAD'],
 | 
						|
                                             cwd=repo2_root).decode('utf-8')
 | 
						|
        self.assertEqual(repo_2_hash_new, rev_lists.strip('\r\n'))
 | 
						|
 | 
						|
        # Check that we have actually checked out the right commit.
 | 
						|
        self.assertTrue(os.path.exists(join(repo2_root, 'last_file')))
 | 
						|
 | 
						|
 | 
						|
if __name__ == '__main__':
 | 
						|
    if '-v' in sys.argv:
 | 
						|
        logging.basicConfig(level=logging.DEBUG)
 | 
						|
    unittest.main()
 |