1<?php
2/*
3 *
4 * Copyright 2015 gRPC authors.
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 *     http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 */
19class SecureEndToEndTest extends PHPUnit_Framework_TestCase
20{
21    public function setUp()
22    {
23        $credentials = Grpc\ChannelCredentials::createSsl(
24            file_get_contents(dirname(__FILE__).'/../data/ca.pem'));
25        $server_credentials = Grpc\ServerCredentials::createSsl(
26            null,
27            file_get_contents(dirname(__FILE__).'/../data/server1.key'),
28            file_get_contents(dirname(__FILE__).'/../data/server1.pem'));
29        $this->server = new Grpc\Server();
30        $this->port = $this->server->addSecureHttp2Port('0.0.0.0:0',
31                                              $server_credentials);
32        $this->server->start();
33        $this->host_override = 'foo.test.google.fr';
34        $this->channel = new Grpc\Channel(
35            'localhost:'.$this->port,
36            [
37            'force_new' => true,
38            'grpc.ssl_target_name_override' => $this->host_override,
39            'grpc.default_authority' => $this->host_override,
40            'credentials' => $credentials,
41            ]
42        );
43    }
44
45    public function tearDown()
46    {
47        $this->channel->close();
48        unset($this->server);
49    }
50
51    public function testSimpleRequestBody()
52    {
53        $deadline = Grpc\Timeval::infFuture();
54        $status_text = 'xyz';
55        $call = new Grpc\Call($this->channel,
56                              'dummy_method',
57                              $deadline,
58                              $this->host_override);
59
60        $event = $call->startBatch([
61            Grpc\OP_SEND_INITIAL_METADATA => [],
62            Grpc\OP_SEND_CLOSE_FROM_CLIENT => true,
63        ]);
64
65        $this->assertTrue($event->send_metadata);
66        $this->assertTrue($event->send_close);
67
68        $event = $this->server->requestCall();
69        $this->assertSame('dummy_method', $event->method);
70        $server_call = $event->call;
71
72        $event = $server_call->startBatch([
73            Grpc\OP_SEND_INITIAL_METADATA => [],
74            Grpc\OP_SEND_STATUS_FROM_SERVER => [
75                'metadata' => [],
76                'code' => Grpc\STATUS_OK,
77                'details' => $status_text,
78            ],
79            Grpc\OP_RECV_CLOSE_ON_SERVER => true,
80        ]);
81
82        $this->assertTrue($event->send_metadata);
83        $this->assertTrue($event->send_status);
84        $this->assertFalse($event->cancelled);
85
86        $event = $call->startBatch([
87            Grpc\OP_RECV_INITIAL_METADATA => true,
88            Grpc\OP_RECV_STATUS_ON_CLIENT => true,
89        ]);
90
91        $this->assertSame([], $event->metadata);
92        $status = $event->status;
93        $this->assertSame([], $status->metadata);
94        $this->assertSame(Grpc\STATUS_OK, $status->code);
95        $this->assertSame($status_text, $status->details);
96
97        unset($call);
98        unset($server_call);
99    }
100
101    public function testMessageWriteFlags()
102    {
103        $deadline = Grpc\Timeval::infFuture();
104        $req_text = 'message_write_flags_test';
105        $status_text = 'xyz';
106        $call = new Grpc\Call($this->channel,
107                              'dummy_method',
108                              $deadline,
109                              $this->host_override);
110
111        $event = $call->startBatch([
112            Grpc\OP_SEND_INITIAL_METADATA => [],
113            Grpc\OP_SEND_MESSAGE => ['message' => $req_text,
114                                     'flags' => Grpc\WRITE_NO_COMPRESS, ],
115            Grpc\OP_SEND_CLOSE_FROM_CLIENT => true,
116        ]);
117
118        $this->assertTrue($event->send_metadata);
119        $this->assertTrue($event->send_close);
120
121        $event = $this->server->requestCall();
122        $this->assertSame('dummy_method', $event->method);
123        $server_call = $event->call;
124
125        $event = $server_call->startBatch([
126            Grpc\OP_SEND_INITIAL_METADATA => [],
127            Grpc\OP_SEND_STATUS_FROM_SERVER => [
128                'metadata' => [],
129                'code' => Grpc\STATUS_OK,
130                'details' => $status_text,
131            ],
132        ]);
133
134        $event = $call->startBatch([
135            Grpc\OP_RECV_INITIAL_METADATA => true,
136            Grpc\OP_RECV_STATUS_ON_CLIENT => true,
137        ]);
138
139        $this->assertSame([], $event->metadata);
140        $status = $event->status;
141        $this->assertSame([], $status->metadata);
142        $this->assertSame(Grpc\STATUS_OK, $status->code);
143        $this->assertSame($status_text, $status->details);
144
145        unset($call);
146        unset($server_call);
147    }
148
149    public function testClientServerFullRequestResponse()
150    {
151        $deadline = Grpc\Timeval::infFuture();
152        $req_text = 'client_server_full_request_response';
153        $reply_text = 'reply:client_server_full_request_response';
154        $status_text = 'status:client_server_full_response_text';
155
156        $call = new Grpc\Call($this->channel,
157                              'dummy_method',
158                              $deadline,
159                              $this->host_override);
160
161        $event = $call->startBatch([
162            Grpc\OP_SEND_INITIAL_METADATA => [],
163            Grpc\OP_SEND_CLOSE_FROM_CLIENT => true,
164            Grpc\OP_SEND_MESSAGE => ['message' => $req_text],
165        ]);
166
167        $this->assertTrue($event->send_metadata);
168        $this->assertTrue($event->send_close);
169        $this->assertTrue($event->send_message);
170
171        $event = $this->server->requestCall();
172        $this->assertSame('dummy_method', $event->method);
173        $server_call = $event->call;
174
175        $event = $server_call->startBatch([
176            Grpc\OP_SEND_INITIAL_METADATA => [],
177            Grpc\OP_SEND_MESSAGE => ['message' => $reply_text],
178            Grpc\OP_SEND_STATUS_FROM_SERVER => [
179                'metadata' => [],
180                'code' => Grpc\STATUS_OK,
181                'details' => $status_text,
182            ],
183            Grpc\OP_RECV_MESSAGE => true,
184            Grpc\OP_RECV_CLOSE_ON_SERVER => true,
185        ]);
186
187        $this->assertTrue($event->send_metadata);
188        $this->assertTrue($event->send_status);
189        $this->assertTrue($event->send_message);
190        $this->assertFalse($event->cancelled);
191        $this->assertSame($req_text, $event->message);
192
193        $event = $call->startBatch([
194            Grpc\OP_RECV_INITIAL_METADATA => true,
195            Grpc\OP_RECV_MESSAGE => true,
196            Grpc\OP_RECV_STATUS_ON_CLIENT => true,
197        ]);
198
199        $this->assertSame([], $event->metadata);
200        $this->assertSame($reply_text, $event->message);
201        $status = $event->status;
202        $this->assertSame([], $status->metadata);
203        $this->assertSame(Grpc\STATUS_OK, $status->code);
204        $this->assertSame($status_text, $status->details);
205
206        unset($call);
207        unset($server_call);
208    }
209}
210