11defmodule GRPC.StreamTest do
2- use ExUnit.Case
2+ use GRPC.Integration.TestCase
33 doctest GRPC.Stream
44
55 describe "simple test" do
@@ -9,22 +9,42 @@ defmodule GRPC.StreamTest do
99
1010 defmodule FakeAdapter do
1111 def get_headers ( _ ) , do: % { "content-type" => "application/grpc" }
12- end
1312
14- test "unary/2 creates a flow from a unary input" do
15- input = % TestInput { message: 1 }
13+ def send_reply ( % { test_pid: test_pid , ref: ref } , item , _opts ) do
14+ send ( test_pid , { :send_reply , ref , item } )
15+ end
1616
17- result =
18- GRPC.Stream . unary ( input )
19- |> GRPC.Stream . map ( & & 1 )
20- |> GRPC.Stream . run ( )
17+ def send_trailers ( % { test_pid: test_pid , ref: ref } , trailers ) do
18+ send ( test_pid , { :send_trailers , ref , trailers } )
19+ end
20+ end
2121
22- assert result == input
22+ test "unary/2 creates a flow from a unary input" do
23+ test_pid = self ( )
24+ ref = make_ref ( )
25+
26+ input = % Routeguide.Point { latitude: 1 , longitude: 2 }
27+
28+ materializer = % GRPC.Server.Stream {
29+ adapter: FakeAdapter ,
30+ payload: % { test_pid: test_pid , ref: ref } ,
31+ grpc_type: :unary
32+ }
33+
34+ assert :noreply =
35+ GRPC.Stream . unary ( input , materializer: materializer )
36+ |> GRPC.Stream . map ( fn item ->
37+ item
38+ end )
39+ |> GRPC.Stream . run ( )
40+
41+ assert_receive { :send_reply , ^ ref , response }
42+ assert IO . iodata_to_binary ( response ) == Protobuf . encode ( input )
2343 end
2444
2545 test "unary/2 creates a flow with metadata" do
2646 input = % TestInput { message: 1 }
27- materializer = % GRPC.Server.Stream { adapter: FakeAdapter }
47+ materializer = % GRPC.Server.Stream { adapter: FakeAdapter , grpc_type: :unary }
2848
2949 flow =
3050 GRPC.Stream . unary ( input , materializer: materializer , propagate_context: true )
@@ -51,7 +71,7 @@ defmodule GRPC.StreamTest do
5171
5272 test "from_as_ctx/3 creates a flow from enumerable input" do
5373 input = [ % { message: "a" } , % { message: "b" } ]
54- materializer = % GRPC.Server.Stream { adapter: FakeAdapter }
74+ materializer = % GRPC.Server.Stream { adapter: FakeAdapter , grpc_type: :unary }
5575
5676 flow =
5777 GRPC.Stream . from ( input , propagate_context: true , materializer: materializer )
@@ -257,6 +277,38 @@ defmodule GRPC.StreamTest do
257277 end
258278 end
259279
280+ defmodule MyGRPCService do
281+ use GRPC.Server , service: Routeguide.RouteGuide.Service
282+
283+ def get_feature ( input , materializer ) do
284+ GRPC.Stream . unary ( input , materializer: materializer )
285+ |> GRPC.Stream . map ( fn point ->
286+ % Routeguide.Feature { location: point , name: "#{ point . latitude } ,#{ point . longitude } " }
287+ end )
288+ |> GRPC.Stream . run ( )
289+ end
290+ end
291+
292+ describe "run/1" do
293+ test "runs a unary stream" do
294+ run_server ( [ MyGRPCService ] , fn port ->
295+ point = % Routeguide.Point { latitude: 409_146_138 , longitude: - 746_188_906 }
296+ { :ok , channel } = GRPC.Stub . connect ( "localhost:#{ port } " , adapter_opts: [ retry_timeout: 10 ] )
297+
298+ expected_response = % Routeguide.Feature {
299+ location: point ,
300+ name: "#{ point . latitude } ,#{ point . longitude } "
301+ }
302+
303+ assert { :ok , response , % { trailers: trailers } } =
304+ Routeguide.RouteGuide.Stub . get_feature ( channel , point , return_headers: true )
305+
306+ assert response == expected_response
307+ assert trailers == GRPC.Transport.HTTP2 . server_trailers ( )
308+ end )
309+ end
310+ end
311+
260312 defp receive_loop do
261313 receive do
262314 { :request , item , from } ->
0 commit comments