#!/usr/bin/perl
# Copyright (C) 2009 Google Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#     * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
#     * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# Script to run Web Socket server.

use strict;
use warnings;

use File::Spec;
use FindBin;
use IPC::Open2;

use lib $FindBin::Bin;
use webkitdirs;

sub closeWebSocketServer();
sub openWebSocketServer();

my $webSocketPort = 8880;

my $srcDir = sourceDir();
my $layoutTestsName = "$srcDir/LayoutTests";
my $testDirectory = File::Spec->rel2abs($layoutTestsName);
my $webSocketServerPID = 0;


print "Starting Web Socket server...\n";
openWebSocketServer();
print "Started.\n";
print "Hit [ENTER] to stop it.";
<STDIN>;
print "Stopping Web Socket server...\n";
closeWebSocketServer();
print "Stopped.\n";
exit 0;


sub openWebSocketServer()
{
    my $webSocketServerPath = "/usr/bin/python";
    my $webSocketPythonPath = "$srcDir/WebKitTools/pywebsocket";
    my $webSocketHandlerDir = "$testDirectory";
    my $webSocketHandlerScanDir = "$testDirectory/websocket/tests";
    my $webSocketHandlerMapFile = "$webSocketHandlerScanDir/handler_map.txt";

    my @args = (
        "$srcDir/WebKitTools/pywebsocket/mod_pywebsocket/standalone.py",
        "-p", "$webSocketPort",
        "-d", "$webSocketHandlerDir",
        "-s", "$webSocketHandlerScanDir",
        "-m", "$webSocketHandlerMapFile",
        "-x", "/websocket/tests/cookies",
    );

    $ENV{"PYTHONPATH"} = $webSocketPythonPath;
    $webSocketServerPID = open2(\*WEBSOCKETSERVER_IN, \*WEBSOCKETSERVER_OUT, $webSocketServerPath, @args);

    my $listen = "http://127.0.0.1:$webSocketPort";
    my $retryCount = 10;
    while (system("/usr/bin/curl -k -q --silent --stderr - --output /dev/null $listen") && $retryCount) {
        sleep 1;
        --$retryCount;
    }
    die "Timed out waiting for WebSocketServer to start" unless $retryCount;
}

sub closeWebSocketServer()
{
    close WEBSOCKETSERVER_IN;
    close WEBSOCKETSERVER_OUT;
    kill 15, $webSocketServerPID;
}

