#!/usr/bin/env bash

test_description='daemon redirects'

. lib/test-lib.sh

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

test_begin_subtest "request INIT"
testguard --name=TEST TEST_redirect &
sleep .1
cawait T1:GRD-TEST_STATE A
cawait T1:GRD-TEST_STATUS DONE
camonitor -tn -F. T1:GRD-TEST_{STATE,STATUS} >OUTPUT &
sleep .1
caput T1:GRD-TEST_REQUEST C
cawait T1:GRD-TEST_STATE C
cawait T1:GRD-TEST_STATUS DONE
caput T1:GRD-TEST_REQUEST INIT
cawait T1:GRD-TEST_STATE A
cawait T1:GRD-TEST_STATUS DONE
kill %1 %2
wait
cat <<EOF >EXPECTED
T1:GRD-TEST_STATE..A..
T1:GRD-TEST_STATUS..DONE..
T1:GRD-TEST_STATUS..EDGE..
T1:GRD-TEST_STATE..B..
T1:GRD-TEST_STATUS..ENTER..
T1:GRD-TEST_STATUS..MAIN..
T1:GRD-TEST_STATUS..RUN..
T1:GRD-TEST_STATUS..EDGE..
T1:GRD-TEST_STATE..C..
T1:GRD-TEST_STATUS..ENTER..
T1:GRD-TEST_STATUS..MAIN..
T1:GRD-TEST_STATUS..RUN..
T1:GRD-TEST_STATUS..DONE..
T1:GRD-TEST_STATUS..REDIRECT..
T1:GRD-TEST_STATUS..EDGE..
T1:GRD-TEST_STATE..INIT..
T1:GRD-TEST_STATUS..ENTER..
T1:GRD-TEST_STATUS..MAIN..
T1:GRD-TEST_STATUS..RUN..
T1:GRD-TEST_STATUS..JUMP..
T1:GRD-TEST_STATE..A..
T1:GRD-TEST_STATUS..ENTER..
T1:GRD-TEST_STATUS..MAIN..
T1:GRD-TEST_STATUS..RUN..
T1:GRD-TEST_STATUS..EDGE..
T1:GRD-TEST_STATE..B..
T1:GRD-TEST_STATUS..ENTER..
T1:GRD-TEST_STATUS..MAIN..
T1:GRD-TEST_STATUS..RUN..
T1:GRD-TEST_STATUS..EDGE..
T1:GRD-TEST_STATE..C..
T1:GRD-TEST_STATUS..ENTER..
T1:GRD-TEST_STATUS..MAIN..
T1:GRD-TEST_STATUS..RUN..
T1:GRD-TEST_STATUS..DONE..
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "goto in path"
testguard --name=TEST TEST_redirect &
sleep .1
cawait T1:GRD-TEST_STATE A
cawait T1:GRD-TEST_STATUS DONE
camonitor -tn -F. T1:GRD-TEST_{STATE,STATUS} >OUTPUT &
sleep .1
caput T1:GRD-TEST_REQUEST C
cawait T1:GRD-TEST_STATE C
cawait T1:GRD-TEST_STATUS DONE
caput T1:GRD-TEST_REQUEST B
sleep .1
cawait T1:GRD-TEST_STATUS DONE
kill %1 %2
wait
cat <<EOF >EXPECTED
T1:GRD-TEST_STATE..A..
T1:GRD-TEST_STATUS..DONE..
T1:GRD-TEST_STATUS..EDGE..
T1:GRD-TEST_STATE..B..
T1:GRD-TEST_STATUS..ENTER..
T1:GRD-TEST_STATUS..MAIN..
T1:GRD-TEST_STATUS..RUN..
T1:GRD-TEST_STATUS..EDGE..
T1:GRD-TEST_STATE..C..
T1:GRD-TEST_STATUS..ENTER..
T1:GRD-TEST_STATUS..MAIN..
T1:GRD-TEST_STATUS..RUN..
T1:GRD-TEST_STATUS..DONE..
T1:GRD-TEST_STATUS..REDIRECT..
T1:GRD-TEST_STATUS..EDGE..
T1:GRD-TEST_STATE..A..
T1:GRD-TEST_STATUS..ENTER..
T1:GRD-TEST_STATUS..MAIN..
T1:GRD-TEST_STATUS..RUN..
T1:GRD-TEST_STATUS..EDGE..
T1:GRD-TEST_STATE..B..
T1:GRD-TEST_STATUS..ENTER..
T1:GRD-TEST_STATUS..MAIN..
T1:GRD-TEST_STATUS..RUN..
T1:GRD-TEST_STATUS..DONE..
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "re-request current state"
testguard --name=TEST TEST_redirect &
sleep .1
cawait T1:GRD-TEST_STATE A
cawait T1:GRD-TEST_STATUS DONE
camonitor -tn -F. T1:GRD-TEST_{STATE,STATUS} >OUTPUT &
sleep .1
caput T1:GRD-TEST_REQUEST C
cawait T1:GRD-TEST_STATE C
cawait T1:GRD-TEST_STATUS DONE
caput T1:GRD-TEST_REQUEST C
sleep .1
cawait T1:GRD-TEST_STATUS DONE
kill %1 %2
wait
cat <<EOF >EXPECTED
T1:GRD-TEST_STATE..A..
T1:GRD-TEST_STATUS..DONE..
T1:GRD-TEST_STATUS..EDGE..
T1:GRD-TEST_STATE..B..
T1:GRD-TEST_STATUS..ENTER..
T1:GRD-TEST_STATUS..MAIN..
T1:GRD-TEST_STATUS..RUN..
T1:GRD-TEST_STATUS..EDGE..
T1:GRD-TEST_STATE..C..
T1:GRD-TEST_STATUS..ENTER..
T1:GRD-TEST_STATUS..MAIN..
T1:GRD-TEST_STATUS..RUN..
T1:GRD-TEST_STATUS..DONE..
T1:GRD-TEST_STATUS..REDIRECT..
T1:GRD-TEST_STATUS..EDGE..
T1:GRD-TEST_STATUS..ENTER..
T1:GRD-TEST_STATUS..MAIN..
T1:GRD-TEST_STATUS..RUN..
T1:GRD-TEST_STATUS..DONE..
EOF
test_expect_equal_file OUTPUT EXPECTED

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

test_done
