Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(96)

Unified Diff: third_party/WebKit/Source/modules/bluetooth/testing/clusterfuzz/fuzz_main_run.py

Issue 2166463002: bluetooth: Basic Web Bluetooth Fuzzer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@my-origin
Patch Set: Move to testing/clusterfuzz directory Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/modules/bluetooth/testing/clusterfuzz/fuzz_main_run.py
diff --git a/third_party/WebKit/Source/modules/bluetooth/testing/clusterfuzz/fuzz_main_run.py b/third_party/WebKit/Source/modules/bluetooth/testing/clusterfuzz/fuzz_main_run.py
new file mode 100644
index 0000000000000000000000000000000000000000..725c34437088bac22a2fbf294336912b63ac6920
--- /dev/null
+++ b/third_party/WebKit/Source/modules/bluetooth/testing/clusterfuzz/fuzz_main_run.py
@@ -0,0 +1,166 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Script to generate Web Bluetooth Layout Tests that can be run in ClusterFuzz.
+
+This script uses templates in the templates/ directory to generate html files
+that can be run as Layout Tests. The script reads a template, includes files
+necessary to run as a layout test, fuzzes its parameters and saves the result in
+a new file in the directory specified when running the script.
+"""
+
+import argparse
+import glob
+import os
+import sys
+import tempfile
+import time
+
+from fuzzer_helpers import FillInParameter
+import parameter_fuzzer
+import test_case_fuzzer
+
+JS_FILES_AND_PARAMETERS = (
+ ('testharness.js', 'INCLUDE_TESTHARNESS'),
+ ('testharnessreport.js', 'INCLUDE_REPORT'),
+ ('bluetooth-helpers.js', 'INCLUDE_BLUETOOTH_HELPERS'))
+
+SCRIPT_PREFIX = '<script type="text/javascript">\n'
+SCRIPT_SUFFIX = '\n</script>\n'
+
+
+def _GetArguments():
+ """Parses the arguments passed when running this script.
+
+ Returns:
+ An argparse.Namespace object containing the arguments in sys.argv.
+ """
+ parser = argparse.ArgumentParser()
+
+ # Arguments used by ClusterFuzz:
+ parser.add_argument('-n', '--no_of_files', type=int, required=True,
+ help='The number of test cases that the fuzzer is '
+ 'expected to generate')
+ parser.add_argument('-i', '--input_dir',
+ help='The directory containing the fuzzer\'s data '
+ 'bundle.')
+ parser.add_argument('-o', '--output_dir', required=True,
+ help='The directory where test case files should be '
+ 'written to.')
+
+ parser.add_argument('--content_shell_dir',
+ help='The directory of content shell. If present the '
+ 'program will print a command to run the '
+ 'generated test file.')
+
+ return parser.parse_args()
+
+
+def FuzzTemplate(template_path, resources_path):
+ """Uses a template to return a test case that can be run as a layout test.
+
+ This functions reads the template in |template_path|, injects the necessary
+ js files to run as a layout test and fuzzes the template's parameters to
+ generate a test case.
+
+ Args:
+ template_path: The path to the template that will be used to generate
+ a new test case.
+ resources_path: Path to the js files that need to be included.
+
+ Returns:
+ A string containing the test case.
+ """
+ print 'Generating test file based on {}'.format(template_path)
+
+ # Read the template.
+ template_file_handle = open(template_path)
+ template_file_data = template_file_handle.read().decode('utf-8')
+ template_file_handle.close()
+
+ # Generate a test file based on the template.
+ generated_test = test_case_fuzzer.GenerateTestFile(template_file_data)
+ # Fuzz parameters.
+ fuzzed_file_data = parameter_fuzzer.FuzzParameters(generated_test)
+
+ # Add includes
+ for (js_file_name, include_parameter) in JS_FILES_AND_PARAMETERS:
+ # Read js file.
+ js_file_handle = open(os.path.join(resources_path, js_file_name))
+ js_file_data = js_file_handle.read()
+ js_file_handle.close()
+
+ js_file_data = (SCRIPT_PREFIX + js_file_data + SCRIPT_SUFFIX)
+
+ fuzzed_file_data = FillInParameter(include_parameter,
+ lambda data=js_file_data: data,
+ fuzzed_file_data)
+
+ return fuzzed_file_data.encode('utf-8')
+
+
+def WriteTestFile(test_file_data, test_file_prefix, output_dir):
+ """Creates a new file with a unique name and writes the test case to it.
+
+ Args:
+ test_file_data: The data to be included in the new file.
+ test_file_prefix: Used as a prefix when generating a new file.
+ output_dir: The directory where the new file should be created.
+
+ Returns:
+ A string representing the file path to access the new file.
+ """
+
+ file_descriptor, file_path = tempfile.mkstemp(
+ prefix=test_file_prefix,
+ suffix='.html',
+ dir=output_dir)
+
+ with os.fdopen(file_descriptor, 'wb') as output:
+ print 'Writing {} bytes to \'{}\''.format(len(test_file_data),
+ file_path)
+ output.write(test_file_data)
+
+ return file_path
+
+
+def main():
+ args = _GetArguments()
+
+ print 'Generating {} test file(s).'.format(args.no_of_files)
+ print 'Writing test files to: \'{}\''.format(args.output_dir)
+ if args.input_dir:
+ print 'Reading data bundle from: \'{}\''.format(args.input_dir)
+
+ # Get Templates
+ current_path = os.path.dirname(os.path.realpath(__file__))
+ available_templates = glob.glob(os.path.join(current_path,
+ 'templates',
+ '*.html'))
+
+ # Generate Test Files
+ resources_path = os.path.join(current_path, 'resources')
+ start_time = time.time()
+ for file_no in range(args.no_of_files):
+ template_path = available_templates[file_no % len(available_templates)]
+
+ test_file_data = FuzzTemplate(template_path, resources_path)
+
+ # Get Test File
+ template_name = os.path.splitext(os.path.basename(template_path))[0]
+ test_file_name = 'fuzz-{}-{}-{}'.format(template_name,
+ int(start_time),
+ int(file_no))
+
+ test_file_path = WriteTestFile(test_file_data,
+ test_file_name,
+ args.output_dir)
+
+ if args.content_shell_dir:
+ print '{} --run-layout-test {}'.format(args.content_shell_dir,
+ test_file_path)
+
+
+if __name__ == '__main__':
+ sys.exit(main())

Powered by Google App Engine
This is Rietveld 408576698