Merge github.com:grpc/grpc into error

pull/6897/head
Craig Tiller 9 years ago
commit 1d39a06d06
  1. 77
      doc/command_line_tool.md
  2. 8
      examples/php/greeter_client.php
  3. 70
      examples/php/helloworld.php
  4. 344
      examples/php/route_guide/route_guide.php
  5. 46
      examples/php/route_guide/route_guide_client.php
  6. 12
      setup.py
  7. 3
      src/core/ext/load_reporting/load_reporting.c
  8. 3
      src/php/tests/interop/interop_client.php
  9. 13
      src/php/tests/interop/stress_client.php
  10. 2
      src/python/grpcio/commands.py
  11. 16
      src/python/grpcio/grpc/_channel.py
  12. 13
      src/python/grpcio/grpc/_common.py
  13. 7
      src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi
  14. 24
      src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi
  15. 2
      src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi
  16. 53
      src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi
  17. 39
      src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi
  18. 68
      src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi
  19. 7
      src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi
  20. 1
      src/python/grpcio/grpc/_cython/cygrpc.pyx
  21. 6
      src/python/grpcio/grpc/_links/service.py
  22. 14
      src/python/grpcio/grpc/_server.py
  23. 17
      src/python/grpcio/grpc/beta/_client_adaptations.py
  24. 30
      src/python/grpcio/grpc/beta/_server_adaptations.py
  25. 5
      src/python/grpcio/tests/qps/benchmark_client.py
  26. 7
      src/python/grpcio/tests/qps/client_runner.py
  27. 6
      src/python/grpcio/tests/stress/client.py
  28. 1
      src/python/grpcio/tests/tests.json
  29. 43
      src/python/grpcio/tests/unit/_adapter/_intermediary_low_test.py
  30. 16
      src/python/grpcio/tests/unit/_adapter/_low_test.py
  31. 2
      src/python/grpcio/tests/unit/_cython/cygrpc_test.py
  32. 137
      src/python/grpcio/tests/unit/_empty_message_test.py
  33. 2
      src/python/grpcio/tests/unit/_links/_transmission_test.py
  34. 8
      src/python/grpcio/tests/unit/_rpc_test.py
  35. 4
      src/python/grpcio/tests/unit/beta/_beta_features_test.py
  36. 2
      src/python/grpcio/tests/unit/beta/_not_found_test.py
  37. 6
      src/python/grpcio/tests/unit/framework/interfaces/base/test_cases.py
  38. 4
      src/python/grpcio/tests/unit/test_common.py
  39. 6
      templates/tools/dockerfile/test/cxx_ubuntu1604_x64/Dockerfile.template
  40. 4
      test/core/client_config/uri_fuzzer_test.c
  41. 3
      test/core/end2end/fuzzers/api_fuzzer.c
  42. BIN
      test/core/end2end/fuzzers/api_fuzzer_corpus/0e79b68aa8b9c336f0bbf9029928c53079711423
  43. BIN
      test/core/end2end/fuzzers/api_fuzzer_corpus/1560af88445d6c1e8b1300047f33056dce198e02
  44. BIN
      test/core/end2end/fuzzers/api_fuzzer_corpus/48caf755ddcc6c45d3416ba6ab44709f360eb82b
  45. BIN
      test/core/end2end/fuzzers/api_fuzzer_corpus/7030cb2c62b289459e459bc54bd84c8d7e6f5a98
  46. BIN
      test/core/end2end/fuzzers/api_fuzzer_corpus/81f8c545d77d93e6cb8239e9e4a4d7f8f8beeee9
  47. BIN
      test/core/end2end/fuzzers/api_fuzzer_corpus/b7d02f4d12cd0b5442a04675e69f98fbdabc775a
  48. BIN
      test/core/end2end/fuzzers/api_fuzzer_corpus/ce6a90cb7d395fea7aa54ee9f7061cc45f5494d7
  49. BIN
      test/core/end2end/fuzzers/api_fuzzer_corpus/crash-482e9bdce0e13df2a77eef75a1c07d38ee28f4ab
  50. BIN
      test/core/end2end/fuzzers/api_fuzzer_corpus/e94428d78182060ff6309dd626cf6b3ebeed88d6
  51. 16
      test/core/end2end/fuzzers/client_fuzzer.c
  52. 15
      test/core/end2end/fuzzers/server_fuzzer.c
  53. BIN
      test/core/end2end/fuzzers/server_fuzzer_corpus/05551028437699c8650f5d08eb5f95ee25adf436
  54. BIN
      test/core/end2end/fuzzers/server_fuzzer_corpus/06285b50669cc16463db009ac821f99cf1ec2e24
  55. BIN
      test/core/end2end/fuzzers/server_fuzzer_corpus/23c582f6e23c7bbc9ae7b039b3b4e2ccdea3d5d2
  56. BIN
      test/core/end2end/fuzzers/server_fuzzer_corpus/395aea4fcfea081fc0d2733fff2d14405439fa72
  57. BIN
      test/core/end2end/fuzzers/server_fuzzer_corpus/404e234751b01dd0b51f9e7610f787253b074528
  58. BIN
      test/core/end2end/fuzzers/server_fuzzer_corpus/4123bd764c04385191342ea64918408140313714
  59. BIN
      test/core/end2end/fuzzers/server_fuzzer_corpus/4f96a5fba4d11401eb22d4b1e365fbbb2d684f24
  60. BIN
      test/core/end2end/fuzzers/server_fuzzer_corpus/609706c57e848ea58d7ca14fe6cc253322f3e8ce
  61. BIN
      test/core/end2end/fuzzers/server_fuzzer_corpus/89cd90fb47bb9eb289e8126b26021ee00d572d95
  62. BIN
      test/core/end2end/fuzzers/server_fuzzer_corpus/99a1acc96512c1155f91afa378e2345726d307c3
  63. BIN
      test/core/end2end/fuzzers/server_fuzzer_corpus/crash-ccf36bef9318fe6d5e5e1560c5485cdc87d0a701
  64. BIN
      test/core/end2end/fuzzers/server_fuzzer_corpus/ec4949487fa84f0cead39521b51f837af9dc784a
  65. BIN
      test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-0292270056246b7a4ccd2e7d0356665cef307ef2
  66. BIN
      test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-098ec93ded3a20e6043d11e9cc6066351e257f8e
  67. BIN
      test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-1dc659f500e7bee41a4fee4423ade8332c162cc0
  68. BIN
      test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-350b5da741597222c98fe86768432507850317f5
  69. BIN
      test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-395aea4fcfea081fc0d2733fff2d14405439fa72
  70. BIN
      test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-45cf8ac5faa9c7b15baf9281e8d7e0b4e103f0e0
  71. BIN
      test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-60a9f77951c5059616764894e1963d83d478edfe
  72. BIN
      test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-97a338fa892093ed5013a76b96b35dd112df3342
  73. BIN
      test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-a1b2cfcf0997acb13a32fc5c004f57d9e9bc4275
  74. BIN
      test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-a1ed26e6f82ca0e81e3f415bd8b0b8b520d3927b
  75. BIN
      test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-f412afea6b01aa53da919a41a65ffbf9885f2d65
  76. 4
      test/core/http/request_fuzzer.c
  77. 4
      test/core/json/fuzzer.c
  78. 3
      test/core/nanopb/fuzzer_response.c
  79. 3
      test/core/nanopb/fuzzer_serverlist.c
  80. 5
      test/core/transport/chttp2/hpack_parser_fuzzer_test.c
  81. 7
      test/core/util/one_corpus_entry_fuzzer.c
  82. 6
      tools/dockerfile/test/cxx_ubuntu1604_x64/Dockerfile
  83. 4
      tools/gce/linux_performance_worker_init.sh
  84. 15
      tools/run_tests/build_python.sh
  85. 1
      tools/run_tests/run_python.sh
  86. 60
      tools/run_tests/run_tests.py
  87. 544
      tools/run_tests/tests.json

@ -0,0 +1,77 @@
# gRPC command line tool
## Overview
This document describes the command line tool that comes with gRPC repository. It is desireable to have command line
tools written in other languages to roughly follow the same syntax and flags.
At this point, the tool needs to be built from source, and it should be moved out to grpc-tools repository as a stand
alone application once it is mature enough.
## Core functionality
The command line tool can do the following things:
- Send unary rpc.
- Attach metadata and display received metadata.
- Handle common authentication to server.
- Find the request/response types from a given proto file.
- Read proto request in text form.
- Read request in wire form (for protobuf messages, this means serialized binary form).
- Display proto response in text form.
- Write response in wire form to a file.
The command line tool should support the following things:
- List server services and methods through server reflection.
- Infer request/response types from server reflection result.
- Fine-grained auth control (such as, use this oauth token to talk to the server).
- Send streaming rpc.
## Code location
To use the tool, you need to get the grpc repository and in the grpc directory execute
```
$ make grpc_cli
```
The main file can be found at
https://github.com/grpc/grpc/blob/master/test/cpp/util/grpc_cli.cc
## Usage
### Basic usage
Send a rpc to a helloworld server at `localhost:50051`:
```
$ bins/opt/grpc_cli call localhost:50051 SayHello examples/protos/helloworld.proto \
"name: 'world'" --enable_ssl=false
```
On success, the tool will print out
```
Rpc succeeded with OK status
Response:
message: "Hello world"
```
The `localhost:50051` part indicates the server you are connecting to. `SayHello` is (part of) the
gRPC method string. Then there is the path to the proto file containing the service definition,
if it is not under current directory, you can use `--proto_path` to specify a new search root.
`"name: 'world'"` is the text format of the request proto message.
We are not using ssl here by `--enable_ssl=false`. For information on more
flags, look at the comments of `grpc_cli.cc`.
### Send non-proto rpc
For using gRPC with protocols other than probobuf, you will need the exact method name string
and a file containing the raw bytes to be sent on the wire
```
$ bins/opt/grpc_cli call localhost:50051 /helloworld.Greeter/SayHello --input_binary_file=input.bin \
--output_binary_file=output.bin
```
On success, you will need to read or decode the response from the `output.bin` file.

@ -35,16 +35,18 @@
require dirname(__FILE__).'/vendor/autoload.php'; require dirname(__FILE__).'/vendor/autoload.php';
require dirname(__FILE__).'/helloworld.php'; require dirname(__FILE__).'/helloworld.php';
function greet($name) { function greet($name)
{
$client = new helloworld\GreeterClient('localhost:50051', [ $client = new helloworld\GreeterClient('localhost:50051', [
'credentials' => Grpc\ChannelCredentials::createInsecure() 'credentials' => Grpc\ChannelCredentials::createInsecure(),
]); ]);
$request = new helloworld\HelloRequest(); $request = new helloworld\HelloRequest();
$request->setName($name); $request->setName($name);
list($reply, $status) = $client->SayHello($request)->wait(); list($reply, $status) = $client->SayHello($request)->wait();
$message = $reply->getMessage(); $message = $reply->getMessage();
return $message; return $message;
} }
$name = !empty($argv[1]) ? $argv[1] : 'world'; $name = !empty($argv[1]) ? $argv[1] : 'world';
print(greet($name)."\n"); echo greet($name)."\n";

@ -5,12 +5,11 @@
namespace helloworld { namespace helloworld {
class HelloRequest extends \DrSlump\Protobuf\Message { class HelloRequest extends \DrSlump\Protobuf\Message
{
/** @var string */ /** @var string */
public $name = null; public $name = null;
/** @var \Closure[] */ /** @var \Closure[] */
protected static $__extensions = array(); protected static $__extensions = array();
@ -21,7 +20,7 @@ namespace helloworld {
// OPTIONAL STRING name = 1 // OPTIONAL STRING name = 1
$f = new \DrSlump\Protobuf\Field(); $f = new \DrSlump\Protobuf\Field();
$f->number = 1; $f->number = 1;
$f->name = "name"; $f->name = 'name';
$f->type = \DrSlump\Protobuf::TYPE_STRING; $f->type = \DrSlump\Protobuf::TYPE_STRING;
$f->rule = \DrSlump\Protobuf::RULE_OPTIONAL; $f->rule = \DrSlump\Protobuf::RULE_OPTIONAL;
$descriptor->addField($f); $descriptor->addField($f);
@ -34,39 +33,44 @@ namespace helloworld {
} }
/** /**
* Check if <name> has a value * Check if <name> has a value.
* *
* @return boolean * @return bool
*/ */
public function hasName(){ public function hasName()
{
return $this->_has(1); return $this->_has(1);
} }
/** /**
* Clear <name> value * Clear <name> value.
* *
* @return \helloworld\HelloRequest * @return \helloworld\HelloRequest
*/ */
public function clearName(){ public function clearName()
{
return $this->_clear(1); return $this->_clear(1);
} }
/** /**
* Get <name> value * Get <name> value.
* *
* @return string * @return string
*/ */
public function getName(){ public function getName()
{
return $this->_get(1); return $this->_get(1);
} }
/** /**
* Set <name> value * Set <name> value.
* *
* @param string $value * @param string $value
*
* @return \helloworld\HelloRequest * @return \helloworld\HelloRequest
*/ */
public function setName( $value){ public function setName($value)
{
return $this->_set(1, $value); return $this->_set(1, $value);
} }
} }
@ -74,12 +78,11 @@ namespace helloworld {
namespace helloworld { namespace helloworld {
class HelloReply extends \DrSlump\Protobuf\Message { class HelloReply extends \DrSlump\Protobuf\Message
{
/** @var string */ /** @var string */
public $message = null; public $message = null;
/** @var \Closure[] */ /** @var \Closure[] */
protected static $__extensions = array(); protected static $__extensions = array();
@ -90,7 +93,7 @@ namespace helloworld {
// OPTIONAL STRING message = 1 // OPTIONAL STRING message = 1
$f = new \DrSlump\Protobuf\Field(); $f = new \DrSlump\Protobuf\Field();
$f->number = 1; $f->number = 1;
$f->name = "message"; $f->name = 'message';
$f->type = \DrSlump\Protobuf::TYPE_STRING; $f->type = \DrSlump\Protobuf::TYPE_STRING;
$f->rule = \DrSlump\Protobuf::RULE_OPTIONAL; $f->rule = \DrSlump\Protobuf::RULE_OPTIONAL;
$descriptor->addField($f); $descriptor->addField($f);
@ -103,39 +106,44 @@ namespace helloworld {
} }
/** /**
* Check if <message> has a value * Check if <message> has a value.
* *
* @return boolean * @return bool
*/ */
public function hasMessage(){ public function hasMessage()
{
return $this->_has(1); return $this->_has(1);
} }
/** /**
* Clear <message> value * Clear <message> value.
* *
* @return \helloworld\HelloReply * @return \helloworld\HelloReply
*/ */
public function clearMessage(){ public function clearMessage()
{
return $this->_clear(1); return $this->_clear(1);
} }
/** /**
* Get <message> value * Get <message> value.
* *
* @return string * @return string
*/ */
public function getMessage(){ public function getMessage()
{
return $this->_get(1); return $this->_get(1);
} }
/** /**
* Set <message> value * Set <message> value.
* *
* @param string $value * @param string $value
*
* @return \helloworld\HelloReply * @return \helloworld\HelloReply
*/ */
public function setMessage( $value){ public function setMessage($value)
{
return $this->_set(1, $value); return $this->_set(1, $value);
} }
} }
@ -143,15 +151,17 @@ namespace helloworld {
namespace helloworld { namespace helloworld {
class GreeterClient extends \Grpc\BaseStub { class GreeterClient extends \Grpc\BaseStub
{
public function __construct($hostname, $opts) { public function __construct($hostname, $opts)
{
parent::__construct($hostname, $opts); parent::__construct($hostname, $opts);
} }
/** /**
* @param helloworld\HelloRequest $input * @param helloworld\HelloRequest $input
*/ */
public function SayHello(\helloworld\HelloRequest $argument, $metadata = array(), $options = array()) { public function SayHello(\helloworld\HelloRequest $argument, $metadata = array(), $options = array())
{
return $this->_simpleRequest('/helloworld.Greeter/SayHello', $argument, '\helloworld\HelloReply::deserialize', $metadata, $options); return $this->_simpleRequest('/helloworld.Greeter/SayHello', $argument, '\helloworld\HelloReply::deserialize', $metadata, $options);
} }
} }

@ -5,15 +5,14 @@
namespace routeguide { namespace routeguide {
class Point extends \DrSlump\Protobuf\Message { class Point extends \DrSlump\Protobuf\Message
{
/** @var int */ /** @var int */
public $latitude = 0; public $latitude = 0;
/** @var int */ /** @var int */
public $longitude = 0; public $longitude = 0;
/** @var \Closure[] */ /** @var \Closure[] */
protected static $__extensions = array(); protected static $__extensions = array();
@ -24,7 +23,7 @@ namespace routeguide {
// OPTIONAL INT32 latitude = 1 // OPTIONAL INT32 latitude = 1
$f = new \DrSlump\Protobuf\Field(); $f = new \DrSlump\Protobuf\Field();
$f->number = 1; $f->number = 1;
$f->name = "latitude"; $f->name = 'latitude';
$f->type = \DrSlump\Protobuf::TYPE_INT32; $f->type = \DrSlump\Protobuf::TYPE_INT32;
$f->rule = \DrSlump\Protobuf::RULE_OPTIONAL; $f->rule = \DrSlump\Protobuf::RULE_OPTIONAL;
$f->default = 0; $f->default = 0;
@ -33,7 +32,7 @@ namespace routeguide {
// OPTIONAL INT32 longitude = 2 // OPTIONAL INT32 longitude = 2
$f = new \DrSlump\Protobuf\Field(); $f = new \DrSlump\Protobuf\Field();
$f->number = 2; $f->number = 2;
$f->name = "longitude"; $f->name = 'longitude';
$f->type = \DrSlump\Protobuf::TYPE_INT32; $f->type = \DrSlump\Protobuf::TYPE_INT32;
$f->rule = \DrSlump\Protobuf::RULE_OPTIONAL; $f->rule = \DrSlump\Protobuf::RULE_OPTIONAL;
$f->default = 0; $f->default = 0;
@ -47,76 +46,86 @@ namespace routeguide {
} }
/** /**
* Check if <latitude> has a value * Check if <latitude> has a value.
* *
* @return boolean * @return bool
*/ */
public function hasLatitude(){ public function hasLatitude()
{
return $this->_has(1); return $this->_has(1);
} }
/** /**
* Clear <latitude> value * Clear <latitude> value.
* *
* @return \routeguide\Point * @return \routeguide\Point
*/ */
public function clearLatitude(){ public function clearLatitude()
{
return $this->_clear(1); return $this->_clear(1);
} }
/** /**
* Get <latitude> value * Get <latitude> value.
* *
* @return int * @return int
*/ */
public function getLatitude(){ public function getLatitude()
{
return $this->_get(1); return $this->_get(1);
} }
/** /**
* Set <latitude> value * Set <latitude> value.
* *
* @param int $value * @param int $value
*
* @return \routeguide\Point * @return \routeguide\Point
*/ */
public function setLatitude( $value){ public function setLatitude($value)
{
return $this->_set(1, $value); return $this->_set(1, $value);
} }
/** /**
* Check if <longitude> has a value * Check if <longitude> has a value.
* *
* @return boolean * @return bool
*/ */
public function hasLongitude(){ public function hasLongitude()
{
return $this->_has(2); return $this->_has(2);
} }
/** /**
* Clear <longitude> value * Clear <longitude> value.
* *
* @return \routeguide\Point * @return \routeguide\Point
*/ */
public function clearLongitude(){ public function clearLongitude()
{
return $this->_clear(2); return $this->_clear(2);
} }
/** /**
* Get <longitude> value * Get <longitude> value.
* *
* @return int * @return int
*/ */
public function getLongitude(){ public function getLongitude()
{
return $this->_get(2); return $this->_get(2);
} }
/** /**
* Set <longitude> value * Set <longitude> value.
* *
* @param int $value * @param int $value
*
* @return \routeguide\Point * @return \routeguide\Point
*/ */
public function setLongitude( $value){ public function setLongitude($value)
{
return $this->_set(2, $value); return $this->_set(2, $value);
} }
} }
@ -124,15 +133,14 @@ namespace routeguide {
namespace routeguide { namespace routeguide {
class Rectangle extends \DrSlump\Protobuf\Message { class Rectangle extends \DrSlump\Protobuf\Message
{
/** @var \routeguide\Point */ /** @var \routeguide\Point */
public $lo = null; public $lo = null;
/** @var \routeguide\Point */ /** @var \routeguide\Point */
public $hi = null; public $hi = null;
/** @var \Closure[] */ /** @var \Closure[] */
protected static $__extensions = array(); protected static $__extensions = array();
@ -143,7 +151,7 @@ namespace routeguide {
// OPTIONAL MESSAGE lo = 1 // OPTIONAL MESSAGE lo = 1
$f = new \DrSlump\Protobuf\Field(); $f = new \DrSlump\Protobuf\Field();
$f->number = 1; $f->number = 1;
$f->name = "lo"; $f->name = 'lo';
$f->type = \DrSlump\Protobuf::TYPE_MESSAGE; $f->type = \DrSlump\Protobuf::TYPE_MESSAGE;
$f->rule = \DrSlump\Protobuf::RULE_OPTIONAL; $f->rule = \DrSlump\Protobuf::RULE_OPTIONAL;
$f->reference = '\routeguide\Point'; $f->reference = '\routeguide\Point';
@ -152,7 +160,7 @@ namespace routeguide {
// OPTIONAL MESSAGE hi = 2 // OPTIONAL MESSAGE hi = 2
$f = new \DrSlump\Protobuf\Field(); $f = new \DrSlump\Protobuf\Field();
$f->number = 2; $f->number = 2;
$f->name = "hi"; $f->name = 'hi';
$f->type = \DrSlump\Protobuf::TYPE_MESSAGE; $f->type = \DrSlump\Protobuf::TYPE_MESSAGE;
$f->rule = \DrSlump\Protobuf::RULE_OPTIONAL; $f->rule = \DrSlump\Protobuf::RULE_OPTIONAL;
$f->reference = '\routeguide\Point'; $f->reference = '\routeguide\Point';
@ -166,76 +174,86 @@ namespace routeguide {
} }
/** /**
* Check if <lo> has a value * Check if <lo> has a value.
* *
* @return boolean * @return bool
*/ */
public function hasLo(){ public function hasLo()
{
return $this->_has(1); return $this->_has(1);
} }
/** /**
* Clear <lo> value * Clear <lo> value.
* *
* @return \routeguide\Rectangle * @return \routeguide\Rectangle
*/ */
public function clearLo(){ public function clearLo()
{
return $this->_clear(1); return $this->_clear(1);
} }
/** /**
* Get <lo> value * Get <lo> value.
* *
* @return \routeguide\Point * @return \routeguide\Point
*/ */
public function getLo(){ public function getLo()
{
return $this->_get(1); return $this->_get(1);
} }
/** /**
* Set <lo> value * Set <lo> value.
* *
* @param \routeguide\Point $value * @param \routeguide\Point $value
*
* @return \routeguide\Rectangle * @return \routeguide\Rectangle
*/ */
public function setLo(\routeguide\Point $value){ public function setLo(\routeguide\Point $value)
{
return $this->_set(1, $value); return $this->_set(1, $value);
} }
/** /**
* Check if <hi> has a value * Check if <hi> has a value.
* *
* @return boolean * @return bool
*/ */
public function hasHi(){ public function hasHi()
{
return $this->_has(2); return $this->_has(2);
} }
/** /**
* Clear <hi> value * Clear <hi> value.
* *
* @return \routeguide\Rectangle * @return \routeguide\Rectangle
*/ */
public function clearHi(){ public function clearHi()
{
return $this->_clear(2); return $this->_clear(2);
} }
/** /**
* Get <hi> value * Get <hi> value.
* *
* @return \routeguide\Point * @return \routeguide\Point
*/ */
public function getHi(){ public function getHi()
{
return $this->_get(2); return $this->_get(2);
} }
/** /**
* Set <hi> value * Set <hi> value.
* *
* @param \routeguide\Point $value * @param \routeguide\Point $value
*
* @return \routeguide\Rectangle * @return \routeguide\Rectangle
*/ */
public function setHi(\routeguide\Point $value){ public function setHi(\routeguide\Point $value)
{
return $this->_set(2, $value); return $this->_set(2, $value);
} }
} }
@ -243,15 +261,14 @@ namespace routeguide {
namespace routeguide { namespace routeguide {
class Feature extends \DrSlump\Protobuf\Message { class Feature extends \DrSlump\Protobuf\Message
{
/** @var string */ /** @var string */
public $name = null; public $name = null;
/** @var \routeguide\Point */ /** @var \routeguide\Point */
public $location = null; public $location = null;
/** @var \Closure[] */ /** @var \Closure[] */
protected static $__extensions = array(); protected static $__extensions = array();
@ -262,7 +279,7 @@ namespace routeguide {
// OPTIONAL STRING name = 1 // OPTIONAL STRING name = 1
$f = new \DrSlump\Protobuf\Field(); $f = new \DrSlump\Protobuf\Field();
$f->number = 1; $f->number = 1;
$f->name = "name"; $f->name = 'name';
$f->type = \DrSlump\Protobuf::TYPE_STRING; $f->type = \DrSlump\Protobuf::TYPE_STRING;
$f->rule = \DrSlump\Protobuf::RULE_OPTIONAL; $f->rule = \DrSlump\Protobuf::RULE_OPTIONAL;
$descriptor->addField($f); $descriptor->addField($f);
@ -270,7 +287,7 @@ namespace routeguide {
// OPTIONAL MESSAGE location = 2 // OPTIONAL MESSAGE location = 2
$f = new \DrSlump\Protobuf\Field(); $f = new \DrSlump\Protobuf\Field();
$f->number = 2; $f->number = 2;
$f->name = "location"; $f->name = 'location';
$f->type = \DrSlump\Protobuf::TYPE_MESSAGE; $f->type = \DrSlump\Protobuf::TYPE_MESSAGE;
$f->rule = \DrSlump\Protobuf::RULE_OPTIONAL; $f->rule = \DrSlump\Protobuf::RULE_OPTIONAL;
$f->reference = '\routeguide\Point'; $f->reference = '\routeguide\Point';
@ -284,76 +301,86 @@ namespace routeguide {
} }
/** /**
* Check if <name> has a value * Check if <name> has a value.
* *
* @return boolean * @return bool
*/ */
public function hasName(){ public function hasName()
{
return $this->_has(1); return $this->_has(1);
} }
/** /**
* Clear <name> value * Clear <name> value.
* *
* @return \routeguide\Feature * @return \routeguide\Feature
*/ */
public function clearName(){ public function clearName()
{
return $this->_clear(1); return $this->_clear(1);
} }
/** /**
* Get <name> value * Get <name> value.
* *
* @return string * @return string
*/ */
public function getName(){ public function getName()
{
return $this->_get(1); return $this->_get(1);
} }
/** /**
* Set <name> value * Set <name> value.
* *
* @param string $value * @param string $value
*
* @return \routeguide\Feature * @return \routeguide\Feature
*/ */
public function setName( $value){ public function setName($value)
{
return $this->_set(1, $value); return $this->_set(1, $value);
} }
/** /**
* Check if <location> has a value * Check if <location> has a value.
* *
* @return boolean * @return bool
*/ */
public function hasLocation(){ public function hasLocation()
{
return $this->_has(2); return $this->_has(2);
} }
/** /**
* Clear <location> value * Clear <location> value.
* *
* @return \routeguide\Feature * @return \routeguide\Feature
*/ */
public function clearLocation(){ public function clearLocation()
{
return $this->_clear(2); return $this->_clear(2);
} }
/** /**
* Get <location> value * Get <location> value.
* *
* @return \routeguide\Point * @return \routeguide\Point
*/ */
public function getLocation(){ public function getLocation()
{
return $this->_get(2); return $this->_get(2);
} }
/** /**
* Set <location> value * Set <location> value.
* *
* @param \routeguide\Point $value * @param \routeguide\Point $value
*
* @return \routeguide\Feature * @return \routeguide\Feature
*/ */
public function setLocation(\routeguide\Point $value){ public function setLocation(\routeguide\Point $value)
{
return $this->_set(2, $value); return $this->_set(2, $value);
} }
} }
@ -361,15 +388,14 @@ namespace routeguide {
namespace routeguide { namespace routeguide {
class RouteNote extends \DrSlump\Protobuf\Message { class RouteNote extends \DrSlump\Protobuf\Message
{
/** @var \routeguide\Point */ /** @var \routeguide\Point */
public $location = null; public $location = null;
/** @var string */ /** @var string */
public $message = null; public $message = null;
/** @var \Closure[] */ /** @var \Closure[] */
protected static $__extensions = array(); protected static $__extensions = array();
@ -380,7 +406,7 @@ namespace routeguide {
// OPTIONAL MESSAGE location = 1 // OPTIONAL MESSAGE location = 1
$f = new \DrSlump\Protobuf\Field(); $f = new \DrSlump\Protobuf\Field();
$f->number = 1; $f->number = 1;
$f->name = "location"; $f->name = 'location';
$f->type = \DrSlump\Protobuf::TYPE_MESSAGE; $f->type = \DrSlump\Protobuf::TYPE_MESSAGE;
$f->rule = \DrSlump\Protobuf::RULE_OPTIONAL; $f->rule = \DrSlump\Protobuf::RULE_OPTIONAL;
$f->reference = '\routeguide\Point'; $f->reference = '\routeguide\Point';
@ -389,7 +415,7 @@ namespace routeguide {
// OPTIONAL STRING message = 2 // OPTIONAL STRING message = 2
$f = new \DrSlump\Protobuf\Field(); $f = new \DrSlump\Protobuf\Field();
$f->number = 2; $f->number = 2;
$f->name = "message"; $f->name = 'message';
$f->type = \DrSlump\Protobuf::TYPE_STRING; $f->type = \DrSlump\Protobuf::TYPE_STRING;
$f->rule = \DrSlump\Protobuf::RULE_OPTIONAL; $f->rule = \DrSlump\Protobuf::RULE_OPTIONAL;
$descriptor->addField($f); $descriptor->addField($f);
@ -402,76 +428,86 @@ namespace routeguide {
} }
/** /**
* Check if <location> has a value * Check if <location> has a value.
* *
* @return boolean * @return bool
*/ */
public function hasLocation(){ public function hasLocation()
{
return $this->_has(1); return $this->_has(1);
} }
/** /**
* Clear <location> value * Clear <location> value.
* *
* @return \routeguide\RouteNote * @return \routeguide\RouteNote
*/ */
public function clearLocation(){ public function clearLocation()
{
return $this->_clear(1); return $this->_clear(1);
} }
/** /**
* Get <location> value * Get <location> value.
* *
* @return \routeguide\Point * @return \routeguide\Point
*/ */
public function getLocation(){ public function getLocation()
{
return $this->_get(1); return $this->_get(1);
} }
/** /**
* Set <location> value * Set <location> value.
* *
* @param \routeguide\Point $value * @param \routeguide\Point $value
*
* @return \routeguide\RouteNote * @return \routeguide\RouteNote
*/ */
public function setLocation(\routeguide\Point $value){ public function setLocation(\routeguide\Point $value)
{
return $this->_set(1, $value); return $this->_set(1, $value);
} }
/** /**
* Check if <message> has a value * Check if <message> has a value.
* *
* @return boolean * @return bool
*/ */
public function hasMessage(){ public function hasMessage()
{
return $this->_has(2); return $this->_has(2);
} }
/** /**
* Clear <message> value * Clear <message> value.
* *
* @return \routeguide\RouteNote * @return \routeguide\RouteNote
*/ */
public function clearMessage(){ public function clearMessage()
{
return $this->_clear(2); return $this->_clear(2);
} }
/** /**
* Get <message> value * Get <message> value.
* *
* @return string * @return string
*/ */
public function getMessage(){ public function getMessage()
{
return $this->_get(2); return $this->_get(2);
} }
/** /**
* Set <message> value * Set <message> value.
* *
* @param string $value * @param string $value
*
* @return \routeguide\RouteNote * @return \routeguide\RouteNote
*/ */
public function setMessage( $value){ public function setMessage($value)
{
return $this->_set(2, $value); return $this->_set(2, $value);
} }
} }
@ -479,8 +515,8 @@ namespace routeguide {
namespace routeguide { namespace routeguide {
class RouteSummary extends \DrSlump\Protobuf\Message { class RouteSummary extends \DrSlump\Protobuf\Message
{
/** @var int */ /** @var int */
public $point_count = 0; public $point_count = 0;
@ -493,7 +529,6 @@ namespace routeguide {
/** @var int */ /** @var int */
public $elapsed_time = 0; public $elapsed_time = 0;
/** @var \Closure[] */ /** @var \Closure[] */
protected static $__extensions = array(); protected static $__extensions = array();
@ -504,7 +539,7 @@ namespace routeguide {
// OPTIONAL INT32 point_count = 1 // OPTIONAL INT32 point_count = 1
$f = new \DrSlump\Protobuf\Field(); $f = new \DrSlump\Protobuf\Field();
$f->number = 1; $f->number = 1;
$f->name = "point_count"; $f->name = 'point_count';
$f->type = \DrSlump\Protobuf::TYPE_INT32; $f->type = \DrSlump\Protobuf::TYPE_INT32;
$f->rule = \DrSlump\Protobuf::RULE_OPTIONAL; $f->rule = \DrSlump\Protobuf::RULE_OPTIONAL;
$f->default = 0; $f->default = 0;
@ -513,7 +548,7 @@ namespace routeguide {
// OPTIONAL INT32 feature_count = 2 // OPTIONAL INT32 feature_count = 2
$f = new \DrSlump\Protobuf\Field(); $f = new \DrSlump\Protobuf\Field();
$f->number = 2; $f->number = 2;
$f->name = "feature_count"; $f->name = 'feature_count';
$f->type = \DrSlump\Protobuf::TYPE_INT32; $f->type = \DrSlump\Protobuf::TYPE_INT32;
$f->rule = \DrSlump\Protobuf::RULE_OPTIONAL; $f->rule = \DrSlump\Protobuf::RULE_OPTIONAL;
$f->default = 0; $f->default = 0;
@ -522,7 +557,7 @@ namespace routeguide {
// OPTIONAL INT32 distance = 3 // OPTIONAL INT32 distance = 3
$f = new \DrSlump\Protobuf\Field(); $f = new \DrSlump\Protobuf\Field();
$f->number = 3; $f->number = 3;
$f->name = "distance"; $f->name = 'distance';
$f->type = \DrSlump\Protobuf::TYPE_INT32; $f->type = \DrSlump\Protobuf::TYPE_INT32;
$f->rule = \DrSlump\Protobuf::RULE_OPTIONAL; $f->rule = \DrSlump\Protobuf::RULE_OPTIONAL;
$f->default = 0; $f->default = 0;
@ -531,7 +566,7 @@ namespace routeguide {
// OPTIONAL INT32 elapsed_time = 4 // OPTIONAL INT32 elapsed_time = 4
$f = new \DrSlump\Protobuf\Field(); $f = new \DrSlump\Protobuf\Field();
$f->number = 4; $f->number = 4;
$f->name = "elapsed_time"; $f->name = 'elapsed_time';
$f->type = \DrSlump\Protobuf::TYPE_INT32; $f->type = \DrSlump\Protobuf::TYPE_INT32;
$f->rule = \DrSlump\Protobuf::RULE_OPTIONAL; $f->rule = \DrSlump\Protobuf::RULE_OPTIONAL;
$f->default = 0; $f->default = 0;
@ -545,150 +580,170 @@ namespace routeguide {
} }
/** /**
* Check if <point_count> has a value * Check if <point_count> has a value.
* *
* @return boolean * @return bool
*/ */
public function hasPointCount(){ public function hasPointCount()
{
return $this->_has(1); return $this->_has(1);
} }
/** /**
* Clear <point_count> value * Clear <point_count> value.
* *
* @return \routeguide\RouteSummary * @return \routeguide\RouteSummary
*/ */
public function clearPointCount(){ public function clearPointCount()
{
return $this->_clear(1); return $this->_clear(1);
} }
/** /**
* Get <point_count> value * Get <point_count> value.
* *
* @return int * @return int
*/ */
public function getPointCount(){ public function getPointCount()
{
return $this->_get(1); return $this->_get(1);
} }
/** /**
* Set <point_count> value * Set <point_count> value.
* *
* @param int $value * @param int $value
*
* @return \routeguide\RouteSummary * @return \routeguide\RouteSummary
*/ */
public function setPointCount( $value){ public function setPointCount($value)
{
return $this->_set(1, $value); return $this->_set(1, $value);
} }
/** /**
* Check if <feature_count> has a value * Check if <feature_count> has a value.
* *
* @return boolean * @return bool
*/ */
public function hasFeatureCount(){ public function hasFeatureCount()
{
return $this->_has(2); return $this->_has(2);
} }
/** /**
* Clear <feature_count> value * Clear <feature_count> value.
* *
* @return \routeguide\RouteSummary * @return \routeguide\RouteSummary
*/ */
public function clearFeatureCount(){ public function clearFeatureCount()
{
return $this->_clear(2); return $this->_clear(2);
} }
/** /**
* Get <feature_count> value * Get <feature_count> value.
* *
* @return int * @return int
*/ */
public function getFeatureCount(){ public function getFeatureCount()
{
return $this->_get(2); return $this->_get(2);
} }
/** /**
* Set <feature_count> value * Set <feature_count> value.
* *
* @param int $value * @param int $value
*
* @return \routeguide\RouteSummary * @return \routeguide\RouteSummary
*/ */
public function setFeatureCount( $value){ public function setFeatureCount($value)
{
return $this->_set(2, $value); return $this->_set(2, $value);
} }
/** /**
* Check if <distance> has a value * Check if <distance> has a value.
* *
* @return boolean * @return bool
*/ */
public function hasDistance(){ public function hasDistance()
{
return $this->_has(3); return $this->_has(3);
} }
/** /**
* Clear <distance> value * Clear <distance> value.
* *
* @return \routeguide\RouteSummary * @return \routeguide\RouteSummary
*/ */
public function clearDistance(){ public function clearDistance()
{
return $this->_clear(3); return $this->_clear(3);
} }
/** /**
* Get <distance> value * Get <distance> value.
* *
* @return int * @return int
*/ */
public function getDistance(){ public function getDistance()
{
return $this->_get(3); return $this->_get(3);
} }
/** /**
* Set <distance> value * Set <distance> value.
* *
* @param int $value * @param int $value
*
* @return \routeguide\RouteSummary * @return \routeguide\RouteSummary
*/ */
public function setDistance( $value){ public function setDistance($value)
{
return $this->_set(3, $value); return $this->_set(3, $value);
} }
/** /**
* Check if <elapsed_time> has a value * Check if <elapsed_time> has a value.
* *
* @return boolean * @return bool
*/ */
public function hasElapsedTime(){ public function hasElapsedTime()
{
return $this->_has(4); return $this->_has(4);
} }
/** /**
* Clear <elapsed_time> value * Clear <elapsed_time> value.
* *
* @return \routeguide\RouteSummary * @return \routeguide\RouteSummary
*/ */
public function clearElapsedTime(){ public function clearElapsedTime()
{
return $this->_clear(4); return $this->_clear(4);
} }
/** /**
* Get <elapsed_time> value * Get <elapsed_time> value.
* *
* @return int * @return int
*/ */
public function getElapsedTime(){ public function getElapsedTime()
{
return $this->_get(4); return $this->_get(4);
} }
/** /**
* Set <elapsed_time> value * Set <elapsed_time> value.
* *
* @param int $value * @param int $value
*
* @return \routeguide\RouteSummary * @return \routeguide\RouteSummary
*/ */
public function setElapsedTime( $value){ public function setElapsedTime($value)
{
return $this->_set(4, $value); return $this->_set(4, $value);
} }
} }
@ -696,33 +751,38 @@ namespace routeguide {
namespace routeguide { namespace routeguide {
class RouteGuideClient extends \Grpc\BaseStub { class RouteGuideClient extends \Grpc\BaseStub
{
public function __construct($hostname, $opts) { public function __construct($hostname, $opts)
{
parent::__construct($hostname, $opts); parent::__construct($hostname, $opts);
} }
/** /**
* @param routeguide\Point $input * @param routeguide\Point $input
*/ */
public function GetFeature(\routeguide\Point $argument, $metadata = array(), $options = array()) { public function GetFeature(\routeguide\Point $argument, $metadata = array(), $options = array())
{
return $this->_simpleRequest('/routeguide.RouteGuide/GetFeature', $argument, '\routeguide\Feature::deserialize', $metadata, $options); return $this->_simpleRequest('/routeguide.RouteGuide/GetFeature', $argument, '\routeguide\Feature::deserialize', $metadata, $options);
} }
/** /**
* @param routeguide\Rectangle $input * @param routeguide\Rectangle $input
*/ */
public function ListFeatures($argument, $metadata = array(), $options = array()) { public function ListFeatures($argument, $metadata = array(), $options = array())
{
return $this->_serverStreamRequest('/routeguide.RouteGuide/ListFeatures', $argument, '\routeguide\Feature::deserialize', $metadata, $options); return $this->_serverStreamRequest('/routeguide.RouteGuide/ListFeatures', $argument, '\routeguide\Feature::deserialize', $metadata, $options);
} }
/** /**
* @param routeguide\Point $input * @param routeguide\Point $input
*/ */
public function RecordRoute($metadata = array()) { public function RecordRoute($metadata = array())
{
return $this->_clientStreamRequest('/routeguide.RouteGuide/RecordRoute', '\routeguide\RouteSummary::deserialize', $metadata); return $this->_clientStreamRequest('/routeguide.RouteGuide/RecordRoute', '\routeguide\RouteSummary::deserialize', $metadata);
} }
/** /**
* @param routeguide\RouteNote $input * @param routeguide\RouteNote $input
*/ */
public function RouteChat($metadata = array()) { public function RouteChat($metadata = array())
{
return $this->_bidiRequest('/routeguide.RouteGuide/RouteChat', '\routeguide\RouteNote::deserialize', $metadata); return $this->_bidiRequest('/routeguide.RouteGuide/RouteChat', '\routeguide\RouteNote::deserialize', $metadata);
} }
} }

@ -38,17 +38,18 @@ require dirname(__FILE__) . '/route_guide.php';
define('COORD_FACTOR', 1e7); define('COORD_FACTOR', 1e7);
$client = new routeguide\RouteGuideClient('localhost:50051', [ $client = new routeguide\RouteGuideClient('localhost:50051', [
'credentials' => Grpc\ChannelCredentials::createInsecure() 'credentials' => Grpc\ChannelCredentials::createInsecure(),
]); ]);
function printFeature($feature) { function printFeature($feature)
{
$name = $feature->getName(); $name = $feature->getName();
if (!$name) { if (!$name) {
$name_str = "no feature"; $name_str = 'no feature';
} else { } else {
$name_str = "feature called $name"; $name_str = "feature called $name";
} }
print sprintf("Found %s \n at %f, %f\n", $name_str, echo sprintf("Found %s \n at %f, %f\n", $name_str,
$feature->getLocation()->getLatitude() / COORD_FACTOR, $feature->getLocation()->getLatitude() / COORD_FACTOR,
$feature->getLocation()->getLongitude() / COORD_FACTOR); $feature->getLocation()->getLongitude() / COORD_FACTOR);
} }
@ -57,8 +58,9 @@ function printFeature($feature) {
* Run the getFeature demo. Calls getFeature with a point known to have a * Run the getFeature demo. Calls getFeature with a point known to have a
* feature and a point known not to have a feature. * feature and a point known not to have a feature.
*/ */
function runGetFeature() { function runGetFeature()
print "Running GetFeature...\n"; {
echo "Running GetFeature...\n";
global $client; global $client;
$point = new routeguide\Point(); $point = new routeguide\Point();
@ -81,8 +83,9 @@ function runGetFeature() {
* containing all of the features in the pre-generated * containing all of the features in the pre-generated
* database. Prints each response as it comes in. * database. Prints each response as it comes in.
*/ */
function runListFeatures() { function runListFeatures()
print "Running ListFeatures...\n"; {
echo "Running ListFeatures...\n";
global $client; global $client;
$lo_point = new routeguide\Point(); $lo_point = new routeguide\Point();
@ -111,8 +114,9 @@ function runListFeatures() {
* pre-generated feature database with a variable delay in between. Prints * pre-generated feature database with a variable delay in between. Prints
* the statistics when they are sent from the server. * the statistics when they are sent from the server.
*/ */
function runRecordRoute() { function runRecordRoute()
print "Running RecordRoute...\n"; {
echo "Running RecordRoute...\n";
global $client, $argv; global $client, $argv;
// start the client streaming call // start the client streaming call
@ -121,7 +125,7 @@ function runRecordRoute() {
$db = json_decode(file_get_contents($argv[1]), true); $db = json_decode(file_get_contents($argv[1]), true);
$num_points_in_db = count($db); $num_points_in_db = count($db);
$num_points = 10; $num_points = 10;
for ($i = 0; $i < $num_points; $i++) { for ($i = 0; $i < $num_points; ++$i) {
$point = new routeguide\Point(); $point = new routeguide\Point();
$index = rand(0, $num_points_in_db - 1); $index = rand(0, $num_points_in_db - 1);
$lat = $db[$index]['location']['latitude']; $lat = $db[$index]['location']['latitude'];
@ -129,14 +133,14 @@ function runRecordRoute() {
$feature_name = $db[$index]['name']; $feature_name = $db[$index]['name'];
$point->setLatitude($lat); $point->setLatitude($lat);
$point->setLongitude($long); $point->setLongitude($long);
print sprintf("Visiting point %f, %f,\n with feature name: %s\n", echo sprintf("Visiting point %f, %f,\n with feature name: %s\n",
$lat / COORD_FACTOR, $long / COORD_FACTOR, $lat / COORD_FACTOR, $long / COORD_FACTOR,
$feature_name ? $feature_name : '<empty>'); $feature_name ? $feature_name : '<empty>');
usleep(rand(300000, 800000)); usleep(rand(300000, 800000));
$call->write($point); $call->write($point);
} }
list($route_summary, $status) = $call->wait(); list($route_summary, $status) = $call->wait();
print sprintf("Finished trip with %d points\nPassed %d features\n". echo sprintf("Finished trip with %d points\nPassed %d features\n".
"Travelled %d meters\nIt took %d seconds\n", "Travelled %d meters\nIt took %d seconds\n",
$route_summary->getPointCount(), $route_summary->getPointCount(),
$route_summary->getFeatureCount(), $route_summary->getFeatureCount(),
@ -148,8 +152,9 @@ function runRecordRoute() {
* Run the routeChat demo. Send some chat messages, and print any chat * Run the routeChat demo. Send some chat messages, and print any chat
* messages that are sent from the server. * messages that are sent from the server.
*/ */
function runRouteChat() { function runRouteChat()
print "Running RouteChat...\n"; {
echo "Running RouteChat...\n";
global $client; global $client;
// start the bidirectional streaming call // start the bidirectional streaming call
@ -172,7 +177,7 @@ function runRouteChat() {
$route_note->setLocation($point); $route_note->setLocation($point);
$route_note->setMessage($message = $n[2]); $route_note->setMessage($message = $n[2]);
print sprintf("Sending message: '%s' at (%d, %d)\n", echo sprintf("Sending message: '%s' at (%d, %d)\n",
$message, $lat, $long); $message, $lat, $long);
// send a bunch of messages to the server // send a bunch of messages to the server
$call->write($route_note); $call->write($route_note);
@ -181,7 +186,7 @@ function runRouteChat() {
// read from the server until there's no more // read from the server until there's no more
while ($route_note_reply = $call->read()) { while ($route_note_reply = $call->read()) {
print sprintf("Previous left message at (%d, %d): '%s'\n", echo sprintf("Previous left message at (%d, %d): '%s'\n",
$route_note_reply->getLocation()->getLatitude(), $route_note_reply->getLocation()->getLatitude(),
$route_note_reply->getLocation()->getLongitude(), $route_note_reply->getLocation()->getLongitude(),
$route_note_reply->getMessage()); $route_note_reply->getMessage());
@ -189,9 +194,10 @@ function runRouteChat() {
} }
/** /**
* Run all of the demos in order * Run all of the demos in order.
*/ */
function main() { function main()
{
runGetFeature(); runGetFeature();
runListFeatures(); runListFeatures();
runRecordRoute(); runRecordRoute();
@ -199,7 +205,7 @@ function main() {
} }
if (empty($argv[1])) { if (empty($argv[1])) {
print "Usage: php -d extension=grpc.so route_guide_client.php " . echo 'Usage: php -d extension=grpc.so route_guide_client.php '.
"<path to route_guide_db.json>\n"; "<path to route_guide_db.json>\n";
exit(1); exit(1);
} }

@ -33,9 +33,11 @@ import os
import os.path import os.path
import shutil import shutil
import sys import sys
import sysconfig
from distutils import core as _core from distutils import core as _core
from distutils import extension as _extension from distutils import extension as _extension
import pkg_resources
import setuptools import setuptools
from setuptools.command import egg_info from setuptools.command import egg_info
@ -110,6 +112,16 @@ if "linux" in sys.platform or "darwin" in sys.platform:
DEFINE_MACROS += (('PyMODINIT_FUNC', pymodinit),) DEFINE_MACROS += (('PyMODINIT_FUNC', pymodinit),)
# By default, Python3 distutils enforces compatibility of
# c plugins (.so files) with the OSX version Python3 was built with.
# For Python3.4, this is OSX 10.6, but we need Thread Local Support (__thread)
if 'darwin' in sys.platform and PY3:
mac_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
if mac_target and (pkg_resources.parse_version(mac_target) <
pkg_resources.parse_version('10.7.0')):
os.environ['MACOSX_DEPLOYMENT_TARGET'] = '10.7'
def cython_extensions(module_names, extra_sources, include_dirs, def cython_extensions(module_names, extra_sources, include_dirs,
libraries, define_macros, build_with_cython=False): libraries, define_macros, build_with_cython=False):
# Set compiler directives linetrace argument only if we care about tracing; # Set compiler directives linetrace argument only if we care about tracing;

@ -76,7 +76,8 @@ static bool is_load_reporting_enabled(const grpc_channel_args *a) {
if (a == NULL) return false; if (a == NULL) return false;
for (size_t i = 0; i < a->num_args; i++) { for (size_t i = 0; i < a->num_args; i++) {
if (0 == strcmp(a->args[i].key, GRPC_ARG_ENABLE_LOAD_REPORTING)) { if (0 == strcmp(a->args[i].key, GRPC_ARG_ENABLE_LOAD_REPORTING)) {
return a->args[i].value.pointer.p != NULL; return a->args[i].type == GRPC_ARG_POINTER &&
a->args[i].value.pointer.p != NULL;
} }
} }
return false; return false;

@ -477,7 +477,8 @@ function _makeStub($args)
return $stub; return $stub;
} }
function interop_main($args, $stub = false) { function interop_main($args, $stub = false)
{
if (!$stub) { if (!$stub) {
$stub = _makeStub($args); $stub = _makeStub($args);
} }

@ -32,9 +32,10 @@
* *
*/ */
include_once('interop_client.php'); include_once 'interop_client.php';
function stress_main($args) { function stress_main($args)
{
mt_srand(); mt_srand();
set_time_limit(0); set_time_limit(0);
@ -71,11 +72,12 @@ function stress_main($args) {
$args['test_case'] = $args['test_case'] =
$args['test_cases'][mt_rand(0, $num_test_cases - 1)]; $args['test_cases'][mt_rand(0, $num_test_cases - 1)];
$stub = @interop_main($args, $stub); $stub = @interop_main($args, $stub);
$count++; ++$count;
} }
} }
socket_close($socket); socket_close($socket);
echo "Number of interop tests run in $args[test_duration_secs] seconds: $count.\n"; echo "Number of interop tests run in $args[test_duration_secs] ".
"seconds: $count.\n";
} }
// process command line arguments // process command line arguments
@ -85,7 +87,8 @@ $raw_args = getopt('',
'metrics_port::', 'metrics_port::',
'test_duration_secs::', 'test_duration_secs::',
'num_channels_per_server::', 'num_channels_per_server::',
'num_stubs_per_channel::']); 'num_stubs_per_channel::',
]);
$args = []; $args = [];

@ -191,7 +191,7 @@ class BuildProtoModules(setuptools.Command):
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
sys.stderr.write( sys.stderr.write(
'warning: Command:\n{}\nMessage:\n{}\nOutput:\n{}'.format( 'warning: Command:\n{}\nMessage:\n{}\nOutput:\n{}'.format(
command, e.message, e.output)) command, str(e), e.output))
# Generated proto directories dont include __init__.py, but # Generated proto directories dont include __init__.py, but
# these are needed for python package resolution # these are needed for python package resolution

@ -85,7 +85,7 @@ def _deadline(timeout):
def _unknown_code_details(unknown_cygrpc_code, details): def _unknown_code_details(unknown_cygrpc_code, details):
return b'Server sent unknown code {} and details "{}"'.format( return 'Server sent unknown code {} and details "{}"'.format(
unknown_cygrpc_code, details) unknown_cygrpc_code, details)
@ -134,19 +134,19 @@ def _handle_event(event, state, response_deserializer):
for batch_operation in event.batch_operations: for batch_operation in event.batch_operations:
operation_type = batch_operation.type operation_type = batch_operation.type
state.due.remove(operation_type) state.due.remove(operation_type)
if operation_type is cygrpc.OperationType.receive_initial_metadata: if operation_type == cygrpc.OperationType.receive_initial_metadata:
state.initial_metadata = batch_operation.received_metadata state.initial_metadata = batch_operation.received_metadata
elif operation_type is cygrpc.OperationType.receive_message: elif operation_type == cygrpc.OperationType.receive_message:
serialized_response = batch_operation.received_message.bytes() serialized_response = batch_operation.received_message.bytes()
if serialized_response is not None: if serialized_response is not None:
response = _common.deserialize( response = _common.deserialize(
serialized_response, response_deserializer) serialized_response, response_deserializer)
if response is None: if response is None:
details = b'Exception deserializing response!' details = 'Exception deserializing response!'
_abort(state, grpc.StatusCode.INTERNAL, details) _abort(state, grpc.StatusCode.INTERNAL, details)
else: else:
state.response = response state.response = response
elif operation_type is cygrpc.OperationType.receive_status_on_client: elif operation_type == cygrpc.OperationType.receive_status_on_client:
state.trailing_metadata = batch_operation.received_metadata state.trailing_metadata = batch_operation.received_metadata
if state.code is None: if state.code is None:
code = _common.CYGRPC_STATUS_CODE_TO_STATUS_CODE.get( code = _common.CYGRPC_STATUS_CODE_TO_STATUS_CODE.get(
@ -186,7 +186,7 @@ def _consume_request_iterator(
if state.code is None and not state.cancelled: if state.code is None and not state.cancelled:
if serialized_request is None: if serialized_request is None:
call.cancel() call.cancel()
details = b'Exception serializing request!' details = 'Exception serializing request!'
_abort(state, grpc.StatusCode.INTERNAL, details) _abort(state, grpc.StatusCode.INTERNAL, details)
return return
else: else:
@ -230,7 +230,7 @@ class _Rendezvous(grpc.RpcError, grpc.Future, grpc.Call):
if self._state.code is None: if self._state.code is None:
self._call.cancel() self._call.cancel()
self._state.cancelled = True self._state.cancelled = True
_abort(self._state, grpc.StatusCode.CANCELLED, b'Cancelled!') _abort(self._state, grpc.StatusCode.CANCELLED, 'Cancelled!')
self._state.condition.notify_all() self._state.condition.notify_all()
return False return False
@ -402,7 +402,7 @@ def _start_unary_request(request, timeout, request_serializer):
if serialized_request is None: if serialized_request is None:
state = _RPCState( state = _RPCState(
(), _EMPTY_METADATA, _EMPTY_METADATA, grpc.StatusCode.INTERNAL, (), _EMPTY_METADATA, _EMPTY_METADATA, grpc.StatusCode.INTERNAL,
b'Exception serializing request!') 'Exception serializing request!')
rendezvous = _Rendezvous(state, None, None, deadline) rendezvous = _Rendezvous(state, None, None, deadline)
return deadline, deadline_timespec, None, rendezvous return deadline, deadline_timespec, None, rendezvous
else: else:

@ -97,3 +97,16 @@ def serialize(message, serializer):
def deserialize(serialized_message, deserializer): def deserialize(serialized_message, deserializer):
return _transform(serialized_message, deserializer, return _transform(serialized_message, deserializer,
'Exception deserializing message!') 'Exception deserializing message!')
def _encode(s):
if isinstance(s, bytes):
return s
else:
return s.encode('ascii')
def fully_qualified_method(group, method):
group = _encode(group)
method = _encode(method)
return b'/' + group + b'/' + method

@ -55,6 +55,7 @@ cdef class Call:
def cancel( def cancel(
self, grpc_status_code error_code=GRPC_STATUS__DO_NOT_USE, self, grpc_status_code error_code=GRPC_STATUS__DO_NOT_USE,
details=None): details=None):
details = str_to_bytes(details)
if not self.is_valid: if not self.is_valid:
raise ValueError("invalid call object cannot be used from Python") raise ValueError("invalid call object cannot be used from Python")
if (details is None) != (error_code == GRPC_STATUS__DO_NOT_USE): if (details is None) != (error_code == GRPC_STATUS__DO_NOT_USE):
@ -63,12 +64,6 @@ cdef class Call:
cdef grpc_call_error result cdef grpc_call_error result
cdef char *c_details = NULL cdef char *c_details = NULL
if error_code != GRPC_STATUS__DO_NOT_USE: if error_code != GRPC_STATUS__DO_NOT_USE:
if isinstance(details, bytes):
pass
elif isinstance(details, basestring):
details = details.encode()
else:
raise TypeError("expected details to be str or bytes")
self.references.append(details) self.references.append(details)
c_details = details c_details = details
with nogil: with nogil:

@ -34,18 +34,13 @@ cdef class Channel:
def __cinit__(self, target, ChannelArgs arguments=None, def __cinit__(self, target, ChannelArgs arguments=None,
ChannelCredentials channel_credentials=None): ChannelCredentials channel_credentials=None):
target = str_to_bytes(target)
cdef grpc_channel_args *c_arguments = NULL cdef grpc_channel_args *c_arguments = NULL
cdef char *c_target = NULL cdef char *c_target = NULL
self.c_channel = NULL self.c_channel = NULL
self.references = [] self.references = []
if arguments is not None: if arguments is not None:
c_arguments = &arguments.c_args c_arguments = &arguments.c_args
if isinstance(target, bytes):
pass
elif isinstance(target, basestring):
target = target.encode()
else:
raise TypeError("expected target to be str or bytes")
c_target = target c_target = target
if channel_credentials is None: if channel_credentials is None:
with nogil: with nogil:
@ -62,25 +57,14 @@ cdef class Channel:
def create_call(self, Call parent, int flags, def create_call(self, Call parent, int flags,
CompletionQueue queue not None, CompletionQueue queue not None,
method, host, Timespec deadline not None): method, host, Timespec deadline not None):
method = str_to_bytes(method)
host = str_to_bytes(host)
if queue.is_shutting_down: if queue.is_shutting_down:
raise ValueError("queue must not be shutting down or shutdown") raise ValueError("queue must not be shutting down or shutdown")
if isinstance(method, bytes):
pass
elif isinstance(method, basestring):
method = method.encode()
else:
raise TypeError("expected method to be str or bytes")
cdef char *method_c_string = method cdef char *method_c_string = method
cdef char *host_c_string = NULL cdef char *host_c_string = NULL
if host is None: if host is not None:
pass
elif isinstance(host, bytes):
host_c_string = host host_c_string = host
elif isinstance(host, basestring):
host = host.encode()
host_c_string = host
else:
raise TypeError("expected host to be str, bytes, or None")
cdef Call operation_call = Call() cdef Call operation_call = Call()
operation_call.references = [self, method, host, queue] operation_call.references = [self, method, host, queue]
cdef grpc_call *parent_call = NULL cdef grpc_call *parent_call = NULL

@ -54,7 +54,7 @@ cdef class ServerCredentials:
cdef class CredentialsMetadataPlugin: cdef class CredentialsMetadataPlugin:
cdef object plugin_callback cdef object plugin_callback
cdef str plugin_name cdef bytes plugin_name
cdef grpc_metadata_credentials_plugin make_c_plugin(self) cdef grpc_metadata_credentials_plugin make_c_plugin(self)

@ -82,7 +82,7 @@ cdef class ServerCredentials:
cdef class CredentialsMetadataPlugin: cdef class CredentialsMetadataPlugin:
def __cinit__(self, object plugin_callback, str name): def __cinit__(self, object plugin_callback, name):
""" """
Args: Args:
plugin_callback (callable): Callback accepting a service URL (str/bytes) plugin_callback (callable): Callback accepting a service URL (str/bytes)
@ -93,6 +93,7 @@ cdef class CredentialsMetadataPlugin:
successful). successful).
name (str): Plugin name. name (str): Plugin name.
""" """
name = str_to_bytes(name)
if not callable(plugin_callback): if not callable(plugin_callback):
raise ValueError('expected callable plugin_callback') raise ValueError('expected callable plugin_callback')
self.plugin_callback = plugin_callback self.plugin_callback = plugin_callback
@ -129,7 +130,8 @@ cdef void plugin_get_metadata(
grpc_credentials_plugin_metadata_cb cb, void *user_data) with gil: grpc_credentials_plugin_metadata_cb cb, void *user_data) with gil:
def python_callback( def python_callback(
Metadata metadata, grpc_status_code status, Metadata metadata, grpc_status_code status,
const char *error_details): error_details):
error_details = str_to_bytes(error_details)
cb(user_data, metadata.c_metadata_array.metadata, cb(user_data, metadata.c_metadata_array.metadata,
metadata.c_metadata_array.count, status, error_details) metadata.c_metadata_array.count, status, error_details)
cdef CredentialsMetadataPlugin self = <CredentialsMetadataPlugin>state cdef CredentialsMetadataPlugin self = <CredentialsMetadataPlugin>state
@ -148,14 +150,7 @@ def channel_credentials_google_default():
def channel_credentials_ssl(pem_root_certificates, def channel_credentials_ssl(pem_root_certificates,
SslPemKeyCertPair ssl_pem_key_cert_pair): SslPemKeyCertPair ssl_pem_key_cert_pair):
if pem_root_certificates is None: pem_root_certificates = str_to_bytes(pem_root_certificates)
pass
elif isinstance(pem_root_certificates, bytes):
pass
elif isinstance(pem_root_certificates, basestring):
pem_root_certificates = pem_root_certificates.encode()
else:
raise TypeError("expected str or bytes for pem_root_certificates")
cdef ChannelCredentials credentials = ChannelCredentials() cdef ChannelCredentials credentials = ChannelCredentials()
cdef const char *c_pem_root_certificates = NULL cdef const char *c_pem_root_certificates = NULL
if pem_root_certificates is not None: if pem_root_certificates is not None:
@ -207,12 +202,7 @@ def call_credentials_google_compute_engine():
def call_credentials_service_account_jwt_access( def call_credentials_service_account_jwt_access(
json_key, Timespec token_lifetime not None): json_key, Timespec token_lifetime not None):
if isinstance(json_key, bytes): json_key = str_to_bytes(json_key)
pass
elif isinstance(json_key, basestring):
json_key = json_key.encode()
else:
raise TypeError("expected json_key to be str or bytes")
cdef CallCredentials credentials = CallCredentials() cdef CallCredentials credentials = CallCredentials()
cdef char *json_key_c_string = json_key cdef char *json_key_c_string = json_key
with nogil: with nogil:
@ -223,12 +213,7 @@ def call_credentials_service_account_jwt_access(
return credentials return credentials
def call_credentials_google_refresh_token(json_refresh_token): def call_credentials_google_refresh_token(json_refresh_token):
if isinstance(json_refresh_token, bytes): json_refresh_token = str_to_bytes(json_refresh_token)
pass
elif isinstance(json_refresh_token, basestring):
json_refresh_token = json_refresh_token.encode()
else:
raise TypeError("expected json_refresh_token to be str or bytes")
cdef CallCredentials credentials = CallCredentials() cdef CallCredentials credentials = CallCredentials()
cdef char *json_refresh_token_c_string = json_refresh_token cdef char *json_refresh_token_c_string = json_refresh_token
with nogil: with nogil:
@ -238,18 +223,8 @@ def call_credentials_google_refresh_token(json_refresh_token):
return credentials return credentials
def call_credentials_google_iam(authorization_token, authority_selector): def call_credentials_google_iam(authorization_token, authority_selector):
if isinstance(authorization_token, bytes): authorization_token = str_to_bytes(authorization_token)
pass authority_selector = str_to_bytes(authority_selector)
elif isinstance(authorization_token, basestring):
authorization_token = authorization_token.encode()
else:
raise TypeError("expected authorization_token to be str or bytes")
if isinstance(authority_selector, bytes):
pass
elif isinstance(authority_selector, basestring):
authority_selector = authority_selector.encode()
else:
raise TypeError("expected authority_selector to be str or bytes")
cdef CallCredentials credentials = CallCredentials() cdef CallCredentials credentials = CallCredentials()
cdef char *authorization_token_c_string = authorization_token cdef char *authorization_token_c_string = authorization_token
cdef char *authority_selector_c_string = authority_selector cdef char *authority_selector_c_string = authority_selector
@ -272,16 +247,10 @@ def call_credentials_metadata_plugin(CredentialsMetadataPlugin plugin):
def server_credentials_ssl(pem_root_certs, pem_key_cert_pairs, def server_credentials_ssl(pem_root_certs, pem_key_cert_pairs,
bint force_client_auth): bint force_client_auth):
pem_root_certs = str_to_bytes(pem_root_certs)
cdef char *c_pem_root_certs = NULL cdef char *c_pem_root_certs = NULL
if pem_root_certs is None: if pem_root_certs is not None:
pass
elif isinstance(pem_root_certs, bytes):
c_pem_root_certs = pem_root_certs
elif isinstance(pem_root_certs, basestring):
pem_root_certs = pem_root_certs.encode()
c_pem_root_certs = pem_root_certs c_pem_root_certs = pem_root_certs
else:
raise TypeError("expected pem_root_certs to be str or bytes")
pem_key_cert_pairs = list(pem_key_cert_pairs) pem_key_cert_pairs = list(pem_key_cert_pairs)
for pair in pem_key_cert_pairs: for pair in pem_key_cert_pairs:
if not isinstance(pair, SslPemKeyCertPair): if not isinstance(pair, SslPemKeyCertPair):

@ -0,0 +1,39 @@
# Copyright 2016, Google Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
# * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# This function will ascii encode unicode string inputs if neccesary.
# In Python3, unicode strings are the default str type.
cdef bytes str_to_bytes(object s):
if s is None or isinstance(s, bytes):
return s
elif isinstance(s, unicode):
return s.encode('ascii')
else:
raise TypeError('Expected bytes, str, or unicode, not {}'.format(type(s)))

@ -235,18 +235,13 @@ cdef class ByteBuffer:
if data is None: if data is None:
self.c_byte_buffer = NULL self.c_byte_buffer = NULL
return return
if isinstance(data, bytes): if isinstance(data, ByteBuffer):
pass
elif isinstance(data, basestring):
data = data.encode()
elif isinstance(data, ByteBuffer):
data = (<ByteBuffer>data).bytes() data = (<ByteBuffer>data).bytes()
if data is None: if data is None:
self.c_byte_buffer = NULL self.c_byte_buffer = NULL
return return
else: else:
raise TypeError("expected value to be of type str, bytes, or " data = str_to_bytes(data)
"ByteBuffer, not {}".format(type(data)))
cdef char *c_data = data cdef char *c_data = data
cdef gpr_slice data_slice cdef gpr_slice data_slice
@ -302,19 +297,8 @@ cdef class ByteBuffer:
cdef class SslPemKeyCertPair: cdef class SslPemKeyCertPair:
def __cinit__(self, private_key, certificate_chain): def __cinit__(self, private_key, certificate_chain):
if isinstance(private_key, bytes): self.private_key = str_to_bytes(private_key)
self.private_key = private_key self.certificate_chain = str_to_bytes(certificate_chain)
elif isinstance(private_key, basestring):
self.private_key = private_key.encode()
else:
raise TypeError("expected private_key to be of type str or bytes")
if isinstance(certificate_chain, bytes):
self.certificate_chain = certificate_chain
elif isinstance(certificate_chain, basestring):
self.certificate_chain = certificate_chain.encode()
else:
raise TypeError("expected certificate_chain to be of type str or bytes "
"or int")
self.c_pair.private_key = self.private_key self.c_pair.private_key = self.private_key
self.c_pair.certificate_chain = self.certificate_chain self.c_pair.certificate_chain = self.certificate_chain
@ -322,27 +306,16 @@ cdef class SslPemKeyCertPair:
cdef class ChannelArg: cdef class ChannelArg:
def __cinit__(self, key, value): def __cinit__(self, key, value):
if isinstance(key, bytes): self.key = str_to_bytes(key)
self.key = key self.c_arg.key = self.key
elif isinstance(key, basestring): if isinstance(value, int):
self.key = key.encode()
else:
raise TypeError("expected key to be of type str or bytes")
if isinstance(value, bytes):
self.value = value
self.c_arg.type = GRPC_ARG_STRING
self.c_arg.value.string = self.value
elif isinstance(value, basestring):
self.value = value.encode()
self.c_arg.type = GRPC_ARG_STRING
self.c_arg.value.string = self.value
elif isinstance(value, int):
self.value = int(value) self.value = int(value)
self.c_arg.type = GRPC_ARG_INTEGER self.c_arg.type = GRPC_ARG_INTEGER
self.c_arg.value.integer = self.value self.c_arg.value.integer = self.value
else: else:
raise TypeError("expected value to be of type str or bytes or int") self.value = str_to_bytes(value)
self.c_arg.key = self.key self.c_arg.type = GRPC_ARG_STRING
self.c_arg.value.string = self.value
cdef class ChannelArgs: cdef class ChannelArgs:
@ -375,18 +348,8 @@ cdef class ChannelArgs:
cdef class Metadatum: cdef class Metadatum:
def __cinit__(self, key, value): def __cinit__(self, key, value):
if isinstance(key, bytes): self._key = str_to_bytes(key)
self._key = key self._value = str_to_bytes(value)
elif isinstance(key, basestring):
self._key = key.encode()
else:
raise TypeError("expected key to be of type str or bytes")
if isinstance(value, bytes):
self._value = value
elif isinstance(value, basestring):
self._value = value.encode()
else:
raise TypeError("expected value to be of type str or bytes")
self.c_metadata.key = self._key self.c_metadata.key = self._key
self.c_metadata.value = self._value self.c_metadata.value = self._value
self.c_metadata.value_length = len(self._value) self.c_metadata.value_length = len(self._value)
@ -601,12 +564,7 @@ def operation_send_close_from_client(int flags):
def operation_send_status_from_server( def operation_send_status_from_server(
Metadata metadata, grpc_status_code code, details, int flags): Metadata metadata, grpc_status_code code, details, int flags):
if isinstance(details, bytes): details = str_to_bytes(details)
pass
elif isinstance(details, basestring):
details = details.encode()
else:
raise TypeError("expected a str or bytes object for details")
cdef Operation op = Operation() cdef Operation op = Operation()
op.c_op.type = GRPC_OP_SEND_STATUS_FROM_SERVER op.c_op.type = GRPC_OP_SEND_STATUS_FROM_SERVER
op.c_op.flags = flags op.c_op.flags = flags

@ -103,12 +103,7 @@ cdef class Server:
def add_http2_port(self, address, def add_http2_port(self, address,
ServerCredentials server_credentials=None): ServerCredentials server_credentials=None):
if isinstance(address, bytes): address = str_to_bytes(address)
pass
elif isinstance(address, basestring):
address = address.encode()
else:
raise TypeError("expected address to be a str or bytes")
self.references.append(address) self.references.append(address)
cdef int result cdef int result
cdef char *address_c_string = address cdef char *address_c_string = address

@ -35,6 +35,7 @@ import sys
# TODO(atash): figure out why the coverage tool gets confused about the Cython # TODO(atash): figure out why the coverage tool gets confused about the Cython
# coverage plugin when the following files don't have a '.pxi' suffix. # coverage plugin when the following files don't have a '.pxi' suffix.
include "grpc/_cython/_cygrpc/grpc_string.pyx.pxi"
include "grpc/_cython/_cygrpc/call.pyx.pxi" include "grpc/_cython/_cygrpc/call.pyx.pxi"
include "grpc/_cython/_cygrpc/channel.pyx.pxi" include "grpc/_cython/_cygrpc/channel.pyx.pxi"
include "grpc/_cython/_cygrpc/credentials.pyx.pxi" include "grpc/_cython/_cygrpc/credentials.pyx.pxi"

@ -33,6 +33,7 @@ import abc
import enum import enum
import logging import logging
import threading import threading
import six
import time import time
from grpc._adapter import _intermediary_low from grpc._adapter import _intermediary_low
@ -177,7 +178,10 @@ class _Kernel(object):
call = service_acceptance.call call = service_acceptance.call
call.accept(self._completion_queue, call) call.accept(self._completion_queue, call)
try: try:
group, method = service_acceptance.method.split(b'/')[1:3] service_method = service_acceptance.method
if six.PY3:
service_method = service_method.decode('latin1')
group, method = service_method.split('/')[1:3]
except ValueError: except ValueError:
logging.info('Illegal path "%s"!', service_acceptance.method) logging.info('Illegal path "%s"!', service_acceptance.method)
return return

@ -85,7 +85,7 @@ def _abortion_code(state, code):
def _details(state): def _details(state):
return b'' if state.details is None else state.details return '' if state.details is None else state.details
class _HandlerCallDetails( class _HandlerCallDetails(
@ -189,7 +189,7 @@ def _receive_message(state, call, request_deserializer):
if request is None: if request is None:
_abort( _abort(
state, call, cygrpc.StatusCode.internal, state, call, cygrpc.StatusCode.internal,
b'Exception deserializing request!') 'Exception deserializing request!')
else: else:
state.request = request state.request = request
state.condition.notify_all() state.condition.notify_all()
@ -340,7 +340,7 @@ def _unary_request(rpc_event, state, request_deserializer):
state.condition.wait() state.condition.wait()
if state.request is None: if state.request is None:
if state.client is _CLOSED: if state.client is _CLOSED:
details = b'"{}" requires exactly one request message.'.format( details = '"{}" requires exactly one request message.'.format(
rpc_event.request_call_details.method) rpc_event.request_call_details.method)
# TODO(5992#issuecomment-220761992): really, what status code? # TODO(5992#issuecomment-220761992): really, what status code?
_abort( _abort(
@ -363,7 +363,7 @@ def _call_behavior(rpc_event, state, behavior, argument, request_deserializer):
except Exception as e: # pylint: disable=broad-except except Exception as e: # pylint: disable=broad-except
with state.condition: with state.condition:
if e not in state.rpc_errors: if e not in state.rpc_errors:
details = b'Exception calling application: {}'.format(e) details = 'Exception calling application: {}'.format(e)
logging.exception(details) logging.exception(details)
_abort( _abort(
state, rpc_event.operation_call, cygrpc.StatusCode.unknown, details) state, rpc_event.operation_call, cygrpc.StatusCode.unknown, details)
@ -378,7 +378,7 @@ def _take_response_from_response_iterator(rpc_event, state, response_iterator):
except Exception as e: # pylint: disable=broad-except except Exception as e: # pylint: disable=broad-except
with state.condition: with state.condition:
if e not in state.rpc_errors: if e not in state.rpc_errors:
details = b'Exception iterating responses: {}'.format(e) details = 'Exception iterating responses: {}'.format(e)
logging.exception(details) logging.exception(details)
_abort( _abort(
state, rpc_event.operation_call, cygrpc.StatusCode.unknown, details) state, rpc_event.operation_call, cygrpc.StatusCode.unknown, details)
@ -391,7 +391,7 @@ def _serialize_response(rpc_event, state, response, response_serializer):
with state.condition: with state.condition:
_abort( _abort(
state, rpc_event.operation_call, cygrpc.StatusCode.internal, state, rpc_event.operation_call, cygrpc.StatusCode.internal,
b'Failed to serialize response!') 'Failed to serialize response!')
return None return None
else: else:
return serialized_response return serialized_response
@ -544,7 +544,7 @@ def _handle_unrecognized_method(rpc_event):
cygrpc.operation_receive_close_on_server(_EMPTY_FLAGS), cygrpc.operation_receive_close_on_server(_EMPTY_FLAGS),
cygrpc.operation_send_status_from_server( cygrpc.operation_send_status_from_server(
_EMPTY_METADATA, cygrpc.StatusCode.unimplemented, _EMPTY_METADATA, cygrpc.StatusCode.unimplemented,
b'Method not found!', _EMPTY_FLAGS), 'Method not found!', _EMPTY_FLAGS),
) )
rpc_state = _RPCState() rpc_state = _RPCState()
rpc_event.operation_call.start_batch( rpc_event.operation_call.start_batch(

@ -30,6 +30,7 @@
"""Translates gRPC's client-side API into gRPC's client-side Beta API.""" """Translates gRPC's client-side API into gRPC's client-side Beta API."""
import grpc import grpc
from grpc import _common
from grpc._cython import cygrpc from grpc._cython import cygrpc
from grpc.beta import interfaces from grpc.beta import interfaces
from grpc.framework.common import cardinality from grpc.framework.common import cardinality
@ -48,10 +49,6 @@ _STATUS_CODE_TO_ABORTION_KIND_AND_ABORTION_ERROR_CLASS = {
} }
def _fully_qualified_method(group, method):
return b'/{}/{}'.format(group, method)
def _effective_metadata(metadata, metadata_transformer): def _effective_metadata(metadata, metadata_transformer):
non_none_metadata = () if metadata is None else metadata non_none_metadata = () if metadata is None else metadata
if metadata_transformer is None: if metadata_transformer is None:
@ -184,7 +181,7 @@ def _blocking_unary_unary(
metadata_transformer, request, request_serializer, response_deserializer): metadata_transformer, request, request_serializer, response_deserializer):
try: try:
multi_callable = channel.unary_unary( multi_callable = channel.unary_unary(
_fully_qualified_method(group, method), _common.fully_qualified_method(group, method),
request_serializer=request_serializer, request_serializer=request_serializer,
response_deserializer=response_deserializer) response_deserializer=response_deserializer)
effective_metadata = _effective_metadata(metadata, metadata_transformer) effective_metadata = _effective_metadata(metadata, metadata_transformer)
@ -205,7 +202,7 @@ def _future_unary_unary(
channel, group, method, timeout, protocol_options, metadata, channel, group, method, timeout, protocol_options, metadata,
metadata_transformer, request, request_serializer, response_deserializer): metadata_transformer, request, request_serializer, response_deserializer):
multi_callable = channel.unary_unary( multi_callable = channel.unary_unary(
_fully_qualified_method(group, method), _common.fully_qualified_method(group, method),
request_serializer=request_serializer, request_serializer=request_serializer,
response_deserializer=response_deserializer) response_deserializer=response_deserializer)
effective_metadata = _effective_metadata(metadata, metadata_transformer) effective_metadata = _effective_metadata(metadata, metadata_transformer)
@ -219,7 +216,7 @@ def _unary_stream(
channel, group, method, timeout, protocol_options, metadata, channel, group, method, timeout, protocol_options, metadata,
metadata_transformer, request, request_serializer, response_deserializer): metadata_transformer, request, request_serializer, response_deserializer):
multi_callable = channel.unary_stream( multi_callable = channel.unary_stream(
_fully_qualified_method(group, method), _common.fully_qualified_method(group, method),
request_serializer=request_serializer, request_serializer=request_serializer,
response_deserializer=response_deserializer) response_deserializer=response_deserializer)
effective_metadata = _effective_metadata(metadata, metadata_transformer) effective_metadata = _effective_metadata(metadata, metadata_transformer)
@ -235,7 +232,7 @@ def _blocking_stream_unary(
response_deserializer): response_deserializer):
try: try:
multi_callable = channel.stream_unary( multi_callable = channel.stream_unary(
_fully_qualified_method(group, method), _common.fully_qualified_method(group, method),
request_serializer=request_serializer, request_serializer=request_serializer,
response_deserializer=response_deserializer) response_deserializer=response_deserializer)
effective_metadata = _effective_metadata(metadata, metadata_transformer) effective_metadata = _effective_metadata(metadata, metadata_transformer)
@ -257,7 +254,7 @@ def _future_stream_unary(
metadata_transformer, request_iterator, request_serializer, metadata_transformer, request_iterator, request_serializer,
response_deserializer): response_deserializer):
multi_callable = channel.stream_unary( multi_callable = channel.stream_unary(
_fully_qualified_method(group, method), _common.fully_qualified_method(group, method),
request_serializer=request_serializer, request_serializer=request_serializer,
response_deserializer=response_deserializer) response_deserializer=response_deserializer)
effective_metadata = _effective_metadata(metadata, metadata_transformer) effective_metadata = _effective_metadata(metadata, metadata_transformer)
@ -272,7 +269,7 @@ def _stream_stream(
metadata_transformer, request_iterator, request_serializer, metadata_transformer, request_iterator, request_serializer,
response_deserializer): response_deserializer):
multi_callable = channel.stream_stream( multi_callable = channel.stream_stream(
_fully_qualified_method(group, method), _common.fully_qualified_method(group, method),
request_serializer=request_serializer, request_serializer=request_serializer,
response_deserializer=response_deserializer) response_deserializer=response_deserializer)
effective_metadata = _effective_metadata(metadata, metadata_transformer) effective_metadata = _effective_metadata(metadata, metadata_transformer)

@ -33,6 +33,7 @@ import collections
import threading import threading
import grpc import grpc
from grpc import _common
from grpc.beta import interfaces from grpc.beta import interfaces
from grpc.framework.common import cardinality from grpc.framework.common import cardinality
from grpc.framework.common import style from grpc.framework.common import style
@ -287,29 +288,36 @@ def _simple_method_handler(
None, _adapt_stream_stream_event(implementation.stream_stream_event)) None, _adapt_stream_stream_event(implementation.stream_stream_event))
def _flatten_method_pair_map(method_pair_map):
method_pair_map = method_pair_map or {}
flat_map = {}
for method_pair in method_pair_map:
method = _common.fully_qualified_method(method_pair[0], method_pair[1])
flat_map[method] = method_pair_map[method_pair]
return flat_map
class _GenericRpcHandler(grpc.GenericRpcHandler): class _GenericRpcHandler(grpc.GenericRpcHandler):
def __init__( def __init__(
self, method_implementations, multi_method_implementation, self, method_implementations, multi_method_implementation,
request_deserializers, response_serializers): request_deserializers, response_serializers):
self._method_implementations = method_implementations self._method_implementations = _flatten_method_pair_map(
method_implementations)
self._request_deserializers = _flatten_method_pair_map(
request_deserializers)
self._response_serializers = _flatten_method_pair_map(
response_serializers)
self._multi_method_implementation = multi_method_implementation self._multi_method_implementation = multi_method_implementation
self._request_deserializers = request_deserializers or {}
self._response_serializers = response_serializers or {}
def service(self, handler_call_details): def service(self, handler_call_details):
try:
group_name, method_name = handler_call_details.method.split(b'/')[1:3]
except ValueError:
return None
else:
method_implementation = self._method_implementations.get( method_implementation = self._method_implementations.get(
(group_name, method_name,)) handler_call_details.method)
if method_implementation is not None: if method_implementation is not None:
return _simple_method_handler( return _simple_method_handler(
method_implementation, method_implementation,
self._request_deserializers.get((group_name, method_name,)), self._request_deserializers.get(handler_call_details.method),
self._response_serializers.get((group_name, method_name,))) self._response_serializers.get(handler_call_details.method))
elif self._multi_method_implementation is None: elif self._multi_method_implementation is None:
return None return None
else: else:

@ -31,12 +31,9 @@
import abc import abc
import time import time
try:
import Queue as queue # Python 2.x
except ImportError:
import queue # Python 3
from concurrent import futures from concurrent import futures
from six.moves import queue
from grpc.beta import implementations from grpc.beta import implementations
from grpc.framework.interfaces.face import face from grpc.framework.interfaces.face import face

@ -34,7 +34,7 @@ ClientRunner invokes either periodically or in response to some event.
""" """
import abc import abc
import thread import threading
import time import time
@ -61,15 +61,18 @@ class OpenLoopClientRunner(ClientRunner):
super(OpenLoopClientRunner, self).__init__(client) super(OpenLoopClientRunner, self).__init__(client)
self._is_running = False self._is_running = False
self._interval_generator = interval_generator self._interval_generator = interval_generator
self._dispatch_thread = threading.Thread(
target=self._dispatch_requests, args=())
def start(self): def start(self):
self._is_running = True self._is_running = True
self._client.start() self._client.start()
thread.start_new_thread(self._dispatch_requests, ()) self._dispatch_thread.start()
def stop(self): def stop(self):
self._is_running = False self._is_running = False
self._client.stop() self._client.stop()
self._dispatch_thread.join()
self._client = None self._client = None
def _dispatch_requests(self): def _dispatch_requests(self):

@ -30,10 +30,10 @@
"""Entry point for running stress tests.""" """Entry point for running stress tests."""
import argparse import argparse
import Queue
import threading import threading
from grpc.beta import implementations from grpc.beta import implementations
from six.moves import queue
from src.proto.grpc.testing import metrics_pb2 from src.proto.grpc.testing import metrics_pb2
from src.proto.grpc.testing import test_pb2 from src.proto.grpc.testing import test_pb2
@ -94,7 +94,7 @@ def run_test(args):
test_cases = _parse_weighted_test_cases(args.test_cases) test_cases = _parse_weighted_test_cases(args.test_cases)
test_servers = args.server_addresses.split(',') test_servers = args.server_addresses.split(',')
# Propagate any client exceptions with a queue # Propagate any client exceptions with a queue
exception_queue = Queue.Queue() exception_queue = queue.Queue()
stop_event = threading.Event() stop_event = threading.Event()
hist = histogram.Histogram(1, 1) hist = histogram.Histogram(1, 1)
runners = [] runners = []
@ -121,7 +121,7 @@ def run_test(args):
if timeout_secs < 0: if timeout_secs < 0:
timeout_secs = None timeout_secs = None
raise exception_queue.get(block=True, timeout=timeout_secs) raise exception_queue.get(block=True, timeout=timeout_secs)
except Queue.Empty: except queue.Empty:
# No exceptions thrown, success # No exceptions thrown, success
pass pass
finally: finally:

@ -28,6 +28,7 @@
"_crust_over_core_over_links_face_interface_test.GenericInvokerFutureInvocationAsynchronousEventServiceTest", "_crust_over_core_over_links_face_interface_test.GenericInvokerFutureInvocationAsynchronousEventServiceTest",
"_crust_over_core_over_links_face_interface_test.MultiCallableInvokerBlockingInvocationInlineServiceTest", "_crust_over_core_over_links_face_interface_test.MultiCallableInvokerBlockingInvocationInlineServiceTest",
"_crust_over_core_over_links_face_interface_test.MultiCallableInvokerFutureInvocationAsynchronousEventServiceTest", "_crust_over_core_over_links_face_interface_test.MultiCallableInvokerFutureInvocationAsynchronousEventServiceTest",
"_empty_message_test.EmptyMessageTest",
"_face_interface_test.DynamicInvokerBlockingInvocationInlineServiceTest", "_face_interface_test.DynamicInvokerBlockingInvocationInlineServiceTest",
"_face_interface_test.DynamicInvokerFutureInvocationAsynchronousEventServiceTest", "_face_interface_test.DynamicInvokerFutureInvocationAsynchronousEventServiceTest",
"_face_interface_test.GenericInvokerBlockingInvocationInlineServiceTest", "_face_interface_test.GenericInvokerBlockingInvocationInlineServiceTest",

@ -164,15 +164,15 @@ class EchoTest(unittest.TestCase):
self.assertIsNotNone(service_accepted) self.assertIsNotNone(service_accepted)
self.assertIs(service_accepted.kind, _low.Event.Kind.SERVICE_ACCEPTED) self.assertIs(service_accepted.kind, _low.Event.Kind.SERVICE_ACCEPTED)
self.assertIs(service_accepted.tag, service_tag) self.assertIs(service_accepted.tag, service_tag)
self.assertEqual(method, service_accepted.service_acceptance.method) self.assertEqual(method.encode(), service_accepted.service_acceptance.method)
self.assertEqual(self.host, service_accepted.service_acceptance.host) self.assertEqual(self.host.encode(), service_accepted.service_acceptance.host)
self.assertIsNotNone(service_accepted.service_acceptance.call) self.assertIsNotNone(service_accepted.service_acceptance.call)
metadata = dict(service_accepted.metadata) metadata = dict(service_accepted.metadata)
self.assertIn(client_metadata_key, metadata) self.assertIn(client_metadata_key.encode(), metadata)
self.assertEqual(client_metadata_value, metadata[client_metadata_key]) self.assertEqual(client_metadata_value.encode(), metadata[client_metadata_key.encode()])
self.assertIn(client_binary_metadata_key, metadata) self.assertIn(client_binary_metadata_key.encode(), metadata)
self.assertEqual(client_binary_metadata_value, self.assertEqual(client_binary_metadata_value,
metadata[client_binary_metadata_key]) metadata[client_binary_metadata_key.encode()])
server_call = service_accepted.service_acceptance.call server_call = service_accepted.service_acceptance.call
server_call.accept(self.server_completion_queue, finish_tag) server_call.accept(self.server_completion_queue, finish_tag)
server_call.add_metadata(server_leading_metadata_key, server_call.add_metadata(server_leading_metadata_key,
@ -186,12 +186,12 @@ class EchoTest(unittest.TestCase):
self.assertEqual(_low.Event.Kind.METADATA_ACCEPTED, metadata_accepted.kind) self.assertEqual(_low.Event.Kind.METADATA_ACCEPTED, metadata_accepted.kind)
self.assertEqual(metadata_tag, metadata_accepted.tag) self.assertEqual(metadata_tag, metadata_accepted.tag)
metadata = dict(metadata_accepted.metadata) metadata = dict(metadata_accepted.metadata)
self.assertIn(server_leading_metadata_key, metadata) self.assertIn(server_leading_metadata_key.encode(), metadata)
self.assertEqual(server_leading_metadata_value, self.assertEqual(server_leading_metadata_value.encode(),
metadata[server_leading_metadata_key]) metadata[server_leading_metadata_key.encode()])
self.assertIn(server_leading_binary_metadata_key, metadata) self.assertIn(server_leading_binary_metadata_key.encode(), metadata)
self.assertEqual(server_leading_binary_metadata_value, self.assertEqual(server_leading_binary_metadata_value,
metadata[server_leading_binary_metadata_key]) metadata[server_leading_binary_metadata_key.encode()])
for datum in test_data: for datum in test_data:
client_call.write(datum, write_tag, _low.WriteFlags.WRITE_NO_COMPRESS) client_call.write(datum, write_tag, _low.WriteFlags.WRITE_NO_COMPRESS)
@ -277,17 +277,17 @@ class EchoTest(unittest.TestCase):
self.assertIsNone(read_accepted.bytes) self.assertIsNone(read_accepted.bytes)
self.assertEqual(_low.Event.Kind.FINISH, finish_accepted.kind) self.assertEqual(_low.Event.Kind.FINISH, finish_accepted.kind)
self.assertEqual(finish_tag, finish_accepted.tag) self.assertEqual(finish_tag, finish_accepted.tag)
self.assertEqual(_low.Status(_low.Code.OK, details), finish_accepted.status) self.assertEqual(_low.Status(_low.Code.OK, details.encode()), finish_accepted.status)
metadata = dict(finish_accepted.metadata) metadata = dict(finish_accepted.metadata)
self.assertIn(server_trailing_metadata_key, metadata) self.assertIn(server_trailing_metadata_key.encode(), metadata)
self.assertEqual(server_trailing_metadata_value, self.assertEqual(server_trailing_metadata_value.encode(),
metadata[server_trailing_metadata_key]) metadata[server_trailing_metadata_key.encode()])
self.assertIn(server_trailing_binary_metadata_key, metadata) self.assertIn(server_trailing_binary_metadata_key.encode(), metadata)
self.assertEqual(server_trailing_binary_metadata_value, self.assertEqual(server_trailing_binary_metadata_value,
metadata[server_trailing_binary_metadata_key]) metadata[server_trailing_binary_metadata_key.encode()])
self.assertSetEqual(set(key for key, _ in finish_accepted.metadata), self.assertSetEqual(set(key for key, _ in finish_accepted.metadata),
set((server_trailing_metadata_key, set((server_trailing_metadata_key.encode(),
server_trailing_binary_metadata_key,))) server_trailing_binary_metadata_key.encode(),)))
self.assertSequenceEqual(test_data, server_data) self.assertSequenceEqual(test_data, server_data)
self.assertSequenceEqual(test_data, client_data) self.assertSequenceEqual(test_data, client_data)
@ -302,7 +302,8 @@ class EchoTest(unittest.TestCase):
self._perform_echo_test([_BYTE_SEQUENCE]) self._perform_echo_test([_BYTE_SEQUENCE])
def testManyOneByteEchoes(self): def testManyOneByteEchoes(self):
self._perform_echo_test(_BYTE_SEQUENCE) self._perform_echo_test(
[_BYTE_SEQUENCE[i:i+1] for i in range(len(_BYTE_SEQUENCE))])
def testManyManyByteEchoes(self): def testManyManyByteEchoes(self):
self._perform_echo_test(_BYTE_SEQUENCE_SEQUENCE) self._perform_echo_test(_BYTE_SEQUENCE_SEQUENCE)
@ -409,7 +410,7 @@ class CancellationTest(unittest.TestCase):
finish_event = self.client_events.get() finish_event = self.client_events.get()
self.assertEqual(_low.Event.Kind.FINISH, finish_event.kind) self.assertEqual(_low.Event.Kind.FINISH, finish_event.kind)
self.assertEqual(_low.Status(_low.Code.CANCELLED, 'Cancelled'), self.assertEqual(_low.Status(_low.Code.CANCELLED, b'Cancelled'),
finish_event.status) finish_event.status)
self.assertSequenceEqual(test_data, server_data) self.assertSequenceEqual(test_data, server_data)

@ -148,11 +148,11 @@ class InsecureServerInsecureClient(unittest.TestCase):
# Check that Python's user agent string is a part of the full user agent # Check that Python's user agent string is a part of the full user agent
# string # string
received_initial_metadata_dict = dict(received_initial_metadata) received_initial_metadata_dict = dict(received_initial_metadata)
self.assertIn('user-agent', received_initial_metadata_dict) self.assertIn(b'user-agent', received_initial_metadata_dict)
self.assertIn('Python-gRPC-{}'.format(_grpcio_metadata.__version__), self.assertIn('Python-gRPC-{}'.format(_grpcio_metadata.__version__).encode(),
received_initial_metadata_dict['user-agent']) received_initial_metadata_dict[b'user-agent'])
self.assertEqual(method, request_event.call_details.method) self.assertEqual(method.encode(), request_event.call_details.method)
self.assertEqual(host, request_event.call_details.host) self.assertEqual(host.encode(), request_event.call_details.host)
self.assertLess(abs(deadline - request_event.call_details.deadline), self.assertLess(abs(deadline - request_event.call_details.deadline),
deadline_tolerance) deadline_tolerance)
@ -198,12 +198,12 @@ class InsecureServerInsecureClient(unittest.TestCase):
test_common.metadata_transmitted(server_initial_metadata, test_common.metadata_transmitted(server_initial_metadata,
client_result.initial_metadata)) client_result.initial_metadata))
elif client_result.type == _types.OpType.RECV_MESSAGE: elif client_result.type == _types.OpType.RECV_MESSAGE:
self.assertEqual(response, client_result.message) self.assertEqual(response.encode(), client_result.message)
elif client_result.type == _types.OpType.RECV_STATUS_ON_CLIENT: elif client_result.type == _types.OpType.RECV_STATUS_ON_CLIENT:
self.assertTrue( self.assertTrue(
test_common.metadata_transmitted(server_trailing_metadata, test_common.metadata_transmitted(server_trailing_metadata,
client_result.trailing_metadata)) client_result.trailing_metadata))
self.assertEqual(server_status_details, client_result.status.details) self.assertEqual(server_status_details.encode(), client_result.status.details)
self.assertEqual(server_status_code, client_result.status.code) self.assertEqual(server_status_code, client_result.status.code)
self.assertEqual(set([ self.assertEqual(set([
_types.OpType.SEND_INITIAL_METADATA, _types.OpType.SEND_INITIAL_METADATA,
@ -220,7 +220,7 @@ class InsecureServerInsecureClient(unittest.TestCase):
self.assertNotIn(client_result.type, found_server_op_types) self.assertNotIn(client_result.type, found_server_op_types)
found_server_op_types.add(server_result.type) found_server_op_types.add(server_result.type)
if server_result.type == _types.OpType.RECV_MESSAGE: if server_result.type == _types.OpType.RECV_MESSAGE:
self.assertEqual(request, server_result.message) self.assertEqual(request.encode(), server_result.message)
elif server_result.type == _types.OpType.RECV_CLOSE_ON_SERVER: elif server_result.type == _types.OpType.RECV_CLOSE_ON_SERVER:
self.assertFalse(server_result.cancelled) self.assertFalse(server_result.cancelled)
self.assertEqual(set([ self.assertEqual(set([

@ -37,7 +37,7 @@ from tests.unit import test_common
from tests.unit import resources from tests.unit import resources
_SSL_HOST_OVERRIDE = 'foo.test.google.fr' _SSL_HOST_OVERRIDE = b'foo.test.google.fr'
_CALL_CREDENTIALS_METADATA_KEY = 'call-creds-key' _CALL_CREDENTIALS_METADATA_KEY = 'call-creds-key'
_CALL_CREDENTIALS_METADATA_VALUE = 'call-creds-value' _CALL_CREDENTIALS_METADATA_VALUE = 'call-creds-value'
_EMPTY_FLAGS = 0 _EMPTY_FLAGS = 0

@ -0,0 +1,137 @@
# Copyright 2016, Google Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
# * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import unittest
import grpc
from grpc.framework.foundation import logging_pool
from tests.unit.framework.common import test_constants
_REQUEST = b''
_RESPONSE = b''
_UNARY_UNARY = b'/test/UnaryUnary'
_UNARY_STREAM = b'/test/UnaryStream'
_STREAM_UNARY = b'/test/StreamUnary'
_STREAM_STREAM = b'/test/StreamStream'
def handle_unary_unary(request, servicer_context):
return _RESPONSE
def handle_unary_stream(request, servicer_context):
for _ in range(test_constants.STREAM_LENGTH):
yield _RESPONSE
def handle_stream_unary(request_iterator, servicer_context):
for request in request_iterator:
pass
return _RESPONSE
def handle_stream_stream(request_iterator, servicer_context):
for request in request_iterator:
yield _RESPONSE
class _MethodHandler(grpc.RpcMethodHandler):
def __init__(self, request_streaming, response_streaming):
self.request_streaming = request_streaming
self.response_streaming = response_streaming
self.request_deserializer = None
self.response_serializer = None
self.unary_unary = None
self.unary_stream = None
self.stream_unary = None
self.stream_stream = None
if self.request_streaming and self.response_streaming:
self.stream_stream = handle_stream_stream
elif self.request_streaming:
self.stream_unary = handle_stream_unary
elif self.response_streaming:
self.unary_stream = handle_unary_stream
else:
self.unary_unary = handle_unary_unary
class _GenericHandler(grpc.GenericRpcHandler):
def service(self, handler_call_details):
if handler_call_details.method == _UNARY_UNARY:
return _MethodHandler(False, False)
elif handler_call_details.method == _UNARY_STREAM:
return _MethodHandler(False, True)
elif handler_call_details.method == _STREAM_UNARY:
return _MethodHandler(True, False)
elif handler_call_details.method == _STREAM_STREAM:
return _MethodHandler(True, True)
else:
return None
class EmptyMessageTest(unittest.TestCase):
def setUp(self):
self._server_pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
self._server = grpc.server((_GenericHandler(),), self._server_pool)
port = self._server.add_insecure_port('[::]:0')
self._server.start()
self._channel = grpc.insecure_channel('localhost:%d' % port)
def tearDown(self):
self._server.stop(0)
def testUnaryUnary(self):
response = self._channel.unary_unary(_UNARY_UNARY)(_REQUEST)
self.assertEqual(_RESPONSE, response)
def testUnaryStream(self):
response_iterator = self._channel.unary_stream(_UNARY_STREAM)(_REQUEST)
self.assertSequenceEqual(
[_RESPONSE] * test_constants.STREAM_LENGTH, list(response_iterator))
def testStreamUnary(self):
response = self._channel.stream_unary(_STREAM_UNARY)(
[_REQUEST] * test_constants.STREAM_LENGTH)
self.assertEqual(_RESPONSE, response)
def testStreamStream(self):
response_iterator = self._channel.stream_stream(_STREAM_STREAM)(
[_REQUEST] * test_constants.STREAM_LENGTH)
self.assertSequenceEqual(
[_RESPONSE] * test_constants.STREAM_LENGTH, list(response_iterator))
if __name__ == '__main__':
unittest.main(verbosity=2)

@ -153,7 +153,7 @@ class RoundTripTest(unittest.TestCase):
invocation_mate.tickets()[-1].termination, invocation_mate.tickets()[-1].termination,
links.Ticket.Termination.COMPLETION) links.Ticket.Termination.COMPLETION)
self.assertIs(invocation_mate.tickets()[-1].code, test_code) self.assertIs(invocation_mate.tickets()[-1].code, test_code)
self.assertEqual(invocation_mate.tickets()[-1].message, test_message) self.assertEqual(invocation_mate.tickets()[-1].message, test_message.encode())
def _perform_scenario_test(self, scenario): def _perform_scenario_test(self, scenario):
test_operation_id = object() test_operation_id = object()

@ -29,6 +29,8 @@
"""Test of gRPC Python's application-layer API.""" """Test of gRPC Python's application-layer API."""
from __future__ import division
import itertools import itertools
import threading import threading
import unittest import unittest
@ -41,9 +43,9 @@ from tests.unit.framework.common import test_constants
from tests.unit.framework.common import test_control from tests.unit.framework.common import test_control
_SERIALIZE_REQUEST = lambda bytestring: bytestring * 2 _SERIALIZE_REQUEST = lambda bytestring: bytestring * 2
_DESERIALIZE_REQUEST = lambda bytestring: bytestring[len(bytestring) / 2:] _DESERIALIZE_REQUEST = lambda bytestring: bytestring[len(bytestring) // 2:]
_SERIALIZE_RESPONSE = lambda bytestring: bytestring * 3 _SERIALIZE_RESPONSE = lambda bytestring: bytestring * 3
_DESERIALIZE_RESPONSE = lambda bytestring: bytestring[:len(bytestring) / 3] _DESERIALIZE_RESPONSE = lambda bytestring: bytestring[:len(bytestring) // 3]
_UNARY_UNARY = b'/test/UnaryUnary' _UNARY_UNARY = b'/test/UnaryUnary'
_UNARY_STREAM = b'/test/UnaryStream' _UNARY_STREAM = b'/test/UnaryStream'
@ -189,7 +191,7 @@ class RPCTest(unittest.TestCase):
self._server.add_generic_rpc_handlers((_GenericHandler(self._handler),)) self._server.add_generic_rpc_handlers((_GenericHandler(self._handler),))
self._server.start() self._server.start()
self._channel = grpc.insecure_channel(b'localhost:%d' % port) self._channel = grpc.insecure_channel('localhost:%d' % port)
# TODO(nathaniel): Why is this necessary, and only in some development # TODO(nathaniel): Why is this necessary, and only in some development
# environments? # environments?

@ -42,8 +42,8 @@ from tests.unit.framework.common import test_constants
_SERVER_HOST_OVERRIDE = 'foo.test.google.fr' _SERVER_HOST_OVERRIDE = 'foo.test.google.fr'
_PER_RPC_CREDENTIALS_METADATA_KEY = 'my-call-credentials-metadata-key' _PER_RPC_CREDENTIALS_METADATA_KEY = b'my-call-credentials-metadata-key'
_PER_RPC_CREDENTIALS_METADATA_VALUE = 'my-call-credentials-metadata-value' _PER_RPC_CREDENTIALS_METADATA_VALUE = b'my-call-credentials-metadata-value'
_GROUP = 'group' _GROUP = 'group'
_UNARY_UNARY = 'unary-unary' _UNARY_UNARY = 'unary-unary'

@ -61,7 +61,7 @@ class NotFoundTest(unittest.TestCase):
def test_future_stream_unary_not_found(self): def test_future_stream_unary_not_found(self):
rpc_future = self._generic_stub.future_stream_unary( rpc_future = self._generic_stub.future_stream_unary(
'grupe', 'mevvod', b'def', test_constants.LONG_TIMEOUT) 'grupe', 'mevvod', [b'def'], test_constants.LONG_TIMEOUT)
with self.assertRaises(face.LocalError) as exception_assertion_context: with self.assertRaises(face.LocalError) as exception_assertion_context:
rpc_future.result() rpc_future.result()
self.assertIs( self.assertIs(

@ -29,6 +29,8 @@
"""Tests of the base interface of RPC Framework.""" """Tests of the base interface of RPC Framework."""
from __future__ import division
import logging import logging
import random import random
import threading import threading
@ -54,13 +56,13 @@ class _Serialization(test_interfaces.Serialization):
return request + request return request + request
def deserialize_request(self, serialized_request): def deserialize_request(self, serialized_request):
return serialized_request[:len(serialized_request) / 2] return serialized_request[:len(serialized_request) // 2]
def serialize_response(self, response): def serialize_response(self, response):
return response * 3 return response * 3
def deserialize_response(self, serialized_response): def deserialize_response(self, serialized_response):
return serialized_response[2 * len(serialized_response) / 3:] return serialized_response[2 * len(serialized_response) // 3:]
def _advance(quadruples, operator, controller): def _advance(quadruples, operator, controller):

@ -61,6 +61,10 @@ def metadata_transmitted(original_metadata, transmitted_metadata):
original = collections.defaultdict(list) original = collections.defaultdict(list)
for key_value_pair in original_metadata: for key_value_pair in original_metadata:
key, value = tuple(key_value_pair) key, value = tuple(key_value_pair)
if not isinstance(key, bytes):
key = key.encode()
if not isinstance(value, bytes):
value = value.encode()
original[key].append(value) original[key].append(value)
transmitted = collections.defaultdict(list) transmitted = collections.defaultdict(list)
for key_value_pair in transmitted_metadata: for key_value_pair in transmitted_metadata:

@ -34,6 +34,12 @@
<%include file="../../apt_get_basic.include"/> <%include file="../../apt_get_basic.include"/>
<%include file="../../cxx_deps.include"/> <%include file="../../cxx_deps.include"/>
<%include file="../../run_tests_addons.include"/> <%include file="../../run_tests_addons.include"/>
# The clang-3.6 symlink for the default clang version was added
# to Ubuntu 16.04 recently, so make sure it's installed.
# Also install clang3.7.
RUN apt-get update && apt-get -y install clang-3.6 clang-3.7 && apt-get clean
# Define the default command. # Define the default command.
CMD ["bash"] CMD ["bash"]

@ -31,6 +31,7 @@
* *
*/ */
#include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
@ -38,6 +39,9 @@
#include "src/core/ext/client_config/uri_parser.h" #include "src/core/ext/client_config/uri_parser.h"
bool squelch = true;
bool leak_check = true;
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
char *s = gpr_malloc(size + 1); char *s = gpr_malloc(size + 1);
memcpy(s, data, size); memcpy(s, data, size);

@ -50,7 +50,8 @@
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// logging // logging
static const bool squelch = !true; bool squelch = true;
bool leak_check = true;
static void dont_log(gpr_log_func_args *args) {} static void dont_log(gpr_log_func_args *args) {}

@ -41,7 +41,8 @@
#include "test/core/util/memory_counters.h" #include "test/core/util/memory_counters.h"
#include "test/core/util/mock_endpoint.h" #include "test/core/util/mock_endpoint.h"
static const bool squelch = !true; bool squelch = true;
bool leak_check = true;
static void discard_write(gpr_slice slice) {} static void discard_write(gpr_slice slice) {}
@ -51,9 +52,10 @@ static void dont_log(gpr_log_func_args *args) {}
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
grpc_test_only_set_metadata_hash_seed(0); grpc_test_only_set_metadata_hash_seed(0);
// struct grpc_memory_counters counters; struct grpc_memory_counters counters;
if (squelch) gpr_set_log_function(dont_log); if (squelch) gpr_set_log_function(dont_log);
// grpc_memory_counters_init(); grpc_memory_counters_init();
if (leak_check) grpc_memory_counters_init();
grpc_init(); grpc_init();
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
@ -156,8 +158,10 @@ done:
grpc_byte_buffer_destroy(response_payload_recv); grpc_byte_buffer_destroy(response_payload_recv);
} }
grpc_shutdown(); grpc_shutdown();
// counters = grpc_memory_counters_snapshot(); if (leak_check) {
// grpc_memory_counters_destroy(); counters = grpc_memory_counters_snapshot();
// GPR_ASSERT(counters.total_size_relative == 0); grpc_memory_counters_destroy();
GPR_ASSERT(counters.total_size_relative == 0);
}
return 0; return 0;
} }

@ -38,7 +38,8 @@
#include "test/core/util/memory_counters.h" #include "test/core/util/memory_counters.h"
#include "test/core/util/mock_endpoint.h" #include "test/core/util/mock_endpoint.h"
static const bool squelch = !true; bool squelch = true;
bool leak_check = true;
static void discard_write(gpr_slice slice) {} static void discard_write(gpr_slice slice) {}
@ -49,9 +50,9 @@ static void dont_log(gpr_log_func_args *args) {}
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
grpc_test_only_set_metadata_hash_seed(0); grpc_test_only_set_metadata_hash_seed(0);
// struct grpc_memory_counters counters; struct grpc_memory_counters counters;
if (squelch) gpr_set_log_function(dont_log); if (squelch) gpr_set_log_function(dont_log);
// grpc_memory_counters_init(); if (leak_check) grpc_memory_counters_init();
grpc_init(); grpc_init();
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
@ -120,8 +121,10 @@ done:
grpc_server_destroy(server); grpc_server_destroy(server);
grpc_completion_queue_destroy(cq); grpc_completion_queue_destroy(cq);
grpc_shutdown(); grpc_shutdown();
// counters = grpc_memory_counters_snapshot(); if (leak_check) {
// grpc_memory_counters_destroy(); counters = grpc_memory_counters_snapshot();
// GPR_ASSERT(counters.total_size_relative == 0); grpc_memory_counters_destroy();
GPR_ASSERT(counters.total_size_relative == 0);
}
return 0; return 0;
} }

@ -31,6 +31,7 @@
* *
*/ */
#include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
@ -38,6 +39,9 @@
#include "src/core/lib/http/parser.h" #include "src/core/lib/http/parser.h"
bool squelch = true;
bool leak_check = true;
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
grpc_http_parser parser; grpc_http_parser parser;
grpc_http_request request; grpc_http_request request;

@ -31,6 +31,7 @@
* *
*/ */
#include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
@ -40,6 +41,9 @@
#include "src/core/lib/json/json.h" #include "src/core/lib/json/json.h"
#include "test/core/util/memory_counters.h" #include "test/core/util/memory_counters.h"
bool squelch = true;
bool leak_check = true;
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
char *s; char *s;
struct grpc_memory_counters counters; struct grpc_memory_counters counters;

@ -38,6 +38,9 @@
#include "src/core/ext/lb_policy/grpclb/load_balancer_api.h" #include "src/core/ext/lb_policy/grpclb/load_balancer_api.h"
bool squelch = true;
bool leak_check = true;
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
gpr_slice slice = gpr_slice_from_copied_buffer((const char *)data, size); gpr_slice slice = gpr_slice_from_copied_buffer((const char *)data, size);
grpc_grpclb_response *response; grpc_grpclb_response *response;

@ -38,6 +38,9 @@
#include "src/core/ext/lb_policy/grpclb/load_balancer_api.h" #include "src/core/ext/lb_policy/grpclb/load_balancer_api.h"
bool squelch = true;
bool leak_check = true;
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
gpr_slice slice = gpr_slice_from_copied_buffer((const char *)data, size); gpr_slice slice = gpr_slice_from_copied_buffer((const char *)data, size);
grpc_grpclb_serverlist *serverlist; grpc_grpclb_serverlist *serverlist;

@ -40,12 +40,15 @@
#include "src/core/ext/transport/chttp2/transport/hpack_parser.h" #include "src/core/ext/transport/chttp2/transport/hpack_parser.h"
bool squelch = true;
bool leak_check = true;
static void onhdr(void *ud, grpc_mdelem *md) { GRPC_MDELEM_UNREF(md); } static void onhdr(void *ud, grpc_mdelem *md) { GRPC_MDELEM_UNREF(md); }
static void dont_log(gpr_log_func_args *args) {} static void dont_log(gpr_log_func_args *args) {}
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
grpc_test_only_set_metadata_hash_seed(0); grpc_test_only_set_metadata_hash_seed(0);
gpr_set_log_function(dont_log); if (squelch) gpr_set_log_function(dont_log);
grpc_init(); grpc_init();
grpc_chttp2_hpack_parser parser; grpc_chttp2_hpack_parser parser;
grpc_chttp2_hpack_parser_init(&parser); grpc_chttp2_hpack_parser_init(&parser);

@ -31,13 +31,20 @@
* *
*/ */
#include <stdbool.h>
#include <grpc/support/log.h> #include <grpc/support/log.h>
#include "src/core/lib/iomgr/load_file.h" #include "src/core/lib/iomgr/load_file.h"
extern int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size); extern int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
extern bool squelch;
extern bool leak_check;
int main(int argc, char **argv) { int main(int argc, char **argv) {
gpr_slice buffer; gpr_slice buffer;
squelch = false;
leak_check = false;
GPR_ASSERT( GPR_ASSERT(
GRPC_LOG_IF_ERROR("load_file", grpc_load_file(argv[1], 0, &buffer))); GRPC_LOG_IF_ERROR("load_file", grpc_load_file(argv[1], 0, &buffer)));
LLVMFuzzerTestOneInput(GPR_SLICE_START_PTR(buffer), GPR_SLICE_LENGTH(buffer)); LLVMFuzzerTestOneInput(GPR_SLICE_START_PTR(buffer), GPR_SLICE_LENGTH(buffer));

@ -82,5 +82,11 @@ RUN apt-get install -y libzookeeper-mt-dev
RUN mkdir /var/local/jenkins RUN mkdir /var/local/jenkins
# The clang-3.6 symlink for the default clang version was added
# to Ubuntu 16.04 recently, so make sure it's installed.
# Also install clang3.7.
RUN apt-get update && apt-get -y install clang-3.6 clang-3.7 && apt-get clean
# Define the default command. # Define the default command.
CMD ["bash"] CMD ["bash"]

@ -69,6 +69,10 @@ sudo apt-get install -y \
python-pip \ python-pip \
python-setuptools \ python-setuptools \
python-yaml \ python-yaml \
python3-dev \
python3-pip \
python3-setuptools \
python3-yaml \
telnet \ telnet \
unzip \ unzip \
wget \ wget \

@ -34,6 +34,7 @@ set -ex
cd $(dirname $0)/../.. cd $(dirname $0)/../..
TOX_PYTHON_ENV="$1" TOX_PYTHON_ENV="$1"
PY_VERSION="${TOX_PYTHON_ENV: -2}"
ROOT=`pwd` ROOT=`pwd`
export LD_LIBRARY_PATH=$ROOT/libs/$CONFIG export LD_LIBRARY_PATH=$ROOT/libs/$CONFIG
@ -51,11 +52,25 @@ fi
tox -e ${TOX_PYTHON_ENV} --notest tox -e ${TOX_PYTHON_ENV} --notest
# We force the .so naming convention in PEP 3149 for side by side installation support
# Note this is the default in Python3, but explicitly disabled for Darwin, so we only
# use this hack for our testing environment.
if [ "$PY_VERSION" -gt "27" ]
then
mv $ROOT/src/python/grpcio/grpc/_cython/cygrpc.so $ROOT/src/python/grpcio/grpc/_cython/cygrpc.so.backup || true
fi
$ROOT/.tox/${TOX_PYTHON_ENV}/bin/python $ROOT/setup.py build $ROOT/.tox/${TOX_PYTHON_ENV}/bin/python $ROOT/setup.py build
$ROOT/.tox/${TOX_PYTHON_ENV}/bin/python $ROOT/setup.py build_py $ROOT/.tox/${TOX_PYTHON_ENV}/bin/python $ROOT/setup.py build_py
$ROOT/.tox/${TOX_PYTHON_ENV}/bin/python $ROOT/setup.py build_ext --inplace $ROOT/.tox/${TOX_PYTHON_ENV}/bin/python $ROOT/setup.py build_ext --inplace
$ROOT/.tox/${TOX_PYTHON_ENV}/bin/python $ROOT/setup.py gather --test $ROOT/.tox/${TOX_PYTHON_ENV}/bin/python $ROOT/setup.py gather --test
if [ "$PY_VERSION" -gt "27" ]
then
mv $ROOT/src/python/grpcio/grpc/_cython/cygrpc.so $ROOT/src/python/grpcio/grpc/_cython/cygrpc.cpython-${PY_VERSION}m.so || true
mv $ROOT/src/python/grpcio/grpc/_cython/cygrpc.so.backup $ROOT/src/python/grpcio/grpc/_cython/cygrpc.so || true
fi
# Build the health checker # Build the health checker
$ROOT/.tox/${TOX_PYTHON_ENV}/bin/python $ROOT/src/python/grpcio_health_checking/setup.py build $ROOT/.tox/${TOX_PYTHON_ENV}/bin/python $ROOT/src/python/grpcio_health_checking/setup.py build
$ROOT/.tox/${TOX_PYTHON_ENV}/bin/python $ROOT/src/python/grpcio_health_checking/setup.py build_py $ROOT/.tox/${TOX_PYTHON_ENV}/bin/python $ROOT/src/python/grpcio_health_checking/setup.py build_py

@ -55,3 +55,4 @@ fi
mkdir -p $ROOT/reports mkdir -p $ROOT/reports
rm -rf $ROOT/reports/python-coverage rm -rf $ROOT/reports/python-coverage
(mv -T $ROOT/htmlcov $ROOT/reports/python-coverage) || true (mv -T $ROOT/htmlcov $ROOT/reports/python-coverage) || true

@ -246,11 +246,17 @@ class CLanguage(object):
def makefile_name(self): def makefile_name(self):
return 'Makefile' return 'Makefile'
def _clang_make_options(self): def _clang_make_options(self, version_suffix=''):
return ['CC=clang', 'CXX=clang++', 'LD=clang', 'LDXX=clang++'] return ['CC=clang%s' % version_suffix,
'CXX=clang++%s' % version_suffix,
def _gcc44_make_options(self): 'LD=clang%s' % version_suffix,
return ['CC=gcc-4.4', 'CXX=g++-4.4', 'LD=gcc-4.4', 'LDXX=g++-4.4'] 'LDXX=clang++%s' % version_suffix]
def _gcc_make_options(self, version_suffix):
return ['CC=gcc%s' % version_suffix,
'CXX=g++%s' % version_suffix,
'LD=gcc%s' % version_suffix,
'LDXX=g++%s' % version_suffix]
def _compiler_options(self, use_docker, compiler): def _compiler_options(self, use_docker, compiler):
"""Returns docker distro and make options to use for given compiler.""" """Returns docker distro and make options to use for given compiler."""
@ -260,13 +266,20 @@ class CLanguage(object):
if compiler == 'gcc4.9' or compiler == 'default': if compiler == 'gcc4.9' or compiler == 'default':
return ('jessie', []) return ('jessie', [])
elif compiler == 'gcc4.4': elif compiler == 'gcc4.4':
return ('wheezy', self._gcc44_make_options()) return ('wheezy', self._gcc_make_options(version_suffix='-4.4'))
elif compiler == 'gcc4.6':
return ('wheezy', self._gcc_make_options(version_suffix='-4.6'))
elif compiler == 'gcc5.3': elif compiler == 'gcc5.3':
return ('ubuntu1604', []) return ('ubuntu1604', [])
elif compiler == 'clang3.4': elif compiler == 'clang3.4':
# on ubuntu1404, clang-3.4 alias doesn't exist, just use 'clang'
return ('ubuntu1404', self._clang_make_options()) return ('ubuntu1404', self._clang_make_options())
elif compiler == 'clang3.5':
return ('jessie', self._clang_make_options(version_suffix='-3.5'))
elif compiler == 'clang3.6': elif compiler == 'clang3.6':
return ('ubuntu1604', self._clang_make_options()) return ('ubuntu1604', self._clang_make_options(version_suffix='-3.6'))
elif compiler == 'clang3.7':
return ('ubuntu1604', self._clang_make_options(version_suffix='-3.7'))
else: else:
raise Exception('Compiler %s not supported.' % compiler) raise Exception('Compiler %s not supported.' % compiler)
@ -374,7 +387,7 @@ class PythonLanguage(object):
def configure(self, config, args): def configure(self, config, args):
self.config = config self.config = config
self.args = args self.args = args
self._tox_env = self._get_tox_env(self.args.compiler) self._tox_envs = self._get_tox_envs(self.args.compiler)
def test_specs(self): def test_specs(self):
# load list of known test suites # load list of known test suites
@ -386,19 +399,21 @@ class PythonLanguage(object):
os.path.abspath('src/python/grpcio_health_checking')) os.path.abspath('src/python/grpcio_health_checking'))
if self.config.build_config != 'gcov': if self.config.build_config != 'gcov':
return [self.config.job_spec( return [self.config.job_spec(
['tools/run_tests/run_python.sh', self._tox_env], ['tools/run_tests/run_python.sh', tox_env],
None, None,
environ=dict(environment.items() + environ=dict(environment.items() +
[('GRPC_PYTHON_TESTRUNNER_FILTER', suite_name)]), [('GRPC_PYTHON_TESTRUNNER_FILTER', suite_name)]),
shortname='py.test.%s' % suite_name, shortname='%s.test.%s' % (tox_env, suite_name),
timeout_seconds=5*60) timeout_seconds=5*60)
for suite_name in tests_json] for suite_name in tests_json
for tox_env in self._tox_envs]
else: else:
return [self.config.job_spec(['tools/run_tests/run_python.sh'], return [self.config.job_spec(['tools/run_tests/run_python.sh', tox_env],
None, None,
environ=environment, environ=environment,
shortname='py.test.coverage', shortname='%s.test.coverage' % tox_env,
timeout_seconds=15*60)] timeout_seconds=15*60)
for tox_env in self._tox_envs]
def pre_build_steps(self): def pre_build_steps(self):
@ -411,7 +426,8 @@ class PythonLanguage(object):
return [] return []
def build_steps(self): def build_steps(self):
return [['tools/run_tests/build_python.sh', self._tox_env]] return [['tools/run_tests/build_python.sh', tox_env]
for tox_env in self._tox_envs]
def post_tests_steps(self): def post_tests_steps(self):
return [] return []
@ -422,12 +438,14 @@ class PythonLanguage(object):
def dockerfile_dir(self): def dockerfile_dir(self):
return 'tools/dockerfile/test/python_jessie_%s' % _docker_arch_suffix(self.args.arch) return 'tools/dockerfile/test/python_jessie_%s' % _docker_arch_suffix(self.args.arch)
def _get_tox_env(self, compiler): def _get_tox_envs(self, compiler):
"""Returns name of tox environment based on selected compiler.""" """Returns name of tox environment based on selected compiler."""
if compiler == 'python2.7' or compiler == 'default': if compiler == 'default':
return 'py27' return ('py27', 'py34')
elif compiler == 'python2.7':
return ('py27',)
elif compiler == 'python3.4': elif compiler == 'python3.4':
return 'py34' return ('py34',)
else: else:
raise Exception('Compiler %s not supported.' % compiler) raise Exception('Compiler %s not supported.' % compiler)
@ -816,8 +834,8 @@ argp.add_argument('--arch',
help='Selects architecture to target. For some platforms "default" is the only supported choice.') help='Selects architecture to target. For some platforms "default" is the only supported choice.')
argp.add_argument('--compiler', argp.add_argument('--compiler',
choices=['default', choices=['default',
'gcc4.4', 'gcc4.9', 'gcc5.3', 'gcc4.4', 'gcc4.6', 'gcc4.9', 'gcc5.3',
'clang3.4', 'clang3.6', 'clang3.4', 'clang3.5', 'clang3.6', 'clang3.7',
'vs2010', 'vs2013', 'vs2015', 'vs2010', 'vs2013', 'vs2015',
'python2.7', 'python3.4', 'python2.7', 'python3.4',
'node0.12', 'node4', 'node5'], 'node0.12', 'node4', 'node5'],

@ -27516,6 +27516,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/api_fuzzer_corpus/0e79b68aa8b9c336f0bbf9029928c53079711423"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "api_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/api_fuzzer_corpus/0ea509d249ae28faba8980aacb972c7ea28d3fd5" "test/core/end2end/fuzzers/api_fuzzer_corpus/0ea509d249ae28faba8980aacb972c7ea28d3fd5"
@ -27975,6 +27992,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/api_fuzzer_corpus/1560af88445d6c1e8b1300047f33056dce198e02"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "api_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/api_fuzzer_corpus/157586c7c0ba8fd0dc9bfc2426229a7da934cec2" "test/core/end2end/fuzzers/api_fuzzer_corpus/157586c7c0ba8fd0dc9bfc2426229a7da934cec2"
@ -31936,6 +31970,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/api_fuzzer_corpus/48caf755ddcc6c45d3416ba6ab44709f360eb82b"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "api_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/api_fuzzer_corpus/48f56289592da153b3c50bcc26ad6d4d3a7e443b" "test/core/end2end/fuzzers/api_fuzzer_corpus/48f56289592da153b3c50bcc26ad6d4d3a7e443b"
@ -34758,6 +34809,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/api_fuzzer_corpus/7030cb2c62b289459e459bc54bd84c8d7e6f5a98"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "api_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/api_fuzzer_corpus/705c87b99197c87eb2ed148f8b3fdc60f8616f15" "test/core/end2end/fuzzers/api_fuzzer_corpus/705c87b99197c87eb2ed148f8b3fdc60f8616f15"
@ -36084,6 +36152,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/api_fuzzer_corpus/81f8c545d77d93e6cb8239e9e4a4d7f8f8beeee9"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "api_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/api_fuzzer_corpus/820d5ba2e9d91563dae39a1b02833fbef1e6d8f1" "test/core/end2end/fuzzers/api_fuzzer_corpus/820d5ba2e9d91563dae39a1b02833fbef1e6d8f1"
@ -39705,6 +39790,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/api_fuzzer_corpus/b7d02f4d12cd0b5442a04675e69f98fbdabc775a"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "api_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/api_fuzzer_corpus/b7f282fbd77193d822df9c8156370398e1fd099c" "test/core/end2end/fuzzers/api_fuzzer_corpus/b7f282fbd77193d822df9c8156370398e1fd099c"
@ -41575,6 +41677,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/api_fuzzer_corpus/ce6a90cb7d395fea7aa54ee9f7061cc45f5494d7"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "api_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/api_fuzzer_corpus/ceecce905981d8291a79fe32f89e8be688dfee7e" "test/core/end2end/fuzzers/api_fuzzer_corpus/ceecce905981d8291a79fe32f89e8be688dfee7e"
@ -41745,6 +41864,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/api_fuzzer_corpus/crash-482e9bdce0e13df2a77eef75a1c07d38ee28f4ab"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "api_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4ae4941b4c3f857966a0e3c05f789a0a5ae15bbf" "test/core/end2end/fuzzers/api_fuzzer_corpus/crash-4ae4941b4c3f857966a0e3c05f789a0a5ae15bbf"
@ -44142,6 +44278,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/api_fuzzer_corpus/e94428d78182060ff6309dd626cf6b3ebeed88d6"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "api_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/api_fuzzer_corpus/ea2cf809383d8725bec1b44ab774f04b3e6d5ae5" "test/core/end2end/fuzzers/api_fuzzer_corpus/ea2cf809383d8725bec1b44ab774f04b3e6d5ae5"
@ -71444,6 +71597,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/05551028437699c8650f5d08eb5f95ee25adf436"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "server_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/05c3a0390d0f52d241728926fa901599a47e4606" "test/core/end2end/fuzzers/server_fuzzer_corpus/05c3a0390d0f52d241728926fa901599a47e4606"
@ -71478,6 +71648,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/06285b50669cc16463db009ac821f99cf1ec2e24"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "server_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/06bd2f82fefb9943787d63ea359f9b77072380c2" "test/core/end2end/fuzzers/server_fuzzer_corpus/06bd2f82fefb9943787d63ea359f9b77072380c2"
@ -72277,6 +72464,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/23c582f6e23c7bbc9ae7b039b3b4e2ccdea3d5d2"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "server_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/23f261e44d54a2736f6e288128d98db9e5015206" "test/core/end2end/fuzzers/server_fuzzer_corpus/23f261e44d54a2736f6e288128d98db9e5015206"
@ -72906,6 +73110,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/395aea4fcfea081fc0d2733fff2d14405439fa72"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "server_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/39ea47bb.bin" "test/core/end2end/fuzzers/server_fuzzer_corpus/39ea47bb.bin"
@ -73093,6 +73314,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/404e234751b01dd0b51f9e7610f787253b074528"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "server_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/407607d2.bin" "test/core/end2end/fuzzers/server_fuzzer_corpus/407607d2.bin"
@ -73127,6 +73365,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/4123bd764c04385191342ea64918408140313714"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "server_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/418f392319c44d06a018ce4c62569d527829177a" "test/core/end2end/fuzzers/server_fuzzer_corpus/418f392319c44d06a018ce4c62569d527829177a"
@ -73484,6 +73739,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/4f96a5fba4d11401eb22d4b1e365fbbb2d684f24"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "server_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/4f97bd97ab5dc6b4c0f62f8459be8a9593dc83b3" "test/core/end2end/fuzzers/server_fuzzer_corpus/4f97bd97ab5dc6b4c0f62f8459be8a9593dc83b3"
@ -74028,6 +74300,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/609706c57e848ea58d7ca14fe6cc253322f3e8ce"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "server_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/61e798bdd49b339983fea4ccfe18efe44afbd69b" "test/core/end2end/fuzzers/server_fuzzer_corpus/61e798bdd49b339983fea4ccfe18efe44afbd69b"
@ -74827,6 +75116,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/89cd90fb47bb9eb289e8126b26021ee00d572d95"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "server_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/8b186384.bin" "test/core/end2end/fuzzers/server_fuzzer_corpus/8b186384.bin"
@ -75201,6 +75507,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/99a1acc96512c1155f91afa378e2345726d307c3"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "server_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/9a176b6f7e0dc5f681a1788d8954f76fabd08cad" "test/core/end2end/fuzzers/server_fuzzer_corpus/9a176b6f7e0dc5f681a1788d8954f76fabd08cad"
@ -76476,6 +76799,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/crash-ccf36bef9318fe6d5e5e1560c5485cdc87d0a701"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "server_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/crash-dae0f07934a527989f23f06e630710ff6ca8c809" "test/core/end2end/fuzzers/server_fuzzer_corpus/crash-dae0f07934a527989f23f06e630710ff6ca8c809"
@ -76969,6 +77309,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/ec4949487fa84f0cead39521b51f837af9dc784a"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "server_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/ed8da77f.bin" "test/core/end2end/fuzzers/server_fuzzer_corpus/ed8da77f.bin"
@ -77462,6 +77819,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-0292270056246b7a4ccd2e7d0356665cef307ef2"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "server_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-082763e16153cb6b8f3f5308cd060e822f475e5a" "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-082763e16153cb6b8f3f5308cd060e822f475e5a"
@ -77479,6 +77853,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-098ec93ded3a20e6043d11e9cc6066351e257f8e"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "server_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-0aa52e00ddd54f8e129430852c2da95650c354b0" "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-0aa52e00ddd54f8e129430852c2da95650c354b0"
@ -77581,6 +77972,57 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-1dc659f500e7bee41a4fee4423ade8332c162cc0"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "server_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{
"args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-350b5da741597222c98fe86768432507850317f5"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "server_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{
"args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-395aea4fcfea081fc0d2733fff2d14405439fa72"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "server_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-3991c873ba814d0cd03a67d25fff0c8fe8713aca" "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-3991c873ba814d0cd03a67d25fff0c8fe8713aca"
@ -77615,6 +78057,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-45cf8ac5faa9c7b15baf9281e8d7e0b4e103f0e0"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "server_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-4c6da955e4c101b81a62b2f8e934d94a62ae534b" "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-4c6da955e4c101b81a62b2f8e934d94a62ae534b"
@ -77666,6 +78125,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-60a9f77951c5059616764894e1963d83d478edfe"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "server_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-63ebf780ee6c2003eba622686a4bf94c503ad96e" "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-63ebf780ee6c2003eba622686a4bf94c503ad96e"
@ -77819,6 +78295,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-97a338fa892093ed5013a76b96b35dd112df3342"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "server_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-9a176b6f7e0dc5f681a1788d8954f76fabd08cad" "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-9a176b6f7e0dc5f681a1788d8954f76fabd08cad"
@ -77853,6 +78346,40 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-a1b2cfcf0997acb13a32fc5c004f57d9e9bc4275"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "server_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{
"args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-a1ed26e6f82ca0e81e3f415bd8b0b8b520d3927b"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "server_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-a61a28cf78149518466b87e5463ec5c771dc504e" "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-a61a28cf78149518466b87e5463ec5c771dc504e"
@ -78125,6 +78652,23 @@
], ],
"uses_polling": false "uses_polling": false
}, },
{
"args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-f412afea6b01aa53da919a41a65ffbf9885f2d65"
],
"ci_platforms": [
"linux"
],
"cpu_cost": 0.1,
"exclude_configs": [],
"flaky": false,
"language": "c",
"name": "server_fuzzer_one_entry",
"platforms": [
"linux"
],
"uses_polling": false
},
{ {
"args": [ "args": [
"test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-f67be653815f6c2c10eea55c8009e1167ac9c20b" "test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-f67be653815f6c2c10eea55c8009e1167ac9c20b"

Loading…
Cancel
Save