11from datetime import timedelta
2+ from typing import Mapping
23
34from google .protobuf .empty_pb2 import Empty
45from google .protobuf .timestamp_pb2 import Timestamp
2728from temporalio .client import Client
2829
2930
30- def assert_metadata (context : ServicerContext , ** kwargs ) -> None :
31- metadata = dict (context .invocation_metadata ())
32- for k , v in kwargs .items ():
33- assert metadata .get (k ) == v
34-
35-
3631def assert_time_remaining (context : ServicerContext , expected : int ) -> None :
3732 # Give or take 5 seconds
3833 assert expected - 5 <= context .time_remaining () <= expected + 5
@@ -41,24 +36,26 @@ def assert_time_remaining(context: ServicerContext, expected: int) -> None:
4136class SimpleWorkflowServer (WorkflowServiceServicer ):
4237 def __init__ (self ) -> None :
4338 super ().__init__ ()
44- self .expected_client_key_value = "client_value"
39+ self .last_metadata : Mapping [str , str ] = {}
40+
41+ def assert_last_metadata (self , expected : Mapping [str , str ]) -> None :
42+ for k , v in expected .items ():
43+ assert self .last_metadata .get (k ) == v
4544
4645 async def GetSystemInfo ( # type: ignore # https://github.com/nipunn1313/mypy-protobuf/issues/216
4746 self ,
4847 request : GetSystemInfoRequest ,
4948 context : ServicerContext ,
5049 ) -> GetSystemInfoResponse :
51- assert_metadata ( context , client_key = self . expected_client_key_value )
50+ self . last_metadata = dict ( context . invocation_metadata () )
5251 return GetSystemInfoResponse ()
5352
5453 async def CountWorkflowExecutions ( # type: ignore # https://github.com/nipunn1313/mypy-protobuf/issues/216
5554 self ,
5655 request : CountWorkflowExecutionsRequest ,
5756 context : ServicerContext ,
5857 ) -> CountWorkflowExecutionsResponse :
59- assert_metadata (
60- context , client_key = self .expected_client_key_value , rpc_key = "rpc_value"
61- )
58+ self .last_metadata = dict (context .invocation_metadata ())
6259 assert_time_remaining (context , 123 )
6360 assert request .namespace == "my namespace"
6461 assert request .query == "my query"
@@ -71,7 +68,6 @@ async def DeleteNamespace( # type: ignore # https://github.com/nipunn1313/mypy-
7168 request : DeleteNamespaceRequest ,
7269 context : ServicerContext ,
7370 ) -> DeleteNamespaceResponse :
74- assert_metadata (context , client_key = "client_value" , rpc_key = "rpc_value" )
7571 assert_time_remaining (context , 123 )
7672 assert request .namespace == "my namespace"
7773 return DeleteNamespaceResponse (deleted_namespace = "my namespace response" )
@@ -83,7 +79,6 @@ async def GetCurrentTime( # type: ignore # https://github.com/nipunn1313/mypy-p
8379 request : Empty ,
8480 context : ServicerContext ,
8581 ) -> GetCurrentTimeResponse :
86- assert_metadata (context , client_key = "client_value" , rpc_key = "rpc_value" )
8782 assert_time_remaining (context , 123 )
8883 return GetCurrentTimeResponse (time = Timestamp (seconds = 123 ))
8984
@@ -101,34 +96,88 @@ async def test_python_grpc_stub():
10196 await server .start ()
10297
10398 # Use our client to make a call to each service
104- client = await Client .connect (
105- f"localhost:{ port } " , rpc_metadata = {"client_key" : "client_value" }
106- )
107- metadata = {"rpc_key" : "rpc_value" }
99+ client = await Client .connect (f"localhost:{ port } " )
108100 timeout = timedelta (seconds = 123 )
109101 count_resp = await client .workflow_service .count_workflow_executions (
110102 CountWorkflowExecutionsRequest (namespace = "my namespace" , query = "my query" ),
111- metadata = metadata ,
112103 timeout = timeout ,
113104 )
114105 assert count_resp .count == 123
115106 del_resp = await client .operator_service .delete_namespace (
116107 DeleteNamespaceRequest (namespace = "my namespace" ),
117- metadata = metadata ,
118108 timeout = timeout ,
119109 )
120110 assert del_resp .deleted_namespace == "my namespace response"
121- time_resp = await client .test_service .get_current_time (
122- Empty (), metadata = metadata , timeout = timeout
123- )
111+ time_resp = await client .test_service .get_current_time (Empty (), timeout = timeout )
124112 assert time_resp .time .seconds == 123
125113
126- # Make another call to get system info after changing the client-level
127- # header
128- new_metadata = dict (client .rpc_metadata )
129- new_metadata ["client_key" ] = "changed_value"
130- client .rpc_metadata = new_metadata
131- workflow_server .expected_client_key_value = "changed_value"
114+ await server .stop (grace = None )
115+
116+
117+ async def test_grpc_metadata ():
118+ # Start server
119+ server = grpc_server ()
120+ workflow_server = SimpleWorkflowServer () # type: ignore[abstract]
121+ add_WorkflowServiceServicer_to_server (workflow_server , server )
122+ port = server .add_insecure_port ("[::]:0" )
123+ await server .start ()
124+
125+ # Connect and confirm metadata of get system info call
126+ client = await Client .connect (
127+ f"localhost:{ port } " ,
128+ api_key = "my-api-key" ,
129+ rpc_metadata = {"my-meta-key" : "my-meta-val" },
130+ )
131+ workflow_server .assert_last_metadata (
132+ {
133+ "authorization" : "Bearer my-api-key" ,
134+ "my-meta-key" : "my-meta-val" ,
135+ }
136+ )
137+
138+ # Overwrite API key via client RPC metadata, confirm there
139+ client .rpc_metadata = {
140+ "authorization" : "my-auth-val1" ,
141+ "my-meta-key" : "my-meta-val" ,
142+ }
132143 await client .workflow_service .get_system_info (GetSystemInfoRequest ())
144+ workflow_server .assert_last_metadata (
145+ {
146+ "authorization" : "my-auth-val1" ,
147+ "my-meta-key" : "my-meta-val" ,
148+ }
149+ )
150+ client .rpc_metadata = {"my-meta-key" : "my-meta-val" }
151+
152+ # Overwrite API key via call RPC metadata, confirm there
153+ await client .workflow_service .get_system_info (
154+ GetSystemInfoRequest (), metadata = {"authorization" : "my-auth-val2" }
155+ )
156+ workflow_server .assert_last_metadata (
157+ {
158+ "authorization" : "my-auth-val2" ,
159+ "my-meta-key" : "my-meta-val" ,
160+ }
161+ )
162+
163+ # Update API key, confirm updated
164+ client .api_key = "my-new-api-key"
165+ await client .workflow_service .get_system_info (GetSystemInfoRequest ())
166+ workflow_server .assert_last_metadata (
167+ {
168+ "authorization" : "Bearer my-new-api-key" ,
169+ "my-meta-key" : "my-meta-val" ,
170+ }
171+ )
172+
173+ # Remove API key, confirm removed
174+ client .api_key = None
175+ await client .workflow_service .get_system_info (GetSystemInfoRequest ())
176+ workflow_server .assert_last_metadata (
177+ {
178+ "my-meta-key" : "my-meta-val" ,
179+ }
180+ )
181+ assert "authorization" not in workflow_server .last_metadata
133182
134183 await server .stop (grace = None )
0 commit comments