| #!/usr/bin/env python3 |
| # Copyright 2023 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import os |
| import pathlib |
| import shutil |
| import sys |
| import tempfile |
| import time |
| import unittest |
| |
| import action_helpers |
| |
| |
| class ActionHelpersTest(unittest.TestCase): |
| def test_atomic_output(self): |
| tmp_file = pathlib.Path(tempfile.mktemp()) |
| tmp_file.write_text('test') |
| try: |
| # Test that same contents does not change mtime. |
| orig_mtime = os.path.getmtime(tmp_file) |
| with action_helpers.atomic_output(str(tmp_file), 'wt') as af: |
| time.sleep(.01) |
| af.write('test') |
| |
| self.assertEqual(os.path.getmtime(tmp_file), orig_mtime) |
| |
| # Test that contents is written. |
| with action_helpers.atomic_output(str(tmp_file), 'wt') as af: |
| af.write('test2') |
| self.assertEqual(tmp_file.read_text(), 'test2') |
| self.assertNotEqual(os.path.getmtime(tmp_file), orig_mtime) |
| finally: |
| tmp_file.unlink() |
| |
| def test_parse_gn_list(self): |
| def test(value, expected): |
| self.assertEqual(action_helpers.parse_gn_list(value), expected) |
| |
| test(None, []) |
| test('', []) |
| test('asdf', ['asdf']) |
| test('["one"]', ['one']) |
| test(['["one"]', '["two"]'], ['one', 'two']) |
| test(['["one", "two"]', '["three"]'], ['one', 'two', 'three']) |
| |
| def test_write_depfile(self): |
| tmp_file = pathlib.Path(tempfile.mktemp()) |
| try: |
| |
| def capture_output(inputs): |
| action_helpers.write_depfile(str(tmp_file), 'output', inputs) |
| return tmp_file.read_text() |
| |
| self.assertEqual(capture_output(None), 'output: \n') |
| self.assertEqual(capture_output([]), 'output: \n') |
| self.assertEqual(capture_output(['a']), 'output: \\\n a\n') |
| # Check sorted. |
| self.assertEqual(capture_output(['b', 'a']), 'output: \\\n a \\\n b\n') |
| # Check converts to forward slashes. |
| self.assertEqual(capture_output(['a', os.path.join('b', 'c')]), |
| 'output: \\\n a \\\n b/c\n') |
| |
| # Arg should be a list. |
| with self.assertRaises(AssertionError): |
| capture_output('a') |
| |
| # Do not use depfile itself as an output. |
| with self.assertRaises(AssertionError): |
| capture_output([str(tmp_file)]) |
| |
| # Do not use absolute paths. |
| with self.assertRaises(AssertionError): |
| capture_output([os.path.sep + 'foo']) |
| |
| # Do not use absolute paths (output path). |
| with self.assertRaises(AssertionError): |
| action_helpers.write_depfile(str(tmp_file), '/output', []) |
| |
| finally: |
| tmp_file.unlink() |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |