# ------------------------------------
#
# Project: Noid
#
# Name: noid7.t
#
# Function: To test the noid command.
#
# What Is Tested:
# Create minter with template de, for 290 identifiers.
# Mint 2 noids.
# Bind an element/value to the first one using the ":"
# option.
# Bind an element/value, with the element length greater
# than 1,500 characters, and the value being
# 10 lines, to the second one using the ":-" option.
# Fetch the bindings and check that they are correct.
#
# Command line parameters: none.
#
# Author: Michael A. Russell
#
# Revision History:
# 7/20/2004 - MAR - Initial writing
#
# ------------------------------------
# Declare a subroutine we'll define later.
sub random_string;
# Seed the random number generator.
srand(time( ));
use Test::More tests => 27;
my $this_dir = ".";
my $rm_cmd = "/bin/rm -rf $this_dir/NOID > /dev/null 2>&1 ";
my $noid_bin = "blib/script/noid";
my $noid_cmd = (-x $noid_bin ? $noid_bin : "../$noid_bin") . " -f $this_dir ";
# Start off by doing a dbcreate.
# First, though, make sure that the BerkeleyDB files do not exist.
system("$rm_cmd ; " .
"$noid_cmd dbcreate tst7.rde long 13030 cdlib.org noidTest >/dev/null");
# Check that the "NOID" subdirectory was created.
$this_test = -e "$this_dir/NOID";
$next_test = -d _;
ok($this_test, "NOID was created");
unless ($this_test) {
die "no minter directory created, stopped";
}
# That "NOID" is a directory.
ok($next_test, "NOID is a directory");
unless ($next_test) {
die "NOID is not a directory, stopped";
}
# Check for the presence of the "README" file, then "log" file, then the
# "logbdb" file within "NOID".
ok(-e "$this_dir/NOID/README", "NOID/README was created");
ok(-e "$this_dir/NOID/log", "NOID/log was created");
ok(-e "$this_dir/NOID/logbdb", "NOID/logbdb was created");
# Check for the presence of the BerkeleyDB file within "NOID".
$this_test = -e "$this_dir/NOID/noid.bdb";
ok($this_test, "NOID/noid.bdb was created");
unless ($this_test) {
die "minter initialization failed, stopped";
}
# Mint two.
@noid_output = `$noid_cmd mint 2`;
# Remove all newlines.
foreach (@noid_output) {
chomp;
}
# If the last line is empty, delete it.
if ((scalar(@noid_output) > 0) && (length($noid_output[$#noid_output])) == 0) {
$#noid_output--;
}
ok($noid_output[0] =~ s/^id:\s+//,
"first line: \"id: \" preceded minted noid");
ok($noid_output[1] =~ s/^id:\s+//,
"second line: \"id: \" preceded minted noid");
$bound_noid1 = $noid_output[0];
$bound_noid2 = $noid_output[1];
undef @noid_output;
# Generate what we'll bind to noid number 1.
$element1 = random_string( );
$value1 = random_string( );
# Start the "bind set" command for noid number 1, so that we'll be
# able to "print" the element/value.
unless(open(BINDCMD,
"| $noid_cmd bind set $bound_noid1 :- >/dev/null")) {
die "open of \"| $noid_cmd bind set $bound_noid1 $_\" failed, ",
"$!, stopped";
}
# Write the element/value pair.
print BINDCMD "$element1: $value1\n";
close(BINDCMD);
# Generate the stuff for noid number 2.
$element2 = "";
while (length($element2) < 1500) {
$element2 .= random_string( );
}
# Generate 10 lines for the value for noid number 2.
@value2 = ( );
for ($i = 0; $i < 10; $i++) {
push @value2, random_string( );
}
# Start the "bind set" command for noid number 2, so that we'll be
# able to "print" the element/value.
unless(open(BINDCMD,
"| $noid_cmd bind set $bound_noid2 :- >/dev/null")) {
die "open of \"| $noid_cmd bind set $bound_noid2 :-\" failed, ",
"$!, stopped";
}
# Write the element/value pair.
print BINDCMD "$element2 : $value2[0]\n";
for ($i = 1; $i < 10; $i++) {
print BINDCMD "$value2[$i]\n";
}
close(BINDCMD);
# Now, run the "fetch" command on the noid number 1.
@noid_output = `$noid_cmd fetch $bound_noid1`;
ok(scalar(@noid_output) > 0, "\"fetch\" command on noid 1 generated some " .
"output");
unless (scalar(@noid_output) > 0) {
die "something wrong with fetch, stopped";
}
# Remove all newlines.
foreach (@noid_output) {
chomp;
}
# Delete any trailing lines that are empty.
while ((scalar(@noid_output) > 0) &&
(length($noid_output[$#noid_output])) == 0) {
$#noid_output--;
}
is(scalar(@noid_output), 3,
"there are 3 lines of output from the \"fetch\" command on noid 1");
# If there aren't 3 lines of output, somethings is wrong.
unless (scalar(@noid_output) == 3) {
die "something wrong with fetch output, stopped";
}
# Check first line.
ok($noid_output[0] =~ /^id:\s+$bound_noid1\s+hold\s*$/,
"line 1 of \"fetch\" output for noid 1");
# Check second line.
ok($noid_output[1] =~ /^Circ:\s+/, "line 2 of \"fetch\" output for noid 1");
# Check third line.
unless ($noid_output[2] =~ /^\s*(\S+)\s*:\s*(\S+)\s*$/) {
ok(0, "line 3 of \"fetch\" output for noid 1");
die "something wrong with bound value, stopped";
}
ok(($1 eq $element1) && ($2 eq $value1),
"line 3 of \"fetch\" output for noid 1");
# Run the "fetch" on noid 2.
@noid_output = `$noid_cmd fetch $bound_noid2`;
ok(scalar(@noid_output) > 0, "\"fetch\" command on noid 2 generated some " .
"output");
unless (scalar(@noid_output) > 0) {
die "something wrong with fetched value, stopped";
}
# Remove all newlines.
foreach (@noid_output) {
chomp;
}
# Delete any trailing lines that are empty.
while ((scalar(@noid_output) > 0) &&
(length($noid_output[$#noid_output])) == 0) {
$#noid_output--;
}
is(scalar(@noid_output), 12,
"there are 12 lines of output from the \"fetch\" command on noid 2");
# If there aren't 12 lines of output, something is wrong.
unless (scalar(@noid_output) == 12) {
die "not enough lines of output, stopped";
}
# Check first line.
ok($noid_output[0] =~ /^id:\s+$bound_noid2\s+hold\s*$/,
"line 1 of \"fetch\" output for noid 2");
# Check second line.
ok($noid_output[1] =~ /^Circ:\s+/, "line 2 of \"fetch\" output for noid 2");
# Check third line.
unless ($noid_output[2] =~ /^\s*(\S+)\s*:\s*(\S+)\s*$/) {
ok(0, "line 3 of \"fetch\" output for noid 2");
die "something wrong with fetch output, stopped";
}
ok(($1 eq $element2) && ($2 eq $value2[0]),
"line 3 of \"fetch\" output for noid 2");
for ($i = 1; $i <= 9; $i++) {
is($noid_output[$i + 2], $value2[$i], "line " . ($i + 3) . " of " .
"\"fetch\" output for noid 2");
}
# -----
# Subroutine to generate a random string of (sort of) random length.
sub random_string {
my $to_choose_from =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" .
"abcdefghijklmnopqrstuvwxyz" .
"0123456789";
my $to_choose_index;
my $string_length;
my $i;
my $building_string = "";
# Calculate the string length. First, get a fractional number that's
# between 0 and 1 but never 1.
$string_length = rand;
# Multiply it by 48, so that it's between 0 and 48, but never 48.
$string_length *= 48;
# Throw away the fractional part, leaving an integer between 0 and 47.
$string_length = int($string_length);
# Add 3 to give us a number between 3 and 50.
$string_length += 3;
for ($i = 0; $i < $string_length; $i++) {
# Calculate an integer between 0 and ((length of
# $to_choose_from) - 1).
# First, get a fractional number that's between 0 and 1,
# but never 1.
$to_choose_index = rand;
# Multiply it by the length of $to_choose_from, to get
# a number that's between 0 and (length of $to_choose_from),
# but never (length of $choose_from);
$to_choose_index *= length($to_choose_from);
# Throw away the fractional part to get an integer that's
# between 0 and ((length of $to_choose_from) - 1).
$to_choose_index = int($to_choose_index);
# Fetch the character at that index into $to_choose_from,
# and append it to the end of the string we're building.
$building_string .= substr($to_choose_from, $to_choose_index,
1);
}
# Return our construction.
return($building_string);
}