From 00ef2f7b7db6e40da7acc79ec3ba738969276aa9 Mon Sep 17 00:00:00 2001
From: per1234 <accounts@perglass.com>
Date: Fri, 8 Jan 2021 03:43:19 -0800
Subject: [PATCH] Update platform.txt schema to account for the *_remote tools

The upload action for tools with name suffix "_remote" is  given special treatment by the build system. Because it's not
possible to check for this with the regexes provided by the JSON schema validation package, it's necessary to apply
those rules to all upload actions.
---
 ...duino-platform-txt-definitions-schema.json | 44 +++++++++++++++++--
 .../platformtxt/platformtxtschema_test.go     | 27 ++++++------
 .../ruleconfiguration/ruleconfiguration.go    | 32 --------------
 internal/rule/rulefunction/platform_test.go   | 24 ----------
 internal/rule/schema/schemadata/bindata.go    | 44 +++++++++++++++++--
 5 files changed, 95 insertions(+), 76 deletions(-)

diff --git a/etc/schemas/arduino-platform-txt-definitions-schema.json b/etc/schemas/arduino-platform-txt-definitions-schema.json
index c16d9eac4..177fd2f46 100644
--- a/etc/schemas/arduino-platform-txt-definitions-schema.json
+++ b/etc/schemas/arduino-platform-txt-definitions-schema.json
@@ -851,7 +851,7 @@
                 "$ref": "#/definitions/propertiesObjects/toolsToolNameUpload/base/object"
               },
               {
-                "$ref": "#/definitions/requiredObjects/toolsToolNameActionName/permissive/object"
+                "$ref": "#/definitions/requiredObjects/toolsToolNameUpload/permissive/object"
               }
             ]
           }
@@ -863,7 +863,7 @@
                 "$ref": "#/definitions/propertiesObjects/toolsToolNameUpload/base/object"
               },
               {
-                "$ref": "#/definitions/requiredObjects/toolsToolNameActionName/specification/object"
+                "$ref": "#/definitions/requiredObjects/toolsToolNameUpload/specification/object"
               }
             ]
           }
@@ -875,7 +875,7 @@
                 "$ref": "#/definitions/propertiesObjects/toolsToolNameUpload/base/object"
               },
               {
-                "$ref": "#/definitions/requiredObjects/toolsToolNameActionName/strict/object"
+                "$ref": "#/definitions/requiredObjects/toolsToolNameUpload/strict/object"
               }
             ]
           }
@@ -1168,6 +1168,44 @@
             ]
           }
         }
+      },
+      "toolsToolNameUpload": {
+        "base": {
+          "object": {
+            "allOf": [
+              {
+                "required": ["pattern"]
+              }
+            ]
+          }
+        },
+        "permissive": {
+          "object": {
+            "allOf": [
+              {
+                "$ref": "#/definitions/requiredObjects/toolsToolNameUpload/base/object"
+              }
+            ]
+          }
+        },
+        "specification": {
+          "object": {
+            "allOf": [
+              {
+                "$ref": "#/definitions/requiredObjects/toolsToolNameUpload/base/object"
+              }
+            ]
+          }
+        },
+        "strict": {
+          "object": {
+            "allOf": [
+              {
+                "$ref": "#/definitions/requiredObjects/toolsToolNameUpload/base/object"
+              }
+            ]
+          }
+        }
       }
     }
   }
diff --git a/internal/project/platform/platformtxt/platformtxtschema_test.go b/internal/project/platform/platformtxt/platformtxtschema_test.go
index dd373b786..c04ca6f13 100644
--- a/internal/project/platform/platformtxt/platformtxtschema_test.go
+++ b/internal/project/platform/platformtxt/platformtxtschema_test.go
@@ -58,6 +58,9 @@ var validPlatformTxtRaw = []byte(`
 	tools.avrdude.upload.params.verbose=-v
 	tools.avrdude.upload.params.quiet=-q -q
 	tools.avrdude.upload.pattern=asdf
+	tools.avrdude.program.params.verbose=-v
+	tools.avrdude.program.params.quiet=-q -q
+	tools.avrdude.program.pattern=asdf
 	tools.bossac.upload.params.verbose=-v
 	tools.bossac.upload.params.quiet=-q -q
 	tools.bossac.upload.pattern=asdf
@@ -196,25 +199,21 @@ func TestRequired(t *testing.T) {
 		{"recipe.output.tmp_file", "recipe\\.output\\.tmp_file", compliancelevel.Specification, assert.True},
 		{"recipe.output.tmp_file", "recipe\\.output\\.tmp_file", compliancelevel.Strict, assert.True},
 
-		{"tools.avrdude.upload.params.verbose", "tools/avrdude/upload/params\\.verbose", compliancelevel.Permissive, assert.True},
-		{"tools.avrdude.upload.params.verbose", "tools/avrdude/upload/params\\.verbose", compliancelevel.Specification, assert.True},
-		{"tools.avrdude.upload.params.verbose", "tools/avrdude/upload/params\\.verbose", compliancelevel.Strict, assert.True},
-
-		{"tools.avrdude.upload.params.quiet", "tools/avrdude/upload/params\\.quiet", compliancelevel.Permissive, assert.True},
-		{"tools.avrdude.upload.params.quiet", "tools/avrdude/upload/params\\.quiet", compliancelevel.Specification, assert.True},
-		{"tools.avrdude.upload.params.quiet", "tools/avrdude/upload/params\\.quiet", compliancelevel.Strict, assert.True},
-
 		{"tools.avrdude.upload.pattern", "tools/avrdude/upload/pattern", compliancelevel.Permissive, assert.True},
 		{"tools.avrdude.upload.pattern", "tools/avrdude/upload/pattern", compliancelevel.Specification, assert.True},
 		{"tools.avrdude.upload.pattern", "tools/avrdude/upload/pattern", compliancelevel.Strict, assert.True},
 
-		{"tools.bossac.upload.params.verbose", "tools/bossac/upload/params\\.verbose", compliancelevel.Permissive, assert.True},
-		{"tools.bossac.upload.params.verbose", "tools/bossac/upload/params\\.verbose", compliancelevel.Specification, assert.True},
-		{"tools.bossac.upload.params.verbose", "tools/bossac/upload/params\\.verbose", compliancelevel.Strict, assert.True},
+		{"tools.avrdude.program.params.verbose", "tools/avrdude/program/params\\.verbose", compliancelevel.Permissive, assert.True},
+		{"tools.avrdude.program.params.verbose", "tools/avrdude/program/params\\.verbose", compliancelevel.Specification, assert.True},
+		{"tools.avrdude.program.params.verbose", "tools/avrdude/program/params\\.verbose", compliancelevel.Strict, assert.True},
+
+		{"tools.avrdude.program.params.quiet", "tools/avrdude/program/params\\.quiet", compliancelevel.Permissive, assert.True},
+		{"tools.avrdude.program.params.quiet", "tools/avrdude/program/params\\.quiet", compliancelevel.Specification, assert.True},
+		{"tools.avrdude.program.params.quiet", "tools/avrdude/program/params\\.quiet", compliancelevel.Strict, assert.True},
 
-		{"tools.bossac.upload.params.quiet", "tools/bossac/upload/params\\.quiet", compliancelevel.Permissive, assert.True},
-		{"tools.bossac.upload.params.quiet", "tools/bossac/upload/params\\.quiet", compliancelevel.Specification, assert.True},
-		{"tools.bossac.upload.params.quiet", "tools/bossac/upload/params\\.quiet", compliancelevel.Strict, assert.True},
+		{"tools.avrdude.program.pattern", "tools/avrdude/program/pattern", compliancelevel.Permissive, assert.True},
+		{"tools.avrdude.program.pattern", "tools/avrdude/program/pattern", compliancelevel.Specification, assert.True},
+		{"tools.avrdude.program.pattern", "tools/avrdude/program/pattern", compliancelevel.Strict, assert.True},
 
 		{"tools.bossac.upload.pattern", "tools/bossac/upload/pattern", compliancelevel.Permissive, assert.True},
 		{"tools.bossac.upload.pattern", "tools/bossac/upload/pattern", compliancelevel.Specification, assert.True},
diff --git a/internal/rule/ruleconfiguration/ruleconfiguration.go b/internal/rule/ruleconfiguration/ruleconfiguration.go
index bccea6fcb..eb8afb33a 100644
--- a/internal/rule/ruleconfiguration/ruleconfiguration.go
+++ b/internal/rule/ruleconfiguration/ruleconfiguration.go
@@ -2649,38 +2649,6 @@ var configurations = []Type{
 		ErrorModes:       []rulemode.Type{rulemode.Strict},
 		RuleFunction:     rulefunction.PlatformTxtRecipeSizeRegexDataMissing,
 	},
-	{
-		ProjectType:      projecttype.Platform,
-		SuperprojectType: projecttype.All,
-		Category:         "configuration files",
-		Subcategory:      "platform.txt",
-		ID:               "PF078",
-		Brief:            "missing upload.params.verbose",
-		Description:      "",
-		MessageTemplate:  "Missing upload.params.verbose for {{.}} tool(s). See: https://arduino.github.io/arduino-cli/latest/platform-specification/#verbose-parameter",
-		DisableModes:     nil,
-		EnableModes:      []rulemode.Type{rulemode.Default},
-		InfoModes:        nil,
-		WarningModes:     nil,
-		ErrorModes:       []rulemode.Type{rulemode.Default},
-		RuleFunction:     rulefunction.PlatformTxtUploadParamsVerboseMissing,
-	},
-	{
-		ProjectType:      projecttype.Platform,
-		SuperprojectType: projecttype.All,
-		Category:         "configuration files",
-		Subcategory:      "platform.txt",
-		ID:               "PF079",
-		Brief:            "missing upload.params.quiet",
-		Description:      "",
-		MessageTemplate:  "Missing upload.params.quiet for {{.}} tool(s). See: https://arduino.github.io/arduino-cli/latest/platform-specification/#verbose-parameter",
-		DisableModes:     nil,
-		EnableModes:      []rulemode.Type{rulemode.Default},
-		InfoModes:        nil,
-		WarningModes:     nil,
-		ErrorModes:       []rulemode.Type{rulemode.Default},
-		RuleFunction:     rulefunction.PlatformTxtUploadParamsQuietMissing,
-	},
 	{
 		ProjectType:      projecttype.Platform,
 		SuperprojectType: projecttype.All,
diff --git a/internal/rule/rulefunction/platform_test.go b/internal/rule/rulefunction/platform_test.go
index 00e62b05c..5360c4728 100644
--- a/internal/rule/rulefunction/platform_test.go
+++ b/internal/rule/rulefunction/platform_test.go
@@ -934,30 +934,6 @@ func TestPlatformTxtRecipeSizeRegexDataMissing(t *testing.T) {
 	checkPlatformRuleFunction(PlatformTxtRecipeSizeRegexDataMissing, testTables, t)
 }
 
-func TestPlatformTxtUploadParamsVerboseMissing(t *testing.T) {
-	testTables := []platformRuleFunctionTestTable{
-		{"Missing", "missing-platform.txt", ruleresult.Skip, ""},
-		{"Invalid", "invalid-platform.txt", ruleresult.NotRun, ""},
-		{"No tools", "no-tools-platform.txt", ruleresult.Skip, ""},
-		{"Property missing", "upload-params-verbose-missing-platform.txt", ruleresult.Fail, "avrdude, bossac"},
-		{"Valid", "valid-platform.txt", ruleresult.Pass, ""},
-	}
-
-	checkPlatformRuleFunction(PlatformTxtUploadParamsVerboseMissing, testTables, t)
-}
-
-func TestPlatformTxtUploadParamsQuietMissing(t *testing.T) {
-	testTables := []platformRuleFunctionTestTable{
-		{"Missing", "missing-platform.txt", ruleresult.Skip, ""},
-		{"Invalid", "invalid-platform.txt", ruleresult.NotRun, ""},
-		{"No tools", "no-tools-platform.txt", ruleresult.Skip, ""},
-		{"Property missing", "upload-params-quiet-missing-platform.txt", ruleresult.Fail, "avrdude, bossac"},
-		{"Valid", "valid-platform.txt", ruleresult.Pass, ""},
-	}
-
-	checkPlatformRuleFunction(PlatformTxtUploadParamsQuietMissing, testTables, t)
-}
-
 func TestPlatformTxtUploadPatternMissing(t *testing.T) {
 	testTables := []platformRuleFunctionTestTable{
 		{"Missing", "missing-platform.txt", ruleresult.Skip, ""},
diff --git a/internal/rule/schema/schemadata/bindata.go b/internal/rule/schema/schemadata/bindata.go
index 0578006c1..d72179738 100644
--- a/internal/rule/schema/schemadata/bindata.go
+++ b/internal/rule/schema/schemadata/bindata.go
@@ -3148,7 +3148,7 @@ var _arduinoPlatformTxtDefinitionsSchemaJson = []byte(`{
                 "$ref": "#/definitions/propertiesObjects/toolsToolNameUpload/base/object"
               },
               {
-                "$ref": "#/definitions/requiredObjects/toolsToolNameActionName/permissive/object"
+                "$ref": "#/definitions/requiredObjects/toolsToolNameUpload/permissive/object"
               }
             ]
           }
@@ -3160,7 +3160,7 @@ var _arduinoPlatformTxtDefinitionsSchemaJson = []byte(`{
                 "$ref": "#/definitions/propertiesObjects/toolsToolNameUpload/base/object"
               },
               {
-                "$ref": "#/definitions/requiredObjects/toolsToolNameActionName/specification/object"
+                "$ref": "#/definitions/requiredObjects/toolsToolNameUpload/specification/object"
               }
             ]
           }
@@ -3172,7 +3172,7 @@ var _arduinoPlatformTxtDefinitionsSchemaJson = []byte(`{
                 "$ref": "#/definitions/propertiesObjects/toolsToolNameUpload/base/object"
               },
               {
-                "$ref": "#/definitions/requiredObjects/toolsToolNameActionName/strict/object"
+                "$ref": "#/definitions/requiredObjects/toolsToolNameUpload/strict/object"
               }
             ]
           }
@@ -3465,6 +3465,44 @@ var _arduinoPlatformTxtDefinitionsSchemaJson = []byte(`{
             ]
           }
         }
+      },
+      "toolsToolNameUpload": {
+        "base": {
+          "object": {
+            "allOf": [
+              {
+                "required": ["pattern"]
+              }
+            ]
+          }
+        },
+        "permissive": {
+          "object": {
+            "allOf": [
+              {
+                "$ref": "#/definitions/requiredObjects/toolsToolNameUpload/base/object"
+              }
+            ]
+          }
+        },
+        "specification": {
+          "object": {
+            "allOf": [
+              {
+                "$ref": "#/definitions/requiredObjects/toolsToolNameUpload/base/object"
+              }
+            ]
+          }
+        },
+        "strict": {
+          "object": {
+            "allOf": [
+              {
+                "$ref": "#/definitions/requiredObjects/toolsToolNameUpload/base/object"
+              }
+            ]
+          }
+        }
       }
     }
   }