mirror of
https://gerrit.googlesource.com/git-repo
synced 2025-06-26 20:17:52 +00:00
Update errors to extend BaseRepoError
In order to better analyze and track repo errors, repo command failures need to be tied to specific errors in repo source code. Additionally a new GitCommandError was added to differentiate between general git related errors to failed git commands. Git commands that opt into verification will raise a GitCommandError if the command failed. The first step in this process is a general error refactoring Bug: b/293344017 Change-Id: I46944b1825ce892757c8dd3f7e2fab7e460760c0 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/380994 Commit-Queue: Jason Chang <jasonnc@google.com> Reviewed-by: Aravind Vasudevan <aravindvasudev@google.com> Tested-by: Jason Chang <jasonnc@google.com> Reviewed-by: Joanna Wang <jojwang@google.com>
This commit is contained in:
@ -19,6 +19,15 @@ import pickle
|
||||
import unittest
|
||||
|
||||
import error
|
||||
import project
|
||||
import git_command
|
||||
from subcmds import all_modules
|
||||
|
||||
imports = all_modules + [
|
||||
error,
|
||||
project,
|
||||
git_command,
|
||||
]
|
||||
|
||||
|
||||
class PickleTests(unittest.TestCase):
|
||||
@ -26,10 +35,11 @@ class PickleTests(unittest.TestCase):
|
||||
|
||||
def getExceptions(self):
|
||||
"""Return all our custom exceptions."""
|
||||
for name in dir(error):
|
||||
cls = getattr(error, name)
|
||||
if isinstance(cls, type) and issubclass(cls, Exception):
|
||||
yield cls
|
||||
for entry in imports:
|
||||
for name in dir(entry):
|
||||
cls = getattr(entry, name)
|
||||
if isinstance(cls, type) and issubclass(cls, Exception):
|
||||
yield cls
|
||||
|
||||
def testExceptionLookup(self):
|
||||
"""Make sure our introspection logic works."""
|
||||
|
@ -16,6 +16,7 @@
|
||||
|
||||
import re
|
||||
import os
|
||||
import subprocess
|
||||
import unittest
|
||||
|
||||
try:
|
||||
@ -65,6 +66,56 @@ class GitCommandTest(unittest.TestCase):
|
||||
)
|
||||
|
||||
|
||||
class GitCommandWaitTest(unittest.TestCase):
|
||||
"""Tests the GitCommand class .Wait()"""
|
||||
|
||||
def setUp(self):
|
||||
class MockPopen(object):
|
||||
rc = 0
|
||||
|
||||
def communicate(
|
||||
self, input: str = None, timeout: float = None
|
||||
) -> [str, str]:
|
||||
"""Mock communicate fn."""
|
||||
return ["", ""]
|
||||
|
||||
def wait(self, timeout=None):
|
||||
return self.rc
|
||||
|
||||
self.popen = popen = MockPopen()
|
||||
|
||||
def popen_mock(*args, **kwargs):
|
||||
return popen
|
||||
|
||||
def realpath_mock(val):
|
||||
return val
|
||||
|
||||
mock.patch.object(subprocess, "Popen", side_effect=popen_mock).start()
|
||||
|
||||
mock.patch.object(
|
||||
os.path, "realpath", side_effect=realpath_mock
|
||||
).start()
|
||||
|
||||
def tearDown(self):
|
||||
mock.patch.stopall()
|
||||
|
||||
def test_raises_when_verify_non_zero_result(self):
|
||||
self.popen.rc = 1
|
||||
r = git_command.GitCommand(None, ["status"], verify_command=True)
|
||||
with self.assertRaises(git_command.GitCommandError):
|
||||
r.Wait()
|
||||
|
||||
def test_returns_when_no_verify_non_zero_result(self):
|
||||
self.popen.rc = 1
|
||||
r = git_command.GitCommand(None, ["status"], verify_command=False)
|
||||
self.assertEqual(1, r.Wait())
|
||||
|
||||
def test_default_returns_non_zero_result(self):
|
||||
self.popen.rc = 1
|
||||
r = git_command.GitCommand(None, ["status"])
|
||||
self.assertEqual(1, r.Wait())
|
||||
|
||||
|
||||
class GitCallUnitTest(unittest.TestCase):
|
||||
"""Tests the _GitCall class (via git_command.git)."""
|
||||
|
||||
|
Reference in New Issue
Block a user