Skip to content

Commit

Permalink
Add unit testing for GRPC only clients
Browse files Browse the repository at this point in the history
  • Loading branch information
Hectorhammett committed Apr 24, 2024
1 parent 8355a80 commit bb59b9b
Show file tree
Hide file tree
Showing 17 changed files with 358 additions and 26 deletions.
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
"Testing\\BasicBidiStreaming\\": "tests/Unit/ProtoTests/BasicBidiStreaming/out/src",
"Testing\\BasicClientStreaming\\": "tests/Unit/ProtoTests/BasicClientStreaming/out/src",
"Testing\\BasicDiregapic\\": "tests/Unit/ProtoTests/BasicDiregapic/out/src",
"Testing\\BasicGrpcOnly\\": "tests/Unit/ProtoTests/BasicGrpcOnly/out/src",
"Testing\\BasicLro\\": "tests/Unit/ProtoTests/BasicLro/out/src",
"Testing\\BasicOneof\\": "tests/Unit/ProtoTests/BasicOneof/out/src",
"Testing\\BasicOneofNew\\": "tests/Unit/ProtoTests/BasicOneofNew/out/src",
Expand Down
2 changes: 1 addition & 1 deletion rules_php_gapic/php_gapic.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ def php_gapic_srcjar(
if transport == None:
transport = "grpc+rest"
if transport != "grpc+rest" and transport != "rest" and transport != "grpc":
fail("Error: Only 'grpc+rest' or 'rest' transports are supported")
fail("Error: Only 'grpc+rest', 'rest' or `grpc` transports are supported")

# Set plugin arguments.
plugin_args = ["metadata"] # Generate the gapic_metadata.json file.
Expand Down
20 changes: 10 additions & 10 deletions src/Generation/GapicClientV2Generator.php
Original file line number Diff line number Diff line change
Expand Up @@ -480,20 +480,20 @@ private function supportedTransports()
{
if ($this->serviceDetails->transportType === Transport::REST) {
return AST::method('supportedTransports')
->withPhpDocText('Implements ClientOptionsTrait::supportedTransports.')
->withAccess(Access::PRIVATE, Access::STATIC)
->withBody(AST::block(
AST::return(AST::array(['rest']))
));
->withPhpDocText('Implements ClientOptionsTrait::supportedTransports.')
->withAccess(Access::PRIVATE, Access::STATIC)
->withBody(AST::block(
AST::return(AST::array(['rest']))
));
}

if ($this->serviceDetails->transportType === Transport::GRPC) {
return AST::method('supportedTransports')
->withPhpDocText('Implements ClientOptionsTrait::supportedTransports.')
->withAccess(Access::PRIVATE, Access::STATIC)
->withBody(AST::block(
AST::return(AST::array(['grpc', 'grpc-fallback']))
));
->withPhpDocText('Implements ClientOptionsTrait::supportedTransports.')
->withAccess(Access::PRIVATE, Access::STATIC)
->withBody(AST::block(
AST::return(AST::array(['grpc', 'grpc-fallback']))
));
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/Utils/Transport.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public static function parseTransport(?string $transport): int
return static::REST;
}
if ($transport === "grpc") {
throw new \Exception("gRPC-only PHP clients are not supported at this time");
return static::GRPC;
}

throw new \Exception("Transport $transport not supported");
Expand Down
1 change: 1 addition & 0 deletions tests/Integration/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,7 @@ php_gapic_library(
grpc_service_config = "@com_google_googleapis//google/cloud/redis/v1:redis_grpc_service_config.json",
service_yaml = "@com_google_googleapis//google/cloud/redis/v1:redis_v1.yaml",
migration_mode = "MIGRATION_MODE_UNSPECIFIED",
transport = "grpc",
deps = [
":redis_php_grpc",
":redis_php_proto",
Expand Down
19 changes: 12 additions & 7 deletions tests/Integration/goldens/redis/src/V1/Client/CloudRedisClient.php
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,6 @@ private static function getClientDefaults()
'apiEndpoint' => self::SERVICE_ADDRESS . ':' . self::DEFAULT_SERVICE_PORT,
'clientConfig' => __DIR__ . '/../resources/cloud_redis_client_config.json',
'descriptorsConfigPath' => __DIR__ . '/../resources/cloud_redis_descriptor_config.php',
'gcpApiConfigPath' => __DIR__ . '/../resources/cloud_redis_grpc_config.json',
'credentialsConfig' => [
'defaultScopes' => self::$serviceScopes,
],
Expand All @@ -143,6 +142,15 @@ private static function getClientDefaults()
];
}

/** Implements ClientOptionsTrait::supportedTransports. */
private static function supportedTransports()
{
return [
'grpc',
'grpc-fallback',
];
}

/**
* Return an OperationsClient object with the same endpoint as $this.
*
Expand Down Expand Up @@ -263,9 +271,8 @@ public static function parseName(string $formattedName, string $template = null)
* default this settings points to the default client config file, which is
* provided in the resources folder.
* @type string|TransportInterface $transport
* The transport used for executing network requests. May be either the string
* `rest` or `grpc`. Defaults to `grpc` if gRPC support is detected on the system.
* *Advanced usage*: Additionally, it is possible to pass in an already
* The transport used for executing network requests. At the moment, supports only
* `rest`. *Advanced usage*: Additionally, it is possible to pass in an already
* instantiated {@see \Google\ApiCore\Transport\TransportInterface} object. Note
* that when this object is provided, any settings in $transportConfig, and any
* $apiEndpoint setting, will be ignored.
Expand All @@ -274,11 +281,9 @@ public static function parseName(string $formattedName, string $template = null)
* each supported transport type should be passed in a key for that transport. For
* example:
* $transportConfig = [
* 'grpc' => [...],
* 'rest' => [...],
* ];
* See the {@see \Google\ApiCore\Transport\GrpcTransport::build()} and
* {@see \Google\ApiCore\Transport\RestTransport::build()} methods for the
* See the {@see \Google\ApiCore\Transport\RestTransport::build()} method for the
* supported options.
* @type callable $clientCertSource
* A callable which returns the client cert as a string. This can be used to
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,6 @@ private static function getClientDefaults()
'apiEndpoint' => self::SERVICE_ADDRESS . ':' . self::DEFAULT_SERVICE_PORT,
'clientConfig' => __DIR__ . '/../resources/cloud_redis_client_config.json',
'descriptorsConfigPath' => __DIR__ . '/../resources/cloud_redis_descriptor_config.php',
'gcpApiConfigPath' => __DIR__ . '/../resources/cloud_redis_grpc_config.json',
'credentialsConfig' => [
'defaultScopes' => self::$serviceScopes,
],
Expand Down Expand Up @@ -347,9 +346,8 @@ public function resumeOperation($operationName, $methodName = null)
* default this settings points to the default client config file, which is
* provided in the resources folder.
* @type string|TransportInterface $transport
* The transport used for executing network requests. May be either the string
* `rest` or `grpc`. Defaults to `grpc` if gRPC support is detected on the system.
* *Advanced usage*: Additionally, it is possible to pass in an already
* The transport used for executing network requests. At the moment, supports only
* `rest`. *Advanced usage*: Additionally, it is possible to pass in an already
* instantiated {@see \Google\ApiCore\Transport\TransportInterface} object. Note
* that when this object is provided, any settings in $transportConfig, and any
* $apiEndpoint setting, will be ignored.
Expand All @@ -358,11 +356,9 @@ public function resumeOperation($operationName, $methodName = null)
* each supported transport type should be passed in a key for that transport. For
* example:
* $transportConfig = [
* 'grpc' => [...],
* 'rest' => [...],
* ];
* See the {@see \Google\ApiCore\Transport\GrpcTransport::build()} and
* {@see \Google\ApiCore\Transport\RestTransport::build()} methods for the
* See the {@see \Google\ApiCore\Transport\RestTransport::build()} method for the
* supported options.
* @type callable $clientCertSource
* A callable which returns the client cert as a string. This can be used to
Expand Down
14 changes: 14 additions & 0 deletions tests/Unit/ProtoTests/BasicGrpcOnly/basic-grpc-only.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
syntax = "proto3";

package testing.basicgrpconly;

// php_namespace option not included; to test generating namespace from proto package.

import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";

// This is a basicGrpcOnly service.
service BasicGrpcOnly {
option (google.api.default_host) = "basicGrpcOnly.example.com";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
type: google.api.Service
config_version: 3

authentication:
rules:
- selector: 'testing.basicGrpcOnly.BasicGrpcOnly.*'
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
<?php
/*
* Copyright 2022 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

/*
* GENERATED CODE WARNING
* Generated by gapic-generator-php from the file
* https://github.com/googleapis/googleapis/blob/master/tests/Unit/ProtoTests/BasicGrpcOnly/basic-grpc-only.proto
* Updates to the above are reflected here through a refresh process.
*/

namespace Testing\Basicgrpconly\Client;

use Google\ApiCore\CredentialsWrapper;
use Google\ApiCore\GapicClientTrait;
use Google\ApiCore\Transport\TransportInterface;
use Google\ApiCore\ValidationException;
use Google\Auth\FetchAuthTokenInterface;

/**
* Service Description: This is a basicGrpcOnly service.
*
* This class provides the ability to make remote calls to the backing service through method
* calls that map to API methods.
*/
final class BasicGrpcOnlyClient
{
use GapicClientTrait;

/** The name of the service. */
private const SERVICE_NAME = 'testing.basicgrpconly.BasicGrpcOnly';

/** The default address of the service. */
private const SERVICE_ADDRESS = 'basicGrpcOnly.example.com';

/** The default port of the service. */
private const DEFAULT_SERVICE_PORT = 443;

/** The name of the code generator, to be included in the agent header. */
private const CODEGEN_NAME = 'gapic';

/** The default scopes required by the service. */
public static $serviceScopes = [];

private static function getClientDefaults()
{
return [
'serviceName' => self::SERVICE_NAME,
'apiEndpoint' => self::SERVICE_ADDRESS . ':' . self::DEFAULT_SERVICE_PORT,
'clientConfig' => __DIR__ . '/../resources/basic_grpc_only_client_config.json',
'descriptorsConfigPath' => __DIR__ . '/../resources/basic_grpc_only_descriptor_config.php',
'credentialsConfig' => [
'defaultScopes' => self::$serviceScopes,
],
'transportConfig' => [
'rest' => [
'restClientConfigPath' => __DIR__ . '/../resources/basic_grpc_only_rest_client_config.php',
],
],
];
}

/** Implements ClientOptionsTrait::supportedTransports. */
private static function supportedTransports()
{
return [
'grpc',
'grpc-fallback',
];
}

/**
* Constructor.
*
* @param array $options {
* Optional. Options for configuring the service API wrapper.
*
* @type string $apiEndpoint
* The address of the API remote host. May optionally include the port, formatted
* as "<uri>:<port>". Default 'basicGrpcOnly.example.com:443'.
* @type string|array|FetchAuthTokenInterface|CredentialsWrapper $credentials
* The credentials to be used by the client to authorize API calls. This option
* accepts either a path to a credentials file, or a decoded credentials file as a
* PHP array.
* *Advanced usage*: In addition, this option can also accept a pre-constructed
* {@see \Google\Auth\FetchAuthTokenInterface} object or
* {@see \Google\ApiCore\CredentialsWrapper} object. Note that when one of these
* objects are provided, any settings in $credentialsConfig will be ignored.
* @type array $credentialsConfig
* Options used to configure credentials, including auth token caching, for the
* client. For a full list of supporting configuration options, see
* {@see \Google\ApiCore\CredentialsWrapper::build()} .
* @type bool $disableRetries
* Determines whether or not retries defined by the client configuration should be
* disabled. Defaults to `false`.
* @type string|array $clientConfig
* Client method configuration, including retry settings. This option can be either
* a path to a JSON file, or a PHP array containing the decoded JSON data. By
* default this settings points to the default client config file, which is
* provided in the resources folder.
* @type string|TransportInterface $transport
* The transport used for executing network requests. At the moment, supports only
* `rest`. *Advanced usage*: Additionally, it is possible to pass in an already
* instantiated {@see \Google\ApiCore\Transport\TransportInterface} object. Note
* that when this object is provided, any settings in $transportConfig, and any
* $apiEndpoint setting, will be ignored.
* @type array $transportConfig
* Configuration options that will be used to construct the transport. Options for
* each supported transport type should be passed in a key for that transport. For
* example:
* $transportConfig = [
* 'rest' => [...],
* ];
* See the {@see \Google\ApiCore\Transport\RestTransport::build()} method for the
* supported options.
* @type callable $clientCertSource
* A callable which returns the client cert as a string. This can be used to
* provide a certificate and private key to the transport layer for mTLS.
* }
*
* @throws ValidationException
*/
public function __construct(array $options = [])
{
$clientOptions = $this->buildClientOptions($options);
$this->setClientOptions($clientOptions);
}
}
16 changes: 16 additions & 0 deletions tests/Unit/ProtoTests/BasicGrpcOnly/out/src/gapic_metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"schema": "1.0",
"comment": "This file maps proto services\/RPCs to the corresponding library clients\/methods",
"language": "php",
"protoPackage": "testing.basicgrpconly",
"libraryPackage": "Testing\\Basicgrpconly",
"services": {
"BasicGrpcOnly": {
"clients": {
"grpc": {
"libraryClient": "BasicGrpcOnlyGapicClient"
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"interfaces": {
"testing.basicgrpconly.BasicGrpcOnly": {
"retry_codes": {
"idempotent": [
"DEADLINE_EXCEEDED",
"UNAVAILABLE"
],
"non_idempotent": []
},
"retry_params": {
"default": {
"initial_retry_delay_millis": 100,
"retry_delay_multiplier": 1.3,
"max_retry_delay_millis": 60000,
"initial_rpc_timeout_millis": 20000,
"rpc_timeout_multiplier": 1.0,
"max_rpc_timeout_millis": 20000,
"total_timeout_millis": 600000
}
},
"methods": []
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php
/*
* Copyright 2024 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

/*
* GENERATED CODE WARNING
* This file was automatically generated - do not edit!
*/

return [
'interfaces' => [
'testing.basicgrpconly.BasicGrpcOnly' => [],
],
];

0 comments on commit bb59b9b

Please sign in to comment.