The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Test::More tests => 168;

my %have_mods = (
  'Net::SSH2'             => 1,
  'Net::OpenSSH'          => 1,
  'DBI'                   => 1,
  'IPC::Shareable'        => 1,
  'Parallel::ForkManager' => 1,
);

for my $m ( keys %have_mods ) {
  my $have_mod = 1;
  eval "use $m;";
  if ($@) {
    $have_mods{$m} = 0;
  }
}

use_ok 'Rex::Batch';
use_ok 'Rex::Interface::Cache';
use_ok 'Rex::Interface::Cache::Base';
use_ok 'Rex::CLI';
use_ok 'Rex::Commands::Box';
use_ok 'Rex::Commands::Cloud';
use_ok 'Rex::Commands::Cron';

SKIP: {
  diag "DBI module not installed. Database access won't be available."
    unless $have_mods{'DBI'};
  skip "DBI module not installed. Database access won't be available.", 3
    unless $have_mods{'DBI'};
  use_ok 'Rex::Commands::DB';
  use_ok 'Rex::Group::Lookup::DBI';
  use_ok 'Rex::Helper::DBI';
}

SKIP: {
  skip
    "Net::SSH2 module not found. You need Net::SSH2 or Net::OpenSSH module to connect to servers via SSH.",
    1
    unless $have_mods{'Net::SSH2'};
  use_ok 'Rex::Interface::Connection::SSH';
}

SKIP: {
  skip
    "Net::OpenSSH module not found. You need Net::SSH2 or Net::OpenSSH module to connect to servers via SSH.",
    1
    unless $have_mods{'Net::OpenSSH'};
  use_ok 'Rex::Interface::Connection::OpenSSH';
}

SKIP: {
  diag "You need IPC::Shareable module to use Rex::Output modules."
    unless $have_mods{'IPC::Shareable'};
  skip "You need IPC::Shareable module to use Rex::Output modules.", 2
    unless $have_mods{'IPC::Shareable'};
  use_ok 'Rex::Output::JUnit';
  use_ok 'Rex::Output';
}

SKIP: {
  diag
    "You need Parallel::ForkManager to use Parallel_ForkManager distribution method."
    unless $have_mods{'Parallel::ForkManager'};
  skip
    "You need Parallel::ForkManager to use Parallel_ForkManager distribution method.",
    1
    unless $have_mods{'Parallel::ForkManager'};
  use_ok 'Rex::TaskList::Parallel_ForkManager';
}

use_ok 'Rex::Commands::Download';
use_ok 'Rex::Commands::File';
use_ok 'Rex::Commands::Fs';
use_ok 'Rex::Commands::Gather';
use_ok 'Rex::Commands::Host';
use_ok 'Rex::Commands::Iptables';
use_ok 'Rex::Commands::Kernel';
use_ok 'Rex::Commands::LVM';
use_ok 'Rex::Commands::MD5';
use_ok 'Rex::Commands::Network';
use_ok 'Rex::Commands::Partition';
use_ok 'Rex::Commands::Pkg';
use_ok 'Rex::Commands::Process';
use_ok 'Rex::Commands::Run';
use_ok 'Rex::Commands::SCM';

use_ok 'Rex::Commands::Service';
use_ok 'Rex::Commands::SimpleCheck';
use_ok 'Rex::Commands::Sysctl';
use_ok 'Rex::Commands::Tail';
use_ok 'Rex::Commands::Upload';
use_ok 'Rex::Commands::User';
use_ok 'Rex::Commands::Sync';
use_ok 'Rex::Commands';
use_ok 'Rex::Config';
use_ok 'Rex::Exporter';

use_ok 'Rex::File::Parser::Data';
use_ok 'Rex::File::Parser::Ini';

use_ok 'Rex::Fork::Manager';
use_ok 'Rex::Fork::Task';
use_ok 'Rex::FS::File';
use_ok 'Rex::Group::Entry::Server';
use_ok 'Rex::Group::Lookup::File';
use_ok 'Rex::Group::Lookup::YAML';
use_ok 'Rex::Group';
use_ok 'Rex::Hardware::Host';
use_ok 'Rex::Hardware::Kernel';
use_ok 'Rex::Hardware::Memory';
use_ok 'Rex::Hardware::Network::FreeBSD';
use_ok 'Rex::Hardware::Network::Linux';
use_ok 'Rex::Hardware::Network::NetBSD';
use_ok 'Rex::Hardware::Network::OpenBSD';
use_ok 'Rex::Hardware::Network::Solaris';
use_ok 'Rex::Hardware::Network';
use_ok 'Rex::Hardware::Swap';
use_ok 'Rex::Hardware';
use_ok 'Rex::Helper::Array';
use_ok 'Rex::Helper::Hash';
use_ok 'Rex::Helper::SSH2::Expect';
use_ok 'Rex::Helper::SSH2';
use_ok 'Rex::Helper::System';
use_ok 'Rex::Helper::UserAgent';
use_ok 'Rex::Interface::Connection::Base';
use_ok 'Rex::Interface::Connection::Fake';
use_ok 'Rex::Interface::Connection::HTTP';
use_ok 'Rex::Interface::Connection::HTTPS';
use_ok 'Rex::Interface::Connection::Local';

use_ok 'Rex::Interface::Connection';
use_ok 'Rex::Interface::Exec::Base';
use_ok 'Rex::Interface::Exec::HTTP';
use_ok 'Rex::Interface::Exec::Local';
use_ok 'Rex::Interface::Exec::SSH';
use_ok 'Rex::Interface::Exec::Sudo';
use_ok 'Rex::Interface::Exec';
use_ok 'Rex::Interface::Executor::Base';
use_ok 'Rex::Interface::Executor::Default';
use_ok 'Rex::Interface::Executor';
use_ok 'Rex::Interface::File::Base';
use_ok 'Rex::Interface::File::HTTP';
use_ok 'Rex::Interface::File::Local';
use_ok 'Rex::Interface::File::SSH';
use_ok 'Rex::Interface::File::Sudo';
use_ok 'Rex::Interface::File';
use_ok 'Rex::Interface::Fs::Base';
use_ok 'Rex::Interface::Fs::HTTP';
use_ok 'Rex::Interface::Fs::Local';
use_ok 'Rex::Interface::Fs::SSH';
use_ok 'Rex::Interface::Fs::Sudo';
use_ok 'Rex::Interface::Fs';
use_ok 'Rex::Logger';
use_ok 'Rex::Pkg::ALT';
use_ok 'Rex::Pkg::Debian';
use_ok 'Rex::Pkg::FreeBSD';
use_ok 'Rex::Pkg::Gentoo';
use_ok 'Rex::Pkg::Mageia';
use_ok 'Rex::Pkg::NetBSD';
use_ok 'Rex::Pkg::OpenBSD';
use_ok 'Rex::Pkg::Redhat';
use_ok 'Rex::Pkg::SunOS::OpenCSW';
use_ok 'Rex::Pkg::SunOS::pkg';
use_ok 'Rex::Pkg::SunOS';
use_ok 'Rex::Pkg::SuSE';
use_ok 'Rex::Pkg::Ubuntu';
use_ok 'Rex::Pkg';
use_ok 'Rex::Profiler';
use_ok 'Rex::Report::Base';
use_ok 'Rex::Report';
use_ok 'Rex::SCM::Git';
use_ok 'Rex::SCM::Subversion';
use_ok 'Rex::Service::Redhat::systemd';
use_ok 'Rex::Service::Gentoo::systemd';
use_ok 'Rex::Service::ALT::systemd';
use_ok 'Rex::Service::ALT';
use_ok 'Rex::Service::Debian';
use_ok 'Rex::Service::FreeBSD';
use_ok 'Rex::Service::Gentoo';
use_ok 'Rex::Service::Mageia';
use_ok 'Rex::Service::Mageia::systemd';
use_ok 'Rex::Service::NetBSD';
use_ok 'Rex::Service::OpenBSD';
use_ok 'Rex::Service::Redhat::systemd';
use_ok 'Rex::Service::Redhat';
use_ok 'Rex::Service::SunOS::svcadm';
use_ok 'Rex::Service::SunOS';
use_ok 'Rex::Service::SuSE::systemd';
use_ok 'Rex::Service::SuSE';
use_ok 'Rex::Service::Ubuntu';
use_ok 'Rex::Service';
use_ok 'Rex::Shared::Var::Array';
use_ok 'Rex::Shared::Var::Hash';
use_ok 'Rex::Shared::Var::Scalar';
use_ok 'Rex::Shared::Var';
use_ok 'Rex::Sudo::File';
use_ok 'Rex::Task';
use_ok 'Rex::TaskList::Base';
use_ok 'Rex::TaskList';
use_ok 'Rex::Template';
use_ok 'Rex::Transaction';
use_ok 'Rex::User::FreeBSD';
use_ok 'Rex::User::Linux';
use_ok 'Rex::User::NetBSD';
use_ok 'Rex::User::OpenBSD';
use_ok 'Rex::User::SunOS';
use_ok 'Rex::User::OpenWrt';
use_ok 'Rex::User';
use_ok 'Rex::Interface::Shell';
use_ok 'Rex::Interface::Shell::Csh';
use_ok 'Rex::Interface::Shell::Tcsh';
use_ok 'Rex::Interface::Shell::Default';
use_ok 'Rex::Interface::Shell::Bash';
use_ok 'Rex::Interface::Shell::Base';
use_ok 'Rex::Interface::Shell::Sh';
use_ok 'Rex::Interface::Shell::Zsh';
use_ok 'Rex';
use_ok 'Rex::CMDB::Base';
use_ok 'Rex::Test';
use_ok 'Rex::Test::Base';
use_ok 'Rex::Test::Base::has_content';
use_ok 'Rex::Test::Base::has_file';
use_ok 'Rex::Test::Base::has_package';
use_ok 'Rex::Test::Base::has_service_running';
use_ok 'Rex::Test::Base::has_service_stopped';

use Data::Dumper;
my @hosts = Rex::Commands::evaluate_hostname("web[01..10]");
ok(
  join( ",", @hosts ) eq
    "web01,web02,web03,web04,web05,web06,web07,web08,web09,web10",
  "host evaluation 1"
);

@hosts = Rex::Commands::evaluate_hostname("web[01..10]:5000");
ok(
  join( ",", @hosts ) eq
    "web01:5000,web02:5000,web03:5000,web04:5000,web05:5000,web06:5000,web07:5000,web08:5000,web09:5000,web10:5000",
  "host evaluation 2"
);