#!perl

use strict;
use warnings;
use Test;

BEGIN {
    plan tests => 62;
}

use Data::Dumper;
$Data::Dumper::Sortkeys = 1;
use SCST::SCST;

sub setup {
    my $SCST = shift;

    my ($drivers, $errorString) = $SCST->drivers();
    my %drivers = map { $_ => 1 } @{$drivers};
    ok(exists($drivers{'iscsi'}));
    ok(exists($drivers{'scst_local'}));

    ok($SCST->openDevice("vdisk_fileio", "disk01",
			 { 'filename' => '/proc/cpuinfo' }), 0);
    ok($SCST->openDevice("vdisk_fileio", "disk02",
			 { 'filename' => '/proc/cpuinfo' }), 0);
    ok($SCST->openDevice("vdisk_fileio", "disk03",
			 { 'filename' => '/proc/cpuinfo' }), 0);
    ok($SCST->openDevice("vdisk_fileio", "disk04",
			 { 'filename' => '/proc/cpuinfo' }), 0);

    ok($SCST->addVirtualTarget('scst_local', 'local1'), 0);

    ok($SCST->addLun('scst_local', 'local1', 'disk01', 0, { }), 0);
    ok($SCST->addLun('scst_local', 'local1', 'disk02', 1, { }), 0);
    ok($SCST->addLun('scst_local', 'local1', 'disk03', 2, { }), 0);
    ok($SCST->addLun('scst_local', 'local1', 'disk04', 3, { }), 0);
}

sub test {
    my $SCST = shift;

    ok(Dumper($SCST->deviceGroups()), Dumper([], undef));

    ok($SCST->addDeviceGroup('dg1'), 0);
    ok($SCST->addDeviceGroup('dg2'), 0);
    ok($SCST->addDeviceGroup('dg3'), 0);
    ok($SCST->addDeviceGroup('dg4'), 0);

    ok(Dumper($SCST->deviceGroups()),
       Dumper(['dg1', 'dg2', 'dg3', 'dg4'], undef));

    ok(Dumper($SCST->deviceGroupDevices()), Dumper(undef, "Too few arguments"));
    ok(Dumper($SCST->deviceGroupDevices('dg1')), Dumper([], undef));
    ok($SCST->addDeviceGroupDevice('dg1', 'disk01'), 0);
    ok($SCST->addDeviceGroupDevice('dg1', 'disk01'),
       $SCST->SCST_C_DGRP_DEVICE_EXISTS);
    ok($SCST->addDeviceGroupDevice('dg2', 'disk02'), 0);
    ok($SCST->addDeviceGroupDevice('dg2', 'disk01'),
       $SCST->SCST_C_DGRP_DEVICE_OTHER);
    ok($SCST->addDeviceGroupDevice('dg3', 'disk03'), 0);
    ok($SCST->addDeviceGroupDevice('dg4', 'disk04'), 0);
    ok(Dumper($SCST->deviceGroupDevices('dg1')), Dumper(['disk01'], undef));
    ok(Dumper($SCST->deviceGroupDevices('dg2')), Dumper(['disk02'], undef));
    ok(Dumper($SCST->deviceGroupDevices('dg3')), Dumper(['disk03'], undef));
    ok(Dumper($SCST->deviceGroupDevices('dg4')), Dumper(['disk04'], undef));

    ok(Dumper($SCST->targetGroups()), Dumper(undef, "Too few arguments"));
    ok(Dumper($SCST->targetGroups('no-such-device-group')),
       Dumper(undef, "targetGroups(): Device group 'no-such-device-group'" .
	      " does not exist"));
    ok(Dumper($SCST->targetGroups('dg1')), Dumper([], undef));

    ok(Dumper($SCST->targetGroupTargets()), Dumper(undef, "Too few arguments"));
    ok(Dumper($SCST->targetGroupTargets('no-such-device-group')),
       Dumper(undef, "Too few arguments"));
    ok(Dumper($SCST->targetGroupTargets('no-such-device-group', 'tg1')),
       Dumper(undef, "targetGroupTargets(): Device group 'no-such-device-".
	      "group' does not exist"));
    ok(Dumper($SCST->targetGroupTargets('dg1', 'no-such-target-group')),
       Dumper(undef, "targetGroupTargets(): Target group 'no-such-target-".
	      "group' does not exist"));
    ok(Dumper($SCST->targetGroupTargets('dg1', 'tg1')), Dumper(undef,
	      "targetGroupTargets(): Target group 'tg1' does not exist"));
    ok($SCST->addTargetGroup(), $SCST->SCST_C_DGRP_ADD_GRP_FAIL);
    ok($SCST->addTargetGroup('no-such-device-group', 'tg1'),
       $SCST->SCST_C_DEV_GRP_NO_GROUP);
    ok($SCST->addTargetGroup('dg1', 'tg1'), 0);
    ok($SCST->addTargetGroup('dg1', 'tg1'), $SCST->SCST_C_DGRP_GROUP_EXISTS);
    ok($SCST->addTargetGroup('dg1', 'tg2'), 0);

    my ($tga, $errorString) = $SCST->targetGroupAttributes('dg1', 'tg1');
    ok(Dumper($tga->{'group_id'}),
       Dumper({ 'keys' => { '0' => { 'value' => '0' } }, 'static' => 0 }));
    ok($SCST->setTargetGroupAttribute('dg1', 'tg1', 'group_id', 7), 0);
    ($tga, $errorString) = $SCST->targetGroupAttributes('dg1', 'tg1');
    ok(Dumper($tga->{'group_id'}),
       Dumper({ 'keys' => { '0' => { 'value' => '7' } }, 'static' => 0 }));

    ok($SCST->addTargetGroupTarget(), $SCST->SCST_C_TGRP_ADD_TGT_FAIL);
    ok($SCST->addTargetGroupTarget('no-such-device-group', 'tg1', 'tgt1'),
       $SCST->SCST_C_DEV_GRP_NO_GROUP);
    ok($SCST->addTargetGroupTarget('dg1', 'no-such-target-group', 'tgt1'),
       $SCST->SCST_C_DGRP_NO_GROUP);
    ok($SCST->addTargetGroupTarget('dg1', 'tg1', 'tgt1'), 0);
    ok($SCST->addTargetGroupTarget('dg1', 'tg1', 'tgt1'),
       $SCST->SCST_C_TGRP_TGT_EXISTS);
    ok($SCST->addTargetGroupTarget('dg1', 'tg2', 'tgt2'), 0);

    my $tgta;
    ($tgta, $errorString) =
	$SCST->targetGroupTargetAttributes('dg1', 'tg1', 'tgt1');
    ok(Dumper($tgta->{'rel_tgt_id'}),
       Dumper({ 'keys' => { '0' => { 'value' => '0' } }, 'static' => 0 }));
    ok($SCST->setTargetGroupTargetAttribute('dg1', 'tg1', 'tgt1', 'rel_tgt_id',
					    8), 0);
    ($tgta, $errorString) =
	$SCST->targetGroupTargetAttributes('dg1', 'tg1', 'tgt1');
    ok(Dumper($tgta->{'rel_tgt_id'}),
       Dumper({ 'keys' => { '0' => { 'value' => '8' } }, 'static' => 0 }));

    ok($SCST->removeDeviceGroup('dg1'), 0);
    ok($SCST->removeDeviceGroup('dg2'), 0);
    ok($SCST->removeDeviceGroup('dg3'), 0);
    ok($SCST->removeDeviceGroup('dg4'), 0);

    ok(Dumper($SCST->deviceGroups()), Dumper([], undef));
}

sub teardown {
    my $SCST = shift;

    ok($SCST->removeVirtualTarget('scst_local', 'local1'), 0);
    ok($SCST->closeDevice("vdisk_fileio", "disk01"), 0);
    ok($SCST->closeDevice("vdisk_fileio", "disk02"), 0);
}

my $_DEBUG_ = 0;

my $SCST = eval { new SCST::SCST($_DEBUG_) };
die("Creation of SCST object failed") if (!defined($SCST));

setup($SCST);
test($SCST);
teardown($SCST);
