123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- # Copyright (c) 2024 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.
- from __future__ import annotations
- import os
- import sys
- import threading
- from typing import Iterable
- from unittest import mock
- import unittest
- # This is to be able to import scm from the root of the repo.
- sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
- import scm
- def GIT(
- test: unittest.TestCase,
- *,
- branchref: str | None = None,
- system_config: dict[str, list[str]] | None = None
- ) -> Iterable[tuple[str, list[str]]]:
- """Installs fakes/mocks for scm.GIT so that:
- * GetBranch will just return a fake branchname starting with the value of
- branchref.
- * git_new_branch.create_new_branch will be mocked to update the value
- returned by GetBranch.
- If provided, `system_config` allows you to set the 'system' scoped
- git-config which will be visible as the immutable base configuration layer
- for all git config scopes.
- NOTE: The dependency on git_new_branch.create_new_branch seems pretty
- circular - this functionality should probably move to scm.GIT?
- """
- _branchref = [branchref or 'refs/heads/main']
- global_lock = threading.Lock()
- global_state = {}
- def _newBranch(branchref):
- _branchref[0] = branchref
- patches: list[mock._patch] = [
- mock.patch('scm.GIT._new_config_state',
- side_effect=lambda _: scm.GitConfigStateTest(
- global_lock, global_state, system_state=system_config)),
- mock.patch('scm.GIT.GetBranchRef', side_effect=lambda _: _branchref[0]),
- mock.patch('git_new_branch.create_new_branch', side_effect=_newBranch)
- ]
- for p in patches:
- p.start()
- test.addCleanup(p.stop)
- test.addCleanup(scm.GIT.drop_config_cache)
- return global_state.items()
|