public function configure(ExerciseDispatcher $exerciseDispatcher)
{
$eventDispatcher = $exerciseDispatcher->getEventDispatcher();
$appendArgsListener = function (CliExecuteEvent $event) {
$event->appendArg('127.0.0.1');
$event->appendArg($this->getRandomPort());
};
$eventDispatcher->listen('cli.verify.reference-execute.pre', $appendArgsListener);
$eventDispatcher->listen('cli.verify.student-execute.pre', $appendArgsListener);
$eventDispatcher->listen('cli.run.student-execute.pre', $appendArgsListener);
$eventDispatcher->listen('cli.verify.reference.executing', function (CliExecuteEvent $event) {
$args = $event->getArgs()->getArrayCopy();
$client = $this->socketFactory->createClient(...$args);
//wait for server to boot
usleep(100000);
$client->connect();
$client->readAll();
//wait for shutdown
usleep(100000);
});
$eventDispatcher->insertVerifier('cli.verify.student.executing', function (CliExecuteEvent $event) {
$args = $event->getArgs()->getArrayCopy();
$client = $this->socketFactory->createClient(...$args);
//wait for server to boot
usleep(100000);
try {
$client->connect();
} catch (Exception $e) {
return Failure::fromNameAndReason($this->getName(), $e->getMessage());
}
$out = $client->readAll();
//wait for shutdown
usleep(100000);
$date = new \DateTime();
//match the current date but any seconds
//since we can't mock time in PHP easily
if (!preg_match(sprintf('/^%s:([0-5][0-9]|60)\\n$/', $date->format('Y-m-d H:i')), $out)) {
return ComparisonFailure::fromNameAndValues($this->getName(), $date->format("Y-m-d H:i:s\n"), $out);
}
return new Success($this->getName());
});
$eventDispatcher->listen('cli.run.student.executing', function (CliExecuteEvent $event) {
/** @var OutputInterface $output */
$output = $event->getParameter('output');
$args = $event->getArgs()->getArrayCopy();
$client = $this->socketFactory->createClient(...$args);
//wait for server to boot
usleep(100000);
$client->connect();
$out = $client->readAll();
//wait for shutdown
usleep(100000);
$output->write($out);
});
}