Skip to content

Commit e8bde1e

Browse files
committed
Try fix timeserver
1 parent 2906141 commit e8bde1e

File tree

2 files changed

+43
-27
lines changed

2 files changed

+43
-27
lines changed

composer.lock

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Exercise/TimeServer.php

Lines changed: 39 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
use PhpSchool\PhpWorkshop\Exercise\ExerciseInterface;
1111
use PhpSchool\PhpWorkshop\Exercise\ExerciseType;
1212
use PhpSchool\PhpWorkshop\Exercise\Scenario\CliScenario;
13-
use PhpSchool\PhpWorkshop\ExerciseDispatcher;
1413
use PhpSchool\PhpWorkshop\Output\OutputInterface;
1514
use PhpSchool\PhpWorkshop\Result\ComparisonFailure;
1615
use PhpSchool\PhpWorkshop\Result\Failure;
@@ -31,43 +30,50 @@ public function getDescription(): string
3130

3231
public function defineListeners(EventDispatcher $eventDispatcher): void
3332
{
34-
$appendArgsListener = function (CliExecuteEvent $event) {
35-
$event->appendArg('127.0.0.1');
36-
$event->appendArg($this->getRandomPort());
37-
};
38-
39-
$eventDispatcher->listen('cli.verify.reference-execute.pre', $appendArgsListener);
40-
$eventDispatcher->listen('cli.verify.student-execute.pre', $appendArgsListener);
41-
$eventDispatcher->listen('cli.run.student-execute.pre', $appendArgsListener);
42-
43-
$eventDispatcher->listen('cli.verify.reference.executing', function (CliExecuteEvent $event) {
44-
$args = $event->getArgs()->getArrayCopy();
33+
$referencePort = $this->getRandomPort();
34+
$studentPort = $this->getRandomPort();
35+
36+
$eventDispatcher->listen('cli.verify.reference-execute.pre',
37+
function (CliExecuteEvent $event) use ($referencePort) {
38+
$event->appendArg('127.0.0.1');
39+
$event->appendArg($referencePort);
40+
$event->getScenario()->exposePort($referencePort);
41+
}
42+
);
43+
$eventDispatcher->listen(
44+
['cli.verify.student-execute.pre', 'cli.run.student-execute.pre'],
45+
function (CliExecuteEvent $event) use ($studentPort) {
46+
$event->appendArg('127.0.0.1');
47+
$event->appendArg($studentPort);
48+
$event->getScenario()->exposePort($studentPort);
49+
}
50+
);
4551

52+
$eventDispatcher->listen('cli.verify.reference.executing', function (CliExecuteEvent $event) use ($referencePort) {
4653
//wait for server to boot
4754
usleep(100000);
4855

4956
$socket = $this->createSocket();
50-
socket_connect($socket, $args[0], (int) $args[1]);
57+
58+
$connectResult = @socket_connect($socket, '127.0.0.1', $referencePort);
5159
socket_read($socket, 2048, PHP_NORMAL_READ);
5260

5361
//wait for shutdown
5462
usleep(100000);
5563
});
5664

57-
$eventDispatcher->insertVerifier('cli.verify.student.executing', function (CliExecuteEvent $event) {
58-
$args = $event->getArgs()->getArrayCopy();
59-
65+
$eventDispatcher->insertVerifier('cli.verify.student.executing', function (CliExecuteEvent $event) use ($studentPort) {
6066
//wait for server to boot
6167
usleep(100000);
6268

6369
$socket = $this->createSocket();
64-
$connectResult = @socket_connect($socket, $args[0], (int) $args[1]);
70+
$connectResult = @socket_connect($socket, '127.0.0.1', $studentPort);
6571

6672
if (!$connectResult) {
6773
return Failure::fromNameAndReason($this->getName(), sprintf(
6874
"Client returns an error (number %d): Connection refused while trying to join tcp://127.0.0.1:%d.",
6975
socket_last_error($socket),
70-
$args[1]
76+
$studentPort
7177
));
7278
}
7379

@@ -86,16 +92,25 @@ public function defineListeners(EventDispatcher $eventDispatcher): void
8692
return new Success($this->getName());
8793
});
8894

89-
$eventDispatcher->listen('cli.run.student.executing', function (CliExecuteEvent $event) {
95+
$eventDispatcher->listen('cli.run.student.executing', function (CliExecuteEvent $event) use ($studentPort) {
9096
/** @var OutputInterface $output */
9197
$output = $event->getParameter('output');
92-
$args = $event->getArgs()->getArrayCopy();
9398

9499
//wait for server to boot
95100
usleep(100000);
96101

97102
$socket = $this->createSocket();
98-
socket_connect($socket, $args[0], (int) $args[1]);
103+
try {
104+
$connectResult = @socket_connect($socket, '127.0.0.1', $studentPort);
105+
} catch (\ErrorException $e) {
106+
$output->write('Cannot connect');
107+
return;
108+
}
109+
110+
if (false === $connectResult) {
111+
$output->write('Cannot connect');
112+
return;
113+
}
99114
$out = (string) socket_read($socket, 2048, PHP_NORMAL_READ);
100115

101116
//wait for shutdown
@@ -107,7 +122,7 @@ public function defineListeners(EventDispatcher $eventDispatcher): void
107122

108123
private function getRandomPort(): string
109124
{
110-
return (string) mt_rand(1025, 65535);
125+
return mt_rand(8001, 10000);
111126
}
112127

113128
public function getType(): ExerciseType
@@ -117,7 +132,8 @@ public function getType(): ExerciseType
117132

118133
public function defineTestScenario(): CliScenario
119134
{
120-
return (new CliScenario())->withExecution();
135+
return (new CliScenario())
136+
->withExecution();
121137
}
122138

123139
private function createSocket(): Socket

0 commit comments

Comments
 (0)