This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH 4/4] Validate bench.out against a JSON schema


Hi,

The first patch in this series converted the benchmark output into
JSON format.  This patch adds a JSON schema that describes the format
of the benchmark output.  There is also a script that validates the
generated bench.out against the schema at the end of `make bench`.

Siddhesh

	* benchtests/scripts/benchout.schema.json: New file.
	* benchtests/scripts/validate_benchout.py: New script.
	* benchtests/Makefile (bench-func): Call it.

---
 benchtests/Makefile                     |  2 +
 benchtests/scripts/benchout.schema.json | 57 ++++++++++++++++++++++++
 benchtests/scripts/validate_benchout.py | 78 +++++++++++++++++++++++++++++++++
 3 files changed, 137 insertions(+)
 create mode 100644 benchtests/scripts/benchout.schema.json
 create mode 100755 benchtests/scripts/validate_benchout.py

diff --git a/benchtests/Makefile b/benchtests/Makefile
index 1669b6f..4b5b568 100644
--- a/benchtests/Makefile
+++ b/benchtests/Makefile
@@ -143,6 +143,8 @@ bench-func: $(binaries-bench)
 	  mv -f $(objpfx)bench.out $(objpfx)bench.out.old; \
 	fi; \
 	mv -f $(objpfx)bench.out-tmp $(objpfx)bench.out
+	$(.)scripts/validate_benchout.py $(objpfx)bench.out \
+		$(.)scripts/benchout.schema.json
 
 $(timing-type) $(binaries-bench) $(binaries-benchset): %: %.o \
   $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
diff --git a/benchtests/scripts/benchout.schema.json b/benchtests/scripts/benchout.schema.json
new file mode 100644
index 0000000..3f39823
--- /dev/null
+++ b/benchtests/scripts/benchout.schema.json
@@ -0,0 +1,57 @@
+{
+  "title": "benchmark",
+  "type": "object",
+  "properties": {
+    "machine": {
+      "type": "object",
+      "properties": {
+        "vendor-id": {"type": "string"},
+        "cpu-family": {"type": "number"},
+        "model": {"type": "number"},
+        "cpu-cores": {"type": "number"},
+        "processors": {"type": "number"},
+        "cache-size": {"type": "number"},
+        "memory": {"type": "number"},
+        "swap": {"type": "number"}
+      },
+      "required": ["vendor-id", "cpu-family", "model", "cpu-cores",
+                   "processors", "cache-size", "memory", "swap"]
+    },
+    "timing-type": {
+      "type": "string"
+    },
+    "functions": {
+      "title": "Associative array of functions",
+      "type": "object",
+      "patternProperties": {
+        "^[_a-zA-Z][_a-zA-Z0-9]+$": {
+          "title": "Function names",
+          "type": "object",
+          "patternProperties": {
+            "^[_a-zA-Z0-9]*$": {
+              "title": "Function variants",
+              "type": "object",
+              "properties": {
+                "duration": {"type": "number"},
+                "iterations": {"type": "number"},
+                "max": {"type": "number"},
+                "min": {"type": "number"},
+                "mean": {"type": "number"},
+                "timings": {
+                  "type": "array",
+                  "items": {"type": "number"}
+                }
+              },
+              "required": ["duration", "iterations", "max", "min", "mean"],
+              "additionalProperties": false
+            }
+          },
+          "additionalProperties": false
+        }
+      },
+      "minProperties": 1
+    }
+  },
+  "required": ["machine", "timing-type", "functions"],
+  "additionalProperties": false
+}
diff --git a/benchtests/scripts/validate_benchout.py b/benchtests/scripts/validate_benchout.py
new file mode 100755
index 0000000..b6a34e2
--- /dev/null
+++ b/benchtests/scripts/validate_benchout.py
@@ -0,0 +1,78 @@
+#!/usr/bin/python
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This file is part of the GNU C Library.
+#
+# The GNU C Library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# The GNU C Library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with the GNU C Library; if not, see
+# <http://www.gnu.org/licenses/>.
+"""Benchmark output validator
+
+Given a benchmark output file in json format and a benchmark schema file,
+validate the output against the schema.
+"""
+
+from __future__ import print_function
+import jsonschema
+import json
+import sys
+import os
+
+
+def validate_bench(benchfile, schemafile):
+    """Validate benchmark file
+
+    Validate a benchmark output file against a JSON schema.
+
+    Args:
+        benchfile: The file name of the bench.out file.
+        schemafile: The file name of the JSON schema file to validate
+        bench.out against.
+
+    Exceptions:
+        jsonschema.ValidationError: When bench.out is not valid
+        jsonschema.SchemaError: When the JSON schema is not valid
+        IOError: If any of the files are not found.
+    """
+    with open(benchfile, 'r') as bfile:
+        with open(schemafile, 'r') as sfile:
+            bench = json.load(bfile)
+            schema = json.load(sfile)
+            jsonschema.validate(bench, schema)
+
+    # If we reach here, we're all good.
+    print("Benchmark output in %s is valid." % benchfile)
+
+
+def main(args):
+    """Main entry point
+
+    Args:
+        args: The command line arguments to the program
+
+    Returns:
+        0 on success or a non-zero failure code
+
+    Exceptions:
+        Exceptions thrown by validate_bench
+    """
+    if len(args) != 2:
+        print("Usage: %s <bench.out file> <bench.out schema>" % sys.argv[0],
+                file=sys.stderr)
+        return os.EX_USAGE
+
+    validate_bench(args[0], args[1])
+    return os.EX_OK
+
+
+if __name__ == '__main__':
+    sys.exit(main(sys.argv[1:]))
-- 
1.8.3.1

Attachment: pgpDPfq_eJETn.pgp
Description: PGP signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]