{-# LANGUAGE OverloadedStrings #-} import Control.Concurrent import Control.Concurrent.Async import Control.Monad.Trans import Test.Hspec import Network (withSocketsDo) import Network.MessagePackRpc.Server import Network.MessagePackRpc.Client port :: Int port = 5000 main :: IO () main = withSocketsDo $ hspec $ do describe "add service" $ do it "correct" $ do server `race_` (threadDelay 1000 >> client) server :: IO () server = serve port [ ("add", toMethod add) , ("echo", toMethod echo) ] where add :: Int -> Int -> Method Int add x y = return $ x + y echo :: String -> Method String echo s = return $ "***" ++ s ++ "***" client :: IO () client = runClient "localhost" port $ do r1 <- add 123 456 liftIO $ r1 `shouldBe` 123 + 456 r2 <- echo "hello" liftIO $ r2 `shouldBe` "***hello***" where add :: Int -> Int -> Client Int add = call "add" echo :: String -> Client String echo = call "echo"