1# Copyright (c) 2010 Google Inc. All rights reserved. 2# Copyright (C) 2014 Samsung Electronics. All rights reserved. 3# 4# Redistribution and use in source and binary forms, with or without 5# modification, are permitted provided that the following conditions are 6# met: 7# 8# * Redistributions of source code must retain the above copyright 9# notice, this list of conditions and the following disclaimer. 10# * Redistributions in binary form must reproduce the above 11# copyright notice, this list of conditions and the following disclaimer 12# in the documentation and/or other materials provided with the 13# distribution. 14# * Neither the name of Google Inc. nor the names of its 15# contributors may be used to endorse or promote products derived from 16# this software without specific prior written permission. 17# 18# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 30import time 31import json 32import BaseHTTPServer 33import subprocess 34from subprocess import Popen, PIPE, STDOUT 35 36from webkitpy.common.webkit_finder import WebKitFinder 37from webkitpy.common.system.filesystem import FileSystem 38from webkitpy.tool.servers.reflectionhandler import ReflectionHandler 39 40 41class LayoutTestsHTTPServer(BaseHTTPServer.HTTPServer): 42 def __init__(self, httpd_port, config): 43 server_name = "" 44 server_address = ("", httpd_port) 45 BaseHTTPServer.HTTPServer.__init__(self, server_address, LayoutTestsServerHTTPRequestHandler) 46 47 48class LayoutTestsServerHTTPRequestHandler(ReflectionHandler): 49 50 def do_POST(self): 51 json_raw_data = self.rfile.read(int(self.headers.getheader('content-length'))) 52 json_data = json.loads(json_raw_data) 53 test_list = '' 54 for each in json_data['tests']: 55 test_list += each + ' ' 56 filesystem = FileSystem() 57 webkit_finder = WebKitFinder(filesystem) 58 script_dir = webkit_finder.path_from_webkit_base('Tools', 'Scripts') 59 executable_path = script_dir + "/run-webkit-tests" 60 cmd = "python " + executable_path + " --no-show-results " 61 cmd += test_list 62 process = subprocess.Popen(cmd, shell=True, cwd=script_dir, env=None, stdout=subprocess.PIPE, stderr=STDOUT) 63 self.send_response(200) 64 self.send_header('Access-Control-Allow-Origin', '*') 65 self.send_header("Content-type", "text/html") 66 self.end_headers() 67 while process.poll() is None: 68 html_output = '<br>' + str(process.stdout.readline()) 69 self.wfile.write(html_output) 70 self.wfile.flush() 71 time.sleep(0.05) 72 process.wait() 73 74 def do_OPTIONS(self): 75 self.send_response(200, "ok") 76 self.send_header('Access-Control-Allow-Origin', '*') 77 self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS') 78 self.send_header("Access-Control-Allow-Headers", "Content-type") 79