+usage ()
+{
+ echo "Usage:$0 <URL-to-test>"
+}
+
+if [ $# -lt 1 ]; then
+ echo "Error: No test URL given." >&2
+ echo "" >&2
+ usage >&2
+ exit 1
+fi
+
+URL=$1
+CURL="curl --silent --show-error"
+
+_TEST_SECTION()
+{
+ echo ""
+ echo $1
+ echo $1 | sed -e "s/./$2/g"
+}
+
+TEST_SECTION()
+{
+ _TEST_SECTION "$1" =
+}
+
+TEST_SUBSECTION()
+{
+ _TEST_SECTION "$1" -
+}
+
+TEST()
+{
+ printf " $1"
+ printf "%*s" $(( 52 - ${#1} )) | tr ' ' '.'
+ (( tests_total++ )) || true
+}
+
+# Result of test depends on the exit status of last command
+TEST_END()
+{
+ if [ $? -eq 0 ]; then
+ echo -n "OK"
+ else
+ (( tests_failed++ )) || true
+ echo -n "FAIL"
+ fi
+
+ # If we got an argument, append it after test result
+ if [ -n "$1" ]; then
+ echo " $1"
+ else
+ echo ""
+ fi
+}
+
+# Print report of all previous test results
+TEST_REPORT()
+{
+ echo ""
+ echo "Test Report"
+ echo "==========="
+
+ if [ "$tests_failed" == "" ]; then
+ echo "All $tests_total tests passed."
+ echo ""
+ return 0
+ else
+ echo "$tests_failed of $tests_total tests failed."
+ echo ""
+ return 1
+ fi
+}
+
+# Does a string contain a regular expression pattern
+#
+# Example:
+#
+# contains "All's well that ends well" "s.well"
+contains()
+{
+ grep -q "$2" <<< $1
+}
+
+# Post to a URL endpoint with optional JSON data
+#
+# Usage:
+#
+# curl_post <ENDPOINT> [data]
+curl_post()
+{
+ $CURL -X POST ${2:+-H 'Content-Type: application/json' -d "$2"} $URL/$1
+}
+
+# Get form a URL endpoint
+#
+# Usage:
+#
+# curl_get <ENDPOINT>
+curl_get()
+{
+ $CURL $URL/$1
+}
+
+# Create a new game of the specified engine type
+#
+# Usage:
+#
+# new_game <ENGINE>
+new_game()
+{
+ curl_post new/$1 | jq -r .
+}
+
+TEST_SECTION "LMNO (super-site for games)"
+
+TEST_SUBSECTION "Testing home page"
+home_page=$($CURL $URL)
+
+TEST "Contains 'Join Game'"
+contains "$home_page" "Join Game"
+TEST_END
+
+TEST "Contains 'Host a new game'"
+contains "$home_page" "Host a new game"
+TEST_END
+
+TEST_SUBSECTION "Creating some new games"
+
+TEST "Empires"
+empires_game_id=$(new_game empires)
+test "$empires_game_id" != ""
+TEST_END $empires_game_id