Quellcode durchsuchen

Fix semver regex to properly validate version strings (#7439)

* Fix semver regex to properly validate version strings

* Add unit tests for semver regex validation in is_version_string
strmfos vor 3 Monaten
Ursprung
Commit
15635be150
1 geänderte Dateien mit 48 neuen und 1 gelöschten Zeilen
  1. 48 1
      platform-tools-sdk/cargo-build-sbf/src/main.rs

+ 48 - 1
platform-tools-sdk/cargo-build-sbf/src/main.rs

@@ -86,7 +86,7 @@ impl Default for Config<'_> {
 }
 
 pub fn is_version_string(arg: &str) -> Result<(), String> {
-    let semver_re = Regex::new(r"^v?[0-9]+\.[0-9]+(\.[0-9]+)?").unwrap();
+    let semver_re = Regex::new(r"^v?[0-9]+\.[0-9]+(\.[0-9]+)?$").unwrap();
     if semver_re.is_match(arg) {
         return Ok(());
     }
@@ -623,3 +623,50 @@ fn main() {
     }
     build_solana(config, manifest_path);
 }
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn test_is_version_string_valid_versions() {
+        // Test valid versions that should pass validation
+        assert!(is_version_string("1.2.3").is_ok());
+        assert!(is_version_string("v2.1.0").is_ok());
+        assert!(is_version_string("1.32").is_ok());
+        assert!(is_version_string("v1.32").is_ok());
+        assert!(is_version_string("0.1").is_ok());
+        assert!(is_version_string("v0.1").is_ok());
+        assert!(is_version_string("10.20.30").is_ok());
+        assert!(is_version_string("v10.20.30").is_ok());
+    }
+
+    #[test]
+    fn test_is_version_string_invalid_versions() {
+        // Test invalid versions that should fail validation
+        assert!(is_version_string("1.2.3abc").is_err());
+        assert!(is_version_string("v2.1.0-extra").is_err());
+        assert!(is_version_string("abc1.2.3").is_err());
+        assert!(is_version_string("1").is_err());
+        assert!(is_version_string("v1").is_err());
+        assert!(is_version_string("1.2.3.4.5").is_err());
+        assert!(is_version_string("").is_err());
+        assert!(is_version_string("v").is_err());
+        assert!(is_version_string("1.").is_err());
+        assert!(is_version_string("v1.").is_err());
+        assert!(is_version_string(".1.2").is_err());
+        assert!(is_version_string("1.2.3-beta").is_err());
+        assert!(is_version_string("v1.2.3+build").is_err());
+    }
+
+    #[test]
+    fn test_is_version_string_error_message() {
+        // Test that error message is descriptive
+        let result = is_version_string("invalid");
+        assert!(result.is_err());
+        let error_msg = result.unwrap_err();
+        assert!(error_msg.contains("version string may start with 'v'"));
+        assert!(error_msg.contains("major and minor version numbers"));
+        assert!(error_msg.contains("separated by a dot"));
+    }
+}