summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--git_trace2_event_log.py44
-rw-r--r--tests/test_git_trace2_event_log.py29
2 files changed, 52 insertions, 21 deletions
diff --git a/git_trace2_event_log.py b/git_trace2_event_log.py
index 4a8e0347..dfbded15 100644
--- a/git_trace2_event_log.py
+++ b/git_trace2_event_log.py
@@ -132,6 +132,30 @@ class EventLog(object):
132 exit_event['code'] = result 132 exit_event['code'] = result
133 self._log.append(exit_event) 133 self._log.append(exit_event)
134 134
135 def _GetEventTargetPath(self):
136 """Get the 'trace2.eventtarget' path from git configuration.
137
138 Returns:
139 path: git config's 'trace2.eventtarget' path if it exists, or None
140 """
141 path = None
142 cmd = ['config', '--get', 'trace2.eventtarget']
143 # TODO(https://crbug.com/gerrit/13706): Use GitConfig when it supports
144 # system git config variables.
145 p = GitCommand(None, cmd, capture_stdout=True, capture_stderr=True,
146 bare=True)
147 retval = p.Wait()
148 if retval == 0:
149 # Strip trailing carriage-return in path.
150 path = p.stdout.rstrip('\n')
151 elif retval != 1:
152 # `git config --get` is documented to produce an exit status of `1` if
153 # the requested variable is not present in the configuration. Report any
154 # other return value as an error.
155 print("repo: error: 'git config --get' call failed with return code: %r, stderr: %r" % (
156 retval, p.stderr), file=sys.stderr)
157 return path
158
135 def Write(self, path=None): 159 def Write(self, path=None):
136 """Writes the log out to a file. 160 """Writes the log out to a file.
137 161
@@ -150,21 +174,11 @@ class EventLog(object):
150 log_path = None 174 log_path = None
151 # If no logging path is specified, get the path from 'trace2.eventtarget'. 175 # If no logging path is specified, get the path from 'trace2.eventtarget'.
152 if path is None: 176 if path is None:
153 cmd = ['config', '--get', 'trace2.eventtarget'] 177 path = self._GetEventTargetPath()
154 # TODO(https://crbug.com/gerrit/13706): Use GitConfig when it supports 178
155 # system git config variables. 179 # If no logging path is specified, exit.
156 p = GitCommand(None, cmd, capture_stdout=True, capture_stderr=True, 180 if path is None:
157 bare=True) 181 return None
158 retval = p.Wait()
159 if retval == 0:
160 # Strip trailing carriage-return in path.
161 path = p.stdout.rstrip('\n')
162 elif retval != 1:
163 # `git config --get` is documented to produce an exit status of `1` if
164 # the requested variable is not present in the configuration. Report any
165 # other return value as an error.
166 print("repo: error: 'git config --get' call failed with return code: %r, stderr: %r" % (
167 retval, p.stderr), file=sys.stderr)
168 182
169 if isinstance(path, str): 183 if isinstance(path, str):
170 # Get absolute path. 184 # Get absolute path.
diff --git a/tests/test_git_trace2_event_log.py b/tests/test_git_trace2_event_log.py
index 3905630f..686802ea 100644
--- a/tests/test_git_trace2_event_log.py
+++ b/tests/test_git_trace2_event_log.py
@@ -15,8 +15,10 @@
15"""Unittests for the git_trace2_event_log.py module.""" 15"""Unittests for the git_trace2_event_log.py module."""
16 16
17import json 17import json
18import os
18import tempfile 19import tempfile
19import unittest 20import unittest
21from unittest import mock
20 22
21import git_trace2_event_log 23import git_trace2_event_log
22 24
@@ -157,12 +159,27 @@ class EventLogTestCase(unittest.TestCase):
157 self.assertIn('code', exit_event) 159 self.assertIn('code', exit_event)
158 self.assertEqual(exit_event['code'], 2) 160 self.assertEqual(exit_event['code'], 2)
159 161
160 # TODO(https://crbug.com/gerrit/13706): Add additional test coverage for 162 def test_write_with_filename(self):
161 # Write() where: 163 """Test Write() with a path to a file exits with None."""
162 # - path=None (using git config call) 164 self.assertIsNone(self._event_log_module.Write(path='path/to/file'))
163 # - path=<Non-String type> (raises TypeError) 165
164 # - path=<Non-Directory> (should return None) 166 def test_write_with_git_config(self):
165 # - tempfile.NamedTemporaryFile errors with FileExistsError (should return None) 167 """Test Write() uses the git config path when 'git config' call succeeds."""
168 with tempfile.TemporaryDirectory(prefix='event_log_tests') as tempdir:
169 with mock.patch.object(self._event_log_module,
170 '_GetEventTargetPath', return_value=tempdir):
171 self.assertEqual(os.path.dirname(self._event_log_module.Write()), tempdir)
172
173 def test_write_no_git_config(self):
174 """Test Write() with no git config variable present exits with None."""
175 with mock.patch.object(self._event_log_module,
176 '_GetEventTargetPath', return_value=None):
177 self.assertIsNone(self._event_log_module.Write())
178
179 def test_write_non_string(self):
180 """Test Write() with non-string type for |path| throws TypeError."""
181 with self.assertRaises(TypeError):
182 self._event_log_module.Write(path=1234)
166 183
167 184
168if __name__ == '__main__': 185if __name__ == '__main__':