1*6777b538SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*6777b538SAndroid Build Coastguard Worker# Copyright 2023 The Chromium Authors 3*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 4*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 5*6777b538SAndroid Build Coastguard Worker 6*6777b538SAndroid Build Coastguard Workerimport os 7*6777b538SAndroid Build Coastguard Workerimport pathlib 8*6777b538SAndroid Build Coastguard Workerimport shutil 9*6777b538SAndroid Build Coastguard Workerimport sys 10*6777b538SAndroid Build Coastguard Workerimport tempfile 11*6777b538SAndroid Build Coastguard Workerimport time 12*6777b538SAndroid Build Coastguard Workerimport unittest 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Workerimport action_helpers 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Workerclass ActionHelpersTest(unittest.TestCase): 18*6777b538SAndroid Build Coastguard Worker def test_atomic_output(self): 19*6777b538SAndroid Build Coastguard Worker tmp_file = pathlib.Path(tempfile.mktemp()) 20*6777b538SAndroid Build Coastguard Worker tmp_file.write_text('test') 21*6777b538SAndroid Build Coastguard Worker try: 22*6777b538SAndroid Build Coastguard Worker # Test that same contents does not change mtime. 23*6777b538SAndroid Build Coastguard Worker orig_mtime = os.path.getmtime(tmp_file) 24*6777b538SAndroid Build Coastguard Worker with action_helpers.atomic_output(str(tmp_file), 'wt') as af: 25*6777b538SAndroid Build Coastguard Worker time.sleep(.01) 26*6777b538SAndroid Build Coastguard Worker af.write('test') 27*6777b538SAndroid Build Coastguard Worker 28*6777b538SAndroid Build Coastguard Worker self.assertEqual(os.path.getmtime(tmp_file), orig_mtime) 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Worker # Test that contents is written. 31*6777b538SAndroid Build Coastguard Worker with action_helpers.atomic_output(str(tmp_file), 'wt') as af: 32*6777b538SAndroid Build Coastguard Worker af.write('test2') 33*6777b538SAndroid Build Coastguard Worker self.assertEqual(tmp_file.read_text(), 'test2') 34*6777b538SAndroid Build Coastguard Worker self.assertNotEqual(os.path.getmtime(tmp_file), orig_mtime) 35*6777b538SAndroid Build Coastguard Worker finally: 36*6777b538SAndroid Build Coastguard Worker tmp_file.unlink() 37*6777b538SAndroid Build Coastguard Worker 38*6777b538SAndroid Build Coastguard Worker def test_parse_gn_list(self): 39*6777b538SAndroid Build Coastguard Worker def test(value, expected): 40*6777b538SAndroid Build Coastguard Worker self.assertEqual(action_helpers.parse_gn_list(value), expected) 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker test(None, []) 43*6777b538SAndroid Build Coastguard Worker test('', []) 44*6777b538SAndroid Build Coastguard Worker test('asdf', ['asdf']) 45*6777b538SAndroid Build Coastguard Worker test('["one"]', ['one']) 46*6777b538SAndroid Build Coastguard Worker test(['["one"]', '["two"]'], ['one', 'two']) 47*6777b538SAndroid Build Coastguard Worker test(['["one", "two"]', '["three"]'], ['one', 'two', 'three']) 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Worker def test_write_depfile(self): 50*6777b538SAndroid Build Coastguard Worker tmp_file = pathlib.Path(tempfile.mktemp()) 51*6777b538SAndroid Build Coastguard Worker try: 52*6777b538SAndroid Build Coastguard Worker 53*6777b538SAndroid Build Coastguard Worker def capture_output(inputs): 54*6777b538SAndroid Build Coastguard Worker action_helpers.write_depfile(str(tmp_file), 'output', inputs) 55*6777b538SAndroid Build Coastguard Worker return tmp_file.read_text() 56*6777b538SAndroid Build Coastguard Worker 57*6777b538SAndroid Build Coastguard Worker self.assertEqual(capture_output(None), 'output: \n') 58*6777b538SAndroid Build Coastguard Worker self.assertEqual(capture_output([]), 'output: \n') 59*6777b538SAndroid Build Coastguard Worker self.assertEqual(capture_output(['a']), 'output: \\\n a\n') 60*6777b538SAndroid Build Coastguard Worker # Check sorted. 61*6777b538SAndroid Build Coastguard Worker self.assertEqual(capture_output(['b', 'a']), 'output: \\\n a \\\n b\n') 62*6777b538SAndroid Build Coastguard Worker # Check converts to forward slashes. 63*6777b538SAndroid Build Coastguard Worker self.assertEqual(capture_output(['a', os.path.join('b', 'c')]), 64*6777b538SAndroid Build Coastguard Worker 'output: \\\n a \\\n b/c\n') 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Worker # Arg should be a list. 67*6777b538SAndroid Build Coastguard Worker with self.assertRaises(AssertionError): 68*6777b538SAndroid Build Coastguard Worker capture_output('a') 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard Worker # Do not use depfile itself as an output. 71*6777b538SAndroid Build Coastguard Worker with self.assertRaises(AssertionError): 72*6777b538SAndroid Build Coastguard Worker capture_output([str(tmp_file)]) 73*6777b538SAndroid Build Coastguard Worker 74*6777b538SAndroid Build Coastguard Worker # Do not use absolute paths. 75*6777b538SAndroid Build Coastguard Worker with self.assertRaises(AssertionError): 76*6777b538SAndroid Build Coastguard Worker capture_output([os.path.sep + 'foo']) 77*6777b538SAndroid Build Coastguard Worker 78*6777b538SAndroid Build Coastguard Worker # Do not use absolute paths (output path). 79*6777b538SAndroid Build Coastguard Worker with self.assertRaises(AssertionError): 80*6777b538SAndroid Build Coastguard Worker action_helpers.write_depfile(str(tmp_file), '/output', []) 81*6777b538SAndroid Build Coastguard Worker 82*6777b538SAndroid Build Coastguard Worker finally: 83*6777b538SAndroid Build Coastguard Worker tmp_file.unlink() 84*6777b538SAndroid Build Coastguard Worker 85*6777b538SAndroid Build Coastguard Worker 86*6777b538SAndroid Build Coastguard Workerif __name__ == '__main__': 87*6777b538SAndroid Build Coastguard Worker unittest.main() 88