8000 Add pluggable monitor support for platform projects by per1234 · Pull Request #300 · arduino/arduino-lint · GitHub
[go: up one dir, main page]

Skip to content

Add pluggable monitor support for platform projects #300

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Nov 23, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Add rules for the platform.txt pluggable_monitor.* properties
The new pluggable monitor system for Arduino boards platforms introduces a set of `pluggable_monitor.*`
properties to the platform.txt configuration file.

These properties have requirements that are enforced by the rules added here.
  • Loading branch information
per1234 committed Nov 18, 2021
commit 2d263add984c46af94384dac9c1ef0f67bd2a344
34 changes: 34 additions & 0 deletions internal/rule/ruleconfiguration/ruleconfiguration.go
Original file line number Diff line number Diff line change
Expand Up @@ -2864,6 +2864,40 @@ var configurations = []Type{
ErrorModes: []rulemode.Type{rulemode.Default},
RuleFunction: rulefunction.PlatformTxtPluggableDiscoveryDiscoveryIDPatternMissing,
},
{
ProjectType: projecttype.Platform,
SuperprojectType: projecttype.All,
Category: "configuration files",
Subcategory: "platform.txt",
ID: "PF094",
Brief: "pluggable_monitor.pattern.PROTOCOL_ID < min length",
Description: "The `pluggable_monitor.pattern.PROTOCOL_ID` property in the platform's `platform.txt` configuration file is shorter than the minimum length.",
MessageTemplate: "pluggable_monitor.pattern.PROTOCOL_ID value for protocol(s) {{.}} is less than the minimum length.",
Reference: "https://arduino.github.io/arduino-cli/latest/platform-specification/#pluggable-monitor",
DisableModes: nil,
EnableModes: []rulemode.Type{rulemode.Default},
InfoModes: nil,
WarningModes: nil,
ErrorModes: []rulemode.Type{rulemode.Default},
RuleFunction: rulefunction.PlatformTxtPluggableMonitorPatternProtocolIDLTMinLength,
},
{
ProjectType: projecttype.Platform,
SuperprojectType: projecttype.All,
Category: "configuration files",
Subcategory: "platform.txt",
ID: "PF095",
Brief: "invalid pluggable_monitor.required.PROTOCOL_ID format",
Description: "The tool dependency reference for a pluggable monitor in the platform's `platform.txt` configuration file has an invalid format.",
MessageTemplate: "Value for tool dependency reference of pluggable monitor protocol(s) {{.}} is invalid.",
Reference: "https://arduino.github.io/arduino-cli/latest/platform-specification/#pluggable-monitor",
DisableModes: nil,
EnableModes: []rulemode.Type{rulemode.Default},
InfoModes: nil,
WarningModes: nil,
ErrorModes: []rulemode.Type{rulemode.Default},
RuleFunction: rulefunction.PlatformTxtPluggableMonitorRequiredProtocolIDInvalid,
},
{
ProjectType: projecttype.Platform,
SuperprojectType: projecttype.All,
Expand Down
56 changes: 56 additions & 0 deletions internal/rule/rulefunction/platform.go
Original file line number Diff line number Diff line change
Expand Up @@ -1736,6 +1736,62 @@ func PlatformTxtPluggableDiscoveryDiscoveryIDPatternMissing() (result ruleresult
return ruleresult.Pass, ""
}

// PlatformTxtPluggableMonitorPatternProtocolIDLTMinLength checks if the platform.txt pluggable_monitor.pattern.PROTOCOL_ID property value is less than the minimum length.
func PlatformTxtPluggableMonitorPatternProtocolIDLTMinLength() (result ruleresult.Type, output string) {
if !projectdata.PlatformTxtExists() {
return ruleresult.Skip, "Platform has no platform.txt"
}

if projectdata.PlatformTxtLoadError() != nil {
return ruleresult.NotRun, "Couldn't load platform.txt"
}

if projectdata.PlatformTxt().SubTree("pluggable_monitor.pattern").Size() == 0 {
return ruleresult.Skip, "Property not present"
}

nonCompliant := []string{}
for _, protocol := range projectdata.PlatformTxt().SubTree("pluggable_monitor.pattern").Keys() {
if schema.PropertyLessThanMinLength("pluggable_monitor\\.pattern/"+protocol, projectdata.PlatformTxtSchemaValidationResult()[compliancelevel.Specification]) {
nonCompliant = append(nonCompliant, protocol)
}
}

if len(nonCompliant) > 0 {
return ruleresult.Fail, strings.Join(nonCompliant, ", ")
}

return ruleresult.Pass, ""
}

// PlatformTxtPluggableMonitorRequiredProtocolIDInvalid checks if any of the pluggable monitor tool references have invalid format.
func PlatformTxtPluggableMonitorRequiredProtocolIDInvalid() (result ruleresult.Type, output string) {
if !projectdata.PlatformTxtExists() {
return ruleresult.Skip, "Platform has no platform.txt"
}

if projectdata.PlatformTxtLoadError() != nil {
return ruleresult.NotRun, "Couldn't load platform.txt"
}

if projectdata.PlatformTxt().SubTree("pluggable_monitor.required").Size() == 0 {
return ruleresult.Skip, "Property not present"
}

nonCompliant := []string{}
for _, protocol := range projectdata.PlatformTxt().SubTree("pluggable_monitor.required").Keys() {
if schema.PropertyPatternMismatch("pluggable_monitor\\.required/"+protocol, projectdata.PlatformTxtSchemaValidationResult()[compliancelevel.Specification]) {
nonCompliant = append(nonCompliant, protocol)
}
}

if len(nonCompliant) > 0 {
return ruleresult.Fail, strings.Join(nonCompliant, ", ")
}

return ruleresult.Pass, ""
}

// PlatformTxtUploadFieldFieldNameGTMaxLength checks if any platform.txt tools.UPLOAD_RECIPE_ID.upload.field.FIELD_NAME property value is greater than the maximum length.
func PlatformTxtUploadFieldFieldNameGTMaxLength() (result ruleresult.Type, output string) {
if !projectdata.PlatformTxtExists() {
Expand Down
24 changes: 24 additions & 0 deletions internal/rule/rulefunction/platform_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -993,6 +993,30 @@ func TestPlatformTxtPluggableDiscoveryDiscoveryIDPatternMissing(t *testing.T) {
checkPlatformRuleFunction(PlatformTxtPluggableDiscoveryDiscoveryIDPatternMissing, testTables, t)
}

func TestPlatformTxtPluggableMonitorPatternProtocolIDLTMinLength(t *testing.T) {
testTables := []platformRuleFunctionTestTable{
{"Missing", "missing-platform.txt", ruleresult.Skip, ""},
{"Invalid", "invalid-platform.txt", ruleresult.NotRun, ""},
{"Property absent", "no-pluggable-monitors-platform.txt", ruleresult.Skip, ""},
{"Property LT min", "pluggable-monitor-pattern-protocol-id-LT-platform.txt", ruleresult.Fail, "^network, ble$"},
{"Valid", "valid-with-manual-installation-pluggable-monitors-platform.txt", ruleresult.Pass, ""},
}

checkPlatformRuleFunction(PlatformTxtPluggableMonitorPatternProtocolIDLTMinLength, testTables, t)
}

func TestPlatformTxtPluggableMonitorRequiredProtocolIDInvalid(t *testing.T) {
testTables := []platformRuleFunctionTestTable{
{"Missing", "missing-platform.txt", ruleresult.Skip, ""},
{"Invalid", "invalid-platform.txt", ruleresult.NotRun, ""},
{"Property absent", "no-pluggable-monitors-platform.txt", ruleresult.Skip, ""},
{"Property invalid", "invalid-pluggable-monitor-required-platform.txt", ruleresult.Fail, "^network, ble$"},
{"Valid", "valid-platform.txt", ruleresult.Pass, ""},
}

checkPlatformRuleFunction(PlatformTxtPluggableMonitorRequiredProtocolIDInvalid, testTables, t)
}

func TestPlatformTxtUploadFieldFieldNameGTMaxLength(t *testing.T) {
testTables := []platformRuleFunctionTestTable{
{"Missing", "missing-platform.txt", ruleresult.Skip, ""},
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
buno.name=Buno
buno.build.board=BUNO
buno.build.core=arduino
buno.build.variant=standard
buno.upload.tool=avrdude
buno.upload.maximum_size=32256
buno.upload.maximum_data_size=2048

uno.name=Arduino Uno
uno.build.board=UNO
uno.build.core=arduino
uno.build.variant=standard
uno.upload.tool=avrdude
uno.upload.maximum_size=32256
uno.upload.maximum_data_size=2048

funo.name=Funo
funo.build.board=FUNO
funo.build.core=arduino
funo.build.variant=standard
funo.upload.tool=avrdude
funo.upload.maximum_size=32256
funo.upload.maximum_data_size=2048
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
name=Arduino AVR Boards
version=1.8.3
compiler.warning_flags.none=asdf
compiler.warning_flags.default=asdf
compiler.warning_flags.more=asdf
compiler.warning_flags.all=asdf
compiler.optimization_flags.debug=
compiler.optimization_flags.release=
compiler.c.extra_flags=
compiler.c.elf.extra_flags=
compiler.S.extra_flags=
compiler.cpp.extra_flags=
compiler.ar.extra_flags=
compiler.objcopy.eep.extra_flags=
compiler.elf2hex.extra_flags=
recipe.c.o.pattern=asdf {compiler.c.extra_flags}
recipe.cpp.o.pattern=asdf {compiler.cpp.extra_flags}
recipe.S.o.pattern=asdf {compiler.S.extra_flags}
recipe.ar.pattern=asdf {compiler.ar.extra_flags}
recipe.c.combine.pattern=asdf {compiler.c.elf.extra_flags}
recipe.preproc.macros=asdf {compiler.cpp.extra_flags}
recipe.objcopy.eep.pattern=asdf
recipe.objcopy.hex.pattern=asdf
recipe.output.tmp_file=asdf
recipe.output.save_file=asdf
B3E9 recipe.size.pattern=asdf
recipe.size.regex=asdf
recipe.size.regex.data=asdf
pluggable_discovery.required.0=builtin:serial-discovery
pluggable_discovery.required.1=builtin:mdns-discovery
pluggable_monitor.required.carrier-pigeon=coop:coo
pluggable_monitor.required.network=bar
pluggable_monitor.required.ble=
tools.avrdude.upload.field.foo_field_name=Some field label
tools.avrdude.upload.field.foo_field_name.secret=true
tools.avrdude.upload.params.verbose=-v
tools.avrdude.upload.params.quiet=-q -q
tools.avrdude.upload.pattern=asdf
tools.bossac.upload.field.bar_field_name=Some other field label
tools.bossac.upload.params.verbose=-v
tools.bossac.upload.params.quiet=-q -q
tools.bossac.upload.pattern=asdf
tools.avrdude.program.params.verbose=-v
tools.avrdude.program.params.quiet=-q -q
tools.avrdude.program.pattern=asdf
tools.bossac.program.params.verbose=-v
tools.bossac.program.params.quiet=-q -q
tools.bossac.program.pattern=asdf
tools.avrdude.erase.params.verbose=-v
tools.avrdude.erase.params.quiet=-q -q
tools.avrdude.erase.pattern=asdf
tools.bossac.erase.params.verbose=-v
tools.bossac.erase.params.quiet=-q -q
tools.bossac.erase.pattern=asdf
tools.avrdude.bootloader.params.verbose=-v
tools.avrdude.bootloader.params.quiet=-q -q
tools.avrdude.bootloader.pattern=asdf
tools.bossac.bootloader.params.verbose=-v
tools.bossac.bootloader.params.quiet=-q -q
tools.bossac.bootloader.pattern=asdf
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
buno.name=Buno
buno.build.board=BUNO
buno.build.core=arduino
buno.build.variant=standard
buno.upload.tool=avrdude
buno.upload.maximum_size=32256
buno.upload.maximum_data_size=2048

uno.name=Arduino Uno
uno.build.board=UNO
uno.build.core=arduino
uno.build.variant=standard
uno.upload.tool=avrdude
uno.upload.maximum_size=32256
uno.upload.maximum_data_size=2048

funo.name=Funo
funo.build.board=FUNO
funo.build.core=arduino
funo.build.variant=standard
funo.upload.tool=avrdude
funo.upload.maximum_size=32256
funo.upload.maximum_data_size=2048
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name=Arduino AVR Boards
version=1.8.3
compiler.warning_flags.none=asdf
compiler.warning_flags.default=asdf
compiler.warning_flags.more=asdf
compiler.warning_flags.all=asdf
compiler.optimization_flags.debug=
compiler.optimization_flags.release=
compiler.c.extra_flags=
compiler.c.elf.extra_flags=
compiler.S.extra_flags=
compiler.cpp.extra_flags=
compiler.ar.extra_flags=
compiler.objcopy.eep.extra_flags=
compiler.elf2hex.extra_flags=
recipe.c.o.pattern=asdf {compiler.c.extra_flags}
recipe.cpp.o.pattern=asdf {compiler.cpp.extra_flags}
recipe.S.o.pattern=asdf {compiler.S.extra_flags}
recipe.ar.pattern=asdf {compiler.ar.extra_flags}
recipe.c.combine.pattern=asdf {compiler.c.elf.extra_flags}
recipe.preproc.macros=asdf {compiler.cpp.extra_flags}
recipe.objcopy.eep.pattern=asdf
recipe.objcopy.hex.pattern=asdf
recipe.output.tmp_file=asdf
recipe.output.save_file=asdf
recipe.size.pattern=asdf
recipe.size.regex=asdf
recipe.size.regex.data=asdf
tools.avrdude.upload.params.verbose=-v
tools.avrdude.upload.params.quiet=-q -q
tools.avrdude.upload.pattern=asdf
tools.bossac.upload.params.verbose=-v
tools.bossac.upload.params.quiet=-q -q
tools.bossac.upload.pattern=asdf
tools.avrdude.program.params.verbose=-v
tools.avrdude.program.params.quiet=-q -q
tools.avrdude.program.pattern=asdf
tools.bossac.program.params.verbose=-v
tools.bossac.program.params.quiet=-q -q
tools.bossac.program.pattern=asdf
tools.avrdude.erase.params.verbose=-v
tools.avrdude.erase.params.quiet=-q -q
tools.avrdude.erase.pattern=asdf
tools.bossac.erase.params.verbose=-v
tools.bossac.erase.params.quiet=-q -q
tools.bossac.erase.pattern=asdf
tools.avrdude.bootloader.params.verbose=-v
tools.avrdude.bootloader.params.quiet=-q -q
tools.avrdude.bootloader.pattern=asdf
tools.bossac.bootloader.params.verbose=-v
tools.bossac.bootloader.params.quiet=-q -q
tools.bossac.bootloader.pattern=asdf
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
buno.name=Buno
buno.build.board=BUNO
buno.build.core=arduino
buno.build.variant=standard
buno.upload.tool=avrdude
buno.upload.maximum_size=32256
buno.upload.maximum_data_size=2048

uno.name=Arduino Uno
uno.build.board=UNO
uno.build.core=arduino
uno.build.variant=standard
uno.upload.tool=avrdude
uno.upload.maximum_size=32256
uno.upload.maximum_data_size=2048

funo.name=Funo
funo.build.board=FUNO
funo.build.core=arduino
funo.build.variant=standard
funo.upload.tool=avrdude
funo.upload.maximum_size=32256
funo.upload.maximum_data_size=2048
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name=Arduino AVR Boards
version=1.8.3
compiler.warning_flags.none=asdf
compiler.warning_flags.default=asdf
compiler.warning_flags.more=asdf
compiler.warning_flags.all=asdf
compiler.optimization_flags.debug=
compiler.optimization_flags.release=
compiler.c.extra_flags=
compiler.c.elf.extra_flags=
compiler.S.extra_flags=
compiler.cpp.extra_flags=
compiler.ar.extra_flags=
compiler.objcopy.eep.extra_flags=
compiler.elf2hex.extra_flags=
recipe.c.o.pattern=asdf {compiler.c.extra_flags}
recipe.cpp.o.pattern=asdf {compiler.cpp.extra_flags}
recipe.S.o.pattern=asdf {compiler.S.extra_flags}
recipe.ar.pattern=asdf {compiler.ar.extra_flags}
recipe.c.combine.pattern=asdf {compiler.c.elf.extra_flags}
recipe.preproc.macros=asdf {compiler.cpp.extra_flags}
recipe.objcopy.eep.pattern=asdf
recipe.objcopy.hex.pattern=asdf
recipe.output.tmp_file=asdf
recipe.output.save_file=asdf
recipe.size.pattern=asdf
recipe.size.regex=asdf
recipe.size.regex.data=asdf
pluggable_discovery.foo_discovery.pattern=asdf
pluggable_monitor.pattern.carrier-pigeon=coo
pluggable_monitor.pattern.network=
pluggable_monitor.pattern.ble=
tools.avrdude.upload.params.verbose=-v
tools.avrdude.upload.params.quiet=-q -q
tools.avrdude.upload.pattern=asdf
tools.bossac.upload.params.verbose=-v
tools.bossac.upload.params.quiet=-q -q
tools.bossac.upload.pattern=asdf
tools.avrdude.program.params.verbose=-v
tools.avrdude.program.params.quiet=-q -q
tools.avrdude.program.pattern=asdf
tools.bossac.program.params.verbose=-v
tools.bossac.program.params.quiet=-q -q
tools.bossac.program.pattern=asdf
tools.avrdude.erase.params.verbose=-v
tools.avrdude.erase.params.quiet=-q -q
tools.avrdude.erase.pattern=asdf
tools.bossac.erase.params.verbose=-v
tools.bossac.erase.params.quiet=-q -q
tools.bossac.erase.pattern=asdf
tools.avrdude.bootloader.params.verbose=-v
tools.avrdude.bootloader.params.quiet=-q -q
tools.avrdude.bootloader.pattern=asdf
tools.bossac.bootloader.params.verbose=-v
tools.bossac.bootloader.params.quiet=-q -q
tools.bossac.bootloader.pattern=asdf
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ recipe.size.regex=asdf
recipe.size.regex.data=asdf
pluggable_discovery.required.0=builtin:serial-discovery
pluggable_discovery.required.1=builtin:mdns-discovery
pluggable_monitor.pattern.carrier-pigeon=coop:coo
pluggable_monitor.required.network=foo:bar
pluggable_monitor.required.ble=baz:qux
tools.avrdude.upload.field.foo_field_name=Some field label
tools.avrdude.upload.field.foo_field_name.secret=true
tools.avrdude.upload.params.verbose=-v
Expand Down
Loading
0