summaryrefslogtreecommitdiffstats
path: root/testing/mozharness/scripts/configtest.py
diff options
context:
space:
mode:
authorMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
committerMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
commit5f8de423f190bbb79a62f804151bc24824fa32d8 (patch)
tree10027f336435511475e392454359edea8e25895d /testing/mozharness/scripts/configtest.py
parent49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff)
downloadUXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip
Add m-esr52 at 52.6.0
Diffstat (limited to 'testing/mozharness/scripts/configtest.py')
-rwxr-xr-xtesting/mozharness/scripts/configtest.py142
1 files changed, 142 insertions, 0 deletions
diff --git a/testing/mozharness/scripts/configtest.py b/testing/mozharness/scripts/configtest.py
new file mode 100755
index 000000000..5db684f0a
--- /dev/null
+++ b/testing/mozharness/scripts/configtest.py
@@ -0,0 +1,142 @@
+#!/usr/bin/env python
+# ***** BEGIN LICENSE BLOCK *****
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this file,
+# You can obtain one at http://mozilla.org/MPL/2.0/.
+# ***** END LICENSE BLOCK *****
+"""configtest.py
+
+Verify the .json and .py files in the configs/ directory are well-formed.
+Further tests to verify validity would be desirable.
+
+This is also a good example script to look at to understand mozharness.
+"""
+
+import os
+import pprint
+import sys
+try:
+ import simplejson as json
+except ImportError:
+ import json
+
+sys.path.insert(1, os.path.dirname(sys.path[0]))
+
+from mozharness.base.script import BaseScript
+
+# ConfigTest {{{1
+class ConfigTest(BaseScript):
+ config_options = [[
+ ["--test-file",],
+ {"action": "extend",
+ "dest": "test_files",
+ "help": "Specify which config files to test"
+ }
+ ]]
+
+ def __init__(self, require_config_file=False):
+ self.config_files = []
+ BaseScript.__init__(self, config_options=self.config_options,
+ all_actions=['list-config-files',
+ 'test-json-configs',
+ 'test-python-configs',
+ 'summary',
+ ],
+ default_actions=['test-json-configs',
+ 'test-python-configs',
+ 'summary',
+ ],
+ require_config_file=require_config_file)
+
+ def query_config_files(self):
+ """This query method, much like others, caches its runtime
+ settings in self.VAR so we don't have to figure out config_files
+ multiple times.
+ """
+ if self.config_files:
+ return self.config_files
+ c = self.config
+ if 'test_files' in c:
+ self.config_files = c['test_files']
+ return self.config_files
+ self.debug("No --test-file(s) specified; defaulting to crawling the configs/ directory.")
+ config_files = []
+ for root, dirs, files in os.walk(os.path.join(sys.path[0], "..",
+ "configs")):
+ for name in files:
+ # Hardcode =P
+ if name.endswith(".json") or name.endswith(".py"):
+ if not name.startswith("test_malformed"):
+ config_files.append(os.path.join(root, name))
+ self.config_files = config_files
+ return self.config_files
+
+ def list_config_files(self):
+ """ Non-default action that is mainly here to demonstrate how
+ non-default actions work in a mozharness script.
+ """
+ config_files = self.query_config_files()
+ for config_file in config_files:
+ self.info(config_file)
+
+ def test_json_configs(self):
+ """ Currently only "is this well-formed json?"
+
+ """
+ config_files = self.query_config_files()
+ filecount = [0, 0]
+ for config_file in config_files:
+ if config_file.endswith(".json"):
+ filecount[0] += 1
+ self.info("Testing %s." % config_file)
+ contents = self.read_from_file(config_file, verbose=False)
+ try:
+ json.loads(contents)
+ except ValueError:
+ self.add_summary("%s is invalid json." % config_file,
+ level="error")
+ self.error(pprint.pformat(sys.exc_info()[1]))
+ else:
+ self.info("Good.")
+ filecount[1] += 1
+ if filecount[0]:
+ self.add_summary("%d of %d json config files were good." %
+ (filecount[1], filecount[0]))
+ else:
+ self.add_summary("No json config files to test.")
+
+ def test_python_configs(self):
+ """Currently only "will this give me a config dictionary?"
+
+ """
+ config_files = self.query_config_files()
+ filecount = [0, 0]
+ for config_file in config_files:
+ if config_file.endswith(".py"):
+ filecount[0] += 1
+ self.info("Testing %s." % config_file)
+ global_dict = {}
+ local_dict = {}
+ try:
+ execfile(config_file, global_dict, local_dict)
+ except:
+ self.add_summary("%s is invalid python." % config_file,
+ level="error")
+ self.error(pprint.pformat(sys.exc_info()[1]))
+ else:
+ if 'config' in local_dict and isinstance(local_dict['config'], dict):
+ self.info("Good.")
+ filecount[1] += 1
+ else:
+ self.add_summary("%s is valid python, but doesn't create a config dictionary." %
+ config_file, level="error")
+ if filecount[0]:
+ self.add_summary("%d of %d python config files were good." %
+ (filecount[1], filecount[0]))
+ else:
+ self.add_summary("No python config files to test.")
+
+# __main__ {{{1
+if __name__ == '__main__':
+ config_test = ConfigTest()
+ config_test.run_and_exit()