The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# -*- cperl -*-
# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl Config-AugeasC.t'

#########################

# change 'tests => 2' to 'tests => last_test_to_print';

use Test::More tests => 32;
use ExtUtils::testlib;
use File::Path ;
use File::Copy ;
use File::stat;

BEGIN { use_ok('Config::Augeas') };

use strict;
use warnings ;

package Config::Augeas;

# constants are not exported so we switch package
my $fail = 0;
foreach my $constname (qw(AUG_NONE AUG_SAVE_BACKUP AUG_SAVE_NEWFILE 
			  AUG_TYPE_CHECK AUG_NO_STDINC AUG_SAVE_NOOP
			  AUG_NO_LOAD AUG_NO_MODL_AUTOLOAD AUG_ENABLE_SPAN
                          AUG_NOERROR AUG_ENOMEM AUG_EINTERNAL AUG_EPATHX
			  AUG_ENOMATCH AUG_EMMATCH AUG_ESYNTAX AUG_ENOSPAN)) {
  next if (eval "my \$a = $constname; 1");
  if ($@ =~ /^Your vendor has not defined Config::Augeas macro $constname/) {
    print "# pass: $@";
  } else {
    print "# fail: $@";
    $fail = 1;
  }

}

package main;

ok( $fail == 0 , 'Constants' );
#########################
# Insert your test code below, the Test::More module is use()ed here so read
# its man page ( perldoc Test::More ) for help writing this test script.
ok(1,"Compilation done");

# pseudo root were input config file are read
my $r_root = 'augeas-box/';

# pseudo root where config files are written by config-model
my $aug_root = 'augeas-root/';

sub cleanup {
    # cleanup before tests
    rmtree($aug_root);
    mkpath($aug_root.'etc/ssh/', { mode => 0755 }) || die "Can't mkpath:$!" ;
    copy($r_root.'etc/hosts',$aug_root.'etc/') || die "Can't copy etc/hosts:$!";
    copy($r_root.'etc/ssh/sshd_config',$aug_root.'etc/ssh/') 
      || die "Can't copy etc/ssh/sshd_config:$!" ;

    foreach my $f (qw!hosts ssh/sshd_config!) {
	my $testfile = $aug_root."etc/$f" ;
	next if -r $testfile ;
	die "Cannot test: file $testfile was not written";
    }
}

# test augeas without backup file
cleanup;

my $h_file = $aug_root."etc/hosts" ;
my $h_size = stat($h_file)->size ;

my $aug = Config::Augeas::init($aug_root, '' ,0) ;

ok($aug,"Created new Augeas object without backup file");

my $ret = $aug->set("/files/etc/hosts/2/canonical","bilbobackup") ;

is($ret,0,"Set new host name");

$ret = $aug->save ;
is($ret,0,"Save with backup done") ;

is( stat($h_file)->size , $h_size + 6 , "Check new file size") ;

# test augeas with backup file
cleanup;

my $augb = Config::Augeas::init($aug_root, '' ,
				&Config::Augeas::AUG_SAVE_BACKUP) ;

ok($augb,"Created new Augeas object with backup file");

$ret = $augb->set("/files/etc/hosts/2/canonical","bilbobackup") ;

is($ret,0,"Set new host name");

$ret = $augb->save ;
is($ret,0,"Save with backup done") ;

my $b_file = $h_file.".augsave" ;
ok( -e $b_file , "Backup file was written" ) ;
is( stat($b_file)->size , $h_size, "compare file sizes") ;



# complete test with save file
cleanup ;

my $written_file = $aug_root."etc/hosts.augnew" ;
unlink ($written_file) if -e $written_file ;

my $augc = Config::Augeas::init($aug_root, '' ,
				&Config::Augeas::AUG_SAVE_NEWFILE |
                                &Config::Augeas::AUG_ENABLE_SPAN) ;

ok($augc,"Created new Augeas object");

my $string = $augc->get("/files/etc/hosts/1/ipaddr") ;
is($string,'127.0.0.1',"Called get (returned $string )");

$ret = $augc->srun(*STDOUT, 'get /files/etc/hosts/1/ipaddr') ;
is($ret,'1',"Called srun get (returned $ret )");

$ret = $augc->set("/files/etc/hosts/2/ipaddr","192.168.0.1") ;
$ret = $augc->set("/files/etc/hosts/2/canonical","bilbo") ;

is($ret,0,"Set new host");

$ret = $augc->save ;
is($ret,0,"First save done, no file written (no modif)") ;

ok((not -e $written_file), "File was not written" ) ;
unlink ($written_file) if -e $written_file ;

$ret = $augc->get("/files/etc/hosts/2/canonical") ;
is($ret,'bilbo',"Called get after set (returned $ret )");

#$ret = $augc->insert("/files/etc/hosts/1", inserted_host => 1 ) ;
# is($ret ,0,"insert new label");

$augc->set("/files/etc/hosts/3/ipaddr","192.168.0.2") ;
$augc->rm("/files/etc/hosts/3") ;
ok($augc,"removed entry");

$augc->set("/files/etc/hosts/5/ipaddr","192.168.0.3") ;
$augc->set("/files/etc/hosts/5/canonical","gandalf") ;

$ret = $augc->mv("/files/etc/hosts/5","/files/etc/hosts/4") ;
# get return value directly from Augeas
is($ret ,0,"mv ok");

my @a = $augc->match("/files/etc/hosts") ;
is_deeply(\@a,["/files/etc/hosts"],"match result") ;

$ret = $augc->count_match("/files/etc/hosts") ;
is($ret,1,"count_match result") ;

my $span = $augc->span('/files/etc/hosts/2') ;
is($span->{filename}, 'augeas-root/etc/hosts', "filename of span /files/etc/hosts/2") ;
is($span->{span_start}, '30', "span_start of span /files/etc/hosts/2") ;
is($span->{span_end}, '48', "span_start of span /files/etc/hosts/2") ;

# Test text_store and text_retrieve
my $hosts = "192.168.0.1 rtr.example.com router\n";
$augc->set('/raw/hosts', $hosts);
$augc->text_store('Hosts.lns', '/raw/hosts', '/t1');
$augc->text_retrieve('Hosts.lns', '/raw/hosts', '/t1', '/out/hosts');
my $hosts_out = $augc->get('/out/hosts');
is($hosts_out, $hosts, "retrieve ok");

# Test rename
$augc->set('/a/b/c', 'value');
$ret = $augc->rename('/a/b/c', 'd');
is($ret,1,"rename ok") ;

$augc->set('/a/e/d', 'value2');
$ret = $augc->rename('/a//d', 'x');
is($ret,2,"rename ok") ;

$ret = $augc->save ;
is($ret,0,"save done") ;

# $augc->print(*STDOUT,'') ;

ok(-e $written_file,"augnew file written") ;

my $wr_dir = 'wr_test' ;
my $wr_file = "$wr_dir/print_test" ;
if (not -d $wr_dir) {
  mkdir($wr_dir,0755) || die "cannot open $wr_dir:$!";
}

open(WR, ">$wr_file") or die "cannot open $wr_file:$!";
$augc->print(*WR, "/files/etc/") ;
close WR;

ok( -e $wr_file, "$wr_file exists" );