kumquat-buildroot/utils/checkpackagelib/test_tool.py

113 lines
3.5 KiB
Python
Raw Normal View History

import os
import pytest
import re
import tempfile
import checkpackagelib.tool as m
workdir_regex = re.compile(r'/tmp/tmp[^/]*-checkpackagelib-test-tool')
def check_file(tool, filename, string, permissions=None):
with tempfile.TemporaryDirectory(suffix='-checkpackagelib-test-tool') as workdir:
script = os.path.join(workdir, filename)
with open(script, 'wb') as f:
f.write(string.encode())
if permissions:
os.chmod(script, permissions)
obj = tool(script)
result = obj.run()
if result is None:
return []
return [workdir_regex.sub('dir', r) for r in result]
NotExecutable = [
('664',
'package.mk',
0o664,
'',
[]),
('775',
'package.mk',
0o775,
'',
["dir/package.mk:0: This file does not need to be executable"]),
]
@pytest.mark.parametrize('testname,filename,permissions,string,expected', NotExecutable)
def test_NotExecutable(testname, filename, permissions, string, expected):
warnings = check_file(m.NotExecutable, filename, string, permissions)
assert warnings == expected
NotExecutable_hint = [
('no hint',
"",
'sh-shebang.sh',
0o775,
'#!/bin/sh',
["dir/sh-shebang.sh:0: This file does not need to be executable"]),
('hint',
", very special hint",
'sh-shebang.sh',
0o775,
'#!/bin/sh',
["dir/sh-shebang.sh:0: This file does not need to be executable, very special hint"]),
]
@pytest.mark.parametrize('testname,hint,filename,permissions,string,expected', NotExecutable_hint)
def test_NotExecutable_hint(testname, hint, filename, permissions, string, expected):
class NotExecutable(m.NotExecutable):
def hint(self):
return hint
warnings = check_file(NotExecutable, filename, string, permissions)
assert warnings == expected
utils/checkpackagelib/lib_sysv: run shellcheck For simplicity, when shellcheck returns one or more warnings, count it as a single check-package warning. The developer can get the full output either by running shellcheck directly or by calling check-package with -v. Examples: |$ ./utils/docker-run utils/check-package --include Shellcheck package/polkit/S50polkit |package/polkit/S50polkit:0: run 'shellcheck' and fix the warnings |51 lines processed |1 warnings generated |$ ./utils/docker-run utils/check-package --include Shellcheck -v package/polkit/S50polkit |package/polkit/S50polkit:0: run 'shellcheck' and fix the warnings |In package/polkit/S50polkit line 43: |< tab >start|stop|restart|reload) | ^----^ SC2221: This pattern always overrides a later one on line 45. |In package/polkit/S50polkit line 45: |< tab >reload) | ^----^ SC2222: This pattern never matches because of a previous pattern on line 43. |For more information: | https://www.shellcheck.net/wiki/SC2221 -- This pattern always overrides a l... | https://www.shellcheck.net/wiki/SC2222 -- This pattern never matches becaus... |51 lines processed |1 warnings generated NOTICE: shellcheck results depends on the version of the tool. This is why the examples above run inside the docker image. Also update .gitlab-ci.yml with the docker image after the change of the previous commit. We don't actually use shellcheck in CI, but the image from .gitlab-ci.yml is used by the docker-run script and we use that to run shellcheck. Signed-off-by: Ricardo Martincoski <ricardo.martincoski@gmail.com> [Arnout: make sure a single -v is enough to get shellcheck output; update docker image tag in .gitlab-ci.yml] Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
2021-12-26 19:49:19 +01:00
Shellcheck = [
('missing shebang',
'empty.sh',
'',
["dir/empty.sh:0: run 'shellcheck' and fix the warnings",
"In dir/empty.sh line 1:",
"^-- SC2148: Tips depend on target shell and yours is unknown. Add a shebang or a 'shell' directive.",
"For more information:",
" https://www.shellcheck.net/wiki/SC2148 -- Tips depend on target shell and y..."]),
('sh shebang',
'sh-shebang.sh',
'#!/bin/sh',
[]),
('bash shebang',
'bash-shebang.sh',
'#!/bin/bash',
[]),
('2 warnings',
'unused.sh',
'unused=""',
["dir/unused.sh:0: run 'shellcheck' and fix the warnings",
"In dir/unused.sh line 1:",
'unused=""',
"^-- SC2148: Tips depend on target shell and yours is unknown. Add a shebang or a 'shell' directive.",
"^----^ SC2034: unused appears unused. Verify use (or export if used externally).",
"For more information:",
" https://www.shellcheck.net/wiki/SC2148 -- Tips depend on target shell and y...",
" https://www.shellcheck.net/wiki/SC2034 -- unused appears unused. Verify use..."]),
('tab',
'tab.sh',
'\t#!/bin/sh',
["dir/tab.sh:0: run 'shellcheck' and fix the warnings",
"In dir/tab.sh line 1:",
'\t#!/bin/sh',
"^-- SC1114: Remove leading spaces before the shebang.",
"For more information:",
" https://www.shellcheck.net/wiki/SC1114 -- Remove leading spaces before the ..."]),
]
@pytest.mark.parametrize('testname,filename,string,expected', Shellcheck)
def test_Shellcheck(testname, filename, string, expected):
warnings = check_file(m.Shellcheck, filename, string)
assert warnings == expected