#!/usr/bin/env bash

test_description='daemon basic execution'

. lib/test-lib.sh

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

test_begin_subtest "INIT with no request"
testioc ${IFO}:TEST- &
sleep .1
testguard --ca-prefix=TEST --name=TEST TEST0 &
sleep .1
cawait T1:GRD-TEST_STATUS DONE
caget -t T1:GRD-TEST_STATE >OUTPUT
caget -t T1:GRD-TEST_REQUEST >>OUTPUT
caget -t T1:GRD-TEST_NOMINAL >>OUTPUT
caget -t T1:GRD-TEST_OK >>OUTPUT
kill %1 %2
wait
cat <<EOF >EXPECTED
A
NONE
NONE
False
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "request state"
testioc ${IFO}:TEST- &
sleep .1
testguard --mode='PAUSE' --ca-prefix=TEST --name=TEST TEST0 &
sleep .1
camonitor -tn -F. T1:GRD-TEST_STATE >OUTPUT &
sleep .1
caput -c T1:GRD-TEST_REQUEST C
caput -c T1:GRD-TEST_MODE EXEC
cawait T1:GRD-TEST_STATE C
kill %1 %2 %3
wait
cat <<EOF >EXPECTED
T1:GRD-TEST_STATE..INIT..
T1:GRD-TEST_STATE..A..
T1:GRD-TEST_STATE..B..
T1:GRD-TEST_STATE..C..
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "request state, numeric readback"
testioc ${IFO}:TEST- &
sleep .1
testguard --ca-prefix=TEST --name=TEST TEST0 &
sleep .1
camonitor -tn -F. \
    T1:GRD-TEST_STATE_N \
    >OUTPUT &
sleep .1
caput -c T1:GRD-TEST_REQUEST C
cawait T1:GRD-TEST_STATE C
kill %1 %2 %3
wait
cat <<EOF >EXPECTED
T1:GRD-TEST_STATE_N..0.UDF.INVALID
T1:GRD-TEST_STATE_N..1..
T1:GRD-TEST_STATE_N..2..
T1:GRD-TEST_STATE_N..3..
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "request state, string readback"
testioc ${IFO}:TEST- &
sleep .1
testguard --ca-prefix=TEST --name=TEST TEST0 &
sleep .1
camonitor -tn -F. \
    T1:GRD-TEST_STATE_S \
    >OUTPUT &
caput -c T1:GRD-TEST_REQUEST C
cawait T1:GRD-TEST_STATE C
kill %1 %2 %3
wait
cat <<EOF >EXPECTED
T1:GRD-TEST_STATE_S..INIT..
T1:GRD-TEST_STATE_S..A..
T1:GRD-TEST_STATE_S..B..
T1:GRD-TEST_STATE_S..C..
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "request inherited state"
testioc ${IFO}:TEST- &
sleep .1
testguard --ca-prefix=TEST --name=TEST TEST1 &
sleep .1
camonitor -tn -F. T1:GRD-TEST_STATE >OUTPUT &
sleep .1
caput -c T1:GRD-TEST_REQUEST D
cawait T1:GRD-TEST_STATE D
kill %1 %2 %3
wait
cat <<EOF >EXPECTED
T1:GRD-TEST_STATE..INIT..
T1:GRD-TEST_STATE..A..
T1:GRD-TEST_STATE..B..
T1:GRD-TEST_STATE..C..
T1:GRD-TEST_STATE..D..
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "inspect intermediate state"
testioc ${IFO}:TEST- &
sleep .1
testguard --ca-prefix=TEST --name=TEST TEST1 &
sleep .1
caput -c T1:GRD-TEST_REQUEST A
cawait T1:GRD-TEST_STATE A
cawait T1:GRD-TEST_STATUS DONE
node_dump_state TEST > OUTPUT
kill %1 %2
wait
cat <<EOF >EXPECTED
T1:GRD-TEST_ERROR.False
T1:GRD-TEST_MODE.EXEC
T1:GRD-TEST_NOMINAL.D
T1:GRD-TEST_NOMINAL_N.100
T1:GRD-TEST_NOMINAL_S.D
T1:GRD-TEST_OK.False
T1:GRD-TEST_REQUEST.A
T1:GRD-TEST_REQUEST_N.1
T1:GRD-TEST_REQUEST_S.A
T1:GRD-TEST_STATE.A
T1:GRD-TEST_STATE_N.1
T1:GRD-TEST_STATE_S.A
T1:GRD-TEST_STATUS.DONE
T1:GRD-TEST_TARGET.A
T1:GRD-TEST_TARGET_N.1
T1:GRD-TEST_TARGET_S.A
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "inspect final state"
testioc ${IFO}:TEST- &
sleep .1
testguard --ca-prefix=TEST --name=TEST TEST1 &
sleep .1
caput -c T1:GRD-TEST_REQUEST D
cawait T1:GRD-TEST_STATE D
cawait T1:GRD-TEST_OK True
node_dump_state TEST > OUTPUT
kill %1 %2
wait
cat <<EOF >EXPECTED
T1:GRD-TEST_ERROR.False
T1:GRD-TEST_MODE.EXEC
T1:GRD-TEST_NOMINAL.D
T1:GRD-TEST_NOMINAL_N.100
T1:GRD-TEST_NOMINAL_S.D
T1:GRD-TEST_OK.True
T1:GRD-TEST_REQUEST.D
T1:GRD-TEST_REQUEST_N.100
T1:GRD-TEST_REQUEST_S.D
T1:GRD-TEST_STATE.D
T1:GRD-TEST_STATE_N.100
T1:GRD-TEST_STATE_S.D
T1:GRD-TEST_STATUS.DONE
T1:GRD-TEST_TARGET.D
T1:GRD-TEST_TARGET_N.100
T1:GRD-TEST_TARGET_S.D
EOF
test_expect_equal_file OUTPUT EXPECTED

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

test_done
