blob: c1a48140aa24e57d32db616a2b665160ce773712 [file] [log] [blame] [edit]
# This package only contains end-to-end tests for the style linter.
load(
":verilog_style_lint.bzl",
"verilog_style_lint",
"verilog_syntax",
)
load("//bazel:sh_test_with_runfiles_lib.bzl", "sh_test_with_runfiles_lib")
licenses(["notice"])
# Integration tests for different flags and configurations
# These tests help confirm that rules' cc_libraries are properly alwayslink-ed.
# TODO(fangism): re-organize this into structs instead of tuples,
# and provide the group in a .bzl macro,
# and define a test_suite for all of these.
_linter_test_configs = [
# (rule-name, testdata/FILE.sv, default-enabled?)
# See verilog/analysis/default_rules.h for default-enabled rules.
("always-comb", "always_comb_module", True),
("suggest-parentheses", "suggest_parentheses_example", True),
("always-comb-blocking", "always_comb_blocking", True),
("always-ff-non-blocking", "always_ff_non_blocking", True),
("case-missing-default", "case_missing_default", True),
("constraint-name-style", "constraint_name_style", True),
("disable-statement", "disable_statement", False),
("endif-comment", "endif_comment", False),
("enum-name-style", "enum_name_style", True),
("explicit-function-lifetime", "explicit_function_lifetime", True),
("explicit-function-task-parameter-type", "explicit_function_parameter_type", True),
("explicit-function-task-parameter-type", "explicit_task_parameter_type", True),
("explicit-parameter-storage-type", "explicit_parameter_storage_type", True),
("explicit-task-lifetime", "explicit_task_lifetime", True),
("forbid-consecutive-null-statements", "forbid_consecutive_null_statements", True),
("forbid-line-continuations", "forbid_line_continuations", True),
("generate-label", "generate_label_module", True),
("generate-label", "generate-label-module-body", True), # uses parse directive
("generate-label-prefix", "generate_label_prefix", True),
("invalid-system-task-function", "psprintf", True),
("interface-name-style", "interface_type_name_style", True),
("legacy-genvar-declaration", "legacy_genvar_declaration", False),
("legacy-generate-region", "legacy_generate_region", False),
("macro-name-style", "macro_name_style", True),
("macro-string-concatenation", "macro_string_concatenation", False),
("mismatched-labels", "mismatched_labels", False),
("module-begin-block", "module_begin_block", True),
("module-filename", "module_filename", True),
("numeric-format-string-style", "numeric_format_string_style", False),
("package-filename", "package_filename_pkg", True),
("packed-dimensions-range-ordering", "packed_dimensions", True),
("parameter-name-style", "localparam_name_style", True),
("parameter-name-style=localparam_style:ALL_CAPS", "localparam_name_style_all_caps", False),
("parameter-name-style=localparam_style:CamelCase", "localparam_name_style_camel_case", True),
("parameter-name-style", "parameter_name_style", True),
("parameter-type-name-style", "parameter_type_name_style", False),
("parameter-type-name-style", "localparam_type_name_style", False),
("plusarg-assignment", "plusarg_assignment", True),
("port-name-suffix", "port_name_suffix", False),
("positive-meaning-parameter-name", "positive_meaning_parameter_name", True),
("proper-parameter-declaration", "proper_parameter_declaration", False),
("proper-parameter-declaration", "proper_localparam_declaration", False),
("module-parameter", "instance_parameters", True),
("module-port", "instance_ports", True),
("module-port", "instance-ports-module-body", True), # uses parse directive
("signal-name-style", "signal_name_style", False),
("struct-union-name-style", "struct_name_style", True),
("struct-union-name-style", "union_name_style", True),
("v2001-generate-begin", "generate_begin_module", True),
("void-cast", "void-cast", True),
("undersized-binary-literal", "undersized_binary_literal", True),
("unpacked-dimensions-range-ordering", "unpacked_dimensions", True),
("forbidden-macro", "uvm_warning", True),
("create-object-name-match", "object_creation_name", True),
("posix-eof", "posix_eof", True),
("no-tabs", "tabs", True),
("line-length", "long_line", True),
("no-trailing-spaces", "trailing_spaces", True),
("forbid-defparam", "defparam_usage", True),
("typedef-enums", "typedef_enums", True),
("typedef-structs-unions", "typedef_structs", True),
("typedef-structs-unions", "typedef_unions", True),
("truncated-numeric-literal", "truncated_numeric_literal", True),
("one-module-per-file", "one_module_per_file", False),
("uvm-macro-semicolon", "uvm_macro_semicolon", False),
("banned-declared-name-patterns", "banned_declared_name_patterns", False),
]
[
(
# Verifies that with no lint rules, test case is syntactically valid.
verilog_style_lint.test(
name = testfilebase + "-syntax-test",
srcs = ["testdata/{}.sv".format(testfilebase)],
flags = ["--ruleset=none"],
),
# Verifies that rule is available as part of the 'all' set.
# This is only relevant for rules that are not testing specific
# configurations.
verilog_style_lint.test(
name = testfilebase + "-allrules-test",
srcs = ["testdata/{}.sv".format(testfilebase)],
expect_fail = True,
flags = ["--ruleset=all"],
) if "=" not in rule else (), # Only useful when not configured
# Verifies that the rule is/is not enabled in the 'default' set.
verilog_style_lint.test(
name = testfilebase + "-defaultrules-test",
srcs = ["testdata/{}.sv".format(testfilebase)],
expect_fail = default,
),
# Verifies that one specific rule alone fails this test case.
verilog_style_lint.test(
name = testfilebase + "-onerule-test",
srcs = ["testdata/{}.sv".format(testfilebase)],
expect_fail = True,
flags = [
"--ruleset=none",
"--rules=" + rule,
],
),
# Verifies that all rules *except* this one is lint clean.
verilog_style_lint.test(
name = testfilebase + "-minusrule-test",
srcs = ["testdata/{}.sv".format(testfilebase)],
flags = [
"--ruleset=all",
"--rules=-" + rule, # exclude one rule
],
),
)
for rule, testfilebase, default in _linter_test_configs
]
# Modify a file with a known violation by inserting a waiver above the offending line.
genrule(
name = "psprintf-waived-next-line",
srcs = ["testdata/psprintf.sv"],
outs = ["psprintf-waived-next-line.sv"],
cmd = "sed -e '/psprintf/i\\\n // verilog_lint: waive invalid-system-task-function\n' $< > $@",
)
# Modify a file with a known violation by inserting a waiver on the offending line.
genrule(
name = "psprintf-waived-same-line",
srcs = ["testdata/psprintf.sv"],
outs = ["psprintf-waived-same-line.sv"],
cmd = "sed -e '/psprintf/s|$$| // verilog_lint: waive invalid-system-task-function|' $< > $@",
)
# Modify a file with a known violation by inserting a waiver range around the offending line.
genrule(
name = "psprintf-waived-line-range",
srcs = ["testdata/psprintf.sv"],
outs = ["psprintf-waived-line-range.sv"],
cmd = "sed " +
"-e '/psprintf/i\\\n // verilog_lint: waive-start invalid-system-task-function\n' " +
"-e '/psprintf/a\\\n // verilog_lint: waive-stop invalid-system-task-function\n' " +
"$< > $@",
)
# Test that waiver works on one rule, one line, and line range.
[
verilog_style_lint.test(
name = "psprintf-waive-" + variant + "-test",
srcs = [
":psprintf-waived-" + variant,
],
flags = [
"--ruleset=none",
"--rules=invalid-system-task-function",
],
)
for variant in ("same-line", "next-line", "line-range")
]
# Modify a file with a known violation by inserting a waiver on the offending line.
genrule(
name = "line-length-in-module-body-waived",
srcs = ["testdata/line-length-in-module-body.sv"],
outs = ["line-length-in-module-body-waived.sv"],
cmd = "sed -e '$$s|$$| // verilog_lint: waive line-length|' $< > $@",
)
# Test that one long line is caught.
verilog_style_lint.test(
name = "line-length-in-module-body-fail-test",
srcs = [
"testdata/line-length-in-module-body.sv",
],
expect_fail = True,
flags = [
"--ruleset=none",
"--rules=line-length",
],
)
# Test that one long line is caught and waived.
verilog_style_lint.test(
name = "line-length-in-module-body-waived-test",
srcs = [
":line-length-in-module-body-waived",
],
expect_fail = False,
flags = [
"--ruleset=none",
"--rules=line-length",
],
)
# Verifies that lexer errors are properly rejected.
verilog_style_lint.test(
name = "verilog_lint-lexer-fail-test",
srcs = ["testdata/bad-id-lex.sv"],
expect_fail = True,
)
verilog_syntax.test(
name = "verilog_syntax-lexer-fail-test",
srcs = ["testdata/bad-id-lex.sv"],
expect_fail = True,
)
# SystemVerilog-parser based linter
cc_binary(
name = "verible-verilog-lint",
srcs = ["verilog_lint.cc"],
visibility = ["//visibility:public"],
deps = [
"//common/analysis:violation_handler",
"//common/util:enum_flags",
"//common/util:file_util",
"//common/util:init_command_line",
"//common/util:logging",
"//verilog/analysis:verilog_linter",
"//verilog/analysis:verilog_linter_configuration",
"@com_google_absl//absl/flags:flag",
"@com_google_absl//absl/status",
"@com_google_absl//absl/strings",
],
)
sh_test_with_runfiles_lib(
name = "lint_tool_test",
size = "small",
srcs = ["lint_tool_test.sh"],
args = ["$(location :verible-verilog-lint)"],
data = [":verible-verilog-lint"],
deps = [],
)