#!/usr/bin/perl
use warnings;
use strict;

use Getopt::Long;
use Test::BrewBuild;
use Test::BrewBuild::Tester;

our $VERSION = '2.06';

my $ip;
my $port;
my $foreground = 0;
my $stdout = 0;
my $debug;
my $help;

if (@ARGV && $ARGV[0] !~ /(?:start|stop|--fg|-f)/ || ! @ARGV){
    $help = 1;
}

my $op = '';

if ($ARGV[0] !~ /(?:--fg|-f)/){
    $op = shift @ARGV;
}

GetOptions(
    "ip=s"       => \$ip,
    "port=i"     => \$port,
    "fg"         => \$foreground,
    "stdout"     => \$stdout,
    "debug=s"    => \$debug,
    "help"       => \$help,
);

if ($help){
    print <<'EOF';
Usage: 

bbtester start [--ip 0.0.0.0] [--port 7800]] [--debug 0-7]
bbtester stop

bbtester --fg [--ip 0.0.0.0] [--port 7800] [--debug 0-7] [--stdout]

EOF
exit;
}

my $tester = Test::BrewBuild::Tester->new(
    debug => $debug,
    stdout => $stdout,
);

$tester->ip($ip);
$tester->port($port);

if ($op eq 'stop'){
    $tester->stop;
    exit;
}
if ($op eq 'start'){
    $tester->start;
}
if ($foreground){
    $tester->listen;
}
=pod

=head1 NAME

bbtester - Remote Windows/Unix testing platform server daemon for
C<Test::BrewBuild>

=head1 SYNOPSIS

Start the listener in the background, listening on the default IP
0.0.0.0 and port 7800 (TCP)

    bbtester start

Listen using a different IP/Port pair

    bbtester start -i 192.168.10.5 -p 7789

Stop the service from running

    bbtester stop

Run the tester in the foreground for testing/debugging/troubleshooting
purposes.

    bbtester --fg

Enable debug logging. By default, log entries get returned with the results.

    bbtester [...] -d 0-7

Send the logs to STDOUT directly. Only useful in foreground mode.

    bbtester --fg [...] -d 0-7 --stdout

=head1 DESCRIPTION

This script is the listener end of the distributed C<Test::BrewBuild> testing
environment.

C<bbtester> daemonizes a L<Test::BrewBuild::Tester> object, and listens for
incoming build requests from a test dispatcher.

We then run the appropriate commands, and return the results to the dispatcher
for processing.

The default working directory for a Tester is C<~/brewbuild> on all platforms.

=head1 COMMAND LINE OPTIONS

=head2 start

Starts the tester and puts it into the background. Conflicts with C<--fg>.

=head2 stop

Stops the tester.

=head2 -i, --ip

Set the IP address to listen on. If not set, will check for one in the config
file, and if still not found, will default to C<0.0.0.0>, ie. all IPs bound
on the system.

=head2 -p, --port

Same as IP, if not sent in, we'll check the config file, and then default to
C<7800>.

=head2 -f, --fg

Instead of using C<start> which puts the service into the background, this
option will run the tester in the foreground.

=head2 -d, --debug

Pass this option an integer from 0-7, and we'll enable that level of debugging.

If the tester is put into the background with C<start>, or the C<--stdout>
option isn't used with the C<--fg> option, we'll return the debug results with
the test results.

=head2 -s, --stdout

When using C<--fg> to run the tester in the foreground, use this flag to display
debug information live time on C<STDOUT>, as opposed to having it collected and
returned.

=head1 AUTHOR

Steve Bertrand, C<< <steveb at cpan.org> >>

=head1 CONTRIBUTING

Any and all feedback and help is appreciated. A Pull Request is the preferred
method of receiving changes (L<https://github.com/stevieb9/p5-test-brewbuild>),
but regular patches through the bug tracker, or even just email discussions are
welcomed.

=head1 BUGS

L<https://github.com/stevieb9/p5-test-brewbuild/issues>

=head1 SUPPORT

You can find documentation for this script and its associated module with the
perldoc command.

    perldoc bbtester
    perldoc Test::BrewBuild::Tester

=head1 SEE ALSO

    perldoc brewbuild
    perldoc Test::BrewBuild

    perldoc bbdispatch
    perldoc Test::BrewBuild::Dispatch

    perldoc Test::BrewBuild::brewbuild.conf

=head1 LICENSE AND COPYRIGHT

Copyright 2016 Steve Bertrand.

This program is free software; you can redistribute it and/or modify it
under the terms of either: the GNU General Public License as published
by the Free Software Foundation; or the Artistic License.

See L<http://dev.perl.org/licenses/> for more information.

=cut

