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 cd618b45..d5205a61 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 44422da8..c069e287 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 9172a85f..2307c8d9 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 9a77ba28..0683d904 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 0683d904..c9d514f8 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 e7f9424e..cb037f88 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 076738e3..01280d55 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 ea1b5622..a4b9acf4 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 67181764..49e667f3 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 5c861f77..e162284e 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 f3f24c5b..601e6019 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 f396516a..4cd1c7ea 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 00000000..81bc5671 --- /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 00000000..03867989 --- /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 00000000..85ddd387 --- /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 00000000..8b4403cd --- /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 00000000..ec72e5e7 --- /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 00000000..398da7d3 --- /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 00000000..c7a71f05 --- /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 00000000..20197e7f --- /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": [] + } + ] +}