]> git.cworth.org Git - lmno-server/commitdiff
test: Keep player event streams open
authorCarl Worth <cworth@cworth.org>
Sat, 27 Jun 2020 13:50:00 +0000 (06:50 -0700)
committerCarl Worth <cworth@cworth.org>
Sat, 27 Jun 2020 13:54:35 +0000 (06:54 -0700)
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.)

test

diff --git a/test b/test
index 9167ed4f1a6cc03e58651159133b125edb06f638..9d172c78881e318a9d5c91ada63daf73c7d89b89 100755 (executable)
--- a/test
+++ b/test
@@ -95,6 +95,21 @@ curl_post()
     $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:
@@ -115,6 +130,21 @@ curl_get()
     $CURL ${2:-} $URL/$1
 }
 
+# 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:
@@ -411,45 +441,54 @@ TEST_END $empathy_game_id
 
 empathy_game_path=empathy/$empathy_game_id
 
-empathy_profile()
+# 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_event()
+empathy_get_event()
 {
-    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()
 {
-    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"
-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"
-result=$(empathy_player_name $alice)
+result=$(empathy_player_name alice)
 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"
-charlie=$(empathy_profile charlie)
-result=$(empathy_player_name $charlie)
+empathy_player_activate charlie
+result=$(empathy_player_name charlie)
 test "$result" = "charlie"
 TEST_END
 
@@ -457,81 +496,82 @@ TEST_SUBSECTION "Category selection"
 
 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"
-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"
-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()
 {
-    curl_post $empathy_game_path/vote/$2 "" "-b $1"
+    curl_post_cookie $1 $empathy_game_path/vote/$2
 }
 
 TEST "Vote on this category"
-empathy_vote $alice $prompt_id
+empathy_vote alice $prompt_id
 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"
-empathy_start $alice $prompt_id
+empathy_start alice $prompt_id
 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"
+bogus_cookie=/dev/null
 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"
-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()
 {
-    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"
-result=$(echo $(empathy_ambiguities $alice))
+result=$(echo $(empathy_ambiguities alice))
 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"
-result=$(echo $(empathy_ambiguities $alice))
+result=$(echo $(empathy_ambiguities alice))
 test "$result" != "null"
 TEST_END
 
@@ -539,57 +579,57 @@ TEST_SUBSECTION "Judging answers"
 
 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
-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()
 {
-    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"
-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"
-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()
 {
-    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"
-result=$(echo $(empathy_scores $alice))
+result=$(echo $(empathy_scores alice))
 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"
-result=$(echo $(empathy_scores $alice))
+result=$(echo $(empathy_scores alice))
 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'
 }
 
@@ -597,19 +637,19 @@ TEST_SUBSECTION "Scoring"
 
 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()
 {
-    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
-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
 
@@ -626,93 +666,98 @@ test "$?" = "0"
 TEST_END
 
 TEST "Verify scoring is over"
-result=$(echo $(empathy_scores $alice))
+result=$(echo $(empathy_scores alice))
 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"
-dale=$(empathy_profile dale)
-result=$(empathy_player_name $dale)
+empathy_player_activate dale
+result=$(empathy_player_name dale)
 test "$result" = "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"
-result=$(echo $(empathy_ambiguities $alice))
+result=$(echo $(empathy_ambiguities alice))
 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"
-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"
-result=$(echo $(empathy_ambiguities $alice))
+result=$(echo $(empathy_ambiguities alice))
 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"
-result=$(echo $(empathy_ambiguities $alice))
+result=$(echo $(empathy_ambiguities alice))
 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"
-result=$(echo $(empathy_scores $alice))
+result=$(echo $(empathy_scores alice))
 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"
-empathy_end_judging $alice $prompt_id
+empathy_end_judging alice $prompt_id
 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"
-empathy_end_judging $bob $prompt_id
+empathy_end_judging bob $prompt_id
 test "$?" = "0"
 TEST_END
 
 TEST "Scoring has now started"
-result=$(echo $(empathy_scores $alice))
+result=$(echo $(empathy_scores alice))
 test "$result" != "null"
 TEST_END
 
+pkill -P $alice_pid
+pkill -P $bob_pid
+pkill -P $charlie_pid
+pkill -P $dale_pid
+
 TEST_REPORT