summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lambda-calcul/haskell/src/Minilang/Server.hs18
-rwxr-xr-xlambda-calcul/haskell/test.sh32
2 files changed, 44 insertions, 6 deletions
diff --git a/lambda-calcul/haskell/src/Minilang/Server.hs b/lambda-calcul/haskell/src/Minilang/Server.hs
index 68d991a..4252669 100644
--- a/lambda-calcul/haskell/src/Minilang/Server.hs
+++ b/lambda-calcul/haskell/src/Minilang/Server.hs
@@ -53,7 +53,7 @@ startServer serverPort = do
envs <- newTVarIO mempty
logger <- newLog "minilang"
loggerMiddleware <- runHTTPLog logger
- challenges <- readChallenges
+ challenges <- readChallenges logger
env <- newStdGen >>= (`makeEnv` challenges)
let app =
loggerMiddleware $
@@ -75,14 +75,20 @@ startServer serverPort = do
destination = Callback (\str -> logInfo logger (decode @Value $ fromStrict $ fromLogStr str))
}
-readChallenges :: IO [Challenge]
-readChallenges = do
+readChallenges :: LoggerEnv IO -> IO [Challenge]
+readChallenges logger = do
file <- try $ LBS.readFile "challenges.json"
case file of
- Left (_ :: IOError) -> pure defaultChallenges
+ Left (_ :: IOError) -> do
+ logInfo logger $ object ["action" .= ("NoChallengesFile" :: Text)]
+ pure defaultChallenges
Right content -> case eitherDecode content of
- Right challenges -> pure challenges
- Left _ -> pure defaultChallenges
+ Right challenges -> do
+ logInfo logger $ object ["action" .= ("LoadedChallenges" :: Text), "count" .= length challenges]
+ pure challenges
+ Left err -> do
+ logError logger $ object ["action" .= ("FailedToLoadChallenges" :: Text), "error" .= show err]
+ pure defaultChallenges
serveAPI :: Env -> Application
serveAPI env =
diff --git a/lambda-calcul/haskell/test.sh b/lambda-calcul/haskell/test.sh
new file mode 100755
index 0000000..1b78960
--- /dev/null
+++ b/lambda-calcul/haskell/test.sh
@@ -0,0 +1,32 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+HOST=${1:-https://lambda.pankzsoft.net}
+
+ALICE=$(curl -s -X POST -H 'content-type: application/json' $HOST/api/register -d '"alice"' | jq -r)
+echo "registered alice with token '$ALICE'"
+sleep 2
+
+for i in $(seq 1 14); do
+ GRADE=$(curl -s -X GET -H 'content-type: application/json' "$HOST/api/score?token=$ALICE" | jq -r .grade)
+ echo "alice's grade is $GRADE"
+ sleep 1
+
+ CHAL=$(curl -s -X GET -H 'content-type: application/json' "$HOST/api/challenge?token=$ALICE" | jq -r .expr)
+ echo "alice's challenge is '$CHAL'"
+ sleep 1
+
+ ANSWER=$(echo "$CHAL" | cabal run)
+ echo "alice's answer is '$ANSWER'"
+
+ RESULT=$(curl -s -X POST -H 'content-type: application/json' "$HOST/api/challenge?token=$ALICE" -d "\"$ANSWER\"")
+
+ if [ "$RESULT" != "[]" ]; then
+ echo "Failed challenge: $RESULT"
+ fi
+done
+
+SCORE=$(curl -s -X DELETE -H 'content-type: application/json' "$HOST/api/register?token=$ALICE")
+
+echo "Unregistered alice: $SCORE"