/** * @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 setUp() { $this->filesystem = new Filesystem(); $this->check = $this->getMock(SimpleCheckInterface::class); $this->check->expects($this->any())->method('getName')->will($this->returnValue('Some Check')); $this->checkRepository = new CheckRepository([$this->check]); $this->runner = $this->getMock(ExerciseRunnerInterface::class); $this->runnerFactory = $this->getMock(RunnerFactory::class); $this->results = new ResultAggregator(); $this->eventDispatcher = $this->getMockBuilder(EventDispatcher::class)->disableOriginalConstructor()->getMock(); $this->exerciseDispatcher = new ExerciseDispatcher($this->runnerFactory, $this->results, $this->eventDispatcher, $this->checkRepository); $this->assertSame($this->eventDispatcher, $this->exerciseDispatcher->getEventDispatcher()); $this->file = sprintf('%s/%s/submission.php', str_replace('\\', '/', sys_get_temp_dir()), $this->getName()); mkdir(dirname($this->file), 0775, true); touch($this->file); }
public function testGetEventDispatcher() { $eventDispatcher = new EventDispatcher($results = new ResultAggregator()); $exerciseDispatcher = new ExerciseDispatcher($this->prophesize(RunnerManager::class)->reveal(), $results, $eventDispatcher, new CheckRepository()); $this->assertSame($eventDispatcher, $exerciseDispatcher->getEventDispatcher()); }