kumquat-buildroot/utils/checkpackagelib/test_lib_config.py
Ricardo Martincoski fc254881e6 utils/checkpackagelib: add unit tests
So anyone willing to contribute to check-package can run all tests in
less than 1 second by using:
$ python3 -m pytest -v utils/checkpackagelib/

Most test cases are in the form:
@pytest.mark.parametrize('testname,filename,string,expected', function)
 - testname: a short description of the scenario tested, added in order
   to improve readability of the log when some tests fail
 - filename: the filename the check-package function being tested thinks
   it is testing
 - string: the content of the file being sent to the function under test
 - expected: all expected warnings that a given function from
   check-package should generate for a given file named filename and
   with string as its content.

Signed-off-by: Ricardo Martincoski <ricardo.martincoski@gmail.com>
Cc: Arnout Vandecappelle <arnout@mind.be>
Cc: Romain Naour <romain.naour@gmail.com>
Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
2022-02-06 15:35:19 +01:00

388 lines
14 KiB
Python

import pytest
import checkpackagelib.test_util as util
import checkpackagelib.lib_config as m
AttributesOrder = [
('good example',
'any',
'config BR2_PACKAGE_FOO\n'
'bool "foo"\n'
'default y\n'
'depends on BR2_USE_BAR # runtime\n'
'select BR2_PACKAGE_BAZ\n'
'help\n'
'\t help text\n',
[]),
('depends before default',
'any',
'config BR2_PACKAGE_FOO\n'
'bool "foo"\n'
'depends on BR2_USE_BAR\n'
'default y\n',
[['any:4: attributes order: type, default, depends on, select, help (url#_config_files)',
'default y\n']]),
('select after help',
'any',
'config BR2_PACKAGE_FOO\n'
'bool "foo"\n'
'help\n'
'\t help text\n'
'select BR2_PACKAGE_BAZ\n',
[['any:5: attributes order: type, default, depends on, select, help (url#_config_files)',
'select BR2_PACKAGE_BAZ\n']]),
('string',
'any',
'config BR2_PACKAGE_FOO_PLUGINS\n'
'string "foo plugins"\n'
'default "all"\n',
[]),
('ignore tabs',
'any',
'config\tBR2_PACKAGE_FOO_PLUGINS\n'
'default\t"all"\n'
'string\t"foo plugins"\n',
[['any:3: attributes order: type, default, depends on, select, help (url#_config_files)',
'string\t"foo plugins"\n']]),
('choice',
'any',
'config BR2_PACKAGE_FOO\n'
'bool "foo"\n'
'if BR2_PACKAGE_FOO\n'
'\n'
'choice\n'
'prompt "type of foo"\n'
'default BR2_PACKAGE_FOO_STRING\n'
'\n'
'config BR2_PACKAGE_FOO_NONE\n'
'bool "none"\n'
'\n'
'config BR2_PACKAGE_FOO_STRING\n'
'bool "string"\n'
'\n'
'endchoice\n'
'\n'
'endif\n'
'\n',
[]),
('type after default',
'any',
'config BR2_PACKAGE_FOO\n'
'bool "foo"\n'
'if BR2_PACKAGE_FOO\n'
'\n'
'choice\n'
'default BR2_PACKAGE_FOO_STRING\n'
'prompt "type of foo"\n',
[['any:7: attributes order: type, default, depends on, select, help (url#_config_files)',
'prompt "type of foo"\n']]),
('menu',
'any',
'menuconfig BR2_PACKAGE_FOO\n'
'bool "foo"\n'
'help\n'
'\t help text\n'
'\t help text\n'
'\n'
'if BR2_PACKAGE_FOO\n'
'\n'
'menu "foo plugins"\n'
'config BR2_PACKAGE_FOO_COUNTER\n'
'bool "counter"\n'
'\n'
'endmenu\n'
'\n'
'endif\n',
[]),
]
@pytest.mark.parametrize('testname,filename,string,expected', AttributesOrder)
def test_AttributesOrder(testname, filename, string, expected):
warnings = util.check_file(m.AttributesOrder, filename, string)
assert warnings == expected
CommentsMenusPackagesOrder = [
('top menu (good)',
'package/Config.in',
'menu "Target packages"\n'
'source "package/busybox/Config.in"\n'
'source "package/skeleton/Config.in"\n',
[]),
('top menu (bad)',
'package/Config.in',
'source "package/skeleton/Config.in"\n'
'source "package/busybox/Config.in"\n',
[['package/Config.in:2: Packages in: The top level menu,\n'
' are not alphabetically ordered;\n'
" correct order: '-', '_', digits, capitals, lowercase;\n"
' first incorrect package: busybox',
'source "package/busybox/Config.in"\n']]),
('menu (bad)',
'package/Config.in',
'menu "Target packages"\n'
'source "package/skeleton/Config.in"\n'
'source "package/busybox/Config.in"\n',
[['package/Config.in:3: Packages in: menu "Target packages",\n'
' are not alphabetically ordered;\n'
" correct order: '-', '_', digits, capitals, lowercase;\n"
' first incorrect package: busybox',
'source "package/busybox/Config.in"\n']]),
('underscore (good)',
'package/Config.in.host',
'menu "Hardware handling"\n'
'menu "Firmware"\n'
'endmenu\n'
'source "package/usb_modeswitch/Config.in"\n'
'source "package/usbmount/Config.in"\n',
[]),
('underscore (bad)',
'package/Config.in.host',
'menu "Hardware handling"\n'
'menu "Firmware"\n'
'endmenu\n'
'source "package/usbmount/Config.in"\n'
'source "package/usb_modeswitch/Config.in"\n',
[['package/Config.in.host:5: Packages in: menu "Hardware handling",\n'
' are not alphabetically ordered;\n'
" correct order: '-', '_', digits, capitals, lowercase;\n"
' first incorrect package: usb_modeswitch',
'source "package/usb_modeswitch/Config.in"\n']]),
('ignore other files',
'any other file',
'menu "Hardware handling"\n'
'source "package/bbb/Config.in"\n'
'source "package/aaa/Config.in"\n',
[]),
('dash (bad)',
'package/Config.in',
'menu "packages"\n'
'source "package/a_a/Config.in"\n'
'source "package/a-a/Config.in"\n'
'source "package/a1a/Config.in"\n'
'source "package/aAa/Config.in"\n'
'source "package/aaa/Config.in"\n',
[['package/Config.in:3: Packages in: menu "packages",\n'
' are not alphabetically ordered;\n'
" correct order: '-', '_', digits, capitals, lowercase;\n"
' first incorrect package: a-a',
'source "package/a-a/Config.in"\n']]),
('underscore (bad)',
'package/Config.in',
'menu "packages"\n'
'source "package/a-a/Config.in"\n'
'source "package/a1a/Config.in"\n'
'source "package/a_a/Config.in"\n'
'source "package/aAa/Config.in"\n'
'source "package/aaa/Config.in"\n',
[['package/Config.in:4: Packages in: menu "packages",\n'
' are not alphabetically ordered;\n'
" correct order: '-', '_', digits, capitals, lowercase;\n"
' first incorrect package: a_a',
'source "package/a_a/Config.in"\n']]),
('digit (bad)',
'package/Config.in',
'menu "packages"\n'
'source "package/a-a/Config.in"\n'
'source "package/a_a/Config.in"\n'
'source "package/aAa/Config.in"\n'
'source "package/a1a/Config.in"\n'
'source "package/aaa/Config.in"\n',
[['package/Config.in:5: Packages in: menu "packages",\n'
' are not alphabetically ordered;\n'
" correct order: '-', '_', digits, capitals, lowercase;\n"
' first incorrect package: a1a',
'source "package/a1a/Config.in"\n']]),
('capitals (bad)',
'package/Config.in',
'menu "packages"\n'
'source "package/a-a/Config.in"\n'
'source "package/a_a/Config.in"\n'
'source "package/a1a/Config.in"\n'
'source "package/aaa/Config.in"\n'
'source "package/aAa/Config.in"\n',
[['package/Config.in:6: Packages in: menu "packages",\n'
' are not alphabetically ordered;\n'
" correct order: '-', '_', digits, capitals, lowercase;\n"
' first incorrect package: aAa',
'source "package/aAa/Config.in"\n']]),
('digits, capitals, underscore (good)',
'package/Config.in',
'menu "packages"\n'
'source "package/a-a/Config.in"\n'
'source "package/a_a/Config.in"\n'
'source "package/a1a/Config.in"\n'
'source "package/aAa/Config.in"\n'
'source "package/aaa/Config.in"\n',
[]),
('conditional menu (good)',
'package/Config.in',
'menu "Other"\n'
'source "package/linux-pam/Config.in"\n'
'if BR2_PACKAGE_LINUX_PAM\n'
'comment "linux-pam plugins"\n'
'source "package/libpam-radius-auth/Config.in"\n'
'source "package/libpam-tacplus/Config.in"\n'
'endif\n'
'source "package/liquid-dsp/Config.in"\n',
[]),
('conditional menu (bad)',
'package/Config.in',
'menu "Other"\n'
'source "package/linux-pam/Config.in"\n'
'if BR2_PACKAGE_LINUX_PAM\n'
'comment "linux-pam plugins"\n'
'source "package/libpam-tacplus/Config.in"\n'
'source "package/libpam-radius-auth/Config.in"\n'
'endif\n'
'source "package/liquid-dsp/Config.in"\n',
[['package/Config.in:6: Packages in: comment "linux-pam plugins",\n'
' are not alphabetically ordered;\n'
" correct order: '-', '_', digits, capitals, lowercase;\n"
' first incorrect package: libpam-radius-auth',
'source "package/libpam-radius-auth/Config.in"\n']]),
('no conditional (bad)',
'package/Config.in',
'menu "Other"\n'
'source "package/linux-pam/Config.in"\n'
'source "package/libpam-radius-auth/Config.in"\n'
'source "package/libpam-tacplus/Config.in"\n'
'source "package/liquid-dsp/Config.in"\n',
[['package/Config.in:3: Packages in: menu "Other",\n'
' are not alphabetically ordered;\n'
" correct order: '-', '_', digits, capitals, lowercase;\n"
' first incorrect package: libpam-radius-auth',
'source "package/libpam-radius-auth/Config.in"\n']]),
]
@pytest.mark.parametrize('testname,filename,string,expected', CommentsMenusPackagesOrder)
def test_CommentsMenusPackagesOrder(testname, filename, string, expected):
warnings = util.check_file(m.CommentsMenusPackagesOrder, filename, string)
assert warnings == expected
HelpText = [
('single line',
'any',
'config BR2_PACKAGE_FOO\n'
'bool "foo"\n'
'default y\n'
'depends on BR2_USE_BAR # runtime\n'
'select BR2_PACKAGE_BAZ\n'
'help\n'
'\t help text\n',
[]),
('larger than 72',
'any',
'help\n'
'\t 123456789 123456789 123456789 123456789 123456789 123456789 12\n'
'\t 123456789 123456789 123456789 123456789 123456789 123456789 123\n'
'\t help text\n',
[['any:3: help text: <tab><2 spaces><62 chars> (url#writing-rules-config-in)',
'\t 123456789 123456789 123456789 123456789 123456789 123456789 123\n',
'\t 123456789 123456789 123456789 123456789 123456789 123456789 12']]),
('long url at beginning of line',
'any',
'help\n'
'\t 123456789 123456789 123456789 123456789 123456789 123456789 12\n'
'\t http://url.that.is.longer.than.seventy.two.characthers/folder_name\n'
'\t https://url.that.is.longer.than.seventy.two.characthers/folder_name\n'
'\t git://url.that.is.longer.than.seventy.two.characthers/folder_name\n',
[]),
('long url not at beginning of line',
'any',
'help\n'
'\t 123456789 123456789 123456789 123456789 123456789 123456789 12\n'
'\t refer to http://url.that.is.longer.than.seventy.two.characthers/folder_name\n'
'\n'
'\t http://url.that.is.longer.than.seventy.two.characthers/folder_name\n',
[['any:3: help text: <tab><2 spaces><62 chars> (url#writing-rules-config-in)',
'\t refer to http://url.that.is.longer.than.seventy.two.characthers/folder_name\n',
'\t 123456789 123456789 123456789 123456789 123456789 123456789 12']]),
('allow beautified items',
'any',
'help\n'
'\t 123456789 123456789 123456789 123456789 123456789 123456789 12\n'
'\t summary:\n'
'\t - enable that config\n'
'\t - built it\n',
[]),
]
@pytest.mark.parametrize('testname,filename,string,expected', HelpText)
def test_HelpText(testname, filename, string, expected):
warnings = util.check_file(m.HelpText, filename, string)
assert warnings == expected
Indent = [
('good example',
'any',
'config BR2_PACKAGE_FOO\n'
'\tbool "foo"\n'
'\tdefault y\n'
'\tdepends on BR2_TOOLCHAIN_HAS_THREADS\n'
'\tdepends on BR2_INSTALL_LIBSTDCPP\n'
'# very useful comment\n'
'\tselect BR2_PACKAGE_BAZ\n'
'\thelp\n'
'\t help text\n'
'\n'
'comment "foo needs toolchain w/ C++, threads"\n'
'\tdepends on !BR2_INSTALL_LIBSTDCPP || \\\n'
'\t\t!BR2_TOOLCHAIN_HAS_THREADS\n'
'\n'
'source "package/foo/bar/Config.in"\n',
[]),
('spaces',
'any',
'config BR2_PACKAGE_FOO\n'
' bool "foo"\n',
[['any:2: should be indented with one tab (url#_config_files)',
' bool "foo"\n']]),
('without indent',
'any',
'config BR2_PACKAGE_FOO\n'
'default y\n',
[['any:2: should be indented with one tab (url#_config_files)',
'default y\n']]),
('too much tabs',
'any',
'config BR2_PACKAGE_FOO\n'
'\t\tdepends on BR2_TOOLCHAIN_HAS_THREADS\n',
[['any:2: should be indented with one tab (url#_config_files)',
'\t\tdepends on BR2_TOOLCHAIN_HAS_THREADS\n']]),
('help',
'any',
'config BR2_PACKAGE_FOO\n'
' help\n',
[['any:2: should be indented with one tab (url#_config_files)',
' help\n']]),
('continuation line',
'any',
'comment "foo needs toolchain w/ C++, threads"\n'
'\tdepends on !BR2_INSTALL_LIBSTDCPP || \\\n'
' !BR2_TOOLCHAIN_HAS_THREADS\n',
[['any:3: continuation line should be indented using tabs',
' !BR2_TOOLCHAIN_HAS_THREADS\n']]),
('comment with tabs',
'any',
'\tcomment "foo needs toolchain w/ C++, threads"\n',
[['any:1: should not be indented',
'\tcomment "foo needs toolchain w/ C++, threads"\n']]),
('comment with spaces',
'any',
' comment "foo needs toolchain w/ C++, threads"\n',
[['any:1: should not be indented',
' comment "foo needs toolchain w/ C++, threads"\n']]),
]
@pytest.mark.parametrize('testname,filename,string,expected', Indent)
def test_Indent(testname, filename, string, expected):
warnings = util.check_file(m.Indent, filename, string)
assert warnings == expected