We're about to fix the server to properly notice when a player drops
their connection and then consider them inactive. To prepare for this
in the test suite, here we put the curl calls getting the event stream
into the background so they stick around, and finally kill them at the
end of the test suite.
We use an ugly `eval` based approach so that emapthy_player_activate
with a name like "alice" sets both an $alice_cookie and an $alice_pid
variable. (Sure would be nice if we had real data structures. Oh
well.)
$CURL ${3:-} -X POST ${2:+-H 'Content-Type: application/json' -d "$2"} $URL/$1
}
$CURL ${3:-} -X POST ${2:+-H 'Content-Type: application/json' -d "$2"} $URL/$1
}
+# POST to a URL endpoint with optional JSON data using a cookie
+#
+# Usage:
+#
+# curl_post_cookie <name> <ENDPOINT> [data] [CURL_OPTIONS]
+#
+# Where <name> is a string for which there is a defined variable
+# named ${name}_cookie which in turn holds a value that is a filename
+# of a valid cookie
+curl_post_cookie()
+{
+ cookie=${1}_cookie
+ curl_post $2 "${3:-}" "-b ${!cookie} ${4:-}"
+}
+
# PUT to a URL endpoint with optional JSON data
#
# Usage:
# PUT to a URL endpoint with optional JSON data
#
# Usage:
+# GET from a URL endpoint using a cookie
+#
+# Usage:
+#
+# curl_get_cookie <name> <ENDPOINT> [CURL_OPTIONS]
+#
+# Where <name> is a string for which there is a defined variable
+# named ${name}_cookie which in turn holds a value that is a filename
+# of a valid cookie
+curl_get_cookie()
+{
+ cookie=${1}_cookie
+ curl_get $2 "-b ${!cookie} ${3:-}"
+}
+
# Create a new game of the specified engine type
#
# Usage:
# Create a new game of the specified engine type
#
# Usage:
empathy_game_path=empathy/$empathy_game_id
empathy_game_path=empathy/$empathy_game_id
+# Given a player name as $1 (eg. "empathy_player_activate alice") set both
+# $1_cookie and $1_pid (that is $alice_cookie and $alice_pid) to
+# a filename containing a cookie and the PID of a running event-streaming
+# process.
+empathy_player_activate()
- cookie_file=".cookie-empathy-$1"
- curl_put /profile "{ \"nickname\": \"$1\" }" "-c $cookie_file"
- echo $cookie_file
+ player="$1"
+ player_cookie=${player}_cookie
+ player_pid=${player}_pid
+
+ eval ${player_cookie}=".cookie-empathy-$player"
+ curl_put /profile "{ \"nickname\": \"$player\" }" "-c ${!player_cookie}"
+ curl_get_cookie $player $empathy_game_path/events >/dev/null 2>&1 &
+ eval ${player_pid}=$!
- curl_get $1 "-m 0.1 $3" 2>&1 \
- | grep "^event: $2" -A 1 \
+ curl_get_cookie $1 $2 "-m 0.1" 2>&1 \
+ | grep "^event: $3" -A 1 \
| grep ^data: \
| sed -e 's,^data: *,,'
}
empathy_player_name()
{
| grep ^data: \
| sed -e 's,^data: *,,'
}
empathy_player_name()
{
- curl_get_event $empathy_game_path/events player-info "-b $1" | jq -r .name
+ empathy_get_event $1 $empathy_game_path/events player-info | jq -r .name
}
TEST "Set 'alice' in session"
}
TEST "Set 'alice' in session"
-alice=$(empathy_profile alice)
-test "$alice" = ".cookie-empathy-alice"
+empathy_player_activate alice
+test "$alice_cookie" = ".cookie-empathy-alice"
TEST_END
TEST "Register alice and verify name"
TEST_END
TEST "Register alice and verify name"
-result=$(empathy_player_name $alice)
+result=$(empathy_player_name alice)
test "$result" = "alice"
TEST_END
TEST "Register bob"
test "$result" = "alice"
TEST_END
TEST "Register bob"
-bob=$(empathy_profile bob)
-result=$(empathy_player_name $bob)
+empathy_player_activate bob
+result=$(empathy_player_name bob)
test "$result" = "bob"
TEST_END
TEST "Register charlie"
test "$result" = "bob"
TEST_END
TEST "Register charlie"
-charlie=$(empathy_profile charlie)
-result=$(empathy_player_name $charlie)
+empathy_player_activate charlie
+result=$(empathy_player_name charlie)
test "$result" = "charlie"
TEST_END
test "$result" = "charlie"
TEST_END
empathy_submit_prompt()
{
empathy_submit_prompt()
{
- curl_post $empathy_game_path/prompts "{ \"items\": $2, \"prompt\": \"$3\"}" "-b $1"
+ curl_post_cookie $1 $empathy_game_path/prompts "{ \"items\": $2, \"prompt\": \"$3\"}"
}
TEST "Huge numbers are rejected"
}
TEST "Huge numbers are rejected"
-result=$(empathy_submit_prompt $alice 10000 "10,000 Maniacs")
+result=$(empathy_submit_prompt alice 10000 "10,000 Maniacs")
test "$result" = '{"valid":false,"message":"Maximum number of items is 20"}'
TEST_END
TEST "Submit a category"
test "$result" = '{"valid":false,"message":"Maximum number of items is 20"}'
TEST_END
TEST "Submit a category"
-prompt_id=$(empathy_submit_prompt $alice 4 "4 things on a beach" | jq .id)
+prompt_id=$(empathy_submit_prompt alice 4 "4 things on a beach" | jq .id)
test "$prompt_id" = "1"
TEST_END
empathy_vote()
{
test "$prompt_id" = "1"
TEST_END
empathy_vote()
{
- curl_post $empathy_game_path/vote/$2 "" "-b $1"
+ curl_post_cookie $1 $empathy_game_path/vote/$2
}
TEST "Vote on this category"
}
TEST "Vote on this category"
-empathy_vote $alice $prompt_id
+empathy_vote alice $prompt_id
test "$?" = "0"
TEST_END
empathy_start()
{
test "$?" = "0"
TEST_END
empathy_start()
{
- curl_post $empathy_game_path/start/$2 "" "-b $1"
+ curl_post_cookie $1 $empathy_game_path/start/$2
}
TEST "Start the game with this category"
}
TEST "Start the game with this category"
-empathy_start $alice $prompt_id
+empathy_start alice $prompt_id
test "$?" = "0"
TEST_END
empathy_answer()
{
test "$?" = "0"
TEST_END
empathy_answer()
{
- curl_post $empathy_game_path/answer/$2 "{ \"answers\": [$3]}" "-b $1"
+ curl_post_cookie $1 $empathy_game_path/answer/$2 "{ \"answers\": [$3]}"
}
TEST_SUBSECTION "Submitting answers"
TEST "Submit from a non-player fails"
}
TEST_SUBSECTION "Submitting answers"
TEST "Submit from a non-player fails"
result=$(empathy_answer bogus $prompt_id '"Sun", "Sand", "Water", "People"')
test "$result" = '{"valid":false,"message":"Player not found"}'
TEST_END
TEST "Submit from alice succeeds"
result=$(empathy_answer bogus $prompt_id '"Sun", "Sand", "Water", "People"')
test "$result" = '{"valid":false,"message":"Player not found"}'
TEST_END
TEST "Submit from alice succeeds"
-result=$(empathy_answer $alice $prompt_id '"sun", "sand", "water", "people"')
+result=$(empathy_answer alice $prompt_id '"sun", "sand", "water", "people"')
test "$result" = '{"valid":true}'
TEST_END
TEST "Submit from bob succeeds"
test "$result" = '{"valid":true}'
TEST_END
TEST "Submit from bob succeeds"
-result=$(empathy_answer $bob $prompt_id '"sand", "sands", "SunLight", "towels"')
+result=$(empathy_answer bob $prompt_id '"sand", "sands", "SunLight", "towels"')
test "$result" = '{"valid":true}'
TEST_END
empathy_ambiguities()
{
test "$result" = '{"valid":true}'
TEST_END
empathy_ambiguities()
{
- curl_get_event $empathy_game_path/events game-state "-b $1" \
+ empathy_get_event $1 $empathy_game_path/events game-state \
| jq .ambiguities
}
TEST "Judging hasn't started with player unsubmitted"
| jq .ambiguities
}
TEST "Judging hasn't started with player unsubmitted"
-result=$(echo $(empathy_ambiguities $alice))
+result=$(echo $(empathy_ambiguities alice))
test "$result" = "null"
TEST_END
TEST "Submit from charlie succeeds"
test "$result" = "null"
TEST_END
TEST "Submit from charlie succeeds"
-result=$(empathy_answer $charlie $prompt_id '"SunShine", "Grains of Sand", "wafer", "people"')
+result=$(empathy_answer charlie $prompt_id '"SunShine", "Grains of Sand", "wafer", "people"')
test "$result" = '{"valid":true}'
TEST_END
TEST_SUBSECTION "Transition from answering to judging (no voting needed)"
TEST "Judging already started"
test "$result" = '{"valid":true}'
TEST_END
TEST_SUBSECTION "Transition from answering to judging (no voting needed)"
TEST "Judging already started"
-result=$(echo $(empathy_ambiguities $alice))
+result=$(echo $(empathy_ambiguities alice))
test "$result" != "null"
TEST_END
test "$result" != "null"
TEST_END
empathy_ambiguities_list()
{
empathy_ambiguities_list()
{
- curl_get_event $empathy_game_path/events game-state "-b $1" \
+ empathy_get_event $1 $empathy_game_path/events game-state \
| jq .ambiguities[]
}
TEST "Received all unique words"
# echo here is to strip newlines
| jq .ambiguities[]
}
TEST "Received all unique words"
# echo here is to strip newlines
-result=$(echo $(empathy_ambiguities_list $alice))
+result=$(echo $(empathy_ambiguities_list alice))
test "$result" = '"Grains of Sand" "people" "sand" "sands" "sun" "SunLight" "SunShine" "towels" "wafer" "water"'
TEST_END
empathy_judged()
{
test "$result" = '"Grains of Sand" "people" "sand" "sands" "sun" "SunLight" "SunShine" "towels" "wafer" "water"'
TEST_END
empathy_judged()
{
- curl_post $empathy_game_path/judged/$2 "{ \"word_groups\": $3}" "-b $1"
+ curl_post_cookie $1 $empathy_game_path/judged/$2 "{ \"word_groups\": $3}"
}
TEST "Submit word groups from alice"
}
TEST "Submit word groups from alice"
-result=$(empathy_judged $alice $prompt_id '[["sun","SunLight","SunShine"],["sand","sands","Grains of Sand"],["water","wafer"]]')
+result=$(empathy_judged alice $prompt_id '[["sun","SunLight","SunShine"],["sand","sands","Grains of Sand"],["water","wafer"]]')
test "$result" = '{"valid":true}'
TEST_END
TEST "Submit word groups from bob"
test "$result" = '{"valid":true}'
TEST_END
TEST "Submit word groups from bob"
-result=$(empathy_judged $bob $prompt_id '[["sands","grains of sand"],["water","wafer"]]')
+result=$(empathy_judged bob $prompt_id '[["sands","grains of sand"],["water","wafer"]]')
test "$result" = '{"valid":true}'
TEST_END
empathy_scores()
{
test "$result" = '{"valid":true}'
TEST_END
empathy_scores()
{
- curl_get_event $empathy_game_path/events game-state "-b $1" \
+ empathy_get_event $1 $empathy_game_path/events game-state \
| jq .scores
}
TEST "Scoring hasn't started with player unsubmitted"
| jq .scores
}
TEST "Scoring hasn't started with player unsubmitted"
-result=$(echo $(empathy_scores $alice))
+result=$(echo $(empathy_scores alice))
test "$result" = "null"
TEST_END
TEST "Submit word groups from charlie"
test "$result" = "null"
TEST_END
TEST "Submit word groups from charlie"
-result=$(empathy_judged $charlie $prompt_id '[["SunLight","SunShine"],["sand","Grains of Sand"]]')
+result=$(empathy_judged charlie $prompt_id '[["SunLight","SunShine"],["sand","Grains of Sand"]]')
test "$result" = '{"valid":true}'
TEST_END
TEST_SUBSECTION "Transition from judging to scoring (no voting needed)"
TEST "Scoring already started"
test "$result" = '{"valid":true}'
TEST_END
TEST_SUBSECTION "Transition from judging to scoring (no voting needed)"
TEST "Scoring already started"
-result=$(echo $(empathy_scores $alice))
+result=$(echo $(empathy_scores alice))
test "$result" != "null"
TEST_END
empathy_scores_names_numbers()
{
test "$result" != "null"
TEST_END
empathy_scores_names_numbers()
{
- curl_get_event $empathy_game_path/events game-state "-b $1" \
+ empathy_get_event $1 $empathy_game_path/events game-state \
| jq '.scores.scores[]|.player,.score'
}
| jq '.scores.scores[]|.player,.score'
}
TEST "Verify final scores as expected"
# echo here is to strip newlines
TEST "Verify final scores as expected"
# echo here is to strip newlines
-result=$(echo $(empathy_scores_names_numbers $alice))
+result=$(echo $(empathy_scores_names_numbers alice))
test "$result" = '"charlie" 9 "alice" 8 "bob" 6'
TEST_END
empathy_words_submitted()
{
test "$result" = '"charlie" 9 "alice" 8 "bob" 6'
TEST_END
empathy_words_submitted()
{
- curl_get_event $empathy_game_path/events game-state "-b $1" \
+ empathy_get_event $1 $empathy_game_path/events game-state \
| jq '.scores.words[].word'
}
TEST "Verify final list of words submitted"
# echo here is to strip newlines
| jq '.scores.words[].word'
}
TEST "Verify final list of words submitted"
# echo here is to strip newlines
-result=$(echo $(empathy_words_submitted $alice))
+result=$(echo $(empathy_words_submitted alice))
test "$result" = '"Grains of Sand/sand/sands" "SunLight/SunShine" "wafer/water" "people" "sun" "towels"'
TEST_END
test "$result" = '"Grains of Sand/sand/sands" "SunLight/SunShine" "wafer/water" "people" "sun" "towels"'
TEST_END
TEST_END
TEST "Verify scoring is over"
TEST_END
TEST "Verify scoring is over"
-result=$(echo $(empathy_scores $alice))
+result=$(echo $(empathy_scores alice))
test "$result" = "null"
TEST_END
empathy_answering()
{
test "$result" = "null"
TEST_END
empathy_answering()
{
- curl_post $empathy_game_path/answering/$2 "" "-b $1"
+ curl_post_cookie $1 $empathy_game_path/answering/$2
}
TEST "Start 4-player game, 3 submissions"
}
TEST "Start 4-player game, 3 submissions"
-dale=$(empathy_profile dale)
-result=$(empathy_player_name $dale)
+empathy_player_activate dale
+result=$(empathy_player_name dale)
-prompt_id=$(empathy_submit_prompt $alice 4 "3 little words" | jq .id)
-empathy_start $alice $prompt_id
-empathy_answer $alice $prompt_id '"I", "love", "you"' >/dev/null
-empathy_answer $bob $prompt_id '"I", "love", "food"' >/dev/null
-empathy_answer $charlie $prompt_id '"food", "is", "good"' >/dev/null
-result=$(empathy_answering $dale $prompt_id)
+prompt_id=$(empathy_submit_prompt alice 4 "3 little words" | jq .id)
+empathy_start alice $prompt_id
+empathy_answer alice $prompt_id '"I", "love", "you"' >/dev/null
+empathy_answer bob $prompt_id '"I", "love", "food"' >/dev/null
+empathy_answer charlie $prompt_id '"food", "is", "good"' >/dev/null
+result=$(empathy_answering dale $prompt_id)
test "$result" = '{"valid":true}'
TEST_END
TEST "Judging hasn't started with player unsubmitted"
test "$result" = '{"valid":true}'
TEST_END
TEST "Judging hasn't started with player unsubmitted"
-result=$(echo $(empathy_ambiguities $alice))
+result=$(echo $(empathy_ambiguities alice))
test "$result" = "null"
TEST_END
empathy_end_answers()
{
test "$result" = "null"
TEST_END
empathy_end_answers()
{
- curl_post $empathy_game_path/end-answers/$2 "" "-b $1"
+ curl_post_cookie $1 $empathy_game_path/end-answers/$2
}
TEST "Minority of players vote to end answering"
}
TEST "Minority of players vote to end answering"
-empathy_end_answers $alice $prompt_id
-empathy_end_answers $bob $prompt_id
+empathy_end_answers alice $prompt_id
+empathy_end_answers bob $prompt_id
test "$?" = "0"
TEST_END
TEST "Judging still hasn't started"
test "$?" = "0"
TEST_END
TEST "Judging still hasn't started"
-result=$(echo $(empathy_ambiguities $alice))
+result=$(echo $(empathy_ambiguities alice))
test "$result" = "null"
TEST_END
TEST "Majority of players vote to end answering"
test "$result" = "null"
TEST_END
TEST "Majority of players vote to end answering"
-empathy_end_answers $charlie $prompt_id
+empathy_end_answers charlie $prompt_id
test "$?" = "0"
TEST_END
TEST "Judging has now started"
test "$?" = "0"
TEST_END
TEST "Judging has now started"
-result=$(echo $(empathy_ambiguities $alice))
+result=$(echo $(empathy_ambiguities alice))
test "$result" != "null"
TEST_END
TEST "Submit word groups from majority"
test "$result" != "null"
TEST_END
TEST "Submit word groups from majority"
-empathy_judged $alice $prompt_id '[]' >/dev/null
-result=$(empathy_judged $bob $prompt_id '[]')
+empathy_judged alice $prompt_id '[]' >/dev/null
+result=$(empathy_judged bob $prompt_id '[]')
test "$result" = '{"valid":true}'
TEST_END
TEST "Scoring hasn't started with player unsubmitted"
test "$result" = '{"valid":true}'
TEST_END
TEST "Scoring hasn't started with player unsubmitted"
-result=$(echo $(empathy_scores $alice))
+result=$(echo $(empathy_scores alice))
test "$result" = "null"
TEST_END
empathy_end_judging()
{
test "$result" = "null"
TEST_END
empathy_end_judging()
{
- curl_post $empathy_game_path/end-judging/$2 "" "-b $1"
+ curl_post_cookie $1 $empathy_game_path/end-judging/$2
}
TEST "Minority of players vote to end judging"
}
TEST "Minority of players vote to end judging"
-empathy_end_judging $alice $prompt_id
+empathy_end_judging alice $prompt_id
test "$?" = "0"
TEST_END
TEST "Scoring still hasn't started"
test "$?" = "0"
TEST_END
TEST "Scoring still hasn't started"
-result=$(echo $(empathy_scores $alice))
+result=$(echo $(empathy_scores alice))
test "$result" = "null"
TEST_END
TEST "Majority of players vote to end judging"
test "$result" = "null"
TEST_END
TEST "Majority of players vote to end judging"
-empathy_end_judging $bob $prompt_id
+empathy_end_judging bob $prompt_id
test "$?" = "0"
TEST_END
TEST "Scoring has now started"
test "$?" = "0"
TEST_END
TEST "Scoring has now started"
-result=$(echo $(empathy_scores $alice))
+result=$(echo $(empathy_scores alice))
test "$result" != "null"
TEST_END
test "$result" != "null"
TEST_END
+pkill -P $alice_pid
+pkill -P $bob_pid
+pkill -P $charlie_pid
+pkill -P $dale_pid
+