/** * @param ExerciseDispatcher $exerciseDispatcher */ 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 new StdOutFailure($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); }); }
public function testCreateClient() { $factory = new TcpSocketFactory(); $client = $factory->createClient('127.0.0.1', 65000); $this->assertInstanceOf(Client::class, $client); $this->assertSame('tcp://127.0.0.1:65000', $client->getSocket()->__toString()); }