# Test that the --remote=host mechanism is working
# Requires the test user to specify hosts with automated ssh access.

set test "remote"

if {[info exists env(SYSTEMTAP_TESTREMOTES)]} {
  set remotes [split $env(SYSTEMTAP_TESTREMOTES) ,]
}
if {[llength $remotes] == 0} {
  set remotes {direct: stapsh:}
}
set batch_remotes [list]

verbose -log "$test: using $remotes"
if {![llength $remotes] || ![installtest_p]} { untested $test; return }

# Test each remote individually
foreach remote $remotes {
  # Try building for the remote
  spawn stap $srcdir/$subdir/$test.stp --remote=$remote -p4
  expect {
    -timeout 180
    timeout { fail "$test build $remote (timeout)" }
    eof { }
  }
  catch {close}; catch {wait} res
  set rc [lindex $res 3]
  if {$rc == 0} {
    pass "$test build $remote"
  } else {
    fail "$test build $remote ($rc)"
    untested "$test run $remote"
    continue
  }

  # Try running on the remote
  set begin 0
  set end 0
  set err 0
  spawn stap $srcdir/$subdir/$test.stp --remote=$remote
  expect {
    -timeout 180
    -re "^begin0:$remote\r\n" { incr begin; kill -INT [exp_pid] 5; exp_continue }
    -re "^end0:$remote\r\n" { incr end; exp_continue }
    -re {^[^\r\n]*\r\n} { incr err; exp_continue }
    timeout { fail "$test run $remote (timeout)" }
    eof { }
  }
  catch {close}; catch {wait}
  if {!$err && $begin == 1 && $end == 1} {
    pass "$test run $remote"
    lappend batch_remotes "--remote=$remote"
  } else {
    fail "$test run $remote ($begin $end $err)"
  }
}

verbose -log "$test: batch $batch_remotes"
if {[llength $batch_remotes] < 2} {
  untested "$test batch"
} else {
  # Try running the good ones together
  set begin 0
  set end 0
  set err 0
  eval spawn stap {$srcdir/$subdir/$test.stp} $batch_remotes
  expect {
    -timeout 180
    -re {^begin[0-9]+:[^\r\n]+\r\n} {
      incr begin
      if {$begin == [llength $batch_remotes]} {kill -INT [exp_pid] 5}
      exp_continue
    }
      -re {^end[0-9]+:[^\r\n]+\r\n} { incr end; exp_continue }
    -re {^[^\r\n]*\r\n} {
      incr err;
      if {$err == 1} {kill -INT [exp_pid] 5}
      exp_continue
    }
    timeout { fail "$test batch $batch_remotes (timeout)" }
    eof { }
  }
  catch {close}; catch {wait}
  if {!$err && [llength $batch_remotes] == $begin && $begin == $end} {
    pass "$test batch $batch_remotes"
  } else {
    fail "$test batch $batch_remotes ($begin $end $err)"
  }
}
