+ if ($res == ZOOM::IRSpy::Status::TEST_BAD) {
+ my $address = $conn->option('current_test_address');
+ $conn->log("irspy", "top-level test failed!")
+ if $address eq "";
+ my $node = $this->{tree}->select($address);
+ my $skipcount = 0;
+ while (defined $node->next() &&
+ length($node->next()->address()) >= length($address)) {
+ $conn->log("irspy_test", "skipping from '",
+ $node->address(), "' to '",
+ $node->next()->address(), "'");
+ $node = $node->next();
+ $skipcount++;
+ }
+
+ $conn->option(current_test_address => $node->address());
+ $conn->log("irspy_test", "skipped $skipcount tests");
+ $nskipped += $skipcount;
+ }
+
+ } elsif ($res == ZOOM::IRSpy::Status::TEST_SKIPPED) {
+ $conn->log("irspy_test", "test skipped during task $task");
+ $conn->current_task(0);
+ $conn->next_task(0);
+ $nskipped++;
+
+ } else {
+ die "unknown callback return-value '$res'";
+ }
+ }
+
+ $this->log("irspy", "exiting main loop");
+
+ # Sanity checks: none of the following should ever happen
+ my $finished = 1;
+ $this->log("irspy", "performing end-of-run sanity-checks");
+ foreach my $conn (@conn) {
+ my $test = $conn->option("current_test_address");
+ my $next = $this->_next_test($test);
+ if (defined $next) {
+ $this->log("irspy",
+ "$conn (in test '$test') has queued test '$next'");
+ $finished = 0;
+ }
+ if (my $task = $conn->current_task()) {
+ $this->log("irspy", "$conn still has an active task $task");
+ $finished = 0;
+ }
+ if (my $task = $conn->next_task()) {
+ $this->log("irspy", "$conn still has a queued task $task");
+ $finished = 0;
+ }
+ if (!$conn->is_idle()) {
+ $this->log("irspy",
+ "$conn still has ZOOM-C level tasks queued: see below");
+ $finished = 0;
+ }
+ my $ev = $conn->peek_event();
+ if ($ev != 0 && $ev != ZOOM::Event::ZEND) {
+ my $evstr = ZOOM::event_str($ev);
+ $this->log("irspy", "$conn has event $ev ($evstr) waiting");
+ $finished = 0;
+ }
+ if (!$conn->option("rewrote_record")) {
+ $this->log("irspy", "$conn did not rewrite its ZeeRex record");
+ $finished = 0;