[git_auth] Add git_auth tests

Bug: b/351024645
Change-Id: Ie8808de63d09c4a89187f81a5782e09fe73c8b0f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/5698748
Commit-Queue: Allen Li <ayatane@chromium.org>
Reviewed-by: Yiwei Zhang <yiwzhang@google.com>
Reviewed-by: Robbie Iannucci <iannucci@chromium.org>
diff --git a/scm.py b/scm.py
index 645674b..9877f99 100644
--- a/scm.py
+++ b/scm.py
@@ -180,9 +180,9 @@
         If pattern is None, this returns all config items.
         """
         if pattern is None:
-          pred = lambda _: True
+            pred = lambda _: True
         else:
-          pred = re.compile(pattern).match
+            pred = re.compile(pattern).match
         for name, values in sorted(self._maybe_load_config().items()):
             if pred(name):
                 for value in values:
@@ -431,6 +431,19 @@
             cls._CONFIG_CACHE[key] = ret
             return ret
 
+    @classmethod
+    def _dump_config_state(cls) -> Dict[str, GitFlatConfigData]:
+        """Dump internal config state.
+
+        Used for testing.  This will NOT work properly in non-test
+        contexts as it relies on internal caches.
+        """
+        with cls._CONFIG_CACHE_LOCK:
+            state = {}
+            for key, val in cls._CONFIG_CACHE.items():
+                state[str(key)] = val._maybe_load_config()
+        return state
+
     @staticmethod
     def ApplyEnvVars(kwargs):
         env = kwargs.pop('env', None) or os.environ.copy()
diff --git a/tests/git_auth_test.py b/tests/git_auth_test.py
new file mode 100755
index 0000000..f554317
--- /dev/null
+++ b/tests/git_auth_test.py
@@ -0,0 +1,144 @@
+#!/usr/bin/env vpython3
+# coding=utf-8
+# Copyright (c) 2012 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.
+"""Unit tests for git_cl.py."""
+
+import logging
+import os
+import sys
+import unittest
+
+sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+
+import git_auth
+import scm
+import scm_mock
+
+
+class TestConfigChanger(unittest.TestCase):
+
+    def setUp(self):
+        scm_mock.GIT(self)
+
+    def test_apply_new_auth(self):
+        git_auth.ConfigChanger(
+            mode=git_auth.ConfigMode.NEW_AUTH,
+            remote_url=
+            'https://chromium.googlesource.com/chromium/tools/depot_tools.git',
+        ).apply('/some/fake/dir')
+        want = {
+            '/some/fake/dir': {
+                'credential.https://chromium.googlesource.com/.helper':
+                ['', 'luci'],
+                'http.cookieFile': [''],
+            },
+        }
+        self.assertEqual(scm.GIT._dump_config_state(), want)
+
+    def test_apply_new_auth_sso(self):
+        git_auth.ConfigChanger(
+            mode=git_auth.ConfigMode.NEW_AUTH_SSO,
+            remote_url=
+            'https://chromium.googlesource.com/chromium/tools/depot_tools.git',
+        ).apply('/some/fake/dir')
+        want = {
+            '/some/fake/dir': {
+                'protocol.sso.allow': ['always'],
+                'url.sso://chromium/.insteadOf':
+                ['https://chromium.googlesource.com/'],
+                'http.cookieFile': [''],
+            },
+        }
+        self.assertEqual(scm.GIT._dump_config_state(), want)
+
+    def test_apply_no_auth(self):
+        git_auth.ConfigChanger(
+            mode=git_auth.ConfigMode.NO_AUTH,
+            remote_url=
+            'https://chromium.googlesource.com/chromium/tools/depot_tools.git',
+        ).apply('/some/fake/dir')
+        want = {
+            '/some/fake/dir': {},
+        }
+        self.assertEqual(scm.GIT._dump_config_state(), want)
+
+    def test_apply_chain_sso_new(self):
+        git_auth.ConfigChanger(
+            mode=git_auth.ConfigMode.NEW_AUTH_SSO,
+            remote_url=
+            'https://chromium.googlesource.com/chromium/tools/depot_tools.git',
+        ).apply('/some/fake/dir')
+        git_auth.ConfigChanger(
+            mode=git_auth.ConfigMode.NEW_AUTH,
+            remote_url=
+            'https://chromium.googlesource.com/chromium/tools/depot_tools.git',
+        ).apply('/some/fake/dir')
+        want = {
+            '/some/fake/dir': {
+                'credential.https://chromium.googlesource.com/.helper':
+                ['', 'luci'],
+                'http.cookieFile': [''],
+            },
+        }
+        self.assertEqual(scm.GIT._dump_config_state(), want)
+
+    def test_apply_chain_new_sso(self):
+        git_auth.ConfigChanger(
+            mode=git_auth.ConfigMode.NEW_AUTH,
+            remote_url=
+            'https://chromium.googlesource.com/chromium/tools/depot_tools.git',
+        ).apply('/some/fake/dir')
+        git_auth.ConfigChanger(
+            mode=git_auth.ConfigMode.NEW_AUTH_SSO,
+            remote_url=
+            'https://chromium.googlesource.com/chromium/tools/depot_tools.git',
+        ).apply('/some/fake/dir')
+        want = {
+            '/some/fake/dir': {
+                'protocol.sso.allow': ['always'],
+                'url.sso://chromium/.insteadOf':
+                ['https://chromium.googlesource.com/'],
+                'http.cookieFile': [''],
+            },
+        }
+        self.assertEqual(scm.GIT._dump_config_state(), want)
+
+    def test_apply_chain_new_no(self):
+        git_auth.ConfigChanger(
+            mode=git_auth.ConfigMode.NEW_AUTH,
+            remote_url=
+            'https://chromium.googlesource.com/chromium/tools/depot_tools.git',
+        ).apply('/some/fake/dir')
+        git_auth.ConfigChanger(
+            mode=git_auth.ConfigMode.NO_AUTH,
+            remote_url=
+            'https://chromium.googlesource.com/chromium/tools/depot_tools.git',
+        ).apply('/some/fake/dir')
+        want = {
+            '/some/fake/dir': {},
+        }
+        self.assertEqual(scm.GIT._dump_config_state(), want)
+
+    def test_apply_chain_sso_no(self):
+        git_auth.ConfigChanger(
+            mode=git_auth.ConfigMode.NEW_AUTH_SSO,
+            remote_url=
+            'https://chromium.googlesource.com/chromium/tools/depot_tools.git',
+        ).apply('/some/fake/dir')
+        git_auth.ConfigChanger(
+            mode=git_auth.ConfigMode.NO_AUTH,
+            remote_url=
+            'https://chromium.googlesource.com/chromium/tools/depot_tools.git',
+        ).apply('/some/fake/dir')
+        want = {
+            '/some/fake/dir': {},
+        }
+        self.assertEqual(scm.GIT._dump_config_state(), want)
+
+
+if __name__ == '__main__':
+    logging.basicConfig(
+        level=logging.DEBUG if '-v' in sys.argv else logging.ERROR)
+    unittest.main()