packages feed

grapesy-1.0.0: interop/Interop/Client/TestCase/SpecialStatusMessage.hs

{-# LANGUAGE OverloadedStrings #-}

module Interop.Client.TestCase.SpecialStatusMessage (runTest) where

import Data.Text (Text)

import Network.GRPC.Client
import Network.GRPC.Common
import Network.GRPC.Common.Protobuf
import Network.GRPC.Spec (fromGrpcStatus)

import Interop.Client.Connect
import Interop.Cmdline
import Interop.Util.Exceptions

import Proto.API.Interop

-- | <https://github.com/grpc/grpc/blob/master/doc/interop-test-descriptions.md#special_status_message>
runTest :: Cmdline -> IO ()
runTest cmdline = do
    withConnection def (testServer cmdline) $ \conn -> do
      withRPC conn def (Proxy @UnaryCall) $ \call -> do
        sendFinalInput call simpleRequest
        assertThrows verifyError $ recvFinalOutput call
  where
    simpleRequest :: Proto SimpleRequest
    simpleRequest = defMessage & #responseStatus .~ echoStatus

    -- Spec mandates the use of code 2, which is 'GrpcUnknown'
    echoStatus :: Proto EchoStatus
    echoStatus =
        defMessage
          & #code    .~ fromIntegral (fromGrpcStatus $ GrpcError GrpcUnknown)
          & #message .~ statusMessage

    statusMessage :: Text
    statusMessage =
        "\t\ntest with whitespace\r\nand Unicode BMP ☺ and non-BMP 😈\t\n"

    verifyError :: GrpcException -> IO ()
    verifyError err = do
        assertEqual GrpcUnknown          $ grpcError        err
        assertEqual (Just statusMessage) $ grpcErrorMessage err