<?php
/**
 * ezcCacheComplexStackTest 
 * 
 * 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.
 *
 * @package Cache
 * @subpackage Tests
 * @version //autogen//
 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
 */

/**
 * Configurator class.
 */
require_once 'stack_test_configurator.php';

/**
 * Complex "real live" tests for ezcCacheStack.
 *
 * Attention, this test runs continuous and does not reset its environment
 * after each test case.
 * 
 * @package Cache
 * @subpackage Tests
 */
class ezcCacheComplexCacheTest extends ezcTestCase
{
    protected static $stackInitialized = false;

    protected $testDataArray;

    protected function setup()
    {
        if ( !self::$stackInitialized )
        {
            if ( ezcBaseFeatures::hasExtensionSupport( 'apc' ) )
            {
                $memoryStorage = new ezcCacheStorageApcPlain();
            }
            else if ( ezcBaseFeatures::hasExtensionSupport( 'memcache' ) )
            {
                $memoryStorage = new ezcCacheStorageMemcachePlain( 'foo' );
            }
            else
            {
                $this->markTestSkipped( 'APC or Memcached needed to run this test.' );
            }
            // Start cleanly
            $memoryStorage->reset();

            $tmpDir = $this->createTempDir( __CLASS__ );
            $tmpDirEvalArray = "$tmpDir/plain";
            $tmpDirArray = "$tmpDir/array";

            mkdir( $tmpDirEvalArray );
            mkdir( $tmpDirArray );
            
            $fileStorageEvalArray = new ezcCacheStorageFileEvalArray( $tmpDirEvalArray );
            $fileStorageArray = new ezcCacheStorageFileArray( $tmpDirArray );

            ezcCacheStackTestConfigurator::reset();

            ezcCacheStackTestConfigurator::$storages = array(
                new ezcCacheStackStorageConfiguration(
                    'eval_array_storage',
                    $fileStorageEvalArray,
                    10,
                    .8
                ),
                new ezcCacheStackStorageConfiguration(
                    'array_storage',
                    $fileStorageArray,
                    8,
                    .5
                ),
                new ezcCacheStackStorageConfiguration(
                    'memory_storage',
                    $memoryStorage,
                    5,
                    .5
                ),
            );

            ezcCacheStackTestConfigurator::$metaStorage = $fileStorageArray;
            
            ezcCacheManager::createCache(
                __CLASS__,
                null,
                'ezcCacheStack',
                new ezcCacheStackOptions(
                    array(
                        'configurator' => 'ezcCacheStackTestConfigurator',
                        'replacementStrategy' => 'ezcCacheStackLfuReplacementStrategy',
                    )
                )
            );

            self::$stackInitialized = true;
        }

        $this->testDataArray = array(
             array( 'id_1', 'id_1_content', array( 'lang' => 'en', 'area' => 'news' ) ),
             array( 'id_2', 'id_2_content', array( 'lang' => 'en', 'area' => 'news' ) ),
             array( 'id_3', 'id_3_content', array( 'lang' => 'de', 'area' => 'news' ) ),
             array( 'id_4', 'id_4_content', array( 'lang' => 'no', 'area' => 'news' ) ),
             array( 'id_5', 'id_5_content', array( 'lang' => 'de', 'area' => 'news' ) ),
        );
    }

    public static function suite()
    {
        return new PHPUnit_Framework_TestSuite( __CLASS__ );
    }

    public function testEnvSetup()
    {
        $stack = ezcCacheManager::getCache( __CLASS__ );
        $data  = $this->testDataArray;

        // Assert basic config
        $this->assertEquals(
            $stack->getStorages(),
            array_reverse( ezcCacheStackTestConfigurator::$storages )
        );
        $this->assertEquals(
            $stack->options,
            new ezcCacheStackOptions(
                array(
                    'configurator'        => 'ezcCacheStackTestConfigurator',
                    'replacementStrategy' => 'ezcCacheStackLfuReplacementStrategy',
                    'metaStorage'         => ezcCacheStackTestConfigurator::$metaStorage,
                    'bubbleUpOnRestore'   => false,
                )
            )
        );
    }

    public function testBasicStore()
    {
        $stack = ezcCacheManager::getCache( __CLASS__ );
        $data  = $this->testDataArray;

        // Basic store
        foreach ( $this->testDataArray as $dataRow )
        {
            $stack->store( $dataRow[0], $dataRow[1], $dataRow[2] );
        }

        // Assert basic store
        foreach ( $stack->getStorages() as $storageConf )
        {
            foreach ( $this->testDataArray as $dataRow )
            {
                $this->assertEquals(
                    $dataRow[1],
                    $storageConf->storage->restore( $dataRow[0], $dataRow[2] ),
                    "ID '{$dataRow[0]}' missing in storoage '{$storageConf->id}'."
                );
            }
        }
    }

    public function testBasicDelete()
    {
        $stack = ezcCacheManager::getCache( __CLASS__ );
        $data  = $this->testDataArray;

        // Basic delete
        $stack->delete( $data[2][0], $data[2][2] );

        // Assert basic delete
        foreach ( $stack->getStorages() as $storageConf )
        {
            $this->assertFalse(
                $storageConf->storage->restore( $data[2][0], $data[2][2] )
            );
        }
    }

    public function testAdvancedDelete()
    {
        $stack = ezcCacheManager::getCache( __CLASS__ );
        $data  = $this->testDataArray;

        // Advanced delete
        $stack->delete( null, array( 'lang' => 'en' ), true );

        // Assert advanced delete
        foreach ( $stack->getStorages() as $storageConf )
        {
            foreach ( $data as $rowId => $dataRow )
            {
                if ( $dataRow[2]['lang'] === 'en' || $rowId == 2 )
                {
                    $this->assertFalse(
                        $storageConf->storage->restore( $dataRow[0], $dataRow[2] ),
                        "Item with ID '{$dataRow[0]}' still available in storage {$storageConf->id}"
                    );
                }
                else
                {
                    $this->assertEquals(
                        $dataRow[1],
                        $storageConf->storage->restore( $dataRow[0], $dataRow[2] )
                    );
                }

            }
        }
    }

    public function testStoreSecondTime()
    {
        $stack = ezcCacheManager::getCache( __CLASS__ );
        $data  = $this->testDataArray;

        // Store all data again
        foreach ( $data as $dataRow )
        {
            $stack->store( $dataRow[0], $dataRow[1], $dataRow[2] );
        }

        $this->assertEquals(
            array(
                'replacementData' => 
                array (
                    'id_4' => 6,
                    'id_5' => 6,
                    'id_1' => 3,
                    'id_2' => 3,
                    'id_3' => 3,
                ),
                'storageData' => 
                array (
                    'memory_storage' => 
                    array (
                        'id_4' => true,
                        'id_5' => true,
                        'id_1' => true,
                        'id_2' => true,
                        'id_3' => true,
                    ),
                    'array_storage' => 
                    array (
                        'id_4' => true,
                        'id_5' => true,
                        'id_1' => true,
                        'id_2' => true,
                        'id_3' => true,
                    ),
                    'eval_array_storage' => 
                    array (
                        'id_4' => true,
                        'id_5' => true,
                        'id_1' => true,
                        'id_2' => true,
                        'id_3' => true,
                    ),
                )
            ),
            ezcCacheStackTestConfigurator::$metaStorage->restoreMetaData()->getState(),
            'Assertion of current meta data failed'
        );
    }

    public function testRestores()
    {
        $stack = ezcCacheManager::getCache( __CLASS__ );
        $data  = $this->testDataArray;

        // Change some accesses
        $stack->restore( $data[0][0], $data[0][2] );
        $stack->restore( $data[0][0], $data[0][2] );
        $stack->restore( $data[0][0], $data[0][2] );
        $stack->restore( $data[0][0], $data[0][2] );
        $stack->restore( $data[2][0], $data[2][2] );

        $metaData = ezcCacheStackTestConfigurator::$metaStorage->restoreMetaData()->getState();

        $this->assertEquals(
            array (
                'id_4' => 6,
                'id_5' => 6,
                'id_1' => 7,
                'id_2' => 3,
                'id_3' => 4,
            ),
            $metaData['replacementData']
        );
    }

    public function testFreeInMemoryStorage()
    {
        $stack = ezcCacheManager::getCache( __CLASS__ );
        $data  = $this->testDataArray;

        // Free in 'memory_storage'
        $stack->store( 'id_6', 'id_6_contente' );

        $metaData = ezcCacheStackTestConfigurator::$metaStorage->restoreMetaData()->getState();
        $this->assertEquals(
            array (
                'replacementData' => 
                array (
                    'id_2' => 3,
                    'id_3' => 4,
                    'id_5' => 6,
                    'id_4' => 6,
                    'id_1' => 7,
                    'id_6' => 3,
                ),
                'storageData' => 
                array (
                    'memory_storage' => 
                    array (
                        'id_4' => true,
                        'id_1' => true,
                        'id_6' => true,
                    ),
                    'array_storage' => 
                    array (
                        'id_4' => true,
                        'id_5' => true,
                        'id_1' => true,
                        'id_2' => true,
                        'id_3' => true,
                        'id_6' => true,
                    ),
                    'eval_array_storage' => 
                    array (
                        'id_4' => true,
                        'id_5' => true,
                        'id_1' => true,
                        'id_2' => true,
                        'id_3' => true,
                        'id_6' => true,
                    ),
                ),
            ),
            $metaData
        );
    }

    public function testRestores2()
    {
        $stack = ezcCacheManager::getCache( __CLASS__ );
        $data  = $this->testDataArray;
        
        // Change some usage stats
        $stack->restore( $data[1][0], $data[1][2] );
        $stack->restore( $data[1][0], $data[1][2] );
        $stack->restore( $data[1][0], $data[1][2] );
        $stack->restore( 'id_6' );
        $stack->restore( 'id_6' );
        $stack->restore( 'id_6' );
        $stack->restore( 'id_6' );
        $stack->restore( 'id_6' );
        $stack->restore( 'id_6' );
                    
        $metaData = ezcCacheStackTestConfigurator::$metaStorage->restoreMetaData()->getState();
        $this->assertEquals(
            array (
                'replacementData' => 
                array (
                    'id_2' => 6,
                    'id_3' => 4,
                    'id_5' => 6,
                    'id_4' => 6,
                    'id_1' => 7,
                    'id_6' => 9,
                ),
                'storageData' => 
                array (
                    'memory_storage' => 
                    array (
                        'id_4' => true,
                        'id_1' => true,
                        'id_6' => true,
                        // 'id_2' => true,
                    ),
                    'array_storage' => 
                    array (
                        'id_4' => true,
                        'id_5' => true,
                        'id_1' => true,
                        'id_2' => true,
                        'id_3' => true,
                        'id_6' => true,
                    ),
                    'eval_array_storage' => 
                    array (
                        'id_4' => true,
                        'id_5' => true,
                        'id_1' => true,
                        'id_2' => true,
                        'id_3' => true,
                        'id_6' => true,
                    ),
                ),
            ),
            $metaData
        );
    }

    public function testFreeInArrayStorage()
    {
        $stack = ezcCacheManager::getCache( __CLASS__ );
        $data  = $this->testDataArray;

        // Free 'array_storage'

        $stack->store( 'id_7', 'id_7_content' );
        // Should net get purged directly again
        $stack->restore( 'id_7' );
        $stack->restore( 'id_7' );
        $stack->restore( 'id_7' );
        $stack->restore( 'id_7' );
        $stack->restore( 'id_7' );

        $stack->store( 'id_8', 'id_8_content' );
        // Should net get purged directly again
        $stack->restore( 'id_8' );
        $stack->restore( 'id_8' );
        $stack->restore( 'id_8' );
        $stack->restore( 'id_8' );
        $stack->restore( 'id_8' );

        $stack->store( 'id_9', 'id_9_content', array( 'lang' => 'no', 'section' => 'articles' ) );
        // Should net get purged directly again
        $stack->restore( 'id_9', null, true );
        $stack->restore( 'id_9', null, true );
        $stack->restore( 'id_9', null, true );
        $stack->restore( 'id_9', null, true );

        $metaData = ezcCacheStackTestConfigurator::$metaStorage->restoreMetaData()->getState();
        $this->assertEquals(
            array (
                'replacementData' => 
                array (
                    'id_9' => 7, // Was 3 before got restored
                    'id_3' => 4,
                    'id_5' => 6,
                    'id_4' => 6,
                    'id_2' => 6,
                    'id_1' => 7,
                    'id_8' => 8,
                    'id_7' => 8,
                    'id_6' => 9,
                ),
                'storageData' => 
                array (
                    'memory_storage' => 
                    array (
                        'id_6' => true,
                        'id_8' => true,
                        'id_9' => true,
                    ),
                    'array_storage' => 
                    array (
                        'id_1' => true,
                        'id_6' => true,
                        'id_7' => true,
                        'id_8' => true,
                        'id_9' => true,
                    ),
                    'eval_array_storage' => 
                    array (
                        'id_4' => true,
                        'id_5' => true,
                        'id_1' => true,
                        'id_2' => true,
                        'id_3' => true,
                        'id_6' => true,
                        'id_7' => true,
                        'id_8' => true,
                        'id_9' => true,
                    ),
                ),
            ),
            $metaData
        );
    }

    public function testBubbleUp()
    {
        $stack = ezcCacheManager::getCache( __CLASS__ );
        $data  = $this->testDataArray;
        
        // Bubble up now
        $stack->options->bubbleUpOnRestore = true;

        // Bubble up item id_1 from 2nd level to 1st level
        $this->assertEquals(
            $data[0][1],
            $stack->restore( $data[0][0], $data[0][2] )
        );

        $metaData = ezcCacheStackTestConfigurator::$metaStorage->restoreMetaData()->getState();
        $this->assertTrue(
            $metaData['storageData']['memory_storage']['id_1']
        );
        $this->assertEquals(
            $data[0][1],
            ezcCacheStackTestConfigurator::$storages[2]->storage->restore(
                $data[0][0], $data[0][2]
            )
        );
        $this->assertTrue(
            $metaData['storageData']['array_storage']['id_1']
        );
       
        // Bubble up from 3rd level to 1st and 2nd level
        $this->assertEquals(
            $data[2][1],
            $stack->restore( $data[2][0], $data[2][2] )
        );

        $metaData = ezcCacheStackTestConfigurator::$metaStorage->restoreMetaData()->getState();
        $this->assertTrue(
            $metaData['storageData']['memory_storage']['id_3']
        );
        $this->assertTrue(
            $metaData['storageData']['array_storage']['id_3']
        );

        $metaData = ezcCacheStackTestConfigurator::$metaStorage->restoreMetaData()->getState();
        $this->assertEquals(
            array (
                'replacementData' => 
                array (
                    'id_9' => 7,
                    'id_3' => 7,
                    'id_5' => 6,
                    'id_4' => 6,
                    'id_2' => 6,
                    'id_1' => 9,
                    'id_8' => 8,
                    'id_7' => 8,
                    'id_6' => 9,
                ),
                'storageData' => 
                array (
                    'memory_storage' => 
                    array (
                        'id_6' => true,
                        'id_8' => true,
                        'id_9' => true,
                        'id_1' => true,
                        'id_3' => true,
                    ),
                    'array_storage' => 
                    array (
                        'id_1' => true,
                        'id_6' => true,
                        'id_7' => true,
                        'id_8' => true,
                        'id_9' => true,
                        'id_3' => true,
                    ),
                    'eval_array_storage' => 
                    array (
                        'id_4' => true,
                        'id_5' => true,
                        'id_1' => true,
                        'id_2' => true,
                        'id_3' => true,
                        'id_6' => true,
                        'id_7' => true,
                        'id_8' => true,
                        'id_9' => true,
                    ),
                ),
            ),
            $metaData
        );
    }

    public function testNoBubbleUpAgain()
    {
        $stack = ezcCacheManager::getCache( __CLASS__ );
        $data  = $this->testDataArray;

        // Stop bubbling up again
        $stack->options->bubbleUpOnRestore = false;

        // Restore item id_2 from 3rd level without bubbling
        $this->assertEquals(
            $data[1][1],
            $stack->restore( $data[1][0], $data[1][2] )
        );
        // Restore item id_7 from 2nd level without bubbling
        $this->assertEquals(
            'id_7_content',
            $stack->restore( 'id_7' )
        );
        
        $metaData = ezcCacheStackTestConfigurator::$metaStorage->restoreMetaData()->getState();
        $this->assertEquals(
            array (
                'replacementData' => 
                array (
                    'id_9' => 7,
                    'id_3' => 7,
                    'id_5' => 6,
                    'id_4' => 6,
                    'id_2' => 7,
                    'id_1' => 9,
                    'id_8' => 8,
                    'id_7' => 9,
                    'id_6' => 9,
                ),
                'storageData' => 
                array (
                    'memory_storage' => 
                    array (
                        'id_6' => true,
                        'id_8' => true,
                        'id_9' => true,
                        'id_1' => true,
                        'id_3' => true,
                    ),
                    'array_storage' => 
                    array (
                        'id_1' => true,
                        'id_6' => true,
                        'id_7' => true,
                        'id_8' => true,
                        'id_9' => true,
                        'id_3' => true,
                    ),
                    'eval_array_storage' => 
                    array (
                        'id_4' => true,
                        'id_5' => true,
                        'id_1' => true,
                        'id_2' => true,
                        'id_3' => true,
                        'id_6' => true,
                        'id_7' => true,
                        'id_8' => true,
                        'id_9' => true,
                    ),
                ),
            ),
            $metaData
        );
    }
}

?>
