
use strict;
use warnings;
use 5.010;

use Test::More;
use Hash::Merge 'merge';

use Tapper::Schema::TestTools;
use Tapper::Model 'model';

use DateTime::Format::Natural;
use DateTime::Format::Strptime;
use Test::Fixture::DBIC::Schema;
use Test::MockModule;
use POSIX ":sys_wait_h";
use HTTP::Daemon;
use HTTP::Status;

use Data::Dumper;

$SIG{CHLD} = 'IGNORE';
my $d = HTTP::Daemon->new || die "No HTTP daemon:$!";

my $pid = fork();
die "No fork: $!" unless defined $pid;
if ($pid == 0) {
        while (my $c = $d->accept) {
                while (my $r = $c->get_request) {
                        if ($r->method eq 'GET') {
                                if ($r->uri->path eq "/") {
                                        $c->send_file_response("t/htdocs/index.html");
                                } else {
                                        $c->send_file_response("t/htdocs/".$r->uri->path);
                                }
                        }
                }
                $c->close;
                undef($c);
        }
        exit 1;
}


# -----------------------------------------------------------------------------------------------------------------
construct_fixture( schema  => testrundb_schema, fixture => 't/fixtures/testrundb/testrun_with_testplan.yml' );
construct_fixture( schema  => reportsdb_schema, fixture => 't/fixtures/reportsdb/report.yml' );
# -----------------------------------------------------------------------------------------------------------------


BEGIN{
        use_ok('Tapper::Testplan::Generator');
}
Hash::Merge::set_behavior( 'RIGHT_PRECEDENT' );

Tapper::Config->subconfig->{testplans} = merge(
                                                Tapper::Config->subconfig->{testplans},
                                                { reporter   =>
                                                  { plugin   => { name     => 'Taskjuggler',
                                                                  url      => $d->url,
                                                                },
                                                    interval => 1*24*60*60,
                                                  }
                                                });



my $reporter = Tapper::Testplan::Generator->new();
isa_ok($reporter, 'Tapper::Testplan::Generator');
my @instances;
eval {
        @instances = $reporter->run();
};
fail($@) if $@;
is(int @instances, 1, 'One instance created');

if (@instances) {
        my $inst = model('TestrunDB')->resultset('TestplanInstance')->find($instances[0]);
        ok($inst, 'Testplan instance in db');
        is($inst->name, 'KVM: Support Flush by ASID', 'Name of the testplan instance');
        my @preconditions =  map {$_->precondition_as_hash} $inst->testruns->first->ordered_preconditions;
        is_deeply(\@preconditions, [
          {
            'arch' => 'linux64',
            'mount' => '/',
            'precondition_type' => 'image',
            'partition' => 'sda2',
            'image' => 'suse/suse_sles10_64b_smp_raw.tar.gz'
          },
          {
            'protocol' => 'local',
            'dest' => '/bin/',
            'name' => '/data/bancroft/artemis/live/repository/testprograms/uname_tap/uname_tap.sh',
            'precondition_type' => 'copyfile'
          },
          {
            'protocol' => 'local',
            'dest' => '/bin/',
            'name' => '/data/bancroft/artemis/live/repository/packages/artemisutils/kernel/gen_initrd.sh',
            'precondition_type' => 'copyfile'
          },
          {
            'filename' => 'kernel/x86_64/linux-2.6.31_rc6.2009-08-14.x86_64.tgz',
            'precondition_type' => 'package'
          },
          {
            'options' => [
                           '2.6.31-rc6'
                         ],
            'filename' => '/bin/gen_initrd.sh',
            'precondition_type' => 'exec'
          },
          {
            'timeout' => '1000',
            'precondition_type' => 'testprogram',
            'program' => '/opt/artemis/bin/artemis-netperf-server'
          }
        ], 'Preconditions on first created testrun');
        
} else {
        fail "Can not test without instances";
}

kill 15, $pid;


done_testing();
