summaryrefslogtreecommitdiffstats
path: root/tests/test_git_trace2_event_log.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_git_trace2_event_log.py')
-rw-r--r--tests/test_git_trace2_event_log.py169
1 files changed, 169 insertions, 0 deletions
diff --git a/tests/test_git_trace2_event_log.py b/tests/test_git_trace2_event_log.py
new file mode 100644
index 00000000..3905630f
--- /dev/null
+++ b/tests/test_git_trace2_event_log.py
@@ -0,0 +1,169 @@
1# Copyright (C) 2020 The Android Open Source Project
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15"""Unittests for the git_trace2_event_log.py module."""
16
17import json
18import tempfile
19import unittest
20
21import git_trace2_event_log
22
23
24class EventLogTestCase(unittest.TestCase):
25 """TestCase for the EventLog module."""
26
27 PARENT_SID_KEY = 'GIT_TRACE2_PARENT_SID'
28 PARENT_SID_VALUE = 'parent_sid'
29 SELF_SID_REGEX = r'repo-\d+T\d+Z-.*'
30 FULL_SID_REGEX = r'^%s/%s' % (PARENT_SID_VALUE, SELF_SID_REGEX)
31
32 def setUp(self):
33 """Load the event_log module every time."""
34 self._event_log_module = None
35 # By default we initialize with the expected case where
36 # repo launches us (so GIT_TRACE2_PARENT_SID is set).
37 env = {
38 self.PARENT_SID_KEY: self.PARENT_SID_VALUE,
39 }
40 self._event_log_module = git_trace2_event_log.EventLog(env=env)
41 self._log_data = None
42
43 def verifyCommonKeys(self, log_entry, expected_event_name, full_sid=True):
44 """Helper function to verify common event log keys."""
45 self.assertIn('event', log_entry)
46 self.assertIn('sid', log_entry)
47 self.assertIn('thread', log_entry)
48 self.assertIn('time', log_entry)
49
50 # Do basic data format validation.
51 self.assertEqual(expected_event_name, log_entry['event'])
52 if full_sid:
53 self.assertRegex(log_entry['sid'], self.FULL_SID_REGEX)
54 else:
55 self.assertRegex(log_entry['sid'], self.SELF_SID_REGEX)
56 self.assertRegex(log_entry['time'], r'^\d+-\d+-\d+T\d+:\d+:\d+\.\d+Z$')
57
58 def readLog(self, log_path):
59 """Helper function to read log data into a list."""
60 log_data = []
61 with open(log_path, mode='rb') as f:
62 for line in f:
63 log_data.append(json.loads(line))
64 return log_data
65
66 def test_initial_state_with_parent_sid(self):
67 """Test initial state when 'GIT_TRACE2_PARENT_SID' is set by parent."""
68 self.assertRegex(self._event_log_module.full_sid, self.FULL_SID_REGEX)
69
70 def test_initial_state_no_parent_sid(self):
71 """Test initial state when 'GIT_TRACE2_PARENT_SID' is not set."""
72 # Setup an empty environment dict (no parent sid).
73 self._event_log_module = git_trace2_event_log.EventLog(env={})
74 self.assertRegex(self._event_log_module.full_sid, self.SELF_SID_REGEX)
75
76 def test_version_event(self):
77 """Test 'version' event data is valid.
78
79 Verify that the 'version' event is written even when no other
80 events are addded.
81
82 Expected event log:
83 <version event>
84 """
85 with tempfile.TemporaryDirectory(prefix='event_log_tests') as tempdir:
86 log_path = self._event_log_module.Write(path=tempdir)
87 self._log_data = self.readLog(log_path)
88
89 # A log with no added events should only have the version entry.
90 self.assertEqual(len(self._log_data), 1)
91 version_event = self._log_data[0]
92 self.verifyCommonKeys(version_event, expected_event_name='version')
93 # Check for 'version' event specific fields.
94 self.assertIn('evt', version_event)
95 self.assertIn('exe', version_event)
96
97 def test_start_event(self):
98 """Test and validate 'start' event data is valid.
99
100 Expected event log:
101 <version event>
102 <start event>
103 """
104 self._event_log_module.StartEvent()
105 with tempfile.TemporaryDirectory(prefix='event_log_tests') as tempdir:
106 log_path = self._event_log_module.Write(path=tempdir)
107 self._log_data = self.readLog(log_path)
108
109 self.assertEqual(len(self._log_data), 2)
110 start_event = self._log_data[1]
111 self.verifyCommonKeys(self._log_data[0], expected_event_name='version')
112 self.verifyCommonKeys(start_event, expected_event_name='start')
113 # Check for 'start' event specific fields.
114 self.assertIn('argv', start_event)
115 self.assertTrue(isinstance(start_event['argv'], list))
116
117 def test_exit_event_result_none(self):
118 """Test 'exit' event data is valid when result is None.
119
120 We expect None result to be converted to 0 in the exit event data.
121
122 Expected event log:
123 <version event>
124 <exit event>
125 """
126 self._event_log_module.ExitEvent(None)
127 with tempfile.TemporaryDirectory(prefix='event_log_tests') as tempdir:
128 log_path = self._event_log_module.Write(path=tempdir)
129 self._log_data = self.readLog(log_path)
130
131 self.assertEqual(len(self._log_data), 2)
132 exit_event = self._log_data[1]
133 self.verifyCommonKeys(self._log_data[0], expected_event_name='version')
134 self.verifyCommonKeys(exit_event, expected_event_name='exit')
135 # Check for 'exit' event specific fields.
136 self.assertIn('code', exit_event)
137 # 'None' result should convert to 0 (successful) return code.
138 self.assertEqual(exit_event['code'], 0)
139
140 def test_exit_event_result_integer(self):
141 """Test 'exit' event data is valid when result is an integer.
142
143 Expected event log:
144 <version event>
145 <exit event>
146 """
147 self._event_log_module.ExitEvent(2)
148 with tempfile.TemporaryDirectory(prefix='event_log_tests') as tempdir:
149 log_path = self._event_log_module.Write(path=tempdir)
150 self._log_data = self.readLog(log_path)
151
152 self.assertEqual(len(self._log_data), 2)
153 exit_event = self._log_data[1]
154 self.verifyCommonKeys(self._log_data[0], expected_event_name='version')
155 self.verifyCommonKeys(exit_event, expected_event_name='exit')
156 # Check for 'exit' event specific fields.
157 self.assertIn('code', exit_event)
158 self.assertEqual(exit_event['code'], 2)
159
160 # TODO(https://crbug.com/gerrit/13706): Add additional test coverage for
161 # Write() where:
162 # - path=None (using git config call)
163 # - path=<Non-String type> (raises TypeError)
164 # - path=<Non-Directory> (should return None)
165 # - tempfile.NamedTemporaryFile errors with FileExistsError (should return None)
166
167
168if __name__ == '__main__':
169 unittest.main()