1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3# Copyright 2019 The Chromium OS Authors. All rights reserved. 4# Use of this source code is governed by a BSD-style license that can be 5# found in the LICENSE file. 6 7"""Tests for post_process_orderfile.py.""" 8 9from __future__ import division, print_function 10 11import os 12import shutil 13import tempfile 14import unittest 15 16import post_process_orderfile 17 18 19def _write_nm_file(name): 20 with open(name, 'w') as out: 21 out.write('000001 s NotAValidSymbol1\n') 22 out.write('000002 S NotAValidSymbol2\n') 23 out.write('000010 t FirstValidSymbol\n') 24 out.write('000012 t \n') 25 out.write('000020 T Builtins_SecondValidSymbol\n') 26 out.write('000030 T $SymbolToIgnore\n') 27 out.write('000036 T Builtins_LastValidSymbol\n') 28 29 30def _write_orderfile(name): 31 with open(name, 'w') as out: 32 out.write('SymbolOrdered1\n') 33 out.write('SymbolOrdered2\n') 34 35 36def _cleanup(files): 37 for f in files: 38 shutil.rmtree(f, ignore_errors=True) 39 40 41class Tests(unittest.TestCase): 42 """All of our tests for post_process_orderfile.""" 43 44 # pylint: disable=protected-access 45 def test__parse_nm_output(self): 46 temp_dir = tempfile.mkdtemp() 47 self.addCleanup(_cleanup, [temp_dir]) 48 chrome_nm_file = os.path.join(temp_dir, 'chrome_nm.txt') 49 _write_nm_file(chrome_nm_file) 50 with open(chrome_nm_file) as f: 51 results = list(post_process_orderfile._parse_nm_output(f)) 52 self.assertEqual(len(results), 3) 53 self.assertIn('FirstValidSymbol', results) 54 self.assertIn('Builtins_SecondValidSymbol', results) 55 self.assertIn('Builtins_LastValidSymbol', results) 56 57 def test__remove_duplicates(self): 58 duplicates = ['marker1', 'marker2', 'marker3', 'marker2', 'marker1'] 59 results = list(post_process_orderfile._remove_duplicates(duplicates)) 60 self.assertEqual(results, ['marker1', 'marker2', 'marker3']) 61 62 def test_run(self): 63 temp_dir = tempfile.mkdtemp() 64 self.addCleanup(_cleanup, [temp_dir]) 65 orderfile_input = os.path.join(temp_dir, 'orderfile.in.txt') 66 orderfile_output = os.path.join(temp_dir, 'orderfile.out.txt') 67 chrome_nm_file = os.path.join(temp_dir, 'chrome_nm.txt') 68 _write_nm_file(chrome_nm_file) 69 _write_orderfile(orderfile_input) 70 with open(orderfile_input) as in_stream, \ 71 open(orderfile_output, 'w') as out_stream, \ 72 open(chrome_nm_file) as chrome_nm_stream: 73 post_process_orderfile.run(in_stream, chrome_nm_stream, out_stream) 74 75 with open(orderfile_output) as check: 76 results = [x.strip() for x in check.readlines()] 77 self.assertEqual( 78 results, 79 [ 80 # Start marker should be put first. 81 'chrome_begin_ordered_code', 82 # Symbols in orderfile come next. 83 'SymbolOrdered1', 84 'SymbolOrdered2', 85 # Builtin functions in chrome_nm come next, and sorted. 86 'Builtins_LastValidSymbol', 87 'Builtins_SecondValidSymbol', 88 # Last symbol should be end marker. 89 'chrome_end_ordered_code' 90 ]) 91 92 93if __name__ == '__main__': 94 unittest.main() 95