Subversion Repositories php-qbpwcf

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
3 liveuser 1
<?php
2
use GuzzleHttp\Psr7\Uri;
3
use Ratchet\RFC6455\Handshake\InvalidPermessageDeflateOptionsException;
4
use Ratchet\RFC6455\Handshake\PermessageDeflateOptions;
5
use Ratchet\RFC6455\Messaging\MessageBuffer;
6
use Ratchet\RFC6455\Handshake\ClientNegotiator;
7
use Ratchet\RFC6455\Messaging\CloseFrameChecker;
8
use Ratchet\RFC6455\Messaging\MessageInterface;
9
use React\Promise\Deferred;
10
use Ratchet\RFC6455\Messaging\Frame;
11
use React\Socket\ConnectionInterface;
12
use React\Socket\Connector;
13
 
14
require __DIR__ . '/../bootstrap.php';
15
 
16
define('AGENT', 'RatchetRFC/0.3');
17
 
18
$testServer = "127.0.0.1";
19
 
20
$loop = React\EventLoop\Factory::create();
21
 
22
$connector = new Connector($loop);
23
 
24
function echoStreamerFactory($conn, $permessageDeflateOptions = null)
25
{
26
    $permessageDeflateOptions = $permessageDeflateOptions ?: PermessageDeflateOptions::createDisabled();
27
 
28
    return new \Ratchet\RFC6455\Messaging\MessageBuffer(
29
        new \Ratchet\RFC6455\Messaging\CloseFrameChecker,
30
        function (\Ratchet\RFC6455\Messaging\MessageInterface $msg, MessageBuffer $messageBuffer) use ($conn) {
31
            $messageBuffer->sendMessage($msg->getPayload(), true, $msg->isBinary());
32
        },
33
        function (\Ratchet\RFC6455\Messaging\FrameInterface $frame, MessageBuffer $messageBuffer) use ($conn) {
34
            switch ($frame->getOpcode()) {
35
                case Frame::OP_PING:
36
                    return $conn->write((new Frame($frame->getPayload(), true, Frame::OP_PONG))->maskPayload()->getContents());
37
                    break;
38
                case Frame::OP_CLOSE:
39
                    return $conn->end((new Frame($frame->getPayload(), true, Frame::OP_CLOSE))->maskPayload()->getContents());
40
                    break;
41
            }
42
        },
43
        false,
44
        null,
45
        null,
46
        null,
47
        [$conn, 'write'],
48
        $permessageDeflateOptions
49
    );
50
}
51
 
52
function getTestCases() {
53
    global $testServer;
54
    global $connector;
55
 
56
    $deferred = new Deferred();
57
 
58
    $connector->connect($testServer . ':9001')->then(function (ConnectionInterface $connection) use ($deferred) {
59
        $cn = new ClientNegotiator();
60
        $cnRequest = $cn->generateRequest(new Uri('ws://127.0.0.1:9001/getCaseCount'));
61
 
62
        $rawResponse = "";
63
        $response = null;
64
 
65
        /** @var MessageBuffer $ms */
66
        $ms = null;
67
 
68
        $connection->on('data', function ($data) use ($connection, &$rawResponse, &$response, &$ms, $cn, $deferred, &$context, $cnRequest) {
69
            if ($response === null) {
70
                $rawResponse .= $data;
71
                $pos = strpos($rawResponse, "\r\n\r\n");
72
                if ($pos) {
73
                    $data = substr($rawResponse, $pos + 4);
74
                    $rawResponse = substr($rawResponse, 0, $pos + 4);
75
                    $response = \GuzzleHttp\Psr7\parse_response($rawResponse);
76
 
77
                    if (!$cn->validateResponse($cnRequest, $response)) {
78
                        $connection->end();
79
                        $deferred->reject();
80
                    } else {
81
                        $ms = new MessageBuffer(
82
                            new CloseFrameChecker,
83
                            function (MessageInterface $msg) use ($deferred, $connection) {
84
                                $deferred->resolve($msg->getPayload());
85
                                $connection->close();
86
                            },
87
                            null,
88
                            false,
89
                            null,
90
                            null,
91
                            null,
92
                            function () {}
93
                        );
94
                    }
95
                }
96
            }
97
 
98
            // feed the message streamer
99
            if ($ms) {
100
                $ms->onData($data);
101
            }
102
        });
103
 
104
        $connection->write(\GuzzleHttp\Psr7\str($cnRequest));
105
    });
106
 
107
    return $deferred->promise();
108
}
109
 
110
$cn = new \Ratchet\RFC6455\Handshake\ClientNegotiator(
111
    PermessageDeflateOptions::permessageDeflateSupported() ? PermessageDeflateOptions::createEnabled() : null);
112
 
113
function runTest($case)
114
{
115
    global $connector;
116
    global $testServer;
117
    global $cn;
118
 
119
    $casePath = "/runCase?case={$case}&agent=" . AGENT;
120
 
121
    $deferred = new Deferred();
122
 
123
    $connector->connect($testServer . ':9001')->then(function (ConnectionInterface $connection) use ($deferred, $casePath, $case) {
124
        $cn = new ClientNegotiator(
125
            PermessageDeflateOptions::permessageDeflateSupported() ? PermessageDeflateOptions::createEnabled() : null);
126
        $cnRequest = $cn->generateRequest(new Uri('ws://127.0.0.1:9001' . $casePath));
127
 
128
        $rawResponse = "";
129
        $response = null;
130
 
131
        $ms = null;
132
 
133
        $connection->on('data', function ($data) use ($connection, &$rawResponse, &$response, &$ms, $cn, $deferred, &$context, $cnRequest) {
134
            if ($response === null) {
135
                $rawResponse .= $data;
136
                $pos = strpos($rawResponse, "\r\n\r\n");
137
                if ($pos) {
138
                    $data = substr($rawResponse, $pos + 4);
139
                    $rawResponse = substr($rawResponse, 0, $pos + 4);
140
                    $response = \GuzzleHttp\Psr7\parse_response($rawResponse);
141
 
142
                    if (!$cn->validateResponse($cnRequest, $response)) {
143
                        echo "Invalid response.\n";
144
                        $connection->end();
145
                        $deferred->reject();
146
                    } else {
147
                        try {
148
                            $permessageDeflateOptions = PermessageDeflateOptions::fromRequestOrResponse($response)[0];
149
                            $ms = echoStreamerFactory(
150
                                $connection,
151
                                $permessageDeflateOptions
152
                            );
153
                        } catch (InvalidPermessageDeflateOptionsException $e) {
154
                            $connection->end();
155
                        }
156
                    }
157
                }
158
            }
159
 
160
            // feed the message streamer
161
            if ($ms) {
162
                $ms->onData($data);
163
            }
164
        });
165
 
166
        $connection->on('close', function () use ($deferred) {
167
            $deferred->resolve();
168
        });
169
 
170
        $connection->write(\GuzzleHttp\Psr7\str($cnRequest));
171
    });
172
 
173
    return $deferred->promise();
174
}
175
 
176
function createReport() {
177
    global $connector;
178
    global $testServer;
179
 
180
    $deferred = new Deferred();
181
 
182
    $connector->connect($testServer . ':9001')->then(function (ConnectionInterface $connection) use ($deferred) {
183
        // $reportPath = "/updateReports?agent=" . AGENT . "&shutdownOnComplete=true";
184
        // we will stop it using docker now instead of just shutting down
185
        $reportPath = "/updateReports?agent=" . AGENT;
186
        $cn = new ClientNegotiator();
187
        $cnRequest = $cn->generateRequest(new Uri('ws://127.0.0.1:9001' . $reportPath));
188
 
189
        $rawResponse = "";
190
        $response = null;
191
 
192
        /** @var MessageBuffer $ms */
193
        $ms = null;
194
 
195
        $connection->on('data', function ($data) use ($connection, &$rawResponse, &$response, &$ms, $cn, $deferred, &$context, $cnRequest) {
196
            if ($response === null) {
197
                $rawResponse .= $data;
198
                $pos = strpos($rawResponse, "\r\n\r\n");
199
                if ($pos) {
200
                    $data = substr($rawResponse, $pos + 4);
201
                    $rawResponse = substr($rawResponse, 0, $pos + 4);
202
                    $response = \GuzzleHttp\Psr7\parse_response($rawResponse);
203
 
204
                    if (!$cn->validateResponse($cnRequest, $response)) {
205
                        $connection->end();
206
                        $deferred->reject();
207
                    } else {
208
                        $ms = new MessageBuffer(
209
                            new CloseFrameChecker,
210
                            function (MessageInterface $msg) use ($deferred, $connection) {
211
                                $deferred->resolve($msg->getPayload());
212
                                $connection->close();
213
                            },
214
                            null,
215
                            false,
216
                            null,
217
                            null,
218
                            null,
219
                            function () {}
220
                        );
221
                    }
222
                }
223
            }
224
 
225
            // feed the message streamer
226
            if ($ms) {
227
                $ms->onData($data);
228
            }
229
        });
230
 
231
        $connection->write(\GuzzleHttp\Psr7\str($cnRequest));
232
    });
233
 
234
    return $deferred->promise();
235
}
236
 
237
 
238
$testPromises = [];
239
 
240
getTestCases()->then(function ($count) use ($loop) {
241
    $allDeferred = new Deferred();
242
 
243
    $runNextCase = function () use (&$i, &$runNextCase, $count, $allDeferred) {
244
        $i++;
245
        if ($i > $count) {
246
            $allDeferred->resolve();
247
            return;
248
        }
249
        echo "Running test $i/$count...";
250
        $startTime = microtime(true);
251
        runTest($i)
252
            ->then(function () use ($startTime) {
253
                echo " completed " . round((microtime(true) - $startTime) * 1000) . " ms\n";
254
            })
255
            ->then($runNextCase);
256
    };
257
 
258
    $i = 0;
259
    $runNextCase();
260
 
261
    $allDeferred->promise()->then(function () {
262
        createReport();
263
    });
264
});
265
 
266
$loop->run();