#!/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 $webSocketServerPidFile = "$testDirectory/websocket.pid";


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 $webSocketHandlerDir = "$testDirectory";

    my @args = (
        "$srcDir/Tools/Scripts/new-run-webkit-websocketserver",
        "--server", "start",
        "--port", "$webSocketPort",
        "--root", "$webSocketHandlerDir",
        "--pidfile", "$webSocketServerPidFile"
    );
    system "/usr/bin/python", @args;
}

sub closeWebSocketServer()
{
    my @args = (
        "$srcDir/Tools/Scripts/new-run-webkit-websocketserver",
        "--server", "stop",
        "--pidfile", "$webSocketServerPidFile"
    );
    system "/usr/bin/python", @args;
    unlink "$webSocketServerPidFile";
}


