packages feed

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

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

import Network.GRPC.Client
import Network.GRPC.Common
import Network.GRPC.Common.Protobuf

import Interop.Client.Common
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#client_compressed_streaming>
runTest :: Cmdline -> IO ()
runTest cmdline =
    withConnection enableInitCompression (testServer cmdline) $ \conn -> do
      -- 1. Call StreamingInputCall and send the feature-probing message
      checkServerSupportsCompressedRequest conn

      withRPC conn def (Proxy @StreamingInputCall) $ \call -> do
        sendInputWithMeta call $ StreamElem compressed
        sendInputWithMeta call $ FinalElem uncompressed NoMetadata

        (resp, _metadata) <- recvFinalOutput call
        assertEqual 73086 $ resp ^. #aggregatedPayloadSize
  where
    -- Expect compressed, and /is/ compressed
    compressed :: (OutboundMeta, Proto StreamingInputCallRequest)
    compressed = (
          def { outboundEnableCompression = True }
        , mkStreamingInputCallRequest True 27182
        )

    -- Expect uncompressed, and /is/ uncompressed
    uncompressed :: (OutboundMeta, Proto StreamingInputCallRequest)
    uncompressed = (
          def { outboundEnableCompression = False }
        , mkStreamingInputCallRequest False 45904
        )

-- | Check whether the server supports CompressedRequest
--
-- If it does not, throws 'TestSkipped'.
--
-- This is similar to the defintiion in
-- "Interop.Client.TestCase.ClientCompressedUnary", but (per the test spec) not
-- identical; that one uses the "unaryCall" endpoint, here we use
-- "streamingInputCall". The probe that we send is also slightly different.
checkServerSupportsCompressedRequest :: Connection -> IO ()
checkServerSupportsCompressedRequest conn =
    withRPC conn def (Proxy @StreamingInputCall) $ \call -> do
      sendInputWithMeta call $ FinalElem featureProbe NoMetadata
      expectInvalidArgument $ recvFinalOutput call
  where
    -- Expect compressed, but is /not/ actually compressed
    featureProbe :: (OutboundMeta, Proto StreamingInputCallRequest)
    featureProbe = (
          def { outboundEnableCompression = False }
        , mkStreamingInputCallRequest True 27182
        )