packages feed

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

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

import Data.Maybe (isJust)

import Network.GRPC.Client
import Network.GRPC.Common
import Network.GRPC.Common.Protobuf
import Network.GRPC.Common.StreamElem qualified as StreamElem

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

import Proto.API.Interop

-- | <https://github.com/grpc/grpc/blob/master/doc/interop-test-descriptions.md#server_compressed_unary>
runTest :: Cmdline -> IO ()
runTest cmdline =
    withConnection def (testServer cmdline) $ \conn -> do
      withRPC conn def (Proxy @UnaryCall) $ \call -> do
        sendInputWithMeta call $ FinalElem (request True) NoMetadata
        resp <- recvOutputWithMeta call
        verifyResponse True (StreamElem.value resp)

      withRPC conn def (Proxy @UnaryCall) $ \call -> do
        sendInputWithMeta call $ FinalElem (request False) NoMetadata
        resp <- recvOutputWithMeta call
        verifyResponse False (StreamElem.value resp)
  where
    -- To keep the test simple, we disable /outbound/ compression
    -- (this test is testing /inbound/ compression)
    request :: Bool -> (OutboundMeta, Proto SimpleRequest)
    request expectCompressed = (
          def { outboundEnableCompression = False }
        , mkSimpleRequest False
            & #responseCompressed .~ boolValue expectCompressed
        )

verifyResponse ::
     HasCallStack
  => Bool -> Maybe (InboundMeta, Proto SimpleResponse) -> IO ()
verifyResponse _expectCompressed Nothing =
    assertFailure "Expected response"
verifyResponse expectCompressed (Just (meta, resp)) = do
    assertEqual expectCompressed $ isJust (inboundCompressedSize meta)
    verifySimpleResponse resp