#!/usr/bin/perl

use strict;
use blib;
use File::Spec;
use Cwd;
use Test::More tests => 8;
use constant IP      => '127.0.0.1';

use Nmap::Parser;

my $np = new Nmap::Parser;

can_ok( $np, 'cache_scan' );
can_ok( $np, 'parsescan' );
my $nmap_path = find_nmap();

SKIP: {
    skip '[Nmap-Parser] Could not find nmap executable in path', 6
      if ( $nmap_path eq '' );
    ok( $nmap_path, "Exe Path: $nmap_path" );

    skip "[Nmap-Parser] No self scanning with MSWin32", 4
      if ( $^O eq 'MSWin32' || $^O =~ /cygwin/ );
    ok(
        $np->parsescan( $nmap_path, '-p 1-80', IP ),
        'Running parsescan against ' . IP
    );

#if everything passed we can do another scan using the new cache_scan() function
    skip
"[Nmap-Parser] Current user does not have read/write permissions in this directory.",
      3
      unless ( -w '.' && -r '.' );

    my $cache_file = 'cache.' . ( rand(10000) % 10000 ) . '.xml';
    $np->cache_scan($cache_file);
    ok(
        $np->parsescan( $nmap_path, '-p 1-80', IP ),
        'Running parsescan /w cache enabled against ' . IP
    );
    ok( -s $cache_file, 'Testing if cache file was created and written' );
    ok( $np->parsefile($cache_file),
        'Verifying cache file is nmap xml compatible.' );
    is( unlink($cache_file), 1, 'Unlinking created cache file' );

}

sub find_nmap {

    #I think I borrowed this from someone (or from a Cookbook)
    my $exe_to_find = 'nmap';
    $exe_to_find =~ s/\.exe//;
    local ($_);
    local (*DIR);

    for my $dir ( File::Spec->path() ) {
        opendir( DIR, $dir ) || next;
        my @files = ( readdir(DIR) );
        closedir(DIR);

        my $path;
        for my $file (@files) {
            $file =~ s/\.exe$//;
            next unless ( $file eq $exe_to_find );

            $path = File::Spec->catfile( $dir, $file );

            #  Should symbolic link be considered?  Helps me on cygwin but ...
            next unless -r $path && ( -x _ || -l _ );

            return $path;
            last DIR;
        }
    }

}
