• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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