From 4fcbd066c6aa31c23e897b59b54460d4997c5681 Mon Sep 17 00:00:00 2001 From: per1234 Date: Thu, 11 Nov 2021 00:05:38 -0800 Subject: [PATCH 1/3] Add pluggable monitor support to package index schema Support for a new optional `packages[*].platforms[*].monitorDependencies` field in the Arduino package index format has been added to Arduino CLI. Since the package index JSON schema does not allow additional properties in `packages[*].platforms[*]`, package indexes using this new property would previously fail validation against the schema. --- ...uino-package-index-definitions-schema.json | 86 +++++++++++++++++++ .../packageindex/packageindexschemas_test.go | 33 +++++++ internal/rule/schema/schemadata/bindata.go | 86 +++++++++++++++++++ 3 files changed, 205 insertions(+) diff --git a/etc/schemas/arduino-package-index-definitions-schema.json b/etc/schemas/arduino-package-index-definitions-schema.json index cd618b45a..d5205a61f 100644 --- a/etc/schemas/arduino-package-index-definitions-schema.json +++ b/etc/schemas/arduino-package-index-definitions-schema.json @@ -455,6 +455,9 @@ }, "discoveryDependencies": { "$ref": "#/definitions/propertiesObjects/discoveryDependencies/permissive/object" + }, + "monitorDependencies": { + "$ref": "#/definitions/propertiesObjects/monitorDependencies/permissive/object" } }, "additionalProperties": false @@ -510,6 +513,9 @@ }, "discoveryDependencies": { "$ref": "#/definitions/propertiesObjects/discoveryDependencies/specification/object" + }, + "monitorDependencies": { + "$ref": "#/definitions/propertiesObjects/monitorDependencies/specification/object" } }, "additionalProperties": false @@ -565,6 +571,9 @@ }, "discoveryDependencies": { "$ref": "#/definitions/propertiesObjects/discoveryDependencies/strict/object" + }, + "monitorDependencies": { + "$ref": "#/definitions/propertiesObjects/monitorDependencies/strict/object" } }, "additionalProperties": false @@ -1084,6 +1093,83 @@ } } }, + "monitorDependencies": { + "base": { + "object": { + "type": "array", + "items": { + "type": "object", + "required": ["packager", "name"] + } + } + }, + "permissive": { + "object": { + "allOf": [ + { + "$ref": "#/definitions/propertiesObjects/monitorDependencies/base/object" + }, + { + "items": { + "properties": { + "packager": { + "$ref": "#/definitions/propertiesObjects/packager/permissive/object" + }, + "name": { + "$ref": "#/definitions/propertiesObjects/toolName/permissive/object" + } + }, + "additionalProperties": false + } + } + ] + } + }, + "specification": { + "object": { + "allOf": [ + { + "$ref": "#/definitions/propertiesObjects/monitorDependencies/base/object" + }, + { + "items": { + "properties": { + "packager": { + "$ref": "#/definitions/propertiesObjects/packager/specification/object" + }, + "name": { + "$ref": "#/definitions/propertiesObjects/toolName/specification/object" + } + }, + "additionalProperties": false + } + } + ] + } + }, + "strict": { + "object": { + "allOf": [ + { + "$ref": "#/definitions/propertiesObjects/monitorDependencies/base/object" + }, + { + "items": { + "properties": { + "packager": { + "$ref": "#/definitions/propertiesObjects/packager/strict/object" + }, + "name": { + "$ref": "#/definitions/propertiesObjects/toolName/strict/object" + } + }, + "additionalProperties": false + } + } + ] + } + } + }, "packager": { "base": { "object": { diff --git a/internal/project/packageindex/packageindexschemas_test.go b/internal/project/packageindex/packageindexschemas_test.go index 44422da89..c069e2878 100644 --- a/internal/project/packageindex/packageindexschemas_test.go +++ b/internal/project/packageindex/packageindexschemas_test.go @@ -71,6 +71,12 @@ var validIndexRaw = []byte(` "packager": "arduino", "name": "ble-discovery" } + ], + "monitorDependencies": [ + { + "packager": "arduino", + "name": "network-monitor" + } ] } ], @@ -152,6 +158,14 @@ func TestMinLength(t *testing.T) { {"/packages/0/platforms/0/discoveryDependencies/0/name", 1, compliancelevel.Specification}, {"/packages/0/platforms/0/discoveryDependencies/0/name", 1, compliancelevel.Strict}, + {"/packages/0/platforms/0/monitorDependencies/0/packager", 1, compliancelevel.Permissive}, + {"/packages/0/platforms/0/monitorDependencies/0/packager", 1, compliancelevel.Specification}, + {"/packages/0/platforms/0/monitorDependencies/0/packager", 1, compliancelevel.Strict}, + + {"/packages/0/platforms/0/monitorDependencies/0/name", 1, compliancelevel.Permissive}, + {"/packages/0/platforms/0/monitorDependencies/0/name", 1, compliancelevel.Specification}, + {"/packages/0/platforms/0/monitorDependencies/0/name", 1, compliancelevel.Strict}, + {"/packages/0/tools/0/systems/0/archiveFileName", 1, compliancelevel.Permissive}, {"/packages/0/tools/0/systems/0/archiveFileName", 1, compliancelevel.Specification}, {"/packages/0/tools/0/systems/0/archiveFileName", 1, compliancelevel.Strict}, @@ -303,6 +317,18 @@ func TestRequired(t *testing.T) { {"/packages/0/platforms/0/discoveryDependencies/0/name", compliancelevel.Specification, assert.True}, {"/packages/0/platforms/0/discoveryDependencies/0/name", compliancelevel.Strict, assert.True}, + {"/packages/0/platforms/0/monitorDependencies", compliancelevel.Permissive, assert.False}, + {"/packages/0/platforms/0/monitorDependencies", compliancelevel.Specification, assert.False}, + {"/packages/0/platforms/0/monitorDependencies", compliancelevel.Strict, assert.False}, + + {"/packages/0/platforms/0/monitorDependencies/0/packager", compliancelevel.Permissive, assert.True}, + {"/packages/0/platforms/0/monitorDependencies/0/packager", compliancelevel.Specification, assert.True}, + {"/packages/0/platforms/0/monitorDependencies/0/packager", compliancelevel.Strict, assert.True}, + + {"/packages/0/platforms/0/monitorDependencies/0/name", compliancelevel.Permissive, assert.True}, + {"/packages/0/platforms/0/monitorDependencies/0/name", compliancelevel.Specification, assert.True}, + {"/packages/0/platforms/0/monitorDependencies/0/name", compliancelevel.Strict, assert.True}, + {"/packages/0/tools/0/name", compliancelevel.Permissive, assert.True}, {"/packages/0/tools/0/name", compliancelevel.Specification, assert.True}, {"/packages/0/tools/0/name", compliancelevel.Strict, assert.True}, @@ -586,6 +612,9 @@ func TestType(t *testing.T) { {"/packages/0/platforms/0/discoveryDependencies", 42, assert.True}, {"/packages/0/platforms/0/discoveryDependencies/0/packager", 42, assert.True}, {"/packages/0/platforms/0/discoveryDependencies/0/name", 42, assert.True}, + {"/packages/0/platforms/0/monitorDependencies", 42, assert.True}, + {"/packages/0/platforms/0/monitorDependencies/0/packager", 42, assert.True}, + {"/packages/0/platforms/0/monitorDependencies/0/name", 42, assert.True}, {"/packages/0/tools", 42, assert.True}, {"/packages/0/tools/0/name", 42, assert.True}, {"/packages/0/tools/0/version", 42, assert.True}, @@ -717,6 +746,10 @@ func TestAdditionalProperties(t *testing.T) { {"/packages/0/platforms/0/discoveryDependencies/0", compliancelevel.Specification, assert.True}, {"/packages/0/platforms/0/discoveryDependencies/0", compliancelevel.Strict, assert.True}, + {"/packages/0/platforms/0/monitorDependencies/0", compliancelevel.Permissive, assert.True}, + {"/packages/0/platforms/0/monitorDependencies/0", compliancelevel.Specification, assert.True}, + {"/packages/0/platforms/0/monitorDependencies/0", compliancelevel.Strict, assert.True}, + {"/packages/0/tools/0", compliancelevel.Permissive, assert.True}, {"/packages/0/tools/0", compliancelevel.Specification, assert.True}, {"/packages/0/tools/0", compliancelevel.Strict, assert.True}, diff --git a/internal/rule/schema/schemadata/bindata.go b/internal/rule/schema/schemadata/bindata.go index 9172a85f4..2307c8d94 100644 --- a/internal/rule/schema/schemadata/bindata.go +++ b/internal/rule/schema/schemadata/bindata.go @@ -2987,6 +2987,9 @@ var _arduinoPackageIndexDefinitionsSchemaJson = []byte(`{ }, "discoveryDependencies": { "$ref": "#/definitions/propertiesObjects/discoveryDependencies/permissive/object" + }, + "monitorDependencies": { + "$ref": "#/definitions/propertiesObjects/monitorDependencies/permissive/object" } }, "additionalProperties": false @@ -3042,6 +3045,9 @@ var _arduinoPackageIndexDefinitionsSchemaJson = []byte(`{ }, "discoveryDependencies": { "$ref": "#/definitions/propertiesObjects/discoveryDependencies/specification/object" + }, + "monitorDependencies": { + "$ref": "#/definitions/propertiesObjects/monitorDependencies/specification/object" } }, "additionalProperties": false @@ -3097,6 +3103,9 @@ var _arduinoPackageIndexDefinitionsSchemaJson = []byte(`{ }, "discoveryDependencies": { "$ref": "#/definitions/propertiesObjects/discoveryDependencies/strict/object" + }, + "monitorDependencies": { + "$ref": "#/definitions/propertiesObjects/monitorDependencies/strict/object" } }, "additionalProperties": false @@ -3616,6 +3625,83 @@ var _arduinoPackageIndexDefinitionsSchemaJson = []byte(`{ } } }, + "monitorDependencies": { + "base": { + "object": { + "type": "array", + "items": { + "type": "object", + "required": ["packager", "name"] + } + } + }, + "permissive": { + "object": { + "allOf": [ + { + "$ref": "#/definitions/propertiesObjects/monitorDependencies/base/object" + }, + { + "items": { + "properties": { + "packager": { + "$ref": "#/definitions/propertiesObjects/packager/permissive/object" + }, + "name": { + "$ref": "#/definitions/propertiesObjects/toolName/permissive/object" + } + }, + "additionalProperties": false + } + } + ] + } + }, + "specification": { + "object": { + "allOf": [ + { + "$ref": "#/definitions/propertiesObjects/monitorDependencies/base/object" + }, + { + "items": { + "properties": { + "packager": { + "$ref": "#/definitions/propertiesObjects/packager/specification/object" + }, + "name": { + "$ref": "#/definitions/propertiesObjects/toolName/specification/object" + } + }, + "additionalProperties": false + } + } + ] + } + }, + "strict": { + "object": { + "allOf": [ + { + "$ref": "#/definitions/propertiesObjects/monitorDependencies/base/object" + }, + { + "items": { + "properties": { + "packager": { + "$ref": "#/definitions/propertiesObjects/packager/strict/object" + }, + "name": { + "$ref": "#/definitions/propertiesObjects/toolName/strict/object" + } + }, + "additionalProperties": false + } + } + ] + } + } + }, "packager": { "base": { "object": { From 090eb857219c3afa0e7fd2762ade88f914470acb Mon Sep 17 00:00:00 2001 From: per1234 Date: Thu, 11 Nov 2021 00:14:35 -0800 Subject: [PATCH 2/3] Refactor package index project data component parsing code There was an inefficient approach to populating the project data for package index components, where the slices were iterated over redundantly for each of the components they contained. At first perhaps a reasonable tradeoff for the sake of consistency and readability, the redundancy has became more significant over time as new components are added. With the pending addition of yet another for pluggable monitor support, it seems best to refactor now. --- internal/project/projectdata/packageindex.go | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/internal/project/projectdata/packageindex.go b/internal/project/projectdata/packageindex.go index 9a77ba287..0683d904b 100644 --- a/internal/project/projectdata/packageindex.go +++ b/internal/project/projectdata/packageindex.go @@ -54,24 +54,15 @@ func InitializeForPackageIndex() { for _, packageData := range PackageIndexPackages() { packageIndexPlatforms = append(packageIndexPlatforms, getPackageIndexData(packageData.Object, packageData.JSONPointer, "platforms", packageData.ID, ":{{index . 0}}@{{index . 1}}", []string{"architecture", "version"})...) + packageIndexTools = append(packageIndexTools, getPackageIndexData(packageData.Object, packageData.JSONPointer, "tools", packageData.ID, ":{{index . 0}}@{{index . 1}}", []string{"name", "version"})...) } for _, platformData := range PackageIndexPlatforms() { packageIndexBoards = append(packageIndexBoards, getPackageIndexData(platformData.Object, platformData.JSONPointer, "boards", platformData.ID, " >> {{index . 0}}", []string{"name"})...) - } - - for _, platformData := range PackageIndexPlatforms() { packageIndexToolsDependencies = append(packageIndexToolsDependencies, getPackageIndexData(platformData.Object, platformData.JSONPointer, "toolsDependencies", platformData.ID, " >> {{index . 0}}:{{index . 1}}@{{index . 2}}", []string{"packager", "name", "version"})...) - } - - for _, platformData := range PackageIndexPlatforms() { packageIndexDiscoveryDependencies = append(packageIndexDiscoveryDependencies, getPackageIndexData(platformData.Object, platformData.JSONPointer, "discoveryDependencies", platformData.ID, " >> {{index . 0}}:{{index . 1}}", []string{"packager", "name"})...) } - for _, packageData := range PackageIndexPackages() { - packageIndexTools = append(packageIndexTools, getPackageIndexData(packageData.Object, packageData.JSONPointer, "tools", packageData.ID, ":{{index . 0}}@{{index . 1}}", []string{"name", "version"})...) - } - for _, toolData := range PackageIndexTools() { packageIndexSystems = append(packageIndexSystems, getPackageIndexData(toolData.Object, toolData.JSONPointer, "systems", toolData.ID, " >> {{index . 0}}", []string{"host"})...) } From ec2851f01e9eaa88324e35061f49968d9a7791ea Mon Sep 17 00:00:00 2001 From: per1234 Date: Thu, 11 Nov 2021 06:10:46 -0800 Subject: [PATCH 3/3] Add schema-based rules for monitor dependencies data of package index These are the JSON schema-based rules to check the `packages[].platforms[].monitorDependencies[]`-level data of the Arduino Package Index. --- internal/project/projectdata/packageindex.go | 9 + .../project/projectdata/packageindex_test.go | 129 ++++++++++++++ .../empty-ids/package_foo_index.json | 52 ++++++ .../missing-ids/package_foo_index.json | 52 ++++++ .../package_foo_index.json | 26 +++ .../ruleconfiguration/ruleconfiguration.go | 136 +++++++++++++++ internal/rule/rulefunction/packageindex.go | 160 ++++++++++++++++++ .../rule/rulefunction/packageindex_test.go | 80 +++++++++ .../package_foo_index.json | 38 +++++ .../package_foo_index.json | 32 ++++ .../package_foo_index.json | 37 ++++ .../package_foo_index.json | 37 ++++ .../package_foo_index.json | 36 ++++ .../package_foo_index.json | 37 ++++ .../package_foo_index.json | 37 ++++ .../package_foo_index.json | 36 ++++ 16 files changed, 934 insertions(+) create mode 100644 internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-additional-properties/package_foo_index.json create mode 100644 internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-incorrect-type/package_foo_index.json create mode 100644 internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-name-incorrect-type/package_foo_index.json create mode 100644 internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-name-length-lt/package_foo_index.json create mode 100644 internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-name-missing/package_foo_index.json create mode 100644 internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-packager-incorrect-type/package_foo_index.json create mode 100644 internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-packager-length-lt/package_foo_index.json create mode 100644 internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-packager-missing/package_foo_index.json diff --git a/internal/project/projectdata/packageindex.go b/internal/project/projectdata/packageindex.go index 0683d904b..c9d514f88 100644 --- a/internal/project/projectdata/packageindex.go +++ b/internal/project/projectdata/packageindex.go @@ -46,6 +46,7 @@ func InitializeForPackageIndex() { packageIndexBoards = nil packageIndexToolsDependencies = nil packageIndexDiscoveryDependencies = nil + packageIndexMonitorDependencies = nil packageIndexTools = nil packageIndexSystems = nil packageIndexSchemaValidationResult = nil @@ -61,6 +62,7 @@ func InitializeForPackageIndex() { packageIndexBoards = append(packageIndexBoards, getPackageIndexData(platformData.Object, platformData.JSONPointer, "boards", platformData.ID, " >> {{index . 0}}", []string{"name"})...) packageIndexToolsDependencies = append(packageIndexToolsDependencies, getPackageIndexData(platformData.Object, platformData.JSONPointer, "toolsDependencies", platformData.ID, " >> {{index . 0}}:{{index . 1}}@{{index . 2}}", []string{"packager", "name", "version"})...) packageIndexDiscoveryDependencies = append(packageIndexDiscoveryDependencies, getPackageIndexData(platformData.Object, platformData.JSONPointer, "discoveryDependencies", platformData.ID, " >> {{index . 0}}:{{index . 1}}", []string{"packager", "name"})...) + packageIndexMonitorDependencies = append(packageIndexMonitorDependencies, getPackageIndexData(platformData.Object, platformData.JSONPointer, "monitorDependencies", platformData.ID, " >> {{index . 0}}:{{index . 1}}", []string{"packager", "name"})...) } for _, toolData := range PackageIndexTools() { @@ -127,6 +129,13 @@ func PackageIndexDiscoveryDependencies() []PackageIndexData { return packageIndexDiscoveryDependencies } +var packageIndexMonitorDependencies []PackageIndexData + +// PackageIndexMonitorDependencies returns the slice of pluggable monitor tool dependency data for the package index. +func PackageIndexMonitorDependencies() []PackageIndexData { + return packageIndexMonitorDependencies +} + var packageIndexTools []PackageIndexData // PackageIndexTools returns the slice of tool data for the package index. diff --git a/internal/project/projectdata/packageindex_test.go b/internal/project/projectdata/packageindex_test.go index e7f9424e4..cb037f886 100644 --- a/internal/project/projectdata/packageindex_test.go +++ b/internal/project/projectdata/packageindex_test.go @@ -52,6 +52,8 @@ func TestInitializeForPackageIndex(t *testing.T) { packageIndexToolsDependenciesDataAssertion []PackageIndexData packageIndexDiscoveryDependenciesAssertion assert.ValueAssertionFunc packageIndexDiscoveryDependenciesDataAssertion []PackageIndexData + packageIndexMonitorDependenciesAssertion assert.ValueAssertionFunc + packageIndexMonitorDependenciesDataAssertion []PackageIndexData packageIndexToolsAssertion assert.ValueAssertionFunc packageIndexToolsDataAssertion []PackageIndexData packageIndexSystemsAssertion assert.ValueAssertionFunc @@ -187,6 +189,29 @@ func TestInitializeForPackageIndex(t *testing.T) { JSONPointer: "/packages/1/platforms/1/discoveryDependencies/0", }, }, + packageIndexMonitorDependenciesAssertion: assert.NotNil, + packageIndexMonitorDependenciesDataAssertion: []PackageIndexData{ + { + ID: "foopackager1:avr@1.0.1 >> arduino:network-monitor", + JSONPointer: "/packages/0/platforms/1/monitorDependencies/0", + }, + { + ID: "foopackager1:avr@1.0.1 >> barpackager:coop-monitor", + JSONPointer: "/packages/0/platforms/1/monitorDependencies/1", + }, + { + ID: "foopackager2:samd@2.0.0 >> arduino:network-monitor", + JSONPointer: "/packages/1/platforms/0/monitorDependencies/0", + }, + { + ID: "foopackager2:samd@2.0.0 >> bazpackager:flag-monitor", + JSONPointer: "/packages/1/platforms/0/monitorDependencies/1", + }, + { + ID: "foopackager2:mbed@1.1.1 >> quxpackager:shoe-monitor", + JSONPointer: "/packages/1/platforms/1/monitorDependencies/0", + }, + }, packageIndexToolsAssertion: assert.NotNil, packageIndexToolsDataAssertion: []PackageIndexData{ { @@ -400,6 +425,53 @@ func TestInitializeForPackageIndex(t *testing.T) { JSONPointer: "/packages/1/platforms/2/discoveryDependencies/2", }, }, + packageIndexMonitorDependenciesAssertion: assert.NotNil, + packageIndexMonitorDependenciesDataAssertion: []PackageIndexData{ + { + ID: "/packages/0/platforms/0/monitorDependencies/0", + JSONPointer: "/packages/0/platforms/0/monitorDependencies/0", + }, + { + ID: "/packages/0/platforms/0/monitorDependencies/1", + JSONPointer: "/packages/0/platforms/0/monitorDependencies/1", + }, + { + ID: "/packages/0/platforms/1/monitorDependencies/0", + JSONPointer: "/packages/0/platforms/1/monitorDependencies/0", + }, + { + ID: "/packages/0/platforms/1/monitorDependencies/1", + JSONPointer: "/packages/0/platforms/1/monitorDependencies/1", + }, + { + ID: "/packages/1/platforms/0/monitorDependencies/0", + JSONPointer: "/packages/1/platforms/0/monitorDependencies/0", + }, + { + ID: "/packages/1/platforms/0/monitorDependencies/1", + JSONPointer: "/packages/1/platforms/0/monitorDependencies/1", + }, + { + ID: "/packages/1/platforms/1/monitorDependencies/0", + JSONPointer: "/packages/1/platforms/1/monitorDependencies/0", + }, + { + ID: "/packages/1/platforms/1/monitorDependencies/1", + JSONPointer: "/packages/1/platforms/1/monitorDependencies/1", + }, + { + ID: "/packages/1/platforms/2/monitorDependencies/0", + JSONPointer: "/packages/1/platforms/2/monitorDependencies/0", + }, + { + ID: "/packages/1/platforms/2/monitorDependencies/1", + JSONPointer: "/packages/1/platforms/2/monitorDependencies/1", + }, + { + ID: "foopackager2:megaavr@1.0.0 >> quxpackager:shoe-monitor", + JSONPointer: "/packages/1/platforms/2/monitorDependencies/2", + }, + }, packageIndexToolsAssertion: assert.NotNil, packageIndexToolsDataAssertion: []PackageIndexData{ { @@ -621,6 +693,53 @@ func TestInitializeForPackageIndex(t *testing.T) { JSONPointer: "/packages/1/platforms/2/discoveryDependencies/2", }, }, + packageIndexMonitorDependenciesAssertion: assert.NotNil, + packageIndexMonitorDependenciesDataAssertion: []PackageIndexData{ + { + ID: "/packages/0/platforms/0/monitorDependencies/0", + JSONPointer: "/packages/0/platforms/0/monitorDependencies/0", + }, + { + ID: "/packages/0/platforms/0/monitorDependencies/1", + JSONPointer: "/packages/0/platforms/0/monitorDependencies/1", + }, + { + ID: "/packages/0/platforms/1/monitorDependencies/0", + JSONPointer: "/packages/0/platforms/1/monitorDependencies/0", + }, + { + ID: "/packages/0/platforms/1/monitorDependencies/1", + JSONPointer: "/packages/0/platforms/1/monitorDependencies/1", + }, + { + ID: "/packages/1/platforms/0/monitorDependencies/0", + JSONPointer: "/packages/1/platforms/0/monitorDependencies/0", + }, + { + ID: "/packages/1/platforms/0/monitorDependencies/1", + JSONPointer: "/packages/1/platforms/0/monitorDependencies/1", + }, + { + ID: "/packages/1/platforms/1/monitorDependencies/0", + JSONPointer: "/packages/1/platforms/1/monitorDependencies/0", + }, + { + ID: "/packages/1/platforms/1/monitorDependencies/1", + JSONPointer: "/packages/1/platforms/1/monitorDependencies/1", + }, + { + ID: "/packages/1/platforms/2/monitorDependencies/0", + JSONPointer: "/packages/1/platforms/2/monitorDependencies/0", + }, + { + ID: "/packages/1/platforms/2/monitorDependencies/1", + JSONPointer: "/packages/1/platforms/2/monitorDependencies/1", + }, + { + ID: "foopackager2:megaavr@1.0.0 >> quxpackager:shoe-monitor", + JSONPointer: "/packages/1/platforms/2/monitorDependencies/2", + }, + }, packageIndexToolsAssertion: assert.NotNil, packageIndexToolsDataAssertion: []PackageIndexData{ { @@ -672,6 +791,7 @@ func TestInitializeForPackageIndex(t *testing.T) { packageIndexBoardsAssertion: assert.Nil, packageIndexToolsDependenciesAssertion: assert.Nil, packageIndexDiscoveryDependenciesAssertion: assert.Nil, + packageIndexMonitorDependenciesAssertion: assert.Nil, packageIndexToolsAssertion: assert.Nil, packageIndexSystemsAssertion: assert.Nil, packageIndexSchemaValidationResultAssertion: assert.Nil, @@ -687,6 +807,7 @@ func TestInitializeForPackageIndex(t *testing.T) { packageIndexBoardsAssertion: assert.Nil, packageIndexToolsDependenciesAssertion: assert.Nil, packageIndexDiscoveryDependenciesAssertion: assert.Nil, + packageIndexMonitorDependenciesAssertion: assert.Nil, packageIndexToolsAssertion: assert.Nil, packageIndexSystemsAssertion: assert.Nil, packageIndexSchemaValidationResultAssertion: assert.Nil, @@ -748,6 +869,14 @@ func TestInitializeForPackageIndex(t *testing.T) { } } + testTable.packageIndexMonitorDependenciesAssertion(t, PackageIndexMonitorDependencies(), testTable.testName) + if PackageIndexMonitorDependencies() != nil { + for index, packageIndexMonitorDependency := range PackageIndexMonitorDependencies() { + assert.Equal(t, testTable.packageIndexMonitorDependenciesDataAssertion[index].ID, packageIndexMonitorDependency.ID, testTable.testName) + assert.Equal(t, testTable.packageIndexMonitorDependenciesDataAssertion[index].JSONPointer, packageIndexMonitorDependency.JSONPointer, testTable.testName) + } + } + testTable.packageIndexToolsAssertion(t, PackageIndexTools(), testTable.testName) if PackageIndexTools() != nil { for index, packageIndexTool := range PackageIndexTools() { diff --git a/internal/project/projectdata/testdata/packageindexes/empty-ids/package_foo_index.json b/internal/project/projectdata/testdata/packageindexes/empty-ids/package_foo_index.json index 076738e3c..01280d55c 100644 --- a/internal/project/projectdata/testdata/packageindexes/empty-ids/package_foo_index.json +++ b/internal/project/projectdata/testdata/packageindexes/empty-ids/package_foo_index.json @@ -43,6 +43,16 @@ "packager": "barpackager", "name": "carrier-pigeon-discovery" } + ], + "monitorDependencies": [ + { + "packager": "arduino", + "name": "network-monitor" + }, + { + "packager": "barpackager", + "name": "coop-monitor" + } ] }, { @@ -79,6 +89,16 @@ "packager": "barpackager", "name": "carrier-pigeon-discovery" } + ], + "monitorDependencies": [ + { + "packager": "arduino", + "name": "network-monitor" + }, + { + "packager": "barpackager", + "name": "coop-monitor" + } ] } ], @@ -127,6 +147,16 @@ "packager": "bazpackager", "name": "signal-flag-discovery" } + ], + "monitorDependencies": [ + { + "packager": "arduino", + "name": "network-monitor" + }, + { + "packager": "bazpackager", + "name": "flag-monitor" + } ] }, { @@ -163,6 +193,16 @@ "packager": "bazpackager", "name": "signal-flag-discovery" } + ], + "monitorDependencies": [ + { + "packager": "arduino", + "name": "network-monitor" + }, + { + "packager": "bazpackager", + "name": "flag-monitor" + } ] }, { @@ -211,6 +251,18 @@ "packager": "quxpackager", "name": "sneakernet-discovery" } + ], + "monitorDependencies": [ + { + "name": "network-monitor" + }, + { + "packager": "bazpackager" + }, + { + "packager": "quxpackager", + "name": "shoe-monitor" + } ] } ], diff --git a/internal/project/projectdata/testdata/packageindexes/missing-ids/package_foo_index.json b/internal/project/projectdata/testdata/packageindexes/missing-ids/package_foo_index.json index ea1b56227..a4b9acf42 100644 --- a/internal/project/projectdata/testdata/packageindexes/missing-ids/package_foo_index.json +++ b/internal/project/projectdata/testdata/packageindexes/missing-ids/package_foo_index.json @@ -42,6 +42,16 @@ "packager": "barpackager", "name": "carrier-pigeon-discovery" } + ], + "monitorDependencies": [ + { + "packager": "arduino", + "name": "network-monitor" + }, + { + "packager": "barpackager", + "name": "coop-monitor" + } ] }, { @@ -78,6 +88,16 @@ "packager": "barpackager", "name": "carrier-pigeon-discovery" } + ], + "monitorDependencies": [ + { + "packager": "arduino", + "name": "network-monitor" + }, + { + "packager": "barpackager", + "name": "coop-monitor" + } ] } ], @@ -125,6 +145,16 @@ "packager": "bazpackager", "name": "signal-flag-discovery" } + ], + "monitorDependencies": [ + { + "packager": "arduino", + "name": "network-monitor" + }, + { + "packager": "bazpackager", + "name": "flag-monitor" + } ] }, { @@ -160,6 +190,16 @@ "packager": "bazpackager", "name": "signal-flag-discovery" } + ], + "monitorDependencies": [ + { + "packager": "arduino", + "name": "network-monitor" + }, + { + "packager": "bazpackager", + "name": "flag-monitor" + } ] }, { @@ -205,6 +245,18 @@ "packager": "quxpackager", "name": "sneakernet-discovery" } + ], + "monitorDependencies": [ + { + "name": "network-monitor" + }, + { + "packager": "bazpackager" + }, + { + "packager": "quxpackager", + "name": "shoe-monitor" + } ] } ], diff --git a/internal/project/projectdata/testdata/packageindexes/valid-package-index/package_foo_index.json b/internal/project/projectdata/testdata/packageindexes/valid-package-index/package_foo_index.json index 671817646..49e667f36 100644 --- a/internal/project/projectdata/testdata/packageindexes/valid-package-index/package_foo_index.json +++ b/internal/project/projectdata/testdata/packageindexes/valid-package-index/package_foo_index.json @@ -69,6 +69,16 @@ "packager": "barpackager", "name": "carrier-pigeon-discovery" } + ], + "monitorDependencies": [ + { + "packager": "arduino", + "name": "network-monitor" + }, + { + "packager": "barpackager", + "name": "coop-monitor" + } ] } ], @@ -117,6 +127,16 @@ "packager": "bazpackager", "name": "signal-flag-discovery" } + ], + "monitorDependencies": [ + { + "packager": "arduino", + "name": "network-monitor" + }, + { + "packager": "bazpackager", + "name": "flag-monitor" + } ] }, { @@ -149,6 +169,12 @@ "packager": "quxpackager", "name": "sneakernet-discovery" } + ], + "monitorDependencies": [ + { + "packager": "quxpackager", + "name": "shoe-monitor" + } ] } ], diff --git a/internal/rule/ruleconfiguration/ruleconfiguration.go b/internal/rule/ruleconfiguration/ruleconfiguration.go index 5c861f77f..e162284ef 100644 --- a/internal/rule/ruleconfiguration/ruleconfiguration.go +++ b/internal/rule/ruleconfiguration/ruleconfiguration.go @@ -4700,6 +4700,142 @@ var configurations = []Type{ ErrorModes: []rulemode.Type{rulemode.Default}, RuleFunction: rulefunction.PackageIndexPackagesPlatformsDiscoveryDependenciesNameLTMinLength, }, + { + ProjectType: projecttype.PackageIndex, + SuperprojectType: projecttype.All, + Category: "data", + Subcategory: "platform", + ID: "IL067", + Brief: "incorrect packages[*].platforms[*].monitorDependencies type", + Description: "The package index has a platform with a `monitorDependencies` property of incorrect type.", + MessageTemplate: "packages[*].platforms[*].monitorDependencies property has incorrect type in platform(s):\n{{.}}", + Reference: "https://arduino.github.io/arduino-cli/latest/package_index_json-specification/#platforms-definitions", + DisableModes: nil, + EnableModes: []rulemode.Type{rulemode.Default}, + InfoModes: nil, + WarningModes: nil, + ErrorModes: []rulemode.Type{rulemode.Default}, + RuleFunction: rulefunction.PackageIndexPackagesPlatformsMonitorDependenciesIncorrectType, + }, + { + ProjectType: projecttype.PackageIndex, + SuperprojectType: projecttype.All, + Category: "data", + Subcategory: "platform", + ID: "IL068", + Brief: "unrecognized properties in packages[*].platforms[*].monitorDependencies[*]", + Description: "A `monitorDependencies` object for one of the package index's platforms contains unknown data properties.", + MessageTemplate: "Unknown properties under packages[*].platforms[*].monitorDependencies[*] found in platform(s):\n{{.}}", + Reference: "https://arduino.github.io/arduino-cli/latest/package_index_json-specification/#platforms-definitions", + DisableModes: nil, + EnableModes: []rulemode.Type{rulemode.Default}, + InfoModes: nil, + WarningModes: nil, + ErrorModes: []rulemode.Type{rulemode.Default}, + RuleFunction: rulefunction.PackageIndexPackagesPlatformsMonitorDependenciesAdditionalProperties, + }, + { + ProjectType: projecttype.PackageIndex, + SuperprojectType: projecttype.All, + Category: "data", + Subcategory: "platform", + ID: "IL069", + Brief: "packages[*].platforms[*].monitorDependencies[*].packager missing", + Description: "A `monitorDependencies` object for one of the package index's platforms is missing a `packager` property.", + MessageTemplate: "Missing packages[*].platforms[*].monitorDependencies[*].packager property in platform(s):\n{{.}}", + Reference: "https://arduino.github.io/arduino-cli/latest/package_index_json-specification/#platforms-definitions", + DisableModes: nil, + EnableModes: []rulemode.Type{rulemode.Default}, + InfoModes: nil, + WarningModes: nil, + ErrorModes: []rulemode.Type{rulemode.Default}, + RuleFunction: rulefunction.PackageIndexPackagesPlatformsMonitorDependenciesPackagerMissing, + }, + { + ProjectType: projecttype.PackageIndex, + SuperprojectType: projecttype.All, + Category: "data", + Subcategory: "platform", + ID: "IL070", + Brief: "incorrect packages[*].platforms[*].monitorDependencies[*].packager type", + Description: "A `monitorDependencies` object for one of the package index's platforms has a `packager` property of incorrect type.", + MessageTemplate: "packages[*].platforms[*].monitorDependencies[*].packager property has incorrect type in platform(s):\n{{.}}", + Reference: "https://arduino.github.io/arduino-cli/latest/package_index_json-specification/#platforms-definitions", + DisableModes: nil, + EnableModes: []rulemode.Type{rulemode.Default}, + InfoModes: nil, + WarningModes: nil, + ErrorModes: []rulemode.Type{rulemode.Default}, + RuleFunction: rulefunction.PackageIndexPackagesPlatformsMonitorDependenciesPackagerIncorrectType, + }, + { + ProjectType: projecttype.PackageIndex, + SuperprojectType: projecttype.All, + Category: "data", + Subcategory: "platform", + ID: "IL071", + Brief: "packages[*].platforms[*].monitorDependencies[*].packager < min length", + Description: "A `monitorDependencies` object for one of the package index's platforms has a `packager` property shorter than the minimum length.", + MessageTemplate: "packages[*].platforms[*].monitorDependencies[*].packager value less than the minimum length in platform(s):\n{{.}}", + Reference: "https://arduino.github.io/arduino-cli/latest/package_index_json-specification/#platforms-definitions", + DisableModes: nil, + EnableModes: []rulemode.Type{rulemode.Default}, + InfoModes: nil, + WarningModes: nil, + ErrorModes: []rulemode.Type{rulemode.Default}, + RuleFunction: rulefunction.PackageIndexPackagesPlatformsMonitorDependenciesPackagerLTMinLength, + }, + { + ProjectType: projecttype.PackageIndex, + SuperprojectType: projecttype.All, + Category: "data", + Subcategory: "platform", + ID: "IL072", + Brief: "packages[*].platforms[*].monitorDependencies[*].name missing", + Description: "A `monitorDependencies` object for one of the package index's platforms is missing a `name` property.", + MessageTemplate: "Missing packages[*].platforms[*].monitorDependencies[*].name property in platform(s):\n{{.}}", + Reference: "https://arduino.github.io/arduino-cli/latest/package_index_json-specification/#platforms-definitions", + DisableModes: nil, + EnableModes: []rulemode.Type{rulemode.Default}, + InfoModes: nil, + WarningModes: nil, + ErrorModes: []rulemode.Type{rulemode.Default}, + RuleFunction: rulefunction.PackageIndexPackagesPlatformsMonitorDependenciesNameMissing, + }, + { + ProjectType: projecttype.PackageIndex, + SuperprojectType: projecttype.All, + Category: "data", + Subcategory: "platform", + ID: "IL073", + Brief: "incorrect packages[*].platforms[*].monitorDependencies[*].name type", + Description: "A `monitorDependencies` object for one of the package index's platforms has a `name` property of incorrect type.", + MessageTemplate: "packages[*].platforms[*].monitorDependencies[*].name property has incorrect type in platform(s):\n{{.}}", + Reference: "https://arduino.github.io/arduino-cli/latest/package_index_json-specification/#platforms-definitions", + DisableModes: nil, + EnableModes: []rulemode.Type{rulemode.Default}, + InfoModes: nil, + WarningModes: nil, + ErrorModes: []rulemode.Type{rulemode.Default}, + RuleFunction: rulefunction.PackageIndexPackagesPlatformsMonitorDependenciesNameIncorrectType, + }, + { + ProjectType: projecttype.PackageIndex, + SuperprojectType: projecttype.All, + Category: "data", + Subcategory: "platform", + ID: "IL074", + Brief: "packages[*].platforms[*].monitorDependencies[*].name < min length", + Description: "A `monitorDependencies` object for one of the package index's platforms has a `name` property shorter than the minimum length.", + MessageTemplate: "packages[*].platforms[*].monitorDependencies[*].name value less than the minimum length in platform(s):\n{{.}}", + Reference: "https://arduino.github.io/arduino-cli/latest/package_index_json-specification/#platforms-definitions", + DisableModes: nil, + EnableModes: []rulemode.Type{rulemode.Default}, + InfoModes: nil, + WarningModes: nil, + ErrorModes: []rulemode.Type{rulemode.Default}, + RuleFunction: rulefunction.PackageIndexPackagesPlatformsMonitorDependenciesNameLTMinLength, + }, { ProjectType: projecttype.PackageIndex, SuperprojectType: projecttype.All, diff --git a/internal/rule/rulefunction/packageindex.go b/internal/rule/rulefunction/packageindex.go index f3f24c5b3..601e60197 100644 --- a/internal/rule/rulefunction/packageindex.go +++ b/internal/rule/rulefunction/packageindex.go @@ -1936,6 +1936,166 @@ func PackageIndexPackagesPlatformsDiscoveryDependenciesNameLTMinLength() (result return ruleresult.Pass, "" } +// PackageIndexPackagesPlatformsMonitorDependenciesIncorrectType checks for incorrect type of the packages[].platforms[].monitorDependencies property. +func PackageIndexPackagesPlatformsMonitorDependenciesIncorrectType() (result ruleresult.Type, output string) { + if projectdata.PackageIndexLoadError() != nil { + return ruleresult.NotRun, "Error loading package index" + } + + nonCompliantIDs := []string{} + for _, platformData := range projectdata.PackageIndexPlatforms() { + if schema.PropertyTypeMismatch(platformData.JSONPointer+"/monitorDependencies", projectdata.PackageIndexSchemaValidationResult()[compliancelevel.Specification]) { + nonCompliantIDs = append(nonCompliantIDs, platformData.ID) + } + } + + if len(nonCompliantIDs) > 0 { + return ruleresult.Fail, brokenOutputList(nonCompliantIDs) + } + + return ruleresult.Pass, "" +} + +// PackageIndexPackagesPlatformsMonitorDependenciesAdditionalProperties checks for additional properties in packages[].platforms[].monitorDependencies[]. +func PackageIndexPackagesPlatformsMonitorDependenciesAdditionalProperties() (result ruleresult.Type, output string) { + if projectdata.PackageIndexLoadError() != nil { + return ruleresult.NotRun, "Error loading package index" + } + + nonCompliantIDs := []string{} + for _, dependencyData := range projectdata.PackageIndexMonitorDependencies() { + if schema.ProhibitedAdditionalProperties(dependencyData.JSONPointer, projectdata.PackageIndexSchemaValidationResult()[compliancelevel.Specification]) { + nonCompliantIDs = append(nonCompliantIDs, dependencyData.ID) + } + } + + if len(nonCompliantIDs) > 0 { + return ruleresult.Fail, brokenOutputList(nonCompliantIDs) + } + + return ruleresult.Pass, "" +} + +// PackageIndexPackagesPlatformsMonitorDependenciesPackagerMissing checks for missing packages[].platforms[].monitorDependencies[].packager property. +func PackageIndexPackagesPlatformsMonitorDependenciesPackagerMissing() (result ruleresult.Type, output string) { + if projectdata.PackageIndexLoadError() != nil { + return ruleresult.NotRun, "Error loading package index" + } + + nonCompliantIDs := []string{} + for _, dependencyData := range projectdata.PackageIndexMonitorDependencies() { + if schema.RequiredPropertyMissing(dependencyData.JSONPointer+"/packager", projectdata.PackageIndexSchemaValidationResult()[compliancelevel.Specification]) { + nonCompliantIDs = append(nonCompliantIDs, dependencyData.ID) + } + } + + if len(nonCompliantIDs) > 0 { + return ruleresult.Fail, brokenOutputList(nonCompliantIDs) + } + + return ruleresult.Pass, "" +} + +// PackageIndexPackagesPlatformsMonitorDependenciesPackagerIncorrectType checks for incorrect type of the packages[].platforms[].monitorDependencies[].packager property. +func PackageIndexPackagesPlatformsMonitorDependenciesPackagerIncorrectType() (result ruleresult.Type, output string) { + if projectdata.PackageIndexLoadError() != nil { + return ruleresult.NotRun, "Error loading package index" + } + + nonCompliantIDs := []string{} + for _, dependencyData := range projectdata.PackageIndexMonitorDependencies() { + if schema.PropertyTypeMismatch(dependencyData.JSONPointer+"/packager", projectdata.PackageIndexSchemaValidationResult()[compliancelevel.Specification]) { + nonCompliantIDs = append(nonCompliantIDs, dependencyData.ID) + } + } + + if len(nonCompliantIDs) > 0 { + return ruleresult.Fail, brokenOutputList(nonCompliantIDs) + } + + return ruleresult.Pass, "" +} + +// PackageIndexPackagesPlatformsMonitorDependenciesPackagerLTMinLength checks for packages[].platforms[].monitorDependencies[].packager property less than the minimum length. +func PackageIndexPackagesPlatformsMonitorDependenciesPackagerLTMinLength() (result ruleresult.Type, output string) { + if projectdata.PackageIndexLoadError() != nil { + return ruleresult.NotRun, "Error loading package index" + } + + nonCompliantIDs := []string{} + for _, dependencyData := range projectdata.PackageIndexMonitorDependencies() { + if schema.PropertyLessThanMinLength(dependencyData.JSONPointer+"/packager", projectdata.PackageIndexSchemaValidationResult()[compliancelevel.Specification]) { + nonCompliantIDs = append(nonCompliantIDs, dependencyData.ID) + } + } + + if len(nonCompliantIDs) > 0 { + return ruleresult.Fail, brokenOutputList(nonCompliantIDs) + } + + return ruleresult.Pass, "" +} + +// PackageIndexPackagesPlatformsMonitorDependenciesNameMissing checks for missing packages[].platforms[].monitorDependencies[].name property. +func PackageIndexPackagesPlatformsMonitorDependenciesNameMissing() (result ruleresult.Type, output string) { + if projectdata.PackageIndexLoadError() != nil { + return ruleresult.NotRun, "Error loading package index" + } + + nonCompliantIDs := []string{} + for _, dependencyData := range projectdata.PackageIndexMonitorDependencies() { + if schema.RequiredPropertyMissing(dependencyData.JSONPointer+"/name", projectdata.PackageIndexSchemaValidationResult()[compliancelevel.Specification]) { + nonCompliantIDs = append(nonCompliantIDs, dependencyData.ID) + } + } + + if len(nonCompliantIDs) > 0 { + return ruleresult.Fail, brokenOutputList(nonCompliantIDs) + } + + return ruleresult.Pass, "" +} + +// PackageIndexPackagesPlatformsMonitorDependenciesNameIncorrectType checks for incorrect type of the packages[].platforms[].monitorDependencies[].name property. +func PackageIndexPackagesPlatformsMonitorDependenciesNameIncorrectType() (result ruleresult.Type, output string) { + if projectdata.PackageIndexLoadError() != nil { + return ruleresult.NotRun, "Error loading package index" + } + + nonCompliantIDs := []string{} + for _, dependencyData := range projectdata.PackageIndexMonitorDependencies() { + if schema.PropertyTypeMismatch(dependencyData.JSONPointer+"/name", projectdata.PackageIndexSchemaValidationResult()[compliancelevel.Specification]) { + nonCompliantIDs = append(nonCompliantIDs, dependencyData.ID) + } + } + + if len(nonCompliantIDs) > 0 { + return ruleresult.Fail, brokenOutputList(nonCompliantIDs) + } + + return ruleresult.Pass, "" +} + +// PackageIndexPackagesPlatformsMonitorDependenciesNameLTMinLength checks for packages[].platforms[].monitorDependencies[].name property less than the minimum length. +func PackageIndexPackagesPlatformsMonitorDependenciesNameLTMinLength() (result ruleresult.Type, output string) { + if projectdata.PackageIndexLoadError() != nil { + return ruleresult.NotRun, "Error loading package index" + } + + nonCompliantIDs := []string{} + for _, dependencyData := range projectdata.PackageIndexMonitorDependencies() { + if schema.PropertyLessThanMinLength(dependencyData.JSONPointer+"/name", projectdata.PackageIndexSchemaValidationResult()[compliancelevel.Specification]) { + nonCompliantIDs = append(nonCompliantIDs, dependencyData.ID) + } + } + + if len(nonCompliantIDs) > 0 { + return ruleresult.Fail, brokenOutputList(nonCompliantIDs) + } + + return ruleresult.Pass, "" +} + // PackageIndexPackagesToolsMissing checks for missing packages[].tools property. func PackageIndexPackagesToolsMissing() (result ruleresult.Type, output string) { if projectdata.PackageIndexLoadError() != nil { diff --git a/internal/rule/rulefunction/packageindex_test.go b/internal/rule/rulefunction/packageindex_test.go index f396516ac..4cd1c7ea5 100644 --- a/internal/rule/rulefunction/packageindex_test.go +++ b/internal/rule/rulefunction/packageindex_test.go @@ -1013,6 +1013,86 @@ func TestPackageIndexPackagesPlatformsDiscoveryDependenciesNameLTMinLength(t *te checkPackageIndexRuleFunction(PackageIndexPackagesPlatformsDiscoveryDependenciesNameLTMinLength, testTables, t) } +func TestPackageIndexPackagesPlatformsMonitorDependenciesIncorrectType(t *testing.T) { + testTables := []packageIndexRuleFunctionTestTable{ + {"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""}, + {"Incorrect packages[].platforms[].monitorDependencies type", "packages-platforms-monitordependencies-incorrect-type", ruleresult.Fail, "^" + brokenOutputListIndent + "foopackager:avr@1\\.0\\.0$"}, + {"Valid", "valid-package-index", ruleresult.Pass, ""}, + } + + checkPackageIndexRuleFunction(PackageIndexPackagesPlatformsMonitorDependenciesIncorrectType, testTables, t) +} + +func TestPackageIndexPackagesPlatformsMonitorDependenciesAdditionalProperties(t *testing.T) { + testTables := []packageIndexRuleFunctionTestTable{ + {"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""}, + {"Additional packages[].platforms[].monitorDependencies[] properties", "packages-platforms-monitordependencies-additional-properties", ruleresult.Fail, "^" + brokenOutputListIndent + "foopackager:avr@1\\.0\\.0 >> arduino:network-monitor$"}, + {"Valid", "valid-package-index", ruleresult.Pass, ""}, + } + + checkPackageIndexRuleFunction(PackageIndexPackagesPlatformsMonitorDependenciesAdditionalProperties, testTables, t) +} + +func TestPackageIndexPackagesPlatformsMonitorDependenciesPackagerMissing(t *testing.T) { + testTables := []packageIndexRuleFunctionTestTable{ + {"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""}, + {"packages[].platforms[].monitorDependencies[].packager missing", "packages-platforms-monitordependencies-packager-missing", ruleresult.Fail, "^" + brokenOutputListIndent + "/packages/0/platforms/0/monitorDependencies/0$"}, + {"Valid", "valid-package-index", ruleresult.Pass, ""}, + } + + checkPackageIndexRuleFunction(PackageIndexPackagesPlatformsMonitorDependenciesPackagerMissing, testTables, t) +} + +func TestPackageIndexPackagesPlatformsMonitorDependenciesPackagerIncorrectType(t *testing.T) { + testTables := []packageIndexRuleFunctionTestTable{ + {"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""}, + {"Incorrect packages[].platforms[].monitorDependencies[].packager type", "packages-platforms-monitordependencies-packager-incorrect-type", ruleresult.Fail, "^" + brokenOutputListIndent + "/packages/0/platforms/0/monitorDependencies/0$"}, + {"Valid", "valid-package-index", ruleresult.Pass, ""}, + } + + checkPackageIndexRuleFunction(PackageIndexPackagesPlatformsMonitorDependenciesPackagerIncorrectType, testTables, t) +} + +func TestPackageIndexPackagesPlatformsMonitorDependenciesPackagerLTMinLength(t *testing.T) { + testTables := []packageIndexRuleFunctionTestTable{ + {"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""}, + {"packages[].platforms[].monitorDependencies[].packager < min length", "packages-platforms-monitordependencies-packager-length-lt", ruleresult.Fail, "^" + brokenOutputListIndent + "/packages/0/platforms/0/monitorDependencies/0$"}, + {"Valid", "valid-package-index", ruleresult.Pass, ""}, + } + + checkPackageIndexRuleFunction(PackageIndexPackagesPlatformsMonitorDependenciesPackagerLTMinLength, testTables, t) +} + +func TestPackageIndexPackagesPlatformsMonitorDependenciesNameMissing(t *testing.T) { + testTables := []packageIndexRuleFunctionTestTable{ + {"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""}, + {"packages[].platforms[].monitorDependencies[].name missing", "packages-platforms-monitordependencies-name-missing", ruleresult.Fail, "^" + brokenOutputListIndent + "/packages/0/platforms/0/monitorDependencies/0$"}, + {"Valid", "valid-package-index", ruleresult.Pass, ""}, + } + + checkPackageIndexRuleFunction(PackageIndexPackagesPlatformsMonitorDependenciesNameMissing, testTables, t) +} + +func TestPackageIndexPackagesPlatformsMonitorDependenciesNameIncorrectType(t *testing.T) { + testTables := []packageIndexRuleFunctionTestTable{ + {"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""}, + {"Incorrect packages[].platforms[].monitorDependencies[].name type", "packages-platforms-monitordependencies-name-incorrect-type", ruleresult.Fail, "^" + brokenOutputListIndent + "/packages/0/platforms/0/monitorDependencies/0$"}, + {"Valid", "valid-package-index", ruleresult.Pass, ""}, + } + + checkPackageIndexRuleFunction(PackageIndexPackagesPlatformsMonitorDependenciesNameIncorrectType, testTables, t) +} + +func TestPackageIndexPackagesPlatformsMonitorDependenciesNameLTMinLength(t *testing.T) { + testTables := []packageIndexRuleFunctionTestTable{ + {"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""}, + {"packages[].platforms[].monitorDependencies[].name < min length", "packages-platforms-monitordependencies-name-length-lt", ruleresult.Fail, "^" + brokenOutputListIndent + "/packages/0/platforms/0/monitorDependencies/0$"}, + {"Valid", "valid-package-index", ruleresult.Pass, ""}, + } + + checkPackageIndexRuleFunction(PackageIndexPackagesPlatformsMonitorDependenciesNameLTMinLength, testTables, t) +} + func TestPackageIndexPackagesToolsMissing(t *testing.T) { testTables := []packageIndexRuleFunctionTestTable{ {"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""}, diff --git a/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-additional-properties/package_foo_index.json b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-additional-properties/package_foo_index.json new file mode 100644 index 000000000..81bc56717 --- /dev/null +++ b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-additional-properties/package_foo_index.json @@ -0,0 +1,38 @@ +{ + "packages": [ + { + "name": "foopackager", + "maintainer": "Jane Developer", + "websiteURL": "http://example.com", + "email": "jane@example.com", + "help": { + "online": "http://example.com" + }, + "platforms": [ + { + "name": "My Board", + "architecture": "avr", + "version": "1.0.0", + "category": "Contributed", + "help": { + "online": "http://example.com" + }, + "url": "http://example.com", + "archiveFileName": "myboard-1.0.0.zip", + "checksum": "MD5:6c0f556759894aa1a45e8af423a08ce8", + "size": "15005", + "boards": [], + "toolsDependencies": [], + "monitorDependencies": [ + { + "foo": "bar", + "packager": "arduino", + "name": "network-monitor" + } + ] + } + ], + "tools": [] + } + ] +} diff --git a/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-incorrect-type/package_foo_index.json b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-incorrect-type/package_foo_index.json new file mode 100644 index 000000000..038679893 --- /dev/null +++ b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-incorrect-type/package_foo_index.json @@ -0,0 +1,32 @@ +{ + "packages": [ + { + "name": "foopackager", + "maintainer": "Jane Developer", + "websiteURL": "http://example.com", + "email": "jane@example.com", + "help": { + "online": "http://example.com" + }, + "platforms": [ + { + "name": "My Board", + "architecture": "avr", + "version": "1.0.0", + "category": "Contributed", + "help": { + "online": "http://example.com" + }, + "url": "http://example.com", + "archiveFileName": "myboard-1.0.0.zip", + "checksum": "MD5:6c0f556759894aa1a45e8af423a08ce8", + "size": "15005", + "boards": [], + "toolsDependencies": [], + "monitorDependencies": 42 + } + ], + "tools": [] + } + ] +} diff --git a/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-name-incorrect-type/package_foo_index.json b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-name-incorrect-type/package_foo_index.json new file mode 100644 index 000000000..85ddd387d --- /dev/null +++ b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-name-incorrect-type/package_foo_index.json @@ -0,0 +1,37 @@ +{ + "packages": [ + { + "name": "foopackager", + "maintainer": "Jane Developer", + "websiteURL": "http://example.com", + "email": "jane@example.com", + "help": { + "online": "http://example.com" + }, + "platforms": [ + { + "name": "My Board", + "architecture": "avr", + "version": "1.0.0", + "category": "Contributed", + "help": { + "online": "http://example.com" + }, + "url": "http://example.com", + "archiveFileName": "myboard-1.0.0.zip", + "checksum": "MD5:6c0f556759894aa1a45e8af423a08ce8", + "size": "15005", + "boards": [], + "toolsDependencies": [], + "monitorDependencies": [ + { + "packager": "arduino", + "name": 42 + } + ] + } + ], + "tools": [] + } + ] +} diff --git a/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-name-length-lt/package_foo_index.json b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-name-length-lt/package_foo_index.json new file mode 100644 index 000000000..8b4403cda --- /dev/null +++ b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-name-length-lt/package_foo_index.json @@ -0,0 +1,37 @@ +{ + "packages": [ + { + "name": "foopackager", + "maintainer": "Jane Developer", + "websiteURL": "http://example.com", + "email": "jane@example.com", + "help": { + "online": "http://example.com" + }, + "platforms": [ + { + "name": "My Board", + "architecture": "avr", + "version": "1.0.0", + "category": "Contributed", + "help": { + "online": "http://example.com" + }, + "url": "http://example.com", + "archiveFileName": "myboard-1.0.0.zip", + "checksum": "MD5:6c0f556759894aa1a45e8af423a08ce8", + "size": "15005", + "boards": [], + "toolsDependencies": [], + "monitorDependencies": [ + { + "packager": "arduino", + "name": "" + } + ] + } + ], + "tools": [] + } + ] +} diff --git a/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-name-missing/package_foo_index.json b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-name-missing/package_foo_index.json new file mode 100644 index 000000000..ec72e5e78 --- /dev/null +++ b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-name-missing/package_foo_index.json @@ -0,0 +1,36 @@ +{ + "packages": [ + { + "name": "foopackager", + "maintainer": "Jane Developer", + "websiteURL": "http://example.com", + "email": "jane@example.com", + "help": { + "online": "http://example.com" + }, + "platforms": [ + { + "name": "My Board", + "architecture": "avr", + "version": "1.0.0", + "category": "Contributed", + "help": { + "online": "http://example.com" + }, + "url": "http://example.com", + "archiveFileName": "myboard-1.0.0.zip", + "checksum": "MD5:6c0f556759894aa1a45e8af423a08ce8", + "size": "15005", + "boards": [], + "toolsDependencies": [], + "monitorDependencies": [ + { + "packager": "arduino" + } + ] + } + ], + "tools": [] + } + ] +} diff --git a/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-packager-incorrect-type/package_foo_index.json b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-packager-incorrect-type/package_foo_index.json new file mode 100644 index 000000000..398da7d37 --- /dev/null +++ b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-packager-incorrect-type/package_foo_index.json @@ -0,0 +1,37 @@ +{ + "packages": [ + { + "name": "foopackager", + "maintainer": "Jane Developer", + "websiteURL": "http://example.com", + "email": "jane@example.com", + "help": { + "online": "http://example.com" + }, + "platforms": [ + { + "name": "My Board", + "architecture": "avr", + "version": "1.0.0", + "category": "Contributed", + "help": { + "online": "http://example.com" + }, + "url": "http://example.com", + "archiveFileName": "myboard-1.0.0.zip", + "checksum": "MD5:6c0f556759894aa1a45e8af423a08ce8", + "size": "15005", + "boards": [], + "toolsDependencies": [], + "monitorDependencies": [ + { + "packager": 42, + "name": "network-monitor" + } + ] + } + ], + "tools": [] + } + ] +} diff --git a/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-packager-length-lt/package_foo_index.json b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-packager-length-lt/package_foo_index.json new file mode 100644 index 000000000..c7a71f05d --- /dev/null +++ b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-packager-length-lt/package_foo_index.json @@ -0,0 +1,37 @@ +{ + "packages": [ + { + "name": "foopackager", + "maintainer": "Jane Developer", + "websiteURL": "http://example.com", + "email": "jane@example.com", + "help": { + "online": "http://example.com" + }, + "platforms": [ + { + "name": "My Board", + "architecture": "avr", + "version": "1.0.0", + "category": "Contributed", + "help": { + "online": "http://example.com" + }, + "url": "http://example.com", + "archiveFileName": "myboard-1.0.0.zip", + "checksum": "MD5:6c0f556759894aa1a45e8af423a08ce8", + "size": "15005", + "boards": [], + "toolsDependencies": [], + "monitorDependencies": [ + { + "packager": "", + "name": "network-monitor" + } + ] + } + ], + "tools": [] + } + ] +} diff --git a/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-packager-missing/package_foo_index.json b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-packager-missing/package_foo_index.json new file mode 100644 index 000000000..20197e7f2 --- /dev/null +++ b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-packager-missing/package_foo_index.json @@ -0,0 +1,36 @@ +{ + "packages": [ + { + "name": "foopackager", + "maintainer": "Jane Developer", + "websiteURL": "http://example.com", + "email": "jane@example.com", + "help": { + "online": "http://example.com" + }, + "platforms": [ + { + "name": "My Board", + "architecture": "avr", + "version": "1.0.0", + "category": "Contributed", + "help": { + "online": "http://example.com" + }, + "url": "http://example.com", + "archiveFileName": "myboard-1.0.0.zip", + "checksum": "MD5:6c0f556759894aa1a45e8af423a08ce8", + "size": "15005", + "boards": [], + "toolsDependencies": [], + "monitorDependencies": [ + { + "name": "network-monitor" + } + ] + } + ], + "tools": [] + } + ] +}