summaryrefslogtreecommitdiffstats
path: root/tools/fuzzing/smoke
diff options
context:
space:
mode:
Diffstat (limited to 'tools/fuzzing/smoke')
-rwxr-xr-xtools/fuzzing/smoke/js.py27
-rw-r--r--tools/fuzzing/smoke/smoke.py72
-rw-r--r--tools/fuzzing/smoke/tests.py35
3 files changed, 134 insertions, 0 deletions
diff --git a/tools/fuzzing/smoke/js.py b/tools/fuzzing/smoke/js.py
new file mode 100755
index 0000000000..c787e072e7
--- /dev/null
+++ b/tools/fuzzing/smoke/js.py
@@ -0,0 +1,27 @@
+#!/usr/bin/env python
+# 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/.
+""" Hello I am a fake jsshell for testing purpose.
+Add more features!
+"""
+from __future__ import absolute_import
+import argparse
+import sys
+
+
+def run():
+ parser = argparse.ArgumentParser(description="Process some integers.")
+ parser.add_argument("-e", type=str, default=None)
+
+ parser.add_argument("--fuzzing-safe", action="store_true", default=False)
+
+ args = parser.parse_args()
+
+ if args.e is not None:
+ if "crash()" in args.e:
+ sys.exit(1)
+
+
+if __name__ == "__main__":
+ run()
diff --git a/tools/fuzzing/smoke/smoke.py b/tools/fuzzing/smoke/smoke.py
new file mode 100644
index 0000000000..b81fa53941
--- /dev/null
+++ b/tools/fuzzing/smoke/smoke.py
@@ -0,0 +1,72 @@
+# 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/.
+""" Smoke test script for Fuzzing
+
+This script can be used to perform simple calls using `jsshell`
+or whatever other tools you may add.
+
+The call is done via `taskcluster/ci/fuzzing/kind.yml` and
+files contained in the `target.jsshell.zip` and `target.fuzztest.tests.tar.gz`
+build artifacts are downloaded to run things.
+
+Everything included in this directory will be added in
+`target.fuzztest.tests.tar.gz` at build time, so you can add more scripts and
+tools if you need. They will be located in `$MOZ_FETCHES_DIR` and follow the
+same directory structure than the source tree.
+"""
+from __future__ import absolute_import
+from distutils.spawn import find_executable
+import os
+import os.path
+import subprocess
+import shlex
+import sys
+
+
+def run_jsshell(command, label=None):
+ """Invokes `jsshell` with command.
+
+ This function will use the `JSSHELL` environment variable,
+ and fallback to a `js` executable if it finds one
+ """
+ shell = os.environ.get("JSSHELL")
+ if shell is None:
+ shell = find_executable("js")
+ if shell is None:
+ raise FileNotFoundError(shell)
+ else:
+ if not os.path.exists(shell) or not os.path.isfile(shell):
+ raise FileNotFoundError(shell)
+
+ if label is None:
+ label = command
+ sys.stdout.write(label)
+ cmd = [shell] + shlex.split(command)
+ sys.stdout.flush()
+ try:
+ subprocess.check_call(cmd)
+ finally:
+ sys.stdout.write("\n")
+ sys.stdout.flush()
+
+
+def smoke_test():
+ # first, let's make sure it catches crashes so we don't have false
+ # positives.
+ try:
+ run_jsshell("-e 'crash();'", "Testing for crash\n")
+ except subprocess.CalledProcessError:
+ pass
+ else:
+ raise Exception("Could not get the process to crash")
+
+ # now let's proceed with some tests
+ run_jsshell("--fuzzing-safe -e 'print(\"PASSED\")'", "Simple Fuzzing...")
+
+ # add more smoke tests here
+
+
+if __name__ == "__main__":
+ # if this calls raises an error, the job will turn red in the CI.
+ smoke_test()
diff --git a/tools/fuzzing/smoke/tests.py b/tools/fuzzing/smoke/tests.py
new file mode 100644
index 0000000000..9b49380cad
--- /dev/null
+++ b/tools/fuzzing/smoke/tests.py
@@ -0,0 +1,35 @@
+# 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/.
+from __future__ import absolute_import
+import os
+import pytest
+from contextlib import contextmanager
+
+import smoke
+
+JS = os.path.join(os.path.dirname(__file__), "js.py")
+
+
+@contextmanager
+def fake_js():
+ os.environ["JSSHELL"] = JS
+ try:
+ yield
+ finally:
+ del os.environ["JSSHELL"]
+
+
+def test_run_no_jsshell():
+ with pytest.raises(FileNotFoundError):
+ smoke.run_jsshell("--fuzzing-safe -e 'print(\"PASSED\")'")
+
+
+def test_run_jsshell_set():
+ with fake_js():
+ smoke.run_jsshell("--fuzzing-safe -e 'print(\"PASSED\")'")
+
+
+def test_smoke_test():
+ with fake_js():
+ smoke.smoke_test()