@@ -135,6 +135,69 @@ public function testHeadersOverwriteBehavior()
135135 );
136136 }
137137
138+ public function testMiddlewareOptionsIsPreservedByFilterAndVisibleToMiddlewares ()
139+ {
140+ $ unaryDescriptors = [
141+ 'callType ' => Call::UNARY_CALL ,
142+ 'responseType ' => 'decodeType '
143+ ];
144+ $ request = new MockRequestBody ([]);
145+ $ transport = $ this ->prophesize (TransportInterface::class);
146+
147+ $ middlewareOptions = ['myCustomKey ' => 'myCustomValue ' ];
148+
149+ $ transport ->startUnaryCall (
150+ Argument::type (Call::class),
151+ Argument::that (function ($ options ) use ($ middlewareOptions ) {
152+ return isset ($ options ['middlewareOptions ' ])
153+ && $ options ['middlewareOptions ' ] === $ middlewareOptions ;
154+ })
155+ )
156+ ->shouldBeCalledOnce ()
157+ ->willReturn ($ this ->prophesize (PromiseInterface::class)->reveal ());
158+
159+ $ credentialsWrapper = CredentialsWrapper::build ([
160+ 'keyFile ' => __DIR__ . '/testdata/json-key-file.json '
161+ ]);
162+
163+ $ client = new StubGapicClient ();
164+ $ client ->set ('agentHeader ' , []);
165+ $ client ->set (
166+ 'retrySettings ' ,
167+ ['method ' => $ this ->prophesize (RetrySettings::class)->reveal ()]
168+ );
169+ $ client ->set ('transport ' , $ transport ->reveal ());
170+ $ client ->set ('credentialsWrapper ' , $ credentialsWrapper );
171+ $ client ->set ('descriptors ' , ['method ' => $ unaryDescriptors ]);
172+
173+ $ appendedCalled = false ;
174+ $ client ->addMiddleware (function (callable $ handler ) use (&$ appendedCalled , $ middlewareOptions ) {
175+ return function (Call $ call , array $ options ) use ($ handler , &$ appendedCalled , $ middlewareOptions ) {
176+ $ appendedCalled = true ;
177+ $ this ->assertEquals ($ middlewareOptions , $ options ['middlewareOptions ' ] ?? null );
178+ return $ handler ($ call , $ options );
179+ };
180+ });
181+
182+ $ prependedCalled = false ;
183+ $ client ->prependMiddleware (function (callable $ handler ) use (&$ prependedCalled , $ middlewareOptions ) {
184+ return function (Call $ call , array $ options ) use ($ handler , &$ prependedCalled , $ middlewareOptions ) {
185+ $ prependedCalled = true ;
186+ $ this ->assertEquals ($ middlewareOptions , $ options ['middlewareOptions ' ] ?? null );
187+ return $ handler ($ call , $ options );
188+ };
189+ });
190+
191+ $ client ->startApiCall (
192+ 'method ' ,
193+ $ request ,
194+ ['middlewareOptions ' => $ middlewareOptions ]
195+ );
196+
197+ $ this ->assertTrue ($ appendedCalled , 'Appended middleware should have been called ' );
198+ $ this ->assertTrue ($ prependedCalled , 'Prepended middleware should have been called ' );
199+ }
200+
138201 public function testVersionedHeadersOverwriteBehavior ()
139202 {
140203 $ unaryDescriptors = [
0 commit comments