1
1
Fork 0
mirror of https://code.mensbeam.com/MensBeam/Arsse.git synced 2024-12-23 09:02:41 +00:00

More Feed tests: cache header handling

- Also made all SQLite tests skippable if the extension is not loaded
- Fixed format of ETags in test server
- Passed any CLI arguments to PHPUnit in the test runner
This commit is contained in:
J. King 2017-05-22 10:02:36 -04:00
parent f04ba956a9
commit ceeb23aea3
13 changed files with 61 additions and 13 deletions

View file

@ -11,6 +11,9 @@ class TestDbDriverSQLite3 extends \PHPUnit\Framework\TestCase {
protected $ch; protected $ch;
function setUp() { function setUp() {
if(!extension_loaded("sqlite3")) {
$this->markTestSkipped("SQLite extension not loaded");
}
$this->clearData(); $this->clearData();
$conf = new Conf(); $conf = new Conf();
$conf->dbDriver = Db\SQLite3\Driver::class; $conf->dbDriver = Db\SQLite3\Driver::class;

View file

@ -9,6 +9,9 @@ class TestDbResultSQLite3 extends \PHPUnit\Framework\TestCase {
protected $c; protected $c;
function setUp() { function setUp() {
if(!extension_loaded("sqlite3")) {
$this->markTestSkipped("SQLite extension not loaded");
}
$c = new \SQLite3(":memory:"); $c = new \SQLite3(":memory:");
$c->enableExceptions(true); $c->enableExceptions(true);
$this->c = $c; $this->c = $c;

View file

@ -11,6 +11,9 @@ class TestDbStatementSQLite3 extends \PHPUnit\Framework\TestCase {
static protected $imp = Db\SQLite3\Statement::class; static protected $imp = Db\SQLite3\Statement::class;
function setUp() { function setUp() {
if(!extension_loaded("sqlite3")) {
$this->markTestSkipped("SQLite extension not loaded");
}
$c = new \SQLite3(":memory:"); $c = new \SQLite3(":memory:");
$c->enableExceptions(true); $c->enableExceptions(true);
$this->c = $c; $this->c = $c;

View file

@ -16,6 +16,9 @@ class TestDbUpdateSQLite3 extends \PHPUnit\Framework\TestCase {
const MINIMAL2 = "pragma user_version=2"; const MINIMAL2 = "pragma user_version=2";
function setUp() { function setUp() {
if(!extension_loaded("sqlite3")) {
$this->markTestSkipped("SQLite extension not loaded");
}
$this->clearData(); $this->clearData();
$this->vfs = vfsStream::setup("schemata", null, ['SQLite3' => []]); $this->vfs = vfsStream::setup("schemata", null, ['SQLite3' => []]);
$conf = new Conf(); $conf = new Conf();

View file

@ -8,19 +8,10 @@ class TestFeed extends \PHPUnit\Framework\TestCase {
use Test\Tools; use Test\Tools;
protected static $host = "http://localhost:8000/"; protected static $host = "http://localhost:8000/";
protected static $serverUp = true;
protected $base = ""; protected $base = "";
function time(string $t): string {
return gmdate("D, d M Y H:i:s \G\M\T", strtotime($t));
}
static function setUpBeforeClass() {
if(!@file_get_contents(self::$host."IsUp")) self::$serverUp = false;
}
function setUp() { function setUp() {
if(!self::$serverUp) { if(!@file_get_contents(self::$host."IsUp")) {
$this->markTestSkipped("Test Web server is not accepting requests"); $this->markTestSkipped("Test Web server is not accepting requests");
} }
$this->base = self::$host."Feed/"; $this->base = self::$host."Feed/";
@ -28,6 +19,23 @@ class TestFeed extends \PHPUnit\Framework\TestCase {
Data::$conf = new Conf(); Data::$conf = new Conf();
} }
function testHandleCacheHeaders() {
$t = time();
$e = "78567a";
$f = new Feed(null, $this->base."Caching/304Random", $this->dateTransform($t, "http"), $e);
$this->assertTime($t, $f->lastModified);
$this->assertSame($e, $f->resource->getETag());
$f = new Feed(null, $this->base."Caching/304ETagOnly", $this->dateTransform($t, "http"), $e);
$this->assertTime($t, $f->lastModified);
$this->assertSame($e, $f->resource->getETag());
$f = new Feed(null, $this->base."Caching/304LastModOnly", $this->dateTransform($t, "http"), $e);
$this->assertTime($t, $f->lastModified);
$this->assertSame($e, $f->resource->getETag());
$f = new Feed(null, $this->base."Caching/304None", $this->dateTransform($t, "http"), $e);
$this->assertTime($t, $f->lastModified);
$this->assertSame($e, $f->resource->getETag());
}
function testComputeNextFetchOnError() { function testComputeNextFetchOnError() {
for($a = 0; $a < 100; $a++) { for($a = 0; $a < 100; $a++) {
if($a < 3) { if($a < 3) {

View file

@ -0,0 +1,7 @@
<?php return [
'code' => 304,
'cache' => false,
'fields' => [
"ETag: ".$_SERVER['HTTP_IF_NONE_MATCH'],
],
];

View file

@ -0,0 +1,7 @@
<?php return [
'code' => 304,
'cache' => false,
'fields' => [
'Last-Modified: '.$_SERVER['HTTP_IF_MODIFIED_SINCE'],
],
];

View file

@ -0,0 +1,4 @@
<?php return [
'code' => 304,
'cache' => false,
];

View file

@ -0,0 +1,7 @@
<?php return [
'code' => 304,
'lastMod' => random_int(0,2^31),
'fields' => [
"ETag: ".bin2hex(random_bytes(8)),
],
];

View file

@ -6,6 +6,9 @@ use JKingWeb\Arsse\Db\SQLite3\Driver;
trait DriverSQLite3 { trait DriverSQLite3 {
function setUpDriver() { function setUpDriver() {
if(!extension_loaded("sqlite3")) {
$this->markTestSkipped("SQLite extension not loaded");
}
Data::$conf->dbSQLite3File = ":memory:"; Data::$conf->dbSQLite3File = ":memory:";
$this->drv = new Driver(true); $this->drv = new Driver(true);
} }

View file

@ -54,7 +54,7 @@ http_response_code((int) $response['code']);
// if the response has a body, set the content type and (possibly) the ETag. // if the response has a body, set the content type and (possibly) the ETag.
if(strlen($response['content'])) { if(strlen($response['content'])) {
header("Content-Type: ".$response['mime']); header("Content-Type: ".$response['mime']);
if($response['cache']) header("ETag: ".md5($response['content'])); if($response['cache']) header('ETag: "'.md5($response['content']).'"');
} }
// if caching is enabled, set the last-modified date // if caching is enabled, set the last-modified date
if($response['cache']) header("Last-Modified: ".gmdate("D, d M Y H:i:s \G\M\T", $response['lastMod'])); if($response['cache']) header("Last-Modified: ".gmdate("D, d M Y H:i:s \G\M\T", $response['lastMod']));

View file

@ -1,7 +1,7 @@
#! /bin/sh #! /bin/sh
base=`dirname "$0"` base=`dirname "$0"`
php -n -S localhost:8000 "$base/server.php" >/dev/null & php -n -S localhost:8000 "$base/server.php" >/dev/null &
php "$base/../vendor/phpunit/phpunit/phpunit" -c "$base/phpunit.xml" php "$base/../vendor/phpunit/phpunit/phpunit" -c "$base/phpunit.xml" $*
sleep 1s sleep 1s
pid=`lsof -n -i:8000 | grep -Eo "php\s+[0-9]+" | grep -Eo "[0-9]+"` pid=`lsof -n -i:8000 | grep -Eo "php\s+[0-9]+" | grep -Eo "[0-9]+"`
kill $pid kill $pid

View file

@ -2,7 +2,7 @@
setlocal setlocal
set base=%~dp0 set base=%~dp0
start /b php -n -S localhost:8000 "%base%\server.php" >nul start /b php -n -S localhost:8000 "%base%\server.php" >nul
php "%base%\..\vendor\phpunit\phpunit\phpunit" -c "%base%\phpunit.xml" php "%base%\..\vendor\phpunit\phpunit\phpunit" -c "%base%\phpunit.xml" %*
timeout /nobreak /t 1 >nul timeout /nobreak /t 1 >nul
for /f "usebackq tokens=5" %%a in (`netstat -aon ^| find "LISTENING" ^| find ":8000"`) do ( for /f "usebackq tokens=5" %%a in (`netstat -aon ^| find "LISTENING" ^| find ":8000"`) do (
taskkill /f /pid %%a >nul taskkill /f /pid %%a >nul