blob: 4f3b438815714b6f598aab8b4009c43f271c1efb [file] [log] [blame]
<?php
/**
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @version //autogentag//
* @filesource
* @package TreePersistentObjectTiein
* @subpackage Tests
*/
require_once 'Tree/tests/tree.php';
require_once 'files/classes/fileentry.php';
/**
* @package TreePersistentObjectTiein
* @subpackage Tests
*/
class ezcTreePersistentObjectStore extends ezcTestCase
{
private $tempDir;
protected $tables = array( 'nested_set', 'fileentry' );
protected $schemaName = 'persistent_store.dba';
private $session;
protected function setUpEmptyTestTree()
{
$store = new ezcTreePersistentObjectDataStore( $this->session, 'FileEntry', 'id' );
$tree = ezcTreeDbNestedSet::create(
$this->dbh,
'nested_set',
$store
);
$this->emptyTables();
return $tree;
}
protected function setUpTestTree()
{
$store = new ezcTreePersistentObjectDataStore( $this->session, 'FileEntry', 'id' );
$tree = new ezcTreeDbNestedSet(
$this->dbh,
'nested_set',
$store
);
return $tree;
}
protected $dbh;
protected function setUp()
{
$this->tempDir = $this->createTempDir( __CLASS__ ) . '/';
$this->session = new ezcPersistentSession(
ezcDbInstance::get(),
new ezcPersistentCacheManager( new ezcPersistentCodeManager( dirname( __FILE__ ) . '/files/defs' ) )
);
try
{
$this->dbh = ezcDbInstance::get();
$this->removeTables();
$this->loadSchema();
}
catch ( Exception $e )
{
$this->markTestSkipped( $e->getMessage() );
}
}
public function teardown()
{
$this->removeTempDir();
}
private function loadSchema()
{
// create the parent_child table
$schema = ezcDbSchema::createFromFile(
'array',
dirname( __FILE__ ) . '/files/' . $this->schemaName
);
$schema->writeToDb( $this->dbh );
}
protected function emptyTables()
{
$db = $this->dbh;
foreach ( $this->tables as $table )
{
$q = $db->createDeleteQuery();
$q->deleteFrom( $table );
$s = $q->prepare();
$s->execute();
}
}
protected function removeTables()
{
try
{
foreach ( $this->tables as $table )
{
$this->dbh->exec( "DROP TABLE $table" );
}
}
catch ( Exception $e )
{
// ignore
}
}
private function addStandardData( $tree )
{
$entry = new FileEntry( ':root:', FileEntry::ROOT, 60639255 );
$node = $tree->createNode( 1, $entry );
$tree->setRootNode( $node );
$entry = new FileEntry( '/', FileEntry::PARTITION, 8385596, '/dev/sda6' );
$node2 = $tree->createNode( 2, $entry );
$node->addChild( $node2 );
$entry = new FileEntry( '/boot', FileEntry::PARTITION, 124443, '/dev/sda3' );
$node->addChild( $node3 = $tree->createNode( 3, $entry ) );
$entry = new FileEntry( '/boot/grub', FileEntry::DIR, 172 );
$node3->addChild( $node4 = $tree->createNode( 'grubby', $entry ) );
$entry = new FileEntry( '/boot/grub/stage1', FileEntry::FILE, 1 );
$node4->addChild( $tree->createNode( 5, $entry ) );
$entry = new FileEntry( '/boot/grub/stage2', FileEntry::FILE, 107 );
$node4->addChild( $tree->createNode( 6, $entry ) );
$entry = new FileEntry( '/home', FileEntry::PARTITION, 43743620, '/dev/sda7' );
$node->addChild( $node7 = $tree->createNode( 7, $entry ) );
$entry = new FileEntry( '/home/httpd', FileEntry::DIR, 652577 );
$node7->addChild( $node8 = $tree->createNode( 8, $entry ) );
$entry = new FileEntry( '/boot/httpd/pw-admin', FileEntry::FILE, 1 );
$node8->addChild( $tree->createNode( 9, $entry ) );
}
public function testCreateDbTree()
{
$tree = $this->setUpEmptyTestTree();
self::assertSame( false, $tree->nodeExists( '1' ) );
self::assertSame( false, $tree->nodeExists( '3' ) );
$entry = new FileEntry( ':root:', FileEntry::ROOT, 60639255 );
$node = $tree->createNode( 1, $entry );
self::assertType( 'ezcTreeNode', $node );
self::assertSame( '1', $node->id );
$tree->setRootNode( $node );
self::assertSame( true, $tree->nodeExists( '1' ) );
$entry = new FileEntry( '/', FileEntry::PARTITION, 8385596, '/dev/sda6' );
$node2 = $tree->createNode( 2, $entry );
$node->addChild( $node2 );
self::assertSame( true, $tree->nodeExists( '2' ) );
$entry = new FileEntry( '/boot', FileEntry::PARTITION, 124443, '/dev/sda3' );
$node->addChild( $node3 = $tree->createNode( 3, $entry ) );
$entry = new FileEntry( '/boot/grub', FileEntry::DIR, 172 );
$node3->addChild( $tree->createNode( 4, $entry ) );
self::assertSame( true, $tree->nodeExists( '3' ) );
self::assertSame( true, $tree->nodeExists( '4' ) );
}
public function testFetchData()
{
$tree = $this->setUpEmptyTestTree();
$this->addStandardData( $tree );
// start over
$tree = $this->setUpTestTree();
$node = $tree->fetchNodeById( '3' );
self::assertSame( 3, (int) $node->data->id );
self::assertSame( FileEntry::PARTITION, (int) $node->data->type );
$node = $tree->fetchNodeById( 'grubby' );
self::assertSame( 'grubby', $node->data->id );
self::assertSame( 172, (int) $node->data->size );
}
public function testFetchDataXmlTree()
{
$store = new ezcTreePersistentObjectDataStore( $this->session, 'FileEntry', 'id' );
$tree = ezcTreeXml::create( $this->tempDir . 'test-xml.xml', $store, 'ezc' );
$this->emptyTables();
$this->addStandardData( $tree );
// start over
$tree = new ezcTreeXml( $this->tempDir . 'test-xml.xml', $store, 'ezc' );
$node = $tree->fetchNodeById( '3' );
self::assertSame( 3, (int) $node->data->id );
self::assertSame( FileEntry::PARTITION, (int) $node->data->type );
$node = $tree->fetchNodeById( 'grubby' );
self::assertSame( 'grubby', $node->data->id );
self::assertSame( 172, (int) $node->data->size );
}
public function testFetchMissingData()
{
$tree = $this->setUpEmptyTestTree();
$this->addStandardData( $tree );
$node = $tree->fetchNodeById( '9' );
$data = $node->data;
$this->session->delete( $data );
// start over
$tree = $this->setUpTestTree();
try
{
$node = $tree->fetchNodeById( '9' );
$data = $node->data;
self::fail( "Expected exception not thrown." );
}
catch ( ezcTreeDataStoreMissingDataException $e )
{
self::assertSame( "The data store does not have data stored for the node with ID '9'.", $e->getMessage() );
}
}
public function testFetchDataMultipleNodes()
{
$tree = $this->setUpEmptyTestTree();
$this->addStandardData( $tree );
// start over
$tree = $this->setUpTestTree();
$list = $tree->fetchSubtree( '1' );
foreach ( new ezcTreeNodeListIterator( $tree, $list, $tree ) as $elem )
{
}
self::assertSame( '/boot/httpd/pw-admin', $elem->name );
}
public function testDeleteData()
{
$tree = $this->setUpEmptyTestTree();
$this->addStandardData( $tree );
$node = $tree->delete( '3' );
// start over
$tree = $this->setUpTestTree();
$list = $tree->fetchSubtree( '1' );
self::assertSame( 5, $list->size );
}
public static function suite()
{
return new PHPUnit_Framework_TestSuite( "ezcTreePersistentObjectStore" );
}
}
?>