about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGuillaume Gomez <guillaume.gomez@huawei.com>2024-08-16 12:19:39 +0200
committerGuillaume Gomez <guillaume.gomez@huawei.com>2024-08-16 16:32:06 +0200
commita2a4f2bcb59115e5e7fbdeb1fbe1f261999b7bd6 (patch)
treef44ad8466a6ce078b089cb6d2b15ae8d10bb0544
parent27b93da8de2477b3a41811b0ee486cffa99fa00e (diff)
downloadrust-a2a4f2bcb59115e5e7fbdeb1fbe1f261999b7bd6.tar.gz
rust-a2a4f2bcb59115e5e7fbdeb1fbe1f261999b7bd6.zip
Migrate `validate_json.py` script to rust in `run-make/rustdoc-map-file` test
-rw-r--r--src/tools/run-make-support/src/lib.rs1
-rw-r--r--tests/run-make/rustdoc-map-file/rmake.rs50
-rwxr-xr-xtests/run-make/rustdoc-map-file/validate_json.py41
3 files changed, 48 insertions, 44 deletions
diff --git a/src/tools/run-make-support/src/lib.rs b/src/tools/run-make-support/src/lib.rs
index 4bef4f05007..fc20fd3b2e8 100644
--- a/src/tools/run-make-support/src/lib.rs
+++ b/src/tools/run-make-support/src/lib.rs
@@ -38,6 +38,7 @@ pub use bstr;
 pub use gimli;
 pub use object;
 pub use regex;
+pub use serde_json;
 pub use wasmparser;
 
 // Re-exports of external dependencies.
diff --git a/tests/run-make/rustdoc-map-file/rmake.rs b/tests/run-make/rustdoc-map-file/rmake.rs
index a4485165fd2..9b19279dee6 100644
--- a/tests/run-make/rustdoc-map-file/rmake.rs
+++ b/tests/run-make/rustdoc-map-file/rmake.rs
@@ -1,4 +1,6 @@
-use run_make_support::{python_command, rustdoc};
+use run_make_support::path_helpers::read_dir_entries_recursive;
+use run_make_support::rfs::read_to_string;
+use run_make_support::{jzon, rustdoc};
 
 fn main() {
     let out_dir = "out";
@@ -8,6 +10,48 @@ fn main() {
         .arg("--generate-redirect-map")
         .out_dir(&out_dir)
         .run();
-    // FIXME (GuillaumeGomez): Port the python script to Rust as well.
-    python_command().arg("validate_json.py").arg(&out_dir).run();
+
+    let mut found_file = false;
+    read_dir_entries_recursive(&out_dir, |path| {
+        if !found_file
+            && path.is_file()
+            && path.file_name().map(|name| name == "redirect-map.json").unwrap_or(false)
+        {
+            found_file = true;
+            let generated = read_to_string(path);
+            let expected = read_to_string("expected.json");
+            let generated = jzon::parse(&generated).expect("failed to parse JSON");
+            let expected = jzon::parse(&expected).expect("failed to parse JSON");
+
+            let mut differences = Vec::new();
+            for (key, expected_value) in expected.entries() {
+                match generated.get(key) {
+                    Some(value) => {
+                        if expected_value != value {
+                            differences.push(format!("values for key `{key}` don't match"));
+                        }
+                    }
+                    None => differences.push(format!("missing key `{key}`")),
+                }
+            }
+            for (key, data) in generated.entries() {
+                if !expected.has_key(key) {
+                    differences
+                        .push(format!("Extra data not expected: key: `{key}`, data: `{data}`"));
+                }
+            }
+
+            if !differences.is_empty() {
+                eprintln!("Found differences in JSON files:");
+                for diff in differences {
+                    eprintln!("=> {diff}");
+                }
+                std::process::exit(1);
+            }
+        }
+    });
+
+    if !found_file {
+        panic!("`redirect-map.json` file was not found");
+    }
 }
diff --git a/tests/run-make/rustdoc-map-file/validate_json.py b/tests/run-make/rustdoc-map-file/validate_json.py
deleted file mode 100755
index 912dea3791b..00000000000
--- a/tests/run-make/rustdoc-map-file/validate_json.py
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/usr/bin/env python
-
-import os
-import sys
-import json
-
-
-def find_redirect_map_file(folder, errors):
-    for root, _dirs, files in os.walk(folder):
-        for name in files:
-            if not name.endswith("redirect-map.json"):
-                continue
-            with open(os.path.join(root, name)) as f:
-                data = json.load(f)
-            with open("expected.json") as f:
-                expected = json.load(f)
-            for key in expected:
-                if expected[key] != data.get(key):
-                    errors.append("Expected `{}` for key `{}`, found: `{}`".format(
-                        expected[key], key, data.get(key)))
-                else:
-                    del data[key]
-            for key in data:
-                errors.append("Extra data not expected: key: `{}`, data: `{}`".format(
-                    key, data[key]))
-            return True
-    return False
-
-
-if len(sys.argv) != 2:
-    print("Expected doc directory to check!")
-    sys.exit(1)
-
-errors = []
-if not find_redirect_map_file(sys.argv[1], errors):
-    print("Didn't find the map file in `{}`...".format(sys.argv[1]))
-    sys.exit(1)
-for err in errors:
-    print("=> {}".format(err))
-if len(errors) != 0:
-    sys.exit(1)