improving code coverage and unit testing

This commit is contained in:
El RIDO 2016-07-18 14:47:32 +02:00
parent ff0c55c0d6
commit b53efda635
8 changed files with 139 additions and 15 deletions

View File

@ -107,8 +107,7 @@ dir = PATH "data"
[purge]
; minimum time limit between two purgings of expired pastes, it is only
; triggered when pastes are created
; Set this to 0 to disable purging. Set it to run more frequently, if you are
; running a large site.
; Set this to 0 to run a purge every time a paste is created.
limit = 300
; maximum amount of expired pastes to delete in one purge

View File

@ -243,7 +243,8 @@ class privatebin_data extends privatebin_abstract
}
$secondKey = array_rand($secondLevel);
$path = self::$_dir . $firstLevel[$firstKey] . '/' . $secondLevel[$secondKey];
$path = self::$_dir . $firstLevel[$firstKey] .
DIRECTORY_SEPARATOR . $secondLevel[$secondKey];
if (!is_dir($path)) continue;
$thirdLevel = array_filter(
scandir($path),
@ -310,7 +311,8 @@ class privatebin_data extends privatebin_abstract
*/
private static function _dataid2path($dataid)
{
return self::$_dir . substr($dataid,0,2) . '/' . substr($dataid,2,2) . '/';
return self::$_dir . substr($dataid,0,2) . DIRECTORY_SEPARATOR .
substr($dataid,2,2) . DIRECTORY_SEPARATOR;
}
/**
@ -325,7 +327,8 @@ class privatebin_data extends privatebin_abstract
*/
private static function _dataid2discussionpath($dataid)
{
return self::_dataid2path($dataid) . $dataid . '.discussion/';
return self::_dataid2path($dataid) . $dataid .
'.discussion' . DIRECTORY_SEPARATOR;
}
/**
@ -338,7 +341,8 @@ class privatebin_data extends privatebin_abstract
*/
private static function _isFirstLevelDir($element)
{
return self::_isSecondLevelDir($element) && is_dir(self::$_dir . '/' . $element);
return self::_isSecondLevelDir($element) &&
is_dir(self::$_dir . DIRECTORY_SEPARATOR . $element);
}
/**

View File

@ -607,8 +607,8 @@ class privatebin_db extends privatebin_abstract
"postdate INT$after_key );"
);
self::$_db->exec(
'CREATE INDEX parent ON ' . self::_sanitizeIdentifier('comment') .
'(pasteid);'
'CREATE INDEX IF NOT EXISTS comment_parent ON ' .
self::_sanitizeIdentifier('comment') . '(pasteid);'
);
}
@ -689,14 +689,17 @@ class privatebin_db extends privatebin_abstract
else
{
self::$_db->exec(
'CREATE UNIQUE INDEX primary ON ' . self::_sanitizeIdentifier('paste') . '(dataid);'
'CREATE UNIQUE INDEX IF NOT EXISTS paste_dataid ON ' .
self::_sanitizeIdentifier('paste') . '(dataid);'
);
self::$_db->exec(
'CREATE UNIQUE INDEX primary ON ' . self::_sanitizeIdentifier('comment') . '(dataid);'
'CREATE UNIQUE INDEX IF NOT EXISTS comment_dataid ON ' .
self::_sanitizeIdentifier('comment') . '(dataid);'
);
}
self::$_db->exec(
'CREATE INDEX parent ON ' . self::_sanitizeIdentifier('comment') . '(pasteid);'
'CREATE INDEX IF NOT EXISTS comment_parent ON ' .
self::_sanitizeIdentifier('comment') . '(pasteid);'
);
}
}

View File

@ -8,7 +8,9 @@ class modelTest extends PHPUnit_Framework_TestCase
public function setUp()
{
/* Setup Routine */
helper::confRestore();
$options = parse_ini_file(CONF, true);
$options['purge']['limit'] = 0;
$options['model'] = array(
'class' => 'privatebin_db',
);
@ -209,6 +211,45 @@ class modelTest extends PHPUnit_Framework_TestCase
$paste->getComment(helper::getPasteId())->delete();
}
public function testPurge()
{
$conf = new configuration;
$store = privatebin_db::getInstance($conf->getSection('model_options'));
$store->delete(helper::getPasteId());
$expired = helper::getPaste(array('expire_date' => 1344803344));
$paste = helper::getPaste(array('expire_date' => time() + 3600));
$keys = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'x', 'y', 'z');
$ids = array();
foreach ($keys as $key)
{
$ids[$key] = substr(md5($key), 0, 16);
$store->delete($ids[$key]);
$this->assertFalse($store->exists($ids[$key]), "paste $key does not yet exist");
if (in_array($key, array('x', 'y', 'z')))
{
$this->assertTrue($store->create($ids[$key], $paste), "store $key paste");
}
else
{
$this->assertTrue($store->create($ids[$key], $expired), "store $key paste");
}
$this->assertTrue($store->exists($ids[$key]), "paste $key exists after storing it");
}
$this->_model->purge(10);
foreach ($ids as $key => $id)
{
if (in_array($key, array('x', 'y', 'z')))
{
$this->assertTrue($this->_model->getPaste($ids[$key])->exists(), "paste $key exists after purge");
$this->_model->getPaste($ids[$key])->delete();
}
else
{
$this->assertFalse($this->_model->getPaste($ids[$key])->exists(), "paste $key was purged");
}
}
}
public function testCommentWithDisabledVizhash()
{
$options = parse_ini_file(CONF, true);

View File

@ -7,7 +7,6 @@ class privatebinTest extends PHPUnit_Framework_TestCase
{
/* Setup Routine */
$this->_model = privatebin_data::getInstance(array('dir' => PATH . 'data'));
serversalt::setPath(PATH . 'data');
$this->reset();
}
@ -456,6 +455,28 @@ class privatebinTest extends PHPUnit_Framework_TestCase
);
}
/**
* @runInSeparateProcess
*/
public function testCreateTooSoon()
{
$this->reset();
$_POST = helper::getPaste();
$_SERVER['HTTP_X_REQUESTED_WITH'] = 'JSONHttpRequest';
$_SERVER['REQUEST_METHOD'] = 'POST';
$_SERVER['REMOTE_ADDR'] = '::1';
ob_start();
new privatebin;
ob_end_clean();
$this->_model->delete(helper::getPasteId());
ob_start();
new privatebin;
$content = ob_get_contents();
$response = json_decode($content, true);
$this->assertEquals(1, $response['status'], 'outputs error status');
$this->assertFalse($this->_model->exists(helper::getPasteId()), 'paste exists after posting data');
}
/**
* @runInSeparateProcess
*/

View File

@ -65,6 +65,7 @@ class privatebin_dataTest extends PHPUnit_Framework_TestCase
public function testPurge()
{
mkdir($this->_path . DIRECTORY_SEPARATOR . '00', 0777, true);
$expired = helper::getPaste(array('expire_date' => 1344803344));
$paste = helper::getPaste(array('expire_date' => time() + 3600));
$keys = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'x', 'y', 'z');

View File

@ -78,6 +78,7 @@ class privatebin_dbTest extends PHPUnit_Framework_TestCase
foreach ($keys as $key)
{
$ids[$key] = substr(md5($key), 0, 16);
$this->_model->delete($ids[$key]);
$this->assertFalse($this->_model->exists($ids[$key]), "paste $key does not yet exist");
if (in_array($key, array('x', 'y', 'z')))
{
@ -95,6 +96,7 @@ class privatebin_dbTest extends PHPUnit_Framework_TestCase
if (in_array($key, array('x', 'y', 'z')))
{
$this->assertTrue($this->_model->exists($ids[$key]), "paste $key exists after purge");
$this->_model->delete($ids[$key]);
}
else
{
@ -224,10 +226,53 @@ class privatebin_dbTest extends PHPUnit_Framework_TestCase
privatebin_db::getInstance($options);
}
public function testOldAttachments()
{
mkdir(PATH . 'data');
$path = PATH . 'data' . DIRECTORY_SEPARATOR . 'attachement-test.sq3';
@unlink($path);
$this->_options['dsn'] = 'sqlite:' . $path;
$this->_options['tbl'] = 'bar_';
$model = privatebin_db::getInstance($this->_options);
$original = $paste = helper::getPasteWithAttachment(array('expire_date' => 1344803344));
$paste['meta']['attachment'] = $paste['attachment'];
$paste['meta']['attachmentname'] = $paste['attachmentname'];
unset($paste['attachment'], $paste['attachmentname']);
$meta = $paste['meta'];
$db = new PDO(
$this->_options['dsn'],
$this->_options['usr'],
$this->_options['pwd'],
$this->_options['opt']
);
$statement = $db->prepare('INSERT INTO bar_paste VALUES(?,?,?,?,?,?,?,?,?)');
$statement->execute(
array(
helper::getPasteId(),
$paste['data'],
$paste['meta']['postdate'],
1344803344,
0,
0,
json_encode($meta),
null,
null,
)
);
$statement->closeCursor();
$this->assertTrue($model->exists(helper::getPasteId()), 'paste exists after storing it');
$this->assertEquals(json_decode(json_encode($original)), $model->read(helper::getPasteId()));
helper::rmdir(PATH . 'data');
}
public function testTableUpgrade()
{
mkdir(PATH . 'data');
$path = PATH . 'data/db-test.sq3';
$path = PATH . 'data' . DIRECTORY_SEPARATOR . 'db-test.sq3';
@unlink($path);
$this->_options['dsn'] = 'sqlite:' . $path;
$this->_options['tbl'] = 'foo_';
@ -246,7 +291,17 @@ class privatebin_dbTest extends PHPUnit_Framework_TestCase
'opendiscussion INT, ' .
'burnafterreading INT );'
);
$db->exec(
'CREATE TABLE foo_comment ( ' .
"dataid CHAR(16) NOT NULL, " .
'pasteid CHAR(16), ' .
'parentid CHAR(16), ' .
'data BLOB, ' .
'nickname BLOB, ' .
'vizhash BLOB, ' .
"postdate INT );"
);
privatebin_db::getInstance($this->_options);
@unlink($path);
helper::rmdir(PATH . 'data');
}
}

View File

@ -19,7 +19,7 @@ class privatebinWithDbTest extends privatebinTest
/* Setup Routine */
$this->_path = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'privatebin_data';
if(!is_dir($this->_path)) mkdir($this->_path);
$this->_options['dsn'] = 'sqlite:' . $this->_path . '/tst.sq3';
$this->_options['dsn'] = 'sqlite:' . $this->_path . DIRECTORY_SEPARATOR . 'tst.sq3';
$this->_model = privatebin_db::getInstance($this->_options);
$this->reset();
}