.dev/tests/functional/cache/class_cache_abstract.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

require_once dirname(__DIR__) . '/yf_unit_tests_setup.php';

abstract class class_cache_abstract extends yf\tests\wrapper
{
    public static $_cache = [];
    public static function _cache_init()
    {
        main()->modules['cache'] = null;
        self::$_cache = clone _class('cache');
        self::$_cache->_init(['driver' => self::_get_driver_name()]);
        self::$_cache->_driver = clone self::$_cache->_driver;
        if (self::_get_driver_name() == 'memcache') {
            if (false !== strpos(strtolower(get_called_class()), '_memcached')) {
                self::$_cache->_driver->FORCE_EXT = 'memcached';
            } else {
                self::$_cache->_driver->FORCE_EXT = 'memcache';
            }
        }
        method_exists(self::$_cache->_driver, '_init') && self::$_cache->_driver->_init();
        self::$_cache->NO_CACHE = false;
        self::$_cache->CACHE_NS = 'unit_tests_';
        self::$_cache->FORCE_REBUILD_CACHE = false;
    }

    public static function _get_driver_name()
    {
        $called = strtolower(get_called_class());
        $allowed = [
            'memcache', 'xcache', 'apc', 'files', 'tmp', 'couchbase', 'mongodb', 'redis',
        ];
        foreach ($allowed as $name) {
            if (false !== strpos($called, '_' . $name)) {
                return $name;
            }
        }
        return 'tmp';
    }

    public static function _cache()
    {
        return self::$_cache;
    }

    public static function setUpBeforeClass() : void
    {
        if ( ! defined('HHVM_VERSION') || self::_get_driver_name() != 'memcache') {
            self::_cache_init();
        }
    }

    public static function tearDownAfterClass() : void
    {
        $driver = self::_get_driver_name();
        if ($driver == 'files') {
            $cache_dir = self::_cache()->_driver->CACHE_DIR;
            if ($cache_dir && file_exists($cache_dir)) {
                _class('dir')->delete_dir($cache_dir, $delete_start_dir = true);
            }
        }
    }

    protected function setUp() : void
    {
        if (defined('HHVM_VERSION') && self::_get_driver_name() == 'memcache') {
            self::_cache_init();
        }
    }

    public function test_driver()
    {
        $this->assertSame(self::_get_driver_name(), self::_cache()->DRIVER);
    }

    public function test_is_ready()
    {
        $this->assertTrue(self::_cache()->_driver_ok);
        $this->assertNotEmpty(self::_cache()->_driver);
        $this->assertTrue(self::_cache()->_driver->is_ready());
    }

    public function test_get()
    {
        $this->assertTrue(self::_cache()->flush());
        $this->assertNull(@self::_cache()->get(null));
        $this->assertNull(self::_cache()->get('k1'));

        $this->assertTrue(self::_cache()->set('k1', 'val1'));
        $this->assertSame('val1', self::_cache()->get('k1'));

        $this->assertTrue(self::_cache()->set('k11', 0));
        //        $this->assertSame(0, self::_cache()->get('k11'));
        $this->assertEquals(0, self::_cache()->get('k11'));

        $this->assertTrue(self::_cache()->set('k11_', false));
        $this->assertFalse(self::_cache()->get('k11_'));
    }

    public function test_set()
    {
        $this->assertTrue(self::_cache()->flush());
        $this->assertTrue(self::_cache()->set('k2', 'some_data'));
        $this->assertSame('some_data', self::_cache()->get('k2'));
        $this->assertTrue(self::_cache()->set('k2_', []));
        $this->assertSame([], self::_cache()->get('k2_'));
        $this->assertTrue(self::_cache()->set('k3_', false));
        $this->assertFalse(self::_cache()->get('k3_'));
    }

    public function test_del()
    {
        $this->assertTrue(self::_cache()->flush());
        $this->assertTrue(self::_cache()->set('k3', 'val3'));
        $this->assertSame('val3', self::_cache()->get('k3'));
        $this->assertTrue(self::_cache()->del('k3'));
        $this->assertNull(self::_cache()->get('k3'));
    }

    public function test_flush()
    {
        $this->assertTrue(self::_cache()->flush());
        $this->assertTrue(self::_cache()->set('k4', 'val4'));
        $this->assertTrue(self::_cache()->flush());
        $this->assertNull(self::_cache()->get('k4'));
        $this->assertNull(self::_cache()->list_keys());
    }

    public function test_list_keys()
    {
        if ( ! (self::_cache()->_driver->implemented['list_keys'] ?? null)) {
            return;
        }
        $this->assertTrue(self::_cache()->flush());
        $this->assertTrue(self::_cache()->set('k1', 'v1'));
        $this->assertTrue(self::_cache()->set('k2', 'v2'));
        $list_keys_result = self::_cache()->list_keys();
        if ($list_keys_result !== false && $list_keys_result !== null) {
            $this->assertSame(['k1', 'k2'], self::_cache()->list_keys());
            $this->assertTrue(self::_cache()->set('k3', 'v3'));
            $this->assertSame(['k1', 'k2', 'k3'], self::_cache()->list_keys());
        }
    }

    public function test_multi_get()
    {
        $this->assertTrue(self::_cache()->flush());
        $this->assertTrue(self::_cache()->set('k17', 'v1'));
        $this->assertTrue(self::_cache()->set('k27', 'v2'));
        $this->assertSame(['k17' => 'v1', 'k27' => 'v2'], self::_cache()->multi_get(['k17', 'k27']));
        $this->assertSame('v1', self::_cache()->get('k17'));
        $this->assertSame('v2', self::_cache()->get('k27'));

        $this->assertTrue(self::_cache()->flush());
        $this->assertTrue(self::_cache()->set('k18', 'v1'));
        $this->assertTrue(self::_cache()->set('k28', false));
        $this->assertSame(['k18' => 'v1', 'k28' => false], self::_cache()->multi_get(['k18', 'k28']));
        $this->assertSame('v1', self::_cache()->get('k18'));
        $this->assertFalse(self::_cache()->get('k28'));
    }

    public function test_multi_set()
    {
        $this->assertTrue(self::_cache()->flush());
        $this->assertNull(self::_cache()->multi_get(['k111', 'k222']));
        $this->assertTrue(self::_cache()->multi_set(['k111' => 'v1', 'k222' => 'v2']));
        $this->assertSame(['k111' => 'v1', 'k222' => 'v2'], self::_cache()->multi_get(['k111', 'k222']));

        $this->assertTrue(self::_cache()->flush());
        $this->assertNull(self::_cache()->multi_get(['k113', 'k223']));
        $this->assertTrue(self::_cache()->multi_set(['k113' => 'v1', 'k223' => false]));
        $this->assertSame(['k113' => 'v1', 'k223' => false], self::_cache()->multi_get(['k113', 'k223']));
    }

    public function test_multi_del()
    {
        $this->assertTrue(self::_cache()->flush());
        $this->assertNull(self::_cache()->multi_get(['k133', 'k233']));

        $this->assertTrue(self::_cache()->multi_set(['k133' => 'v1', 'k233' => 'v2']));
        $this->assertSame(['k133' => 'v1', 'k233' => 'v2'], self::_cache()->multi_get(['k133', 'k233']));

        $this->assertTrue(self::_cache()->set('k333', 'v3'));
        $this->assertTrue(self::_cache()->set('k444', false));
        $this->assertSame(['k333' => 'v3', 'k444' => false], self::_cache()->multi_get(['k333', 'k444']));

        $this->assertTrue(self::_cache()->multi_del(['k133', 'k233']));
        $this->assertNull(self::_cache()->multi_get(['k133', 'k233']));
        $this->assertSame('v3', self::_cache()->get('k333'));
        $this->assertFalse(self::_cache()->get('k444'));
    }
    
    public function test_del_by_prefix()
    {
        if ( ! (self::_cache()->_driver->implemented['list_keys'] ?? null)) {
            return;
        }
        $this->assertTrue(self::_cache()->flush());
        $this->assertTrue(self::_cache()->multi_set(['k118' => 'v11', 'k218' => 'v21', 'k138' => 'v13']));
        $this->assertSame(['k118' => 'v11', 'k218' => 'v21', 'k138' => 'v13'], self::_cache()->multi_get(['k118', 'k218', 'k138']));
        $this->assertTrue(self::_cache()->del_by_prefix('k1'));
        $list_keys_result = self::_cache()->list_keys();
        if ($list_keys_result !== false && $list_keys_result !== null) {
            $this->assertSame('v21', self::_cache()->get('k218'));
            $this->assertNull(self::_cache()->get('k138'));
        }
    }
}