#!/usr/bin/env 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";
}


