#!/usr/bin/env python # Copyright (c) 2014 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. import argparse import json import os import sys tracing_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')) if tracing_path not in sys.path: sys.path.append(tracing_path) from tracing import tracing_project from build import dev_server def getFilesIn(basedir): data_files = [] for dirpath, dirnames, filenames in os.walk(basedir, followlinks=True): new_dirnames = [d for d in dirnames if not d.startswith('.')] del dirnames[:] dirnames += new_dirnames for f in filenames: if f.startswith('.'): continue if f == 'README.md': continue full_f = os.path.join(dirpath, f) rel_f = os.path.relpath(full_f, basedir) data_files.append(rel_f) data_files.sort() return data_files def do_GET_json_examples(request): data_files = getFilesIn(request.server.data_dir) files_as_json = json.dumps(data_files) request.send_response(200) request.send_header('Content-Type', 'application/json') request.send_header('Content-Length', len(files_as_json)) request.end_headers() request.wfile.write(files_as_json) def do_GET_json_examples_skp(request): data_files = getFilesIn(request.server.skp_data_dir) files_as_json = json.dumps(data_files) request.send_response(200) request.send_header('Content-Type', 'application/json') request.send_header('Content-Length', len(files_as_json)) request.end_headers() request.wfile.write(files_as_json) def do_GET_json_tests(self): test_module_resources = self.server.project.FindAllTestModuleResources() test_relpaths = [x.unix_style_relative_path for x in test_module_resources] tests = {'test_relpaths': test_relpaths} tests_as_json = json.dumps(tests) self.send_response(200) self.send_header('Content-Type', 'application/json') self.send_header('Content-Length', len(tests_as_json)) self.end_headers() self.wfile.write(tests_as_json) def do_POST_report_test_results(request): request.send_response(200) request.send_header('Content-Length', '0') request.end_headers() msg = request.rfile.read() ostream = sys.stdout if 'PASSED' in msg else sys.stderr ostream.write(msg + '\n') def do_POST_report_test_completion(request): request.send_response(200) request.send_header('Content-Length', '0') request.end_headers() msg = request.rfile.read() sys.stdout.write(msg + '\n') request.server.RequestShutdown(exit_code=(0 if 'ALL_PASSED' in msg else 1)) def Main(args): project = tracing_project.TracingProject() parser = argparse.ArgumentParser(description='Run tracing development server') parser.add_argument( '-d', '--data-dir', default=os.path.abspath(os.path.join(project.test_data_path))) parser.add_argument( '-s', '--skp-data-dir', default=os.path.abspath(os.path.join(project.skp_data_path))) parser.add_argument('-p', '--port', default=8003, type=int) args = parser.parse_args(args=args) server = dev_server.DevServer(port=args.port, project=project) server.data_dir = os.path.abspath(args.data_dir) server.skp_data_dir = os.path.abspath(args.skp_data_dir) project.source_paths.append(server.data_dir) server.AddPathHandler('/json/examples', do_GET_json_examples) server.AddPathHandler('/tr/json/tests', do_GET_json_tests) server.AddPathHandler('/json/examples/skp', do_GET_json_examples_skp) server.AddSourcePathMapping(project.tracing_root_path) server.AddPathHandler('/test_automation/notify_test_result', do_POST_report_test_results, supports_post=True) server.AddPathHandler('/test_automation/notify_completion', do_POST_report_test_completion, supports_post=True) server.serve_forever()