Skip to content

Commit

Permalink
Add rules to check loading of URLs in package index
Browse files Browse the repository at this point in the history
These rules check whether the various URLs provided in the package index data can be loaded.
  • Loading branch information
per1234 committed Jun 11, 2021
1 parent 0047b7a commit 6b82e86
Show file tree
Hide file tree
Showing 11 changed files with 547 additions and 13 deletions.
80 changes: 80 additions & 0 deletions internal/rule/ruleconfiguration/ruleconfiguration.go
Original file line number Diff line number Diff line change
Expand Up @@ -2921,4 +2921,84 @@ var configurations = []Type{
ErrorModes: []rulemode.Type{rulemode.Default},
RuleFunction: rulefunction.PackageIndexFormat,
},
{
ProjectType: projecttype.PackageIndex,
SuperprojectType: projecttype.All,
Category: "data",
Subcategory: "package",
ID: "ID003",
Brief: "dead packages[].websiteURL",
Description: "",
MessageTemplate: "Unable to load the packages[].websiteURL URL for package(s): {{.}}",
DisableModes: nil,
EnableModes: []rulemode.Type{rulemode.Default},
InfoModes: nil,
WarningModes: []rulemode.Type{rulemode.Permissive},
ErrorModes: []rulemode.Type{rulemode.Default},
RuleFunction: rulefunction.PackageIndexPackagesWebsiteURLDeadLink,
},
{
ProjectType: projecttype.PackageIndex,
SuperprojectType: projecttype.All,
Category: "data",
Subcategory: "package",
ID: "ID004",
Brief: "dead packages[].help.online",
Description: "",
MessageTemplate: "Unable to load the packages[].help.online URL for package(s): {{.}}",
DisableModes: nil,
EnableModes: []rulemode.Type{rulemode.Default},
InfoModes: nil,
WarningModes: []rulemode.Type{rulemode.Permissive},
ErrorModes: []rulemode.Type{rulemode.Default},
RuleFunction: rulefunction.PackageIndexPackagesHelpOnlineDeadLink,
},
{
ProjectType: projecttype.PackageIndex,
SuperprojectType: projecttype.All,
Category: "data",
Subcategory: "platform",
ID: "ID005",
Brief: "dead packages[].platforms[].help.online",
Description: "",
MessageTemplate: "Unable to load the packages[].platforms[].help.online URL for platforms(s): {{.}}",
DisableModes: nil,
EnableModes: []rulemode.Type{rulemode.Default},
InfoModes: nil,
WarningModes: []rulemode.Type{rulemode.Permissive},
ErrorModes: []rulemode.Type{rulemode.Default},
RuleFunction: rulefunction.PackageIndexPackagesPlatformsHelpOnlineDeadLink,
},
{
ProjectType: projecttype.PackageIndex,
SuperprojectType: projecttype.All,
Category: "data",
Subcategory: "platform",
ID: "ID006",
Brief: "dead packages[].platforms[].url",
Description: "",
MessageTemplate: "Unable to load the packages[].platforms[].url URL for platforms(s): {{.}}",
DisableModes: nil,
EnableModes: []rulemode.Type{rulemode.Default},
InfoModes: nil,
WarningModes: []rulemode.Type{rulemode.Permissive},
ErrorModes: []rulemode.Type{rulemode.Default},
RuleFunction: rulefunction.PackageIndexPackagesPlatformsURLDeadLink,
},
{
ProjectType: projecttype.PackageIndex,
SuperprojectType: projecttype.All,
Category: "data",
Subcategory: "tool",
ID: "ID007",
Brief: "dead packages[].tools[].systems[].url",
Description: "",
MessageTemplate: "Unable to load the packages[].tools[].systems[].url URL for tools(s): {{.}}",
DisableModes: nil,
EnableModes: []rulemode.Type{rulemode.Default},
InfoModes: nil,
WarningModes: []rulemode.Type{rulemode.Permissive},
ErrorModes: []rulemode.Type{rulemode.Default},
RuleFunction: rulefunction.PackageIndexPackagesToolsSystemsURLDeadLink,
},
}
167 changes: 167 additions & 0 deletions internal/rule/rulefunction/packageindex.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
package rulefunction

import (
"strings"

"github.com/arduino/arduino-lint/internal/project/packageindex"
"github.com/arduino/arduino-lint/internal/project/projectdata"
"github.com/arduino/arduino-lint/internal/rule/ruleresult"
Expand Down Expand Up @@ -83,3 +85,168 @@ func PackageIndexFormat() (result ruleresult.Type, output string) {

return ruleresult.Pass, ""
}

// PackageIndexPackagesWebsiteURLDeadLink checks for dead links in packages[].websiteURL.
func PackageIndexPackagesWebsiteURLDeadLink() (result ruleresult.Type, output string) {
if projectdata.PackageIndexLoadError() != nil {
return ruleresult.NotRun, "Error loading package index"
}

nonCompliantIDs := []string{}
for _, data := range projectdata.PackageIndexPackages() {
url, ok := data.Object["websiteURL"].(string)
if !ok {
continue
}

if url == "" {
continue
}

if checkURL(url) == nil {
continue
}

nonCompliantIDs = append(nonCompliantIDs, data.ID)
}

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

return ruleresult.Pass, ""
}

// PackageIndexPackagesHelpOnlineDeadLink checks for dead links in packages[].help.online.
func PackageIndexPackagesHelpOnlineDeadLink() (result ruleresult.Type, output string) {
if projectdata.PackageIndexLoadError() != nil {
return ruleresult.NotRun, "Error loading package index"
}

nonCompliantIDs := []string{}
for _, data := range projectdata.PackageIndexPackages() {
help, ok := data.Object["help"].(map[string]interface{})
if !ok {
continue
}

url, ok := help["online"].(string)
if !ok {
continue
}

if url == "" {
continue
}

if checkURL(url) == nil {
continue
}

nonCompliantIDs = append(nonCompliantIDs, data.ID)
}

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

return ruleresult.Pass, ""
}

// PackageIndexPackagesPlatformsHelpOnlineDeadLink checks for dead links in packages[].platforms[].help.online.
func PackageIndexPackagesPlatformsHelpOnlineDeadLink() (result ruleresult.Type, output string) {
if projectdata.PackageIndexLoadError() != nil {
return ruleresult.NotRun, "Error loading package index"
}

nonCompliantIDs := []string{}
for _, data := range projectdata.PackageIndexPlatforms() {
help, ok := data.Object["help"].(map[string]interface{})
if !ok {
continue
}

url, ok := help["online"].(string)
if !ok {
continue
}

if url == "" {
continue
}

if checkURL(url) == nil {
continue
}

nonCompliantIDs = append(nonCompliantIDs, data.ID)
}

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

return ruleresult.Pass, ""
}

// PackageIndexPackagesPlatformsURLDeadLink checks for dead links in packages[].platforms[].url.
func PackageIndexPackagesPlatformsURLDeadLink() (result ruleresult.Type, output string) {
if projectdata.PackageIndexLoadError() != nil {
return ruleresult.NotRun, "Error loading package index"
}

nonCompliantIDs := []string{}
for _, data := range projectdata.PackageIndexPlatforms() {
url, ok := data.Object["url"].(string)
if !ok {
continue
}

if url == "" {
continue
}

if checkURL(url) == nil {
continue
}

nonCompliantIDs = append(nonCompliantIDs, data.ID)
}

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

return ruleresult.Pass, ""
}

// PackageIndexPackagesToolsSystemsURLDeadLink checks for dead links in packages[].tools[].systems[].url.
func PackageIndexPackagesToolsSystemsURLDeadLink() (result ruleresult.Type, output string) {
if projectdata.PackageIndexLoadError() != nil {
return ruleresult.NotRun, "Error loading package index"
}

nonCompliantIDs := []string{}
for _, data := range projectdata.PackageIndexSystems() {
url, ok := data.Object["url"].(string)
if !ok {
continue
}

if url == "" {
continue
}

if checkURL(url) == nil {
continue
}

nonCompliantIDs = append(nonCompliantIDs, data.ID)
}

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

return ruleresult.Pass, ""
}
51 changes: 51 additions & 0 deletions internal/rule/rulefunction/packageindex_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,3 +110,54 @@ func TestPackageIndexFormat(t *testing.T) {

checkPackageIndexRuleFunction(PackageIndexFormat, testTables, t)
}

func TestPackageIndexPackagesWebsiteURLDeadLink(t *testing.T) {
testTables := []packageIndexRuleFunctionTestTable{
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
{"Dead URLs", "packages-websiteurl-dead", ruleresult.Fail, "^myboard1, myboard2$"},
{"Invalid URL", "packages-websiteurl-invalid", ruleresult.Fail, "^myboard$"},
{"Valid URL", "valid-package-index", ruleresult.Pass, ""},
}

checkPackageIndexRuleFunction(PackageIndexPackagesWebsiteURLDeadLink, testTables, t)
}

func TestPackageIndexPackagesHelpOnlineDeadLink(t *testing.T) {
testTables := []packageIndexRuleFunctionTestTable{
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
{"Dead URLs", "packages-help-online-dead", ruleresult.Fail, "^myboard1, myboard2$"},
{"Valid URL", "valid-package-index", ruleresult.Pass, ""},
}

checkPackageIndexRuleFunction(PackageIndexPackagesHelpOnlineDeadLink, testTables, t)
}

func TestPackageIndexPackagesPlatformsHelpOnlineDeadLink(t *testing.T) {
testTables := []packageIndexRuleFunctionTestTable{
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
{"Dead URLs", "packages-platforms-help-online-dead", ruleresult.Fail, "^myboard:avr@1\\.0\\.0, myboard:samd@1\\.0\\.0$"},
{"Valid URL", "valid-package-index", ruleresult.Pass, ""},
}

checkPackageIndexRuleFunction(PackageIndexPackagesPlatformsHelpOnlineDeadLink, testTables, t)
}

func TestPackageIndexPackagesPlatformsURLDeadLink(t *testing.T) {
testTables := []packageIndexRuleFunctionTestTable{
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
{"Dead URLs", "packages-platforms-url-dead", ruleresult.Fail, "^myboard:avr@1\\.0\\.0, myboard:samd@1\\.0\\.0$"},
{"Valid URL", "valid-package-index", ruleresult.Pass, ""},
}

checkPackageIndexRuleFunction(PackageIndexPackagesPlatformsURLDeadLink, testTables, t)
}

func TestPackageIndexPackagesToolsSystemsURLDeadLink(t *testing.T) {
testTables := []packageIndexRuleFunctionTestTable{
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
{"Dead URLs", "packages-tools-systems-url-dead", ruleresult.Fail, "^myboard:CMSIS@4\\.0\\.0-atmel - arm-linux-gnueabihf, myboard:CMSIS@4\\.0\\.0-atmel - i686-mingw32$"},
{"Valid URL", "valid-package-index", ruleresult.Pass, ""},
}

checkPackageIndexRuleFunction(PackageIndexPackagesToolsSystemsURLDeadLink, testTables, t)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"packages": [
{
"name": "myboard1",
"maintainer": "Jane Developer",
"websiteURL": "http://example.com",
"email": "jane@example.com",
"help": {
"online": "http://httpstat.us/403"
},
"platforms": [],
"tools": []
},
{
"name": "myboard2",
"maintainer": "Jane Developer",
"websiteURL": "http://example.com",
"email": "jane@example.com",
"help": {
"online": "http://httpstat.us/404"
},
"platforms": [],
"tools": []
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
{
"packages": [
{
"name": "myboard",
"maintainer": "Jane Developer",
"websiteURL": "http://example.com",
"email": "jane@example.com",
"help": {
"online": "http://example.com"
},
"platforms": [
{
"name": "My AVR Board",
"architecture": "avr",
"version": "1.0.0",
"category": "Contributed",
"help": {
"online": "http://httpstat.us/403"
},
"url": "https://janedeveloper.github.io/myboard/myboard-1.0.0.zip",
"archiveFileName": "myboard-1.0.0.zip",
"checksum": "SHA-256:ec3ff8a1dc96d3ba6f432b9b837a35fd4174a34b3d2927de1d51010e8b94f9f1",
"size": "15005",
"boards": [],
"toolsDependencies": []
},
{
"name": "My SAMD Board",
"architecture": "samd",
"version": "1.0.0",
"category": "Contributed",
"help": {
"online": "http://httpstat.us/404"
},
"url": "https://janedeveloper.github.io/myboard/myboard-1.0.0.zip",
"archiveFileName": "myboard-1.0.0.zip",
"checksum": "SHA-256:ec3ff8a1dc96d3ba6f432b9b837a35fd4174a34b3d2927de1d51010e8b94f9f1",
"size": "15005",
"boards": [],
"toolsDependencies": []
}
],
"tools": []
}
]
}

0 comments on commit 6b82e86

Please sign in to comment.