123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304 |
- import pytest
- from unittest.mock import Mock
- from unittest.mock import call
- from checksymbolslib.test_util import assert_db_calls
- import checksymbolslib.makefile as m
- handle_eval = [
- ('generic',
- 'package/foo/foo.mk',
- 5,
- '$(eval $(generic-package))',
- {'add_symbol_usage': [call('BR2_PACKAGE_FOO', 'package/foo/foo.mk', 5)]}),
- ('ignore trailing whitespace',
- 'package/foo/foo.mk',
- 5,
- '$(eval $(generic-package)) ',
- {'add_symbol_usage': [call('BR2_PACKAGE_FOO', 'package/foo/foo.mk', 5)]}),
- ('ignore indent',
- 'package/foo/foo.mk',
- 5,
- '\t$(eval $(generic-package))',
- {'add_symbol_usage': [call('BR2_PACKAGE_FOO', 'package/foo/foo.mk', 5)]}),
- ('rootfs',
- 'fs/foo/foo.mk',
- 5,
- '$(eval $(rootfs))',
- {'add_symbol_usage': [
- call('BR2_TARGET_ROOTFS_FOO', 'fs/foo/foo.mk', 5),
- call('BR2_TARGET_ROOTFS_FOO_BZIP2', 'fs/foo/foo.mk', 5),
- call('BR2_TARGET_ROOTFS_FOO_GZIP', 'fs/foo/foo.mk', 5),
- call('BR2_TARGET_ROOTFS_FOO_LZ4', 'fs/foo/foo.mk', 5),
- call('BR2_TARGET_ROOTFS_FOO_LZMA', 'fs/foo/foo.mk', 5),
- call('BR2_TARGET_ROOTFS_FOO_LZO', 'fs/foo/foo.mk', 5),
- call('BR2_TARGET_ROOTFS_FOO_XZ', 'fs/foo/foo.mk', 5),
- call('BR2_TARGET_ROOTFS_FOO_ZSTD', 'fs/foo/foo.mk', 5)]}),
- ('kernel module',
- 'package/foo/foo.mk',
- 6,
- '$(eval $(kernel-module))',
- {'add_symbol_usage': [call('BR2_PACKAGE_FOO', 'package/foo/foo.mk', 6)]}),
- ('not an eval for package infra',
- 'docs/manual/manual.mk',
- 10,
- '$(eval $(call asciidoc-document))',
- {}),
- ('linux',
- 'linux/linux.mk',
- 617,
- '$(eval $(kconfig-package))',
- {'add_symbol_usage': [call('BR2_LINUX_KERNEL', 'linux/linux.mk', 617)]}),
- ('virtual toolchain',
- 'toolchain/toolchain-external/toolchain-external.mk',
- 18,
- '$(eval $(virtual-package))',
- {'add_symbol_usage': [
- call('BR2_PACKAGE_PROVIDES_TOOLCHAIN_EXTERNAL', 'toolchain/toolchain-external/toolchain-external.mk', 18),
- call('BR2_PACKAGE_HAS_TOOLCHAIN_EXTERNAL', 'toolchain/toolchain-external/toolchain-external.mk', 18),
- call('BR2_TOOLCHAIN_EXTERNAL', 'toolchain/toolchain-external/toolchain-external.mk', 18)],
- 'add_symbol_virtual': [call('BR2_TOOLCHAIN_EXTERNAL', 'toolchain/toolchain-external/toolchain-external.mk', 18)]}),
- ('virtual package',
- 'package/foo/foo.mk',
- 18,
- '$(eval $(virtual-package))',
- {'add_symbol_usage': [
- call('BR2_PACKAGE_PROVIDES_FOO', 'package/foo/foo.mk', 18),
- call('BR2_PACKAGE_HAS_FOO', 'package/foo/foo.mk', 18),
- call('BR2_PACKAGE_FOO', 'package/foo/foo.mk', 18)],
- 'add_symbol_virtual': [call('BR2_PACKAGE_FOO', 'package/foo/foo.mk', 18)]}),
- ('host virtual package',
- 'package/foo/foo.mk',
- 18,
- '$(eval $(host-virtual-package))',
- {'add_symbol_usage': [
- call('BR2_PACKAGE_PROVIDES_HOST_FOO', 'package/foo/foo.mk', 18),
- call('BR2_PACKAGE_HAS_HOST_FOO', 'package/foo/foo.mk', 18),
- call('BR2_PACKAGE_HOST_FOO', 'package/foo/foo.mk', 18)]}),
- ('host generic package',
- 'package/foo/foo.mk',
- 18,
- '$(eval $(host-package))',
- {'add_symbol_usage': [call('BR2_PACKAGE_HOST_FOO', 'package/foo/foo.mk', 18)]}),
- ('boot package',
- 'boot/foo/foo.mk',
- 18,
- '$(eval $(generic-package))',
- {'add_symbol_usage': [call('BR2_TARGET_FOO', 'boot/foo/foo.mk', 18)]}),
- ('toolchain package',
- 'toolchain/foo/foo.mk',
- 18,
- '$(eval $(generic-package))',
- {'add_symbol_usage': [call('BR2_FOO', 'toolchain/foo/foo.mk', 18)]}),
- ('generic package',
- 'package/foo/foo.mk',
- 18,
- '$(eval $(generic-package))',
- {'add_symbol_usage': [call('BR2_PACKAGE_FOO', 'package/foo/foo.mk', 18)]}),
- ('cmake package',
- 'package/foo/foo.mk',
- 18,
- '$(eval $(cmake-package))',
- {'add_symbol_usage': [call('BR2_PACKAGE_FOO', 'package/foo/foo.mk', 18)]}),
- ]
- @pytest.mark.parametrize('testname,filename,lineno,line,expected_calls', handle_eval)
- def test_handle_eval(testname, filename, lineno, line, expected_calls):
- db = Mock()
- m.handle_eval(db, filename, lineno, line)
- assert_db_calls(db, expected_calls)
- handle_definition = [
- ('legacy attribution',
- 'Makefile.legacy',
- 9,
- 'BR2_LEGACY_FOO := foo',
- True,
- {'add_symbol_legacy_definition': [call('BR2_LEGACY_FOO', 'Makefile.legacy', 9)]}),
- ('attribution 1',
- 'Makefile',
- 9,
- 'BR2_FOO ?= foo',
- False,
- {'add_symbol_definition': [call('BR2_FOO', 'Makefile', 9)]}),
- ('attribution 2',
- 'Makefile',
- 9,
- 'BR2_FOO = $(BR2_BAR)',
- False,
- {'add_symbol_definition': [call('BR2_FOO', 'Makefile', 9)]}),
- ('attribution 3',
- 'Makefile',
- 9,
- 'BR2_FOO := foo',
- False,
- {'add_symbol_definition': [call('BR2_FOO', 'Makefile', 9)]}),
- ('normal export',
- 'Makefile',
- 90,
- 'export BR2_FOO',
- False,
- {'add_symbol_definition': [call('BR2_FOO', 'Makefile', 90)]}),
- ('legacy export',
- 'Makefile.legacy',
- 90,
- 'export BR2_FOO',
- True,
- {'add_symbol_legacy_definition': [call('BR2_FOO', 'Makefile.legacy', 90)]}),
- ]
- @pytest.mark.parametrize('testname,filename,lineno,line,legacy,expected_calls', handle_definition)
- def test_handle_definition(testname, filename, lineno, line, legacy, expected_calls):
- db = Mock()
- m.handle_definition(db, filename, lineno, line, legacy)
- assert_db_calls(db, expected_calls)
- handle_usage = [
- ('legacy',
- 'Makefile.legacy',
- 8,
- 'ifeq ($(BR2_LEGACY),y)',
- True,
- {'add_symbol_usage_in_legacy': [call('BR2_LEGACY', 'Makefile.legacy', 8)]}),
- ('attribution',
- 'Makefile',
- 9,
- 'BR2_FOO = $(BR2_BAR)',
- False,
- {'add_symbol_usage': [call('BR2_BAR', 'Makefile', 9)]}),
- ('host virtual package',
- 'package/foo/foo.mk',
- 18,
- '$(eval $(host-virtual-package))',
- False,
- {'add_symbol_usage': [
- call('BR2_PACKAGE_PROVIDES_HOST_FOO', 'package/foo/foo.mk', 18),
- call('BR2_PACKAGE_HAS_HOST_FOO', 'package/foo/foo.mk', 18),
- call('BR2_PACKAGE_HOST_FOO', 'package/foo/foo.mk', 18)]}),
- ]
- @pytest.mark.parametrize('testname,filename,lineno,line,legacy,expected_calls', handle_usage)
- def test_handle_usage(testname, filename, lineno, line, legacy, expected_calls):
- db = Mock()
- m.handle_usage(db, filename, lineno, line, legacy)
- assert_db_calls(db, expected_calls)
- populate_db = [
- ('legacy',
- 'Makefile.legacy',
- [[8, 'ifeq ($(BR2_LEGACY),y)'],
- [9, 'BR2_LEGACY_FOO := foo'],
- [34, 'ifneq ($(BUILDROOT_CONFIG),$(BR2_CONFIG))']],
- {'add_symbol_usage_in_legacy': [
- call('BR2_LEGACY', 'Makefile.legacy', 8),
- call('BR2_CONFIG', 'Makefile.legacy', 34)],
- 'add_symbol_legacy_definition': [call('BR2_LEGACY_FOO', 'Makefile.legacy', 9)]}),
- ('attribution',
- 'Makefile',
- [[9, 'BR2_FOO = $(BR2_BAR)']],
- {'add_symbol_definition': [call('BR2_FOO', 'Makefile', 9)],
- 'add_symbol_usage': [call('BR2_BAR', 'Makefile', 9)]}),
- ('legacy attribution',
- 'Makefile.legacy',
- [[9, 'BR2_FOO = $(BR2_BAR)']],
- {'add_symbol_legacy_definition': [call('BR2_FOO', 'Makefile.legacy', 9)],
- 'add_symbol_usage_in_legacy': [call('BR2_BAR', 'Makefile.legacy', 9)]}),
- ('generic',
- 'package/foo/foo.mk',
- [[3, 'ifeq ($(BR2_PACKAGE_FOO_BAR):$(BR2_BAR),y:)'],
- [4, 'export BR2_PACKAGE_FOO_BAZ'],
- [5, '$(eval $(generic-package))']],
- {'add_symbol_usage': [
- call('BR2_PACKAGE_FOO_BAR', 'package/foo/foo.mk', 3),
- call('BR2_BAR', 'package/foo/foo.mk', 3),
- call('BR2_PACKAGE_FOO', 'package/foo/foo.mk', 5)],
- 'add_symbol_definition': [call('BR2_PACKAGE_FOO_BAZ', 'package/foo/foo.mk', 4)]}),
- ('rootfs',
- 'fs/foo/foo.mk',
- [[4, 'ifeq ($(BR2_TARGET_ROOTFS_FOO_LZ4),y)'],
- [5, '$(eval $(rootfs))']],
- {'add_symbol_usage': [
- call('BR2_TARGET_ROOTFS_FOO', 'fs/foo/foo.mk', 5),
- call('BR2_TARGET_ROOTFS_FOO_BZIP2', 'fs/foo/foo.mk', 5),
- call('BR2_TARGET_ROOTFS_FOO_GZIP', 'fs/foo/foo.mk', 5),
- call('BR2_TARGET_ROOTFS_FOO_LZ4', 'fs/foo/foo.mk', 4),
- call('BR2_TARGET_ROOTFS_FOO_LZ4', 'fs/foo/foo.mk', 5),
- call('BR2_TARGET_ROOTFS_FOO_LZMA', 'fs/foo/foo.mk', 5),
- call('BR2_TARGET_ROOTFS_FOO_LZO', 'fs/foo/foo.mk', 5),
- call('BR2_TARGET_ROOTFS_FOO_XZ', 'fs/foo/foo.mk', 5),
- call('BR2_TARGET_ROOTFS_FOO_ZSTD', 'fs/foo/foo.mk', 5)]}),
- ]
- @pytest.mark.parametrize('testname,filename,file_content,expected_calls', populate_db)
- def test_populate_db(testname, filename, file_content, expected_calls):
- db = Mock()
- m.populate_db(db, filename, file_content)
- assert_db_calls(db, expected_calls)
- check_filename = [
- ('arch/arch.mk.riscv',
- 'arch/arch.mk.riscv',
- True),
- ('boot/lpc32xxcdl/lpc32xxcdl.mk',
- 'boot/lpc32xxcdl/lpc32xxcdl.mk',
- True),
- ('fs/cramfs/cramfs.mk',
- 'fs/cramfs/cramfs.mk',
- True),
- ('linux/linux-ext-fbtft.mk',
- 'linux/linux-ext-fbtft.mk',
- True),
- ('package/ace/ace.mk',
- 'package/ace/ace.mk',
- True),
- ('package/linux-tools/linux-tool-hv.mk.in',
- 'package/linux-tools/linux-tool-hv.mk.in',
- True),
- ('package/pkg-generic.mk',
- 'package/pkg-generic.mk',
- True),
- ('package/x11r7/xlib_libXt/xlib_libXt.mk',
- 'package/x11r7/xlib_libXt/xlib_libXt.mk',
- True),
- ('support/dependencies/check-host-make.mk',
- 'support/dependencies/check-host-make.mk',
- True),
- ('toolchain/toolchain-external/toolchain-external-arm-aarch64-be/toolchain-external-arm-aarch64-be.mk',
- 'toolchain/toolchain-external/toolchain-external-arm-aarch64-be/toolchain-external-arm-aarch64-be.mk',
- True),
- ('Makefile.legacy',
- 'Makefile.legacy',
- True),
- ('boot/common.mk',
- 'boot/common.mk',
- True),
- ('fs/common.mk',
- 'fs/common.mk',
- True),
- ('Makefile',
- 'Makefile',
- True),
- ('package/Makefile.in',
- 'package/Makefile.in',
- True),
- ('Config.in',
- 'Config.in',
- False),
- ('package/foo/0001-Makefile.patch',
- 'package/foo/0001-Makefile.patch',
- False),
- ]
- @pytest.mark.parametrize('testname,filename,expected', check_filename)
- def test_check_filename(testname, filename, expected):
- symbols = m.check_filename(filename)
- assert symbols == expected
|