Skip to content

Commit 6a6d4a9

Browse files
feat: add metadataCallback to CallOptions (#9298)
1 parent d5c1330 commit 6a6d4a9

3 files changed

Lines changed: 80 additions & 0 deletions

File tree

Gax/src/Options/CallOptions.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ class CallOptions implements ArrayAccess, OptionsInterface
5252
private ?int $timeoutMillis;
5353
private array $transportOptions;
5454

55+
/** @var callable|null $metadataCallback */
56+
private $metadataCallback;
57+
5558
/** @var RetrySettings|array|null $retrySettings */
5659
private $retrySettings;
5760

@@ -88,6 +91,7 @@ private function fromArray(array $arr): void
8891
$this->setTimeoutMillis($arr['timeoutMillis'] ?? null);
8992
$this->setTransportOptions($arr['transportOptions'] ?? []);
9093
$this->setRetrySettings($arr['retrySettings'] ?? null);
94+
$this->setMetadataCallback($arr['metadataCallback'] ?? null);
9195
}
9296

9397
/**
@@ -157,4 +161,11 @@ public function setRetrySettings($retrySettings): self
157161

158162
return $this;
159163
}
164+
165+
public function setMetadataCallback(callable|null $metadataCallback): self
166+
{
167+
$this->metadataCallback = $metadataCallback;
168+
169+
return $this;
170+
}
160171
}

Gax/tests/Unit/GapicClientTraitTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1682,8 +1682,10 @@ public function testCallOptionsForV2Surface()
16821682
]),
16831683
'timeoutMillis' => null, // adds null timeoutMillis,
16841684
'transportOptions' => [],
1685+
'metadataCallback' => null,
16851686
]
16861687
)
1688+
16871689
->shouldBeCalledOnce()
16881690
->willReturn(new FulfilledPromise(new Operation()));
16891691

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?php
2+
/*
3+
* Copyright 2026 Google LLC
4+
* All rights reserved.
5+
*
6+
* Redistribution and use in source and binary forms, with or without
7+
* modification, are permitted provided that the following conditions are
8+
* met:
9+
*
10+
* * Redistributions of source code must retain the above copyright
11+
* notice, this list of conditions and the following disclaimer.
12+
* * Redistributions in binary form must reproduce the above
13+
* copyright notice, this list of conditions and the following disclaimer
14+
* in the documentation and/or other materials provided with the
15+
* distribution.
16+
* * Neither the name of Google Inc. nor the names of its
17+
* contributors may be used to endorse or promote products derived from
18+
* this software without specific prior written permission.
19+
*
20+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31+
*/
32+
33+
namespace Google\ApiCore\Tests\Unit\Options;
34+
35+
use Google\ApiCore\Options\CallOptions;
36+
use PHPUnit\Framework\TestCase;
37+
38+
class CallOptionsTest extends TestCase
39+
{
40+
public function testCallOptionsInstantiation()
41+
{
42+
$callback = function (array $headers) {
43+
return;
44+
};
45+
$options = new CallOptions([
46+
'headers' => ['foo' => ['bar']],
47+
'timeoutMillis' => 100,
48+
'metadataCallback' => $callback,
49+
'transportOptions' => ['baz' => 'qux'],
50+
]);
51+
52+
$optionsArray = $options->toArray();
53+
$this->assertEquals(['foo' => ['bar']], $optionsArray['headers']);
54+
$this->assertEquals(100, $optionsArray['timeoutMillis']);
55+
$this->assertEquals(['baz' => 'qux'], $optionsArray['transportOptions']);
56+
$this->assertSame($callback, $optionsArray['metadataCallback']);
57+
}
58+
59+
public function testUnrecognizedOptionsAreIgnored()
60+
{
61+
$options = new CallOptions([
62+
'unrecognizedOption' => 'value',
63+
]);
64+
65+
$this->assertArrayNotHasKey('unrecognizedOption', $options->toArray());
66+
}
67+
}

0 commit comments

Comments
 (0)