Skip to content

Commit f5f93ab

Browse files
committed
Added tests
1 parent 234992a commit f5f93ab

File tree

15 files changed

+1570
-0
lines changed

15 files changed

+1570
-0
lines changed

test/Callback.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
namespace Dazzle\Socket\Test;
4+
5+
class Callback
6+
{
7+
public function __invoke()
8+
{}
9+
}

test/TModule.php

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
<?php
2+
3+
namespace Dazzle\Socket\Test;
4+
5+
use Dazzle\Loop\Model\SelectLoop;
6+
use Dazzle\Loop\Loop;
7+
use Dazzle\Loop\LoopExtendedInterface;
8+
use Dazzle\Loop\LoopInterface;
9+
use Dazzle\Socket\Test\_Simulation\Event;
10+
use Dazzle\Socket\Test\_Simulation\Simulation;
11+
use Exception;
12+
13+
class TModule extends TUnit
14+
{
15+
/**
16+
* @var string
17+
*/
18+
const MSG_EVENT_NAME_ASSERTION_FAILED = 'Expected event name mismatch on %s event.';
19+
20+
/**
21+
* @var string
22+
*/
23+
const MSG_EVENT_DATA_ASSERTION_FAILED = 'Expected event data mismatch on %s event.';
24+
25+
/**
26+
* @var string
27+
*/
28+
const MSG_EVENT_GET_ASSERTION_FAILED = "Expected event count mismatch after %s events.\nExpected event %s, got event %s.";
29+
30+
/**
31+
* @var LoopExtendedInterface
32+
*/
33+
private $loop;
34+
35+
/**
36+
* @var Simulation
37+
*/
38+
private $sim;
39+
40+
/**
41+
*
42+
*/
43+
public function setUp()
44+
{
45+
$this->loop = null;
46+
$this->sim = null;
47+
}
48+
49+
/**
50+
*
51+
*/
52+
public function tearDown()
53+
{
54+
unset($this->sim);
55+
unset($this->loop);
56+
}
57+
58+
/**
59+
* @return LoopInterface|null
60+
*/
61+
public function getLoop()
62+
{
63+
return $this->loop;
64+
}
65+
66+
/**
67+
* Run test scenario as simulation.
68+
*
69+
* @param callable(Simulation) $scenario
70+
* @return TModule
71+
*/
72+
public function simulate(callable $scenario)
73+
{
74+
try
75+
{
76+
$this->loop = new Loop(new SelectLoop);
77+
$this->loop->erase(true);
78+
79+
$this->sim = new Simulation($this->loop);
80+
$this->sim->setScenario($scenario);
81+
$this->sim->begin();
82+
}
83+
catch (Exception $ex)
84+
{
85+
$this->fail($ex->getMessage());
86+
}
87+
88+
return $this;
89+
}
90+
91+
/**
92+
* @param $events
93+
* @param int $flags
94+
* @return TModule
95+
*/
96+
public function expect($events, $flags = Simulation::EVENTS_COMPARE_IN_ORDER)
97+
{
98+
$expectedEvents = [];
99+
100+
foreach ($events as $event)
101+
{
102+
$data = isset($event[1]) ? $event[1] : [];
103+
$expectedEvents[] = new Event($event[0], $data);
104+
}
105+
106+
$this->assertEvents(
107+
$this->sim->getExpectations(),
108+
$expectedEvents,
109+
$flags
110+
);
111+
112+
return $this;
113+
}
114+
115+
/**
116+
* @param Event[] $actualEvents
117+
* @param Event[] $expectedEvents
118+
* @param int $flags
119+
*/
120+
public function assertEvents($actualEvents = [], $expectedEvents = [], $flags = Simulation::EVENTS_COMPARE_IN_ORDER)
121+
{
122+
$count = max(count($actualEvents), count($expectedEvents));
123+
124+
if ($flags === Simulation::EVENTS_COMPARE_RANDOMLY)
125+
{
126+
sort($actualEvents);
127+
sort($expectedEvents);
128+
}
129+
130+
for ($i=0; $i<$count; $i++)
131+
{
132+
if (!isset($actualEvents[$i]))
133+
{
134+
$this->fail(
135+
sprintf(self::MSG_EVENT_GET_ASSERTION_FAILED, $i, $expectedEvents[$i]->name(), 'null')
136+
);
137+
}
138+
else if (!isset($expectedEvents[$i]))
139+
{
140+
$this->fail(
141+
sprintf(self::MSG_EVENT_GET_ASSERTION_FAILED, $i, 'null', $actualEvents[$i]->name())
142+
);
143+
}
144+
145+
$actualEvent = $actualEvents[$i];
146+
$expectedEvent = $expectedEvents[$i];
147+
148+
$this->assertSame(
149+
$expectedEvent->name(),
150+
$actualEvent->name(),
151+
sprintf(self::MSG_EVENT_NAME_ASSERTION_FAILED, $i)
152+
);
153+
$this->assertSame(
154+
$expectedEvent->data(),
155+
$actualEvent->data(),
156+
sprintf(self::MSG_EVENT_DATA_ASSERTION_FAILED, $i)
157+
);
158+
}
159+
}
160+
}

test/TModule/SocketTest.php

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
<?php
2+
3+
namespace Dazzle\_Module\Ipc\Socket;
4+
5+
use Dazzle\Socket\Socket;
6+
use Dazzle\Socket\SocketInterface;
7+
use Dazzle\Socket\SocketListener;
8+
use Dazzle\Socket\SocketListenerInterface;
9+
use Dazzle\Socket\Test\_Simulation\SimulationInterface;
10+
use Dazzle\Socket\Test\TModule;
11+
12+
/**
13+
* @runTestsInSeparateProcesses
14+
* @preserveGlobalState disabled
15+
*/
16+
class SocketTest extends TModule
17+
{
18+
/**
19+
* @dataProvider endpointProvider
20+
*/
21+
public function testSocketWritesAndReadsDataCorrectly($endpoint)
22+
{
23+
$sim = $this->simulate(function(SimulationInterface $sim) use($endpoint) {
24+
$loop = $sim->getLoop();
25+
26+
$server = new SocketListener($endpoint, $loop);
27+
$server->start();
28+
$server->on('connect', function(SocketListenerInterface $server, SocketInterface $conn) use($sim) {
29+
$conn->on('data', function(SocketInterface $conn, $data) use($server, $sim) {
30+
$sim->expect('data', $data);
31+
$conn->write('secret answer!');
32+
$server->close();
33+
});
34+
});
35+
$server->on('error', $this->expectCallableNever());
36+
$server->on('close', function() use($sim) {
37+
$sim->expect('close');
38+
});
39+
$server->start();
40+
41+
$client = new Socket($endpoint, $loop);
42+
$client->on('data', function(SocketInterface $conn, $data) use($loop, $sim) {
43+
$sim->expect('data', $data);
44+
$conn->close();
45+
$sim->done();
46+
});
47+
$client->on('error', $this->expectCallableNever());
48+
$client->on('close', function() use($sim) {
49+
$sim->expect('close');
50+
});
51+
52+
$client->write('secret question!');
53+
});
54+
$sim = $sim->expect([
55+
[ 'data', 'secret question!' ],
56+
[ 'close' ],
57+
[ 'data', 'secret answer!' ],
58+
[ 'close' ]
59+
]);
60+
}
61+
62+
/**
63+
* @dataProvider endpointSSLProvider
64+
*/
65+
public function testSocketWritesAndReadsDataCorrectly_WithSSLConfiguration($endpoint)
66+
{
67+
$sim = $this->simulate(function(SimulationInterface $sim) use($endpoint) {
68+
$loop = $sim->getLoop();
69+
70+
$serverConfig = [
71+
'ssl' => true,
72+
'ssl_cert' => __DIR__ . '/_Data/_ssl_cert.pem',
73+
'ssl_key' => __DIR__ . '/_Data/_ssl_key.pem',
74+
'ssl_secret' => 'secret',
75+
];
76+
77+
$server = new SocketListener($endpoint, $loop, $serverConfig);
78+
$server->on('connect', function(SocketListenerInterface $server, SocketInterface $conn) use($sim) {
79+
$conn->on('data', function(SocketInterface $conn, $data) use($server, $sim) {
80+
$sim->expect('data', $data);
81+
$conn->write('secret answer!');
82+
$server->close();
83+
});
84+
});
85+
$server->on('error', $this->expectCallableNever());
86+
$server->on('close', function() use($sim) {
87+
$sim->expect('close');
88+
});
89+
$server->start();
90+
91+
$clientConfig = [
92+
'ssl' => true,
93+
];
94+
$client = new Socket($endpoint, $loop, $clientConfig);
95+
$client->on('data', function(SocketInterface $conn, $data) use($loop, $sim) {
96+
$sim->expect('data', $data);
97+
$conn->close();
98+
$sim->done();
99+
});
100+
$client->on('error', $this->expectCallableNever());
101+
$client->on('close', function() use($sim) {
102+
$sim->expect('close');
103+
});
104+
105+
$client->write('secret question!');
106+
});
107+
$sim = $sim->expect([
108+
[ 'data', 'secret question!' ],
109+
[ 'close' ],
110+
[ 'data', 'secret answer!' ],
111+
[ 'close' ]
112+
]);
113+
}
114+
115+
/**
116+
* @return string[][]
117+
*/
118+
public function endpointProvider()
119+
{
120+
return [
121+
[ 'tcp://127.0.0.1:2080' ],
122+
[ 'unix://mysocket.sock' ]
123+
];
124+
}
125+
126+
/**
127+
* @return string[][]
128+
*/
129+
public function endpointSSLProvider()
130+
{
131+
return [
132+
[ 'tcp://127.0.0.1:2080' ],
133+
];
134+
}
135+
}

test/TModule/_Data/_ssl_cert.pem

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIC9jCCAd4CCQC1n9FarkDiuTANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQGEwJD
3+
TjELMAkGA1UECAwCU0gxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0
4+
ZDAeFw0xNzAxMjcwMjI0MjNaFw0xODAxMjcwMjI0MjNaMD0xCzAJBgNVBAYTAkNO
5+
MQswCQYDVQQIDAJTSDEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRk
6+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6P2tbxw2JBEr/jI6dyU/
7+
ppopZ3XbUybS4A3V2G/k5wXocjPOx2ttb4J3cClKYzyyG96AFRftmkjps1ixxknO
8+
ZlXWVJ+Cdgw3RXn0kt9s8zjYtGKFnDBTyi27KMVjpdGiOl9iJA71FgWeRuUOzFUf
9+
poAVkeohGwVQQKjiBANZo4Civwae71LJ0HwN+JtX/l8Rcqrlt5DYAAix13ZzF9EY
10+
OQQTb18UVEdKyVM8RQbpnE3DZ0tdB7WAiUBOd3H9DICPSCytSSVfOFYyWXzM66CO
11+
q2rI3CN4mNYBybNrfjby5FK8Qgnu8boVLPlpq70j8SnAik1drfGVdf0W2UOvxWcD
12+
+wIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQBWSUEWA161OYo9XM6PVqP++RQyIq7d
13+
YFgdwgxjZTUINuOlBQnQEPbCskeCEaxEK/APkyGfV8M+b8NzLgXSJJAXjI6tfBmR
14+
CMLXk/cTGImAd1c6KQ3wCPQqbn8bxCaC1ca9MrJPqB4EOjIiVw+zBNXS6n3kDqkD
15+
a6N3DfBXZycY6tfOSnbej6q2/hPzgqP2VquNvsiloRpay5i+yfcx3rbh/bJVHsb7
16+
1YoqYZU/Kn88Lt2U8Qhwkag2qAvSd7uGAldxNkzgbAXZ3QneoOKFcWCvGLbS3XjN
17+
mMWkYg8EHsks6PzLRtQesHKiq8t92JdZsxvasMXMNAs9GHDQ88En8iUL
18+
-----END CERTIFICATE-----

test/TModule/_Data/_ssl_key.pem

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIIEpAIBAAKCAQEA6P2tbxw2JBEr/jI6dyU/ppopZ3XbUybS4A3V2G/k5wXocjPO
3+
x2ttb4J3cClKYzyyG96AFRftmkjps1ixxknOZlXWVJ+Cdgw3RXn0kt9s8zjYtGKF
4+
nDBTyi27KMVjpdGiOl9iJA71FgWeRuUOzFUfpoAVkeohGwVQQKjiBANZo4Civwae
5+
71LJ0HwN+JtX/l8Rcqrlt5DYAAix13ZzF9EYOQQTb18UVEdKyVM8RQbpnE3DZ0td
6+
B7WAiUBOd3H9DICPSCytSSVfOFYyWXzM66COq2rI3CN4mNYBybNrfjby5FK8Qgnu
7+
8boVLPlpq70j8SnAik1drfGVdf0W2UOvxWcD+wIDAQABAoIBAGr6BwbsMiOvSr7F
8+
Ozj3flk1kWsynwh32/0J/TUKc1RrzwWYqgnAVpgLlGGIY+JavQC00aRdvzfG4J77
9+
S2za+IzePrHOJ22iQEKDM3u4YGLwp/dzARvsyJwdEUEwGIfLUCxzHTGnOHrrC3hL
10+
tda2AvlE+CJuGNM6RlXZ9SSYkTDTgBORkuAJf4pTZrG5wVedTGR0us1lj4BKzuDF
11+
MsApnBum8Dpj73nZCcfT9MMgbuXGp1jsDuE7eZsiDzklarroZxOcYX9YMTpsG2iY
12+
f2drGWSVssZKwmxaTiAHi4iMIhawxQwE13PxK5FqP1DQjQYmPjoDY5CQ1/OD6oGJ
13+
klRpEykCgYEA+XDlDHRP3UK1UpZJY6heudRgdbuEdd4vFbEVG6Kk1vh3ub6Y33UJ
14+
1nvHIvjzCOEnjO5wZbBpoJy1O2fCJt/rdP1nWI2SLXtBIv4floia1SK5S1fmrr4C
15+
1uDAB3+/PAJe5gSBX6l9dt1JesB6ERrrVYU05GCnW64T+kDg19IZaUUCgYEA7x4M
16+
sOGXjdunmk5DmgaAZcKKUXm6G5+DGHCiHzylUr3LsJ4dqBMFYDfA0s2YNlT+pKpK
17+
BEDBxfzlx1ewaorr2Hge3QAHeGWa4oQok42u7rv1ernl/RYOfI3JcZaX89cu482b
18+
/tFUjeMDfxqiD74hl2JtK3vkBTfldApPS10ZbD8CgYEA4S1S+C0/s4P23/kfg0GJ
19+
UcQw19dRun26j6BuZ6YpnI5stlci9gZXvTG8EQwfiZKH+6d7+7CHiiAtUtVV5XYa
20+
vl/LnZsfrMMpiAdUSLZE38ca8rMFYhXRxlzZvWtLHUcemBLVH6CHzHfzT0bWav6c
21+
F3XKy6edLRw2mKFc2DeoDOkCgYEAndDhY2Sg2Bme9rKs311nJMJO9BM5B74xkdHU
22+
znUCUCe/5eOVgzZ6l9R0SS00Rre2EQvrKf9rZLbTGMwBPXBO1GIDTK0WQRoeLV44
23+
QZqDWEFpdQR4jJ8gFIin6XYQ9/iPk/5B9N5HxhWMWzlCuM0t8nIdx1NPXTpVEE81
24+
onHhs5UCgYA6y5LpvJ5vOpZyHdTISgQK+4SmhUSu3e29qE8AjixaTBFwGa/PKuVO
25+
ggpceNZjl+pg1F74IMEpg1c6N1MKEIhK+NEYhxS9QkShPNYwasfkhg87QfkOxUi+
26+
jed5G+yO01Re0bkyE6YiS+JrJQZJEdna/x9eb5IxF/LiTWkZhkdywg==
27+
-----END RSA PRIVATE KEY-----

0 commit comments

Comments
 (0)