Gather targets when running in "all targets in DB" mode.
[irspy-moved-to-github.git] / lib / ZOOM / IRSpy.pm
index 0fb95f7..d7ed4d6 100644 (file)
@@ -1,4 +1,4 @@
-# $Id: IRSpy.pm,v 1.6 2006-06-21 16:24:55 mike Exp $
+# $Id: IRSpy.pm,v 1.12 2006-07-25 15:18:03 mike Exp $
 
 package ZOOM::IRSpy;
 
@@ -49,6 +49,7 @@ sub new {
        targets => undef,       # filled in later
        target2record => undef, # filled in later
        pod => undef,           # filled in later
+       tests => [],            # stack of tests currently being executed
     }, $class;
     $this->log("irspy", "starting up with database '$dbname'");
 
@@ -76,16 +77,11 @@ sub targets {
     my @targets = split /\s+/, $targetList;
     my @qlist;
     foreach my $target (@targets) {
-       my($host, $port, $db) = ($target =~ /(.*?):(.*?)\/(.*)/);
-       if (!defined $host) {
-           $port = 210;
-           ($host, $db) = ($target =~ /(.*?)\/(.*)/);
-           my $new = "$host:$port/$db";
-           $this->log("irspy_debug", "rewriting '$target' to '$new'");
-           $target = $new;
+       my($host, $port, $db, $newtarget) = _parse_target_string($target);
+       if ($newtarget ne $target) {
+           $this->log("irspy_debug", "rewriting '$target' to '$newtarget'");
+           $target = $newtarget; # This written through the ref
        }
-       die "invalid target string '$target'"
-           if !defined $host;
        push @qlist,
            (qq[(host = "$host" and port = "$port" and path="$db")]);
     }
@@ -95,6 +91,23 @@ sub targets {
 }
 
 
+# Also used by ZOOM::IRSpy::Record
+sub _parse_target_string {
+    my($target) = @_;
+
+    my($host, $port, $db) = ($target =~ /(.*?):(.*?)\/(.*)/);
+    if (!defined $host) {
+       $port = 210;
+       ($host, $db) = ($target =~ /(.*?)\/(.*)/);
+       $target = "$host:$port/$db";
+    }
+    die "$0: invalid target string '$target'"
+       if !defined $host;
+
+    return ($host, $port, $db, $target);
+}
+
+
 # There are two cases.
 #
 # 1. A specific set of targets is nominated on the command line.
@@ -140,6 +153,8 @@ sub initialise {
        my $zeerex = _render_record($rs, $i-1, "zeerex");
        $target2record{lc($target)} =
            new ZOOM::IRSpy::Record($target, $zeerex);
+       push @{ $this->{targets} }, $target
+           if $this->{allrecords};
     }
 
     foreach my $target (keys %target2record) {
@@ -180,7 +195,15 @@ sub _render_record {
 sub check {
     my $this = shift();
 
-    return $this->_run_test("Main");
+    my $res = $this->_run_test("Main");
+    foreach my $target (sort keys %{ $this->{target2record} }) {
+       my $rec = $this->{target2record}->{$target};
+       print STDERR "$target: zeerex='", $rec->{zeerex}, "' = \n",
+           $rec->{zeerex}->toString(), "\n";
+       ### Write record back to database, if modified.
+    }
+    return $res;
+
 }
 
 
@@ -188,6 +211,10 @@ sub _run_test {
     my $this = shift();
     my($tname) = @_;
 
+    die("$0: test-hierarchy loop detected: " .
+       join(" -> ", @{ $this->{tests} }, $tname))
+       if grep { $_ eq $tname } @{ $this->{tests} };
+
     eval {
        my $slashSeperatedTname = $tname;
        $slashSeperatedTname =~ s/::/\//g;
@@ -199,8 +226,11 @@ sub _run_test {
     }
 
     $this->log("irspy", "running test '$tname'");
+    push @{ $this->{tests} }, $tname;
     my $test = "ZOOM::IRSpy::Test::$tname"->new($this);
-    return $test->run();
+    my $res =$test->run();
+    pop @{ $this->{tests} };
+    return $res;
 }
 
 
@@ -218,13 +248,22 @@ sub record {
        # Can be called with a Connection instead of a target-name
        my $conn = $target;
        $target = $conn->option("host");
-       $this->log("irspy_debug", "record() resolved $conn to '$target'");
     }
 
     return $this->{target2record}->{lc($target)};
 }
 
 
+# Utility method, really nothing to do with IRSpy
+sub isodate {
+    my $this = shift();
+    my($time) = @_;
+
+    my($sec, $min, $hour, $mday, $mon, $year) = localtime($time);
+    return sprintf("%04d-%02d-%02dT%02d:%02d:%02d",
+                  $year+1900, $mon+1, $mday, $hour, $min, $sec);
+}
+
 
 =head1 SEE ALSO