1010use PhpSchool \PhpWorkshop \Exercise \ExerciseInterface ;
1111use PhpSchool \PhpWorkshop \Exercise \ExerciseType ;
1212use PhpSchool \PhpWorkshop \Exercise \Scenario \CliScenario ;
13- use PhpSchool \PhpWorkshop \ExerciseDispatcher ;
1413use PhpSchool \PhpWorkshop \Output \OutputInterface ;
1514use PhpSchool \PhpWorkshop \Result \ComparisonFailure ;
1615use 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