From 83e03c009ec7e38e8bc7e6e089ebfd94a96dbe6a Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Sat, 27 Jun 2020 06:50:00 -0700 Subject: [PATCH] test: Keep player event streams open 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 | 179 +++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 112 insertions(+), 67 deletions(-) diff --git a/test b/test index 9167ed4..9d172c7 100755 --- 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 [data] [CURL_OPTIONS] +# +# Where 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 [CURL_OPTIONS] +# +# Where 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 -- 2.43.0