<?php

/**
 * TEST: CGI worker.
 */

declare(strict_types=1);
use AmK\FastCGI;
use AmK\Server\CGI\Worker;
use React\EventLoop;
use React\Http;
use Tester\Assert;

require(__DIR__ . '/../../bootstrap.php');

$loop = EventLoop\Factory::create();
$connector = new FastCGI\Connector($loop);
$worker = new Worker($loop, $connector, null, __DIR__ . '/../../www', ['-n']);

register_shutdown_function([$worker, 'stop']);

$request = new Http\Io\ServerRequest(
	'DELETE',
	'/info',
	[
		'Host' => 'example.com',
	],
	null,
	'1.1',
	[
		'SCRIPT_FILENAME' => 'info.php',
	]
);

$worker->handle($request)
	->then(function(Http\Response $r) use(&$response, &$content, $worker): void {

		$response = $r;
		$content = '';

		/** @var $stream Http\Io\HttpBodyStream */
		$stream = $r->getBody();

		$stream->on('data', function(string $data) use(&$content): void {
			$content .= $data;
		});

		$stream->on('end', function() use($worker): void {

			if (DIRECTORY_SEPARATOR === '\\') {
				exec("taskkill /F /PID {$worker->pid()}");
			} else {
				exec("kill {$worker->pid()}");
			}

		});

	}, function(Http\Response $r) use(&$response): void {
		$response = $r;
	});

$worker->on('start', function() use(&$start): void {
	$start = true;
});

$worker->on('exit', function() use(&$exit): void {
	$exit = true;
});

$loop->run();

Assert::true($start);
Assert::true($exit);

/** @var $response Http\Response */
Assert::same(418, $response->getStatusCode());

$info = json_decode($content);
Assert::truthy($info);
Assert::same('info.php', $info->SCRIPT_FILENAME);
Assert::same('/info', $info->REQUEST_URI);
Assert::same('example.com', $info->HTTP_HOST);
Assert::same('DELETE', $info->REQUEST_METHOD);