# 03-iterator.t
# Basic sanity checks for BSD::Sysctl
#
# Copyright (C) 2006-2009 David Landgren
use strict;
use Test::More tests => 15;
use BSD::Sysctl;
my $it = BSD::Sysctl->iterator('kern.ipc');
ok( defined($it), 'defined a BSD::Sysctl iterator' );
my $sysctl_binary;
for my $path (qw( /sbin /bin /usr/sbin/ /usr/bin /usr/local/sbin /usr/local/bin )) {
my $binary = "$path/sysctl";
if (-x $binary) {
$sysctl_binary = $binary;
last;
}
}
SKIP: {
skip( 'failed to find sysctl binary', 4 )
unless defined $sysctl_binary;
my @sysctl = `$sysctl_binary -Na kern.ipc`;
my $x = $it->next;
my $first = shift @sysctl;
chomp $first;
is( $first, $x, 'iterate kern.ipc' ) or do {
diag( "bin: " . join( ' ', map{ord} split //, $first));
diag( " xs: " . join( ' ', map{ord} split //, $x));
};
my $count;
++$count while $it->next;
is( $count, scalar(@sysctl), 'number of elements in subtree' );
$x = $it->reset->next;
is( $first, $x, 'reset kern.ipc' ) or do {
diag( "bin: " . join( ' ', map{ord} split //, $first));
diag( " xs: " . join( ' ', map{ord} split //, $x));
};
($first) = `$sysctl_binary -Na`;
chomp $first;
$it = BSD::Sysctl->iterator;
$x = $it->next;
is( $first, $x, 'iterate implicit' ) or do {
diag( "bin: " . join( ' ', map{ord} split //, $first));
diag( " xs: " . join( ' ', map{ord} split //, $x));
};
}
{
my $iter = BSD::Sysctl->iterator('vfs');
ok( !defined($iter->name), 'no name before next' );
ok( !defined($iter->value), 'no value before next' );
my $first = $iter->next;
is( $iter->name, $first, 'name of first iterator' );
ok( defined($iter->value), 'value of first' );
my $next = $iter->next;
is( $iter->name, $next, 'name of next iterator' );
isnt( $first, $next, 'next is different' );
ok( defined($iter->value), 'value of next' );
}
{
my $iter = BSD::Sysctl->iterator('');
my $name_count = 0;
while ($iter->next) {
my $dummy = $iter->name;
++$name_count;
}
# the above fails if the XS dumps core, thus the following test isn't hit
cmp_ok( $name_count, '>', 0, "iterated through $name_count names" );
$iter->reset;
my $value_count = 0;
while ($iter->next) {
my $dummy = $iter->value;
++$value_count;
}
# ditto, this time checking the value method
cmp_ok( $value_count, '>', 0, "iterated through $value_count values" );
is($name_count, $value_count, "read as many names as values" );
}