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());
 }
 /**
  * @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);
     });
 }