<?php
namespace ParagonIE\EasyDB\Tests;
use ParagonIE\EasyDB\EasyDB;
use ParagonIE\EasyDB\EasyDBCache;
use PHPUnit\Framework\TestCase;
/**
* Class EasyDBCacheTest
* @package ParagonIE\EasyDB\Tests
*/
class EasyDBCacheTest extends TestCase
{
/** @var EasyDBCache $db */
private $db;
/** @var string $fuzz */
private $fuzz;
/** @var EasyDB $db */
private $db2;
public function setUp(): void
{
if (!\extension_loaded('sqlite3')) {
$this->markTestSkipped('SQLite driver not installed.');
}
$pdo = new \PDO('sqlite::memory:');
$this->db = new EasyDBCache($pdo);
$this->db->query("CREATE TABLE foo (bar TEXT, baz TEXT);");
$this->fuzz = bin2hex(random_bytes(16));
$this->db->insert('foo', ['bar' => 'easydb', 'baz' => $this->fuzz]);
$this->db->insert('foo', ['bar' => 'ezdb', 'baz' => $this->fuzz]);
$this->db2 = new EasyDB($pdo);
}
/**
* @throws \SodiumException
*/
public function testPrepareReuse()
{
$query = "SELECT * FROM foo WHERE bar = ?";
$query2 = "SELECT * FROM foo WHERE baz = ?";
// Preliminary:
$this->assertFalse(
$this->db->isCached($query),
'Prepared statement was already cached.'
);
$resultA = $this->db->run($query, 'easydb');
$this->assertCount(1, $resultA);
$this->assertTrue(
$this->db->isCached($query),
'Prepared statement cache miss.'
);
$resultB = $this->db->run($query, 'easydb');
$this->assertCount(1, $resultA);
$this->assertEquals(
$resultA,
$resultB,
'Different results from same query?'
);
$this->assertFalse(
$this->db->isCached($query2),
'Prepared statement #2 was already cached.'
);
$results = $this->db->run($query2, $this->fuzz);
$this->assertTrue(
$this->db->isCached($query2),
'Prepared statement #2 cache miss.'
);
$this->assertCount(2, $results);
$this->db->clearStatementCache();
$this->assertFalse(
$this->db->isCached($query2),
'Clear statement cache failed'
);
}
/**
* @throws \SodiumException
*/
public function testSpeed()
{
if (!extension_loaded('sodium') || PHP_VERSION_ID >= 70300) {
$this->markTestSkipped('Do not run this test without ext/sodium');
}
// Initialize variables:
$stop = $uncacheTime = $cacheTime = 0;
$start = microtime(true);
for ($i = 0; $i < 100000; ++$i) {
$this->db->prepare("SELECT * FROM foo WHERE bar = ? OR baz = ?");
}
$stop = microtime(true);
$cacheTime = $stop - $start;
$start = microtime(true);
for ($i = 0; $i < 100000; ++$i) {
$this->db2->prepare("SELECT * FROM foo WHERE bar = ? OR baz = ?");
}
$stop = microtime(true);
$uncacheTime = $stop - $start;
$this->assertLessThan($uncacheTime, $cacheTime);
}
}
|