<?php
declare(strict_types=1);
namespace ParagonIE\Paserk\Tests;
use ParagonIE\ConstantTime\Binary;
use ParagonIE\Paseto\ProtocolInterface;
use PHPUnit\Framework\TestCase;
use ParagonIE\Paseto\Protocol\{
Version3,
Version4
};
use Exception;
abstract class KnownAnswers extends TestCase
{
/** @var string $dir */
protected string $dir;
/** @var ProtocolInterface[] $versions */
protected array $versions;
public function setUp(): void
{
$this->dir = __DIR__ . '/test-vectors';
$this->versions = [new Version3, new Version4];
}
/**
* @param ProtocolInterface $version
* @param string $name
* @param array $tests
*/
abstract protected function genericTest(ProtocolInterface $version, string $name, array $tests): void;
/**
* @param ProtocolInterface $v
* @param string $filename
*/
protected function doJsonTest(ProtocolInterface $v, string $filename): void
{
$json = $this->loadTestFile($filename);
$this->genericTest($v, $json['name'], $json['tests']);
}
/**
* @param string $filename
* @return array
*/
protected function loadTestFile(string $filename): array
{
if (!is_readable($this->dir . '/' . $filename)) {
$this->markTestSkipped('File not found: ' . $filename);
}
$decodedFile = json_decode(
file_get_contents($this->dir . '/' . $filename),
true
);
if (!is_array($decodedFile)) {
$this->fail('Decoded JSON file is not an array: ' . $filename);
}
return $decodedFile;
}
/**
* @throws \Exception
*/
protected function getProtocol(string $test): ProtocolInterface
{
$header = Binary::safeSubstr($test, 0, 2);
return match ($header) {
'v3', 'k3' => new Version3(),
'v4', 'k4' => new Version4(),
default => throw new Exception("Unknown protocol: $test"),
};
}
}
|