#!/usr/bin/env bash

test_description='graph state/path execution'

. lib/test-lib.sh

################################################################

test_expect_code 1 'non-existant state' 'guardian TEST0 BAD'
test_expect_code 1 'non-existant request state' 'guardian TEST0 A BAD'

test_begin_subtest "state A"
testioc ${IFO}:TEST- &
sleep .1
camonitor -tn -F. ${IFO}:TEST-{A,B,C,D} > OUTPUT &
guardian --ca-prefix TEST TEST0 A
kill_jobs
cat <<EOF >EXPECTED
T1:TEST-A..0..
T1:TEST-B..0..
T1:TEST-C..0..
T1:TEST-D..0..
T1:TEST-A..1..
T1:TEST-A..2..
T1:TEST-A..3..
T1:TEST-A..4..
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "state B"
testioc ${IFO}:TEST- &
sleep .1
camonitor -tn -F. ${IFO}:TEST-{A,B,C,D} > OUTPUT &
guardian --ca-prefix TEST TEST0 B
kill_jobs
cat <<EOF >EXPECTED
T1:TEST-A..0..
T1:TEST-B..0..
T1:TEST-C..0..
T1:TEST-D..0..
T1:TEST-B..1..
T1:TEST-B..2..
T1:TEST-B..3..
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "path A -> B (non-requestable)"
testioc ${IFO}:TEST- &
sleep .1
camonitor -tn -F. ${IFO}:TEST-{A,B,C,D} >OUTPUT &
guardian --ca-prefix TEST TEST0 A B
kill_jobs
cat <<EOF >EXPECTED
T1:TEST-A..0..
T1:TEST-B..0..
T1:TEST-C..0..
T1:TEST-D..0..
T1:TEST-A..1..
T1:TEST-A..2..
T1:TEST-A..3..
T1:TEST-A..4..
T1:TEST-B..1..
T1:TEST-B..2..
T1:TEST-B..3..
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "path A -> C"
testioc ${IFO}:TEST- &
sleep .1
camonitor -tn -F. ${IFO}:TEST-{A,B,C,D} >OUTPUT &
guardian --ca-prefix TEST TEST0 A C
kill_jobs
cat <<EOF >EXPECTED
T1:TEST-A..0..
T1:TEST-B..0..
T1:TEST-C..0..
T1:TEST-D..0..
T1:TEST-A..1..
T1:TEST-A..2..
T1:TEST-A..3..
T1:TEST-A..4..
T1:TEST-B..1..
T1:TEST-B..2..
T1:TEST-B..3..
T1:TEST-C..1..
T1:TEST-C..2..
T1:TEST-C..3..
T1:TEST-C..4..
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "invalid path A -> D"
testioc ${IFO}:TEST- &
sleep .1
camonitor -tn -F. ${IFO}:TEST-{A,B,C,D} >OUTPUT &
guardian --ca-prefix TEST --name TEST TEST0 A D
kill_jobs
cat <<EOF >EXPECTED
T1:TEST-A..0..
T1:TEST-B..0..
T1:TEST-C..0..
T1:TEST-D..0..
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "inherited path A -> D"
testioc ${IFO}:TEST- &
sleep .1
camonitor -tn -F. ${IFO}:TEST-{A,B,C,D} >OUTPUT &
guardian --ca-prefix TEST --name TEST TEST1 A D
kill_jobs
cat <<EOF >EXPECTED
T1:TEST-A..0..
T1:TEST-B..0..
T1:TEST-C..0..
T1:TEST-D..0..
T1:TEST-A..1..
T1:TEST-A..2..
T1:TEST-A..3..
T1:TEST-A..4..
T1:TEST-B..1..
T1:TEST-B..2..
T1:TEST-B..3..
T1:TEST-C..1..
T1:TEST-C..2..
T1:TEST-C..3..
T1:TEST-C..4..
T1:TEST-D..-1..
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "state with main jump"
testioc ${IFO}:TEST- &
sleep .1
camonitor -tn -F. ${IFO}:TEST-{A,B,C,D} >OUTPUT &
sleep .1
caput ${IFO}:TEST-C 10
guardian --ca-prefix TEST --name TEST TEST0 C
kill_jobs
cat <<EOF >EXPECTED
T1:TEST-A..0..
T1:TEST-B..0..
T1:TEST-C..0..
T1:TEST-D..0..
T1:TEST-C..10..
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "state with run jump"
testioc ${IFO}:TEST- &
sleep .1
camonitor -tn -F. ${IFO}:TEST-{A,B,C,D} >OUTPUT &
sleep .1
caput ${IFO}:TEST-C 9
caput ${IFO}:TEST-J 1
guardian --ca-prefix TEST --name TEST TEST0 C
kill_jobs
cat <<EOF >EXPECTED
T1:TEST-A..0..
T1:TEST-B..0..
T1:TEST-C..0..
T1:TEST-D..0..
T1:TEST-C..9..
T1:TEST-C..0..
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "follow lighter path"
testioc ${IFO}:TEST- &
sleep .1
camonitor -tn -F. ${IFO}:TEST-{A,B,C,D} > OUTPUT &
guardian --ca-prefix TEST TEST_multipath A D
kill_jobs
cat <<EOF >EXPECTED
T1:TEST-A..0..
T1:TEST-B..0..
T1:TEST-C..0..
T1:TEST-D..0..
T1:TEST-A..1..
T1:TEST-B..1..
T1:TEST-B..2..
T1:TEST-D..1..
EOF
test_expect_equal_file OUTPUT EXPECTED

################################################################

test_done
