Skip to content

Commit 5fdf55b

Browse files
committed
[HttpClient] Added more functionnal tests
1 parent 29a2f17 commit 5fdf55b

File tree

5 files changed

+160
-0
lines changed

5 files changed

+160
-0
lines changed

.travis.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,11 @@ before_install:
141141
(cd php-$MIN_PHP && ./configure --enable-sigchild --enable-pcntl && make -j2)
142142
fi
143143
144+
- |
145+
# Install vulcain
146+
wget https://github.com/symfony/binary-utils/releases/download/v0.1/vulcain_0.1.3_Linux_x86_64.tar.gz -O - | tar xz
147+
sudo mv vulcain /usr/local/bin
148+
144149
- |
145150
# php.ini configuration
146151
for PHP in $TRAVIS_PHP_VERSION $php_extra; do

src/Symfony/Component/HttpClient/Tests/CurlHttpClientTest.php

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,14 @@
1313

1414
use Psr\Log\AbstractLogger;
1515
use Symfony\Component\HttpClient\CurlHttpClient;
16+
use Symfony\Component\Process\Exception\ProcessFailedException;
17+
use Symfony\Component\Process\Process;
1618
use Symfony\Contracts\HttpClient\HttpClientInterface;
1719

1820
/**
21+
* Some test needs HTTP2 Push capability and this feature yet is not available on ubuntu with ondrej PPA.
22+
* You can run theses tests with docker:
23+
* docker run -it --rm -v $(pwd):/app -v /usr/local/bin/vulcain:/usr/local/bin/vulcain -w /app php:7.3-alpine ./phpunit src/Symfony/Component/HttpClient/Tests/CurlHttpClientTest.php --filter testHttp2Push
1924
* @requires extension curl
2025
*/
2126
class CurlHttpClientTest extends HttpClientTestCase
@@ -66,4 +71,86 @@ public function log($level, $message, array $context = []): void
6671
];
6772
$this->assertSame($expected, $logger->logs);
6873
}
74+
75+
/**
76+
* @requires PHP 7.2.17
77+
*/
78+
public function testHttp2PushVulcain()
79+
{
80+
if (\PHP_VERSION_ID >= 70300 && \PHP_VERSION_ID < 70304) {
81+
$this->markTestSkipped('PHP 7.3.0 to 7.3.3 don\'t support HTTP/2 PUSH');
82+
}
83+
84+
if (!\defined('CURLMOPT_PUSHFUNCTION') || 0x073d00 > ($v = curl_version())['version_number'] || !(CURL_VERSION_HTTP2 & $v['features'])) {
85+
$this->markTestSkipped('curl <7.61 is used or it is not compiled with support for HTTP/2 PUSH');
86+
}
87+
88+
$this->startVulcain();
89+
90+
$logger = new class() extends AbstractLogger {
91+
public $logs = [];
92+
93+
public function log($level, $message, array $context = []): void
94+
{
95+
$this->logs[] = $message;
96+
}
97+
};
98+
99+
$client = new CurlHttpClient(['verify_peer' => false, 'verify_host' => false]);
100+
$client->setLogger($logger);
101+
102+
$responseAsArray = $client->request('GET', 'https://127.0.0.1:3000/json', [
103+
'headers' => [
104+
'Preload' => '/documents/*/id',
105+
]
106+
])->toArray();
107+
foreach ($responseAsArray['documents'] as $document) {
108+
$docAsArray = $client->request('GET', 'https://127.0.0.1:3000' . $document['id'])->toArray();
109+
}
110+
111+
$expected = [
112+
'Request: "GET https://127.0.0.1:3000/json"',
113+
'Queueing pushed response: "https://127.0.0.1:3000/json/1"',
114+
'Queueing pushed response: "https://127.0.0.1:3000/json/2"',
115+
'Queueing pushed response: "https://127.0.0.1:3000/json/3"',
116+
'Response: "200 https://127.0.0.1:3000/json"',
117+
'Unused pushed response: "https://127.0.0.1:3000/json/1"',
118+
'Unused pushed response: "https://127.0.0.1:3000/json/2"',
119+
'Unused pushed response: "https://127.0.0.1:3000/json/3"',
120+
'Accepting pushed response: "GET https://127.0.0.1:3000/json/1"',
121+
'Response: "200 https://127.0.0.1:3000/json/1"',
122+
'Unused pushed response: "https://127.0.0.1:3000/json/2"',
123+
'Unused pushed response: "https://127.0.0.1:3000/json/3"',
124+
'Accepting pushed response: "GET https://127.0.0.1:3000/json/2"',
125+
'Response: "200 https://127.0.0.1:3000/json/2"',
126+
'Unused pushed response: "https://127.0.0.1:3000/json/3"',
127+
'Accepting pushed response: "GET https://127.0.0.1:3000/json/3"',
128+
'Response: "200 https://127.0.0.1:3000/json/3"',
129+
];
130+
$this->assertSame($expected, $logger->logs);
131+
}
132+
133+
private function startVulcain()
134+
{
135+
$process = new Process(['vulcain'], null, [
136+
'DEBUG' => 1,
137+
'UPSTREAM' => 'http://127.0.0.1:8057',
138+
'ADDR' => ':3000',
139+
'KEY_FILE' => 'src/Symfony/Contracts/HttpClient/Test/Fixtures/tls/server.key',
140+
'CERT_FILE'=> 'src/Symfony/Contracts/HttpClient/Test/Fixtures/tls/server.crt',
141+
]);
142+
$process->start();
143+
144+
register_shutdown_function(function() use ($process) {
145+
$process->stop();
146+
147+
echo $process->getOutput();
148+
});
149+
150+
usleep(1000000);
151+
152+
if (!$process->isRunning()) {
153+
throw new ProcessFailedException($process);
154+
}
155+
}
69156
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDPjCCAiYCCQDpVvfmCZt2GzANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJV
3+
UzEUMBIGA1UEBwwLR290aGFtIENpdHkxEjAQBgNVBAMMCWxvY2FsaG9zdDEoMCYG
4+
CSqGSIb3DQEJARYZZHVuZ2xhcyttZXJjdXJlQGdtYWlsLmNvbTAeFw0xOTAxMjMx
5+
NTUzMzlaFw0yOTAxMjAxNTUzMzlaMGExCzAJBgNVBAYTAlVTMRQwEgYDVQQHDAtH
6+
b3RoYW0gQ2l0eTESMBAGA1UEAwwJbG9jYWxob3N0MSgwJgYJKoZIhvcNAQkBFhlk
7+
dW5nbGFzK21lcmN1cmVAZ21haWwuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
8+
MIIBCgKCAQEAuKnXkBSJwOwkKfR58wP/yLYW9QFX2THoqN8iffangRmZwc5KLE6F
9+
1S8jYMv3JGiJ95Ij3MezAfuBCdgPqqP8JrR1XwjR1RFZMOL/4U9R9OuMVng04PLw
10+
L6TzKoEtZuExHUWFP0+5AYblgno2hoN/HVuox8m6zQrBNcbhTgDIjP5Hn491d9od
11+
MtS3OxksDLr1UIOUGUWF7MQMN7lsN7rgT5qxoCkcAGAB4GPOA23HMt2zt4afDiI7
12+
lAmuv8MKkTmBCcFe+q+U7o6wMxkjGstzAWRibtwzR4ejPwdO7se23MXCWGPvF16Z
13+
tu1ip+e+waRus9o5UnyGaVPFAw8iCTC/KwIDAQABMA0GCSqGSIb3DQEBCwUAA4IB
14+
AQB42AW7E57yOky8GpsKLoa9u7okwvvg8CQJ117X8a2MElBGnmMd9tjLa/pXAx2I
15+
bN7jSTSadXiPNYCx4ueiJa4Dwy+C8YkwUbhRf3+mc7Chnz0SXouTjh7OUeeA06jS
16+
W2VAR2pKB0pdJtAkXxIy21Juu8KF5uZqVq1oimgKw2lRUIMdKaqsrVwESk6u5Ojj
17+
3DS40q9DzFnwKGCuZpspvMdWYLscotzLrCbnHp+guWDigEHS3CKzKbNo327nVg6X
18+
7UjqqtPZ2mCsnUx3QTDJsr3gcSqhzmB+Q6I/0Q2Nx/aMmbsNegu+LC3GjFtL59Bv
19+
B8pB/MxID0j47SwPKQghZvb3
20+
-----END CERTIFICATE-----
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIIEpAIBAAKCAQEAuKnXkBSJwOwkKfR58wP/yLYW9QFX2THoqN8iffangRmZwc5K
3+
LE6F1S8jYMv3JGiJ95Ij3MezAfuBCdgPqqP8JrR1XwjR1RFZMOL/4U9R9OuMVng0
4+
4PLwL6TzKoEtZuExHUWFP0+5AYblgno2hoN/HVuox8m6zQrBNcbhTgDIjP5Hn491
5+
d9odMtS3OxksDLr1UIOUGUWF7MQMN7lsN7rgT5qxoCkcAGAB4GPOA23HMt2zt4af
6+
DiI7lAmuv8MKkTmBCcFe+q+U7o6wMxkjGstzAWRibtwzR4ejPwdO7se23MXCWGPv
7+
F16Ztu1ip+e+waRus9o5UnyGaVPFAw8iCTC/KwIDAQABAoIBAQCczVNGe7oRADMh
8+
EP/wM4ghhUTvHAndWrzFkFs4fJX1UKi34ZQoFTEdOZ6f1fHwj3f/qa8cDNJar5X9
9+
puJ+siotL3Suks2iT83dbhN63SCpiM2sqvuzu3Xp7vWwNOo5fqR2x46CmQ5uVn5S
10+
EbZ09/mbEza5FvmwnB49rLepxY6F8P+vK5ZnCZYS2SHpOxv3U9wG8gmcHRI9ejbC
11+
X9rwuu3oT23bfbJ0tn6Qh8O3R1kXZUUXqnxsn554cZZrXg5+ygbt4HfDVWMLpqy/
12+
5wG0FCpU8QvjF4L8qErP7TZRrWGFtti1RtACbu9LrWvO/74v54td5V28U6kqlDJR
13+
ff4Mi4whAoGBAOBzReQIxGwoYApPyhF+ohvF39JEEXYfkzk94t6hbgyBFBFvqdFY
14+
shT59im2P9LyDvTd5DnCIo52Sj7vM9H80tRjAA0A8okGOczk31ABbH8aZ2orU/0G
15+
EJe4PV4r3bpLO6DKTYsicgRpXI3aHHLvYFXOVNrQKfrKCQ+GFMVuhDdRAoGBANKe
16+
3Dn3XOq7EW42GZey1xUxrfQRJp491KXHvjYt7z7zSiUzqN+mqIqz6ngCjJWbyQsl
17+
Ud9N9U+4rNfYYLHQ0resjxGQRtmooOHlLhT6pEplXDgQb2SmCg2u22SKkkXA7zOV
18+
OFbNryXgkYThsA6ih8LiKM8aFn7zttRSEeTpfye7AoGBALhIzRyiuiuXpuswgdeF
19+
YrJs8A1jB/c1i5qXHlvurT2lCYYbaZHSQj0I0r2CvrqDNhaEzStDIz5XDzTHD4Qd
20+
EjmBo3wJyBkLPI/nZxb4ZE2jrz8znf0EasE3a2OTnrSjqqylDa/sMzM+EtkBORSB
21+
SFaLV45lFeKs2W2eiBVmXTZRAoGAJoA7qaz6Iz6G9SqWixB6GLm4HsFz2cFbueJF
22+
dwn2jf9TMnG7EQcaECDLX5y3rjGIEq2DxdouWaBcmChJpLeTjVfR31gMW4Vjw2dt
23+
gRBAMAlPTkBS3Ictl0q7eCmMi4u1Liy828FFnxrp/uxyjnpPbuSAqTsPma1bYnyO
24+
INY+FDkCgYAe9e39/vXe7Un3ysjqDUW+0OMM+kg4ulhiopzKY+QbHiSWmUUDtvcN
25+
asqrYiX1d59e2ZNiqrlBn86I8549St81bWSrRMNf7R+WVb79RApsABeUaEoyo3lq
26+
0UgOBM8Nt558kaja/YfJf/jwNC1DPuu5x5t38ZcqAkqrZ/HEPkFdGQ==
27+
-----END RSA PRIVATE KEY-----

src/Symfony/Contracts/HttpClient/Test/Fixtures/web/index.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,27 @@
155155
usleep(500);
156156
}
157157
exit;
158+
159+
case '/json':
160+
header("Content-Type: application/json");
161+
echo json_encode([
162+
'documents' => [
163+
['id' => '/json/1'],
164+
['id' => '/json/2'],
165+
['id' => '/json/3'],
166+
],
167+
]);
168+
exit;
169+
170+
case '/json/1':
171+
case '/json/2':
172+
case '/json/3':
173+
header("Content-Type: application/json");
174+
echo json_encode([
175+
'title' => $vars['REQUEST_URI'],
176+
]);
177+
178+
exit;
158179
}
159180

160181
header('Content-Type: application/json', true);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy