Mike Frysinger | e58c0e2 | 2017-10-04 15:43:30 -0400 | [diff] [blame] | 1 | # -*- coding: utf-8 -*- |
Alex Deymo | 3cfb9cd | 2014-08-18 15:56:35 -0700 | [diff] [blame] | 2 | # Copyright 2014 The Chromium OS Authors. All rights reserved. |
| 3 | # Use of this source code is governed by a BSD-style license that can be |
| 4 | # found in the LICENSE file. |
| 5 | |
| 6 | """Unit tests for dep_tracker.py.""" |
| 7 | |
Mike Frysinger | 383367e | 2014-09-16 15:06:17 -0400 | [diff] [blame] | 8 | from __future__ import print_function |
| 9 | |
Alex Deymo | 3cfb9cd | 2014-08-18 15:56:35 -0700 | [diff] [blame] | 10 | import os |
Mike Frysinger | 03b983f | 2020-02-21 02:31:49 -0500 | [diff] [blame] | 11 | import sys |
Alex Deymo | 3cfb9cd | 2014-08-18 15:56:35 -0700 | [diff] [blame] | 12 | |
Alex Deymo | 3cfb9cd | 2014-08-18 15:56:35 -0700 | [diff] [blame] | 13 | from chromite.lib import cros_test_lib |
Alex Deymo | 365b10c | 2014-08-25 13:14:28 -0700 | [diff] [blame] | 14 | from chromite.lib import osutils |
Alex Deymo | 3cfb9cd | 2014-08-18 15:56:35 -0700 | [diff] [blame] | 15 | from chromite.lib import unittest_lib |
| 16 | from chromite.scripts import dep_tracker |
| 17 | |
Mike Frysinger | 03b983f | 2020-02-21 02:31:49 -0500 | [diff] [blame] | 18 | |
| 19 | assert sys.version_info >= (3, 6), 'This module requires Python 3.6+' |
| 20 | |
| 21 | |
Alex Deymo | 3cfb9cd | 2014-08-18 15:56:35 -0700 | [diff] [blame] | 22 | # Allow access private members for testing: |
Mike Frysinger | 27e21b7 | 2018-07-12 14:20:21 -0400 | [diff] [blame] | 23 | # pylint: disable=protected-access |
Alex Deymo | 3cfb9cd | 2014-08-18 15:56:35 -0700 | [diff] [blame] | 24 | |
| 25 | |
Mike Frysinger | 68b6504 | 2014-12-07 01:21:22 -0500 | [diff] [blame] | 26 | class MainTest(cros_test_lib.OutputTestCase): |
Alex Deymo | 3cfb9cd | 2014-08-18 15:56:35 -0700 | [diff] [blame] | 27 | """Tests for the main() function.""" |
| 28 | |
| 29 | def testHelp(self): |
| 30 | """Test that --help is functioning.""" |
Mike Frysinger | d6e2df0 | 2014-11-26 02:55:04 -0500 | [diff] [blame] | 31 | argv = ['--help'] |
Alex Deymo | 3cfb9cd | 2014-08-18 15:56:35 -0700 | [diff] [blame] | 32 | |
| 33 | with self.OutputCapturer() as output: |
| 34 | # Running with --help should exit with code==0. |
| 35 | self.AssertFuncSystemExitZero(dep_tracker.main, argv) |
| 36 | |
| 37 | # Verify that a message beginning with "usage: " was printed. |
| 38 | stdout = output.GetStdout() |
| 39 | self.assertTrue(stdout.startswith('usage: ')) |
| 40 | |
| 41 | |
| 42 | class DepTrackerTest(cros_test_lib.TempDirTestCase): |
| 43 | """Tests for the DepTracker() class.""" |
| 44 | |
| 45 | def testSimpleDep(self): |
| 46 | unittest_lib.BuildELF(os.path.join(self.tempdir, 'libabc.so'), |
| 47 | ['func_a', 'func_b', 'func_c']) |
| 48 | unittest_lib.BuildELF(os.path.join(self.tempdir, 'abc_main'), |
| 49 | undefined_symbols=['func_b'], |
| 50 | used_libs=['abc'], |
| 51 | executable=True) |
| 52 | dt = dep_tracker.DepTracker(self.tempdir) |
| 53 | dt.Init() |
| 54 | dt.ComputeELFFileDeps() |
| 55 | |
Mike Frysinger | 2d589a1 | 2019-08-25 14:15:12 -0400 | [diff] [blame] | 56 | self.assertEqual(sorted(dt._files.keys()), ['abc_main', 'libabc.so']) |
Alex Deymo | 3cfb9cd | 2014-08-18 15:56:35 -0700 | [diff] [blame] | 57 | |
Alex Deymo | 365b10c | 2014-08-25 13:14:28 -0700 | [diff] [blame] | 58 | def testFiletypeSet(self): |
| 59 | """Tests that the 'ftype' member is set for ELF files first.""" |
| 60 | unittest_lib.BuildELF(os.path.join(self.tempdir, 'libabc.so'), |
| 61 | ['func_a', 'func_b', 'func_c']) |
| 62 | osutils.WriteFile(os.path.join(self.tempdir, 'pyscript'), |
Mike Frysinger | 80de501 | 2019-08-01 14:10:53 -0400 | [diff] [blame] | 63 | '#!/usr/bin/python\nimport sys\nsys.exit(42)\n') |
Alex Deymo | 365b10c | 2014-08-25 13:14:28 -0700 | [diff] [blame] | 64 | dt = dep_tracker.DepTracker(self.tempdir) |
| 65 | dt.Init() |
| 66 | |
| 67 | # ComputeELFFileDeps() should compute the file type of ELF files so we |
| 68 | # don't need to parse them again. |
| 69 | dt.ComputeELFFileDeps() |
| 70 | self.assertTrue('ftype' in dt._files['libabc.so']) |
| 71 | self.assertFalse('ftype' in dt._files['pyscript']) |
| 72 | |
| 73 | # ComputeFileTypes() shold compute the file type of every file. |
| 74 | dt.ComputeFileTypes() |
| 75 | self.assertTrue('ftype' in dt._files['libabc.so']) |
| 76 | self.assertTrue('ftype' in dt._files['pyscript']) |