統計
| ブランチ: | リビジョン:

pictcode / lib / Cake / Test / Case / Cache / CacheTest.php @ 0b1b8047

履歴 | 表示 | アノテート | ダウンロード (13.938 KB)

1
<?php
2
/**
3
 * CacheTest file
4
 *
5
 * CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
6
 * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
7
 *
8
 * Licensed under The MIT License
9
 * For full copyright and license information, please see the LICENSE.txt
10
 * Redistributions of files must retain the above copyright notice
11
 *
12
 * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
13
 * @link          http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests
14
 * @package       Cake.Test.Case.Cache
15
 * @since         CakePHP(tm) v 1.2.0.5432
16
 * @license       http://www.opensource.org/licenses/mit-license.php MIT License
17
 */
18

    
19
App::uses('Cache', 'Cache');
20

    
21
/**
22
 * CacheTest class
23
 *
24
 * @package       Cake.Test.Case.Cache
25
 */
26
class CacheTest extends CakeTestCase {
27

    
28
        protected $_count = 0;
29

    
30
/**
31
 * setUp method
32
 *
33
 * @return void
34
 */
35
        public function setUp() {
36
                parent::setUp();
37
                $this->_cacheDisable = Configure::read('Cache.disable');
38
                Configure::write('Cache.disable', false);
39

    
40
                $this->_defaultCacheConfig = Cache::config('default');
41
                Cache::config('default', array('engine' => 'File', 'path' => TMP . 'tests'));
42
        }
43

    
44
/**
45
 * tearDown method
46
 *
47
 * @return void
48
 */
49
        public function tearDown() {
50
                parent::tearDown();
51
                Cache::drop('latest');
52
                Cache::drop('page');
53
                Cache::drop('archive');
54
                Configure::write('Cache.disable', $this->_cacheDisable);
55
                Cache::config('default', $this->_defaultCacheConfig['settings']);
56
        }
57

    
58
/**
59
 * testConfig method
60
 *
61
 * @return void
62
 */
63
        public function testConfig() {
64
                $settings = array('engine' => 'File', 'path' => TMP . 'tests', 'prefix' => 'cake_test_');
65
                $results = Cache::config('new', $settings);
66
                $this->assertEquals(Cache::config('new'), $results);
67
                $this->assertTrue(isset($results['engine']));
68
                $this->assertTrue(isset($results['settings']));
69
        }
70

    
71
/**
72
 * testConfigInvalidEngine method
73
 *
74
 * @expectedException CacheException
75
 * @return void
76
 */
77
        public function testConfigInvalidEngine() {
78
                $settings = array('engine' => 'Imaginary');
79
                Cache::config('imaginary', $settings);
80
        }
81

    
82
/**
83
 * Check that no fatal errors are issued doing normal things when Cache.disable is true.
84
 *
85
 * @return void
86
 */
87
        public function testNonFatalErrorsWithCachedisable() {
88
                Configure::write('Cache.disable', true);
89
                Cache::config('test', array('engine' => 'File', 'path' => TMP, 'prefix' => 'error_test_'));
90

    
91
                Cache::write('no_save', 'Noooo!', 'test');
92
                Cache::read('no_save', 'test');
93
                Cache::delete('no_save', 'test');
94
                Cache::set('duration', '+10 minutes');
95

    
96
                Configure::write('Cache.disable', false);
97
        }
98

    
99
/**
100
 * test configuring CacheEngines in App/libs
101
 *
102
 * @return void
103
 */
104
        public function testConfigWithLibAndPluginEngines() {
105
                App::build(array(
106
                        'Lib' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Lib' . DS),
107
                        'Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS)
108
                ), App::RESET);
109
                CakePlugin::load('TestPlugin');
110

    
111
                $settings = array('engine' => 'TestAppCache', 'path' => TMP, 'prefix' => 'cake_test_');
112
                $result = Cache::config('libEngine', $settings);
113
                $this->assertEquals(Cache::config('libEngine'), $result);
114

    
115
                $settings = array('engine' => 'TestPlugin.TestPluginCache', 'path' => TMP, 'prefix' => 'cake_test_');
116
                $result = Cache::config('pluginLibEngine', $settings);
117
                $this->assertEquals(Cache::config('pluginLibEngine'), $result);
118

    
119
                Cache::drop('libEngine');
120
                Cache::drop('pluginLibEngine');
121

    
122
                App::build();
123
                CakePlugin::unload();
124
        }
125

    
126
/**
127
 * testInvalidConfig method
128
 *
129
 * Test that the cache class doesn't cause fatal errors with a partial path
130
 *
131
 * @expectedException PHPUnit_Framework_Error_Warning
132
 * @return void
133
 */
134
        public function testInvalidConfig() {
135
                // In debug mode it would auto create the folder.
136
                $debug = Configure::read('debug');
137
                Configure::write('debug', 0);
138

    
139
                Cache::config('invalid', array(
140
                        'engine' => 'File',
141
                        'duration' => '+1 year',
142
                        'prefix' => 'testing_invalid_',
143
                        'path' => 'data/',
144
                        'serialize' => true,
145
                        'random' => 'wii'
146
                ));
147
                Cache::read('Test', 'invalid');
148

    
149
                Configure::write('debug', $debug);
150
        }
151

    
152
/**
153
 * Test reading from a config that is undefined.
154
 *
155
 * @return void
156
 */
157
        public function testReadNonExistingConfig() {
158
                $this->assertFalse(Cache::read('key', 'totally fake'));
159
                $this->assertFalse(Cache::write('key', 'value', 'totally fake'));
160
                $this->assertFalse(Cache::increment('key', 1, 'totally fake'));
161
                $this->assertFalse(Cache::decrement('key', 1, 'totally fake'));
162
        }
163

    
164
/**
165
 * test that trying to configure classes that don't extend CacheEngine fail.
166
 *
167
 * @expectedException CacheException
168
 * @return void
169
 */
170
        public function testAttemptingToConfigureANonCacheEngineClass() {
171
                $this->getMock('StdClass', array(), array(), 'RubbishEngine');
172
                Cache::config('Garbage', array(
173
                        'engine' => 'Rubbish'
174
                ));
175
        }
176

    
177
/**
178
 * testConfigChange method
179
 *
180
 * @return void
181
 */
182
        public function testConfigChange() {
183
                $_cacheConfigSessions = Cache::config('sessions');
184
                $_cacheConfigTests = Cache::config('tests');
185

    
186
                $result = Cache::config('sessions', array('engine' => 'File', 'path' => TMP . 'sessions'));
187
                $this->assertEquals(Cache::settings('sessions'), $result['settings']);
188

    
189
                $result = Cache::config('tests', array('engine' => 'File', 'path' => TMP . 'tests'));
190
                $this->assertEquals(Cache::settings('tests'), $result['settings']);
191

    
192
                Cache::config('sessions', $_cacheConfigSessions['settings']);
193
                Cache::config('tests', $_cacheConfigTests['settings']);
194
        }
195

    
196
/**
197
 * test that calling config() sets the 'default' configuration up.
198
 *
199
 * @return void
200
 */
201
        public function testConfigSettingDefaultConfigKey() {
202
                Cache::config('test_name', array('engine' => 'File', 'prefix' => 'test_name_'));
203

    
204
                Cache::write('value_one', 'I am cached', 'test_name');
205
                $result = Cache::read('value_one', 'test_name');
206
                $this->assertEquals('I am cached', $result);
207

    
208
                $result = Cache::read('value_one');
209
                $this->assertEquals(null, $result);
210

    
211
                Cache::write('value_one', 'I am in default config!');
212
                $result = Cache::read('value_one');
213
                $this->assertEquals('I am in default config!', $result);
214

    
215
                $result = Cache::read('value_one', 'test_name');
216
                $this->assertEquals('I am cached', $result);
217

    
218
                Cache::delete('value_one', 'test_name');
219
                Cache::delete('value_one', 'default');
220
        }
221

    
222
/**
223
 * testWritingWithConfig method
224
 *
225
 * @return void
226
 */
227
        public function testWritingWithConfig() {
228
                $_cacheConfigSessions = Cache::config('sessions');
229

    
230
                Cache::write('test_something', 'this is the test data', 'tests');
231

    
232
                $expected = array(
233
                        'path' => TMP . 'sessions' . DS,
234
                        'prefix' => 'cake_',
235
                        'lock' => true,
236
                        'serialize' => true,
237
                        'duration' => 3600,
238
                        'probability' => 100,
239
                        'engine' => 'File',
240
                        'isWindows' => DIRECTORY_SEPARATOR === '\\',
241
                        'mask' => 0664,
242
                        'groups' => array()
243
                );
244
                $this->assertEquals($expected, Cache::settings('sessions'));
245

    
246
                Cache::config('sessions', $_cacheConfigSessions['settings']);
247
        }
248

    
249
/**
250
 * testGroupConfigs method
251
 *
252
 * @return void
253
 */
254
        public function testGroupConfigs() {
255
                Cache::config('latest', array(
256
                        'duration' => 300,
257
                        'engine' => 'File',
258
                        'groups' => array(
259
                                'posts', 'comments',
260
                        ),
261
                ));
262

    
263
                $expected = array(
264
                        'posts' => array('latest'),
265
                        'comments' => array('latest'),
266
                );
267
                $result = Cache::groupConfigs();
268
                $this->assertEquals($expected, $result);
269

    
270
                $result = Cache::groupConfigs('posts');
271
                $this->assertEquals(array('posts' => array('latest')), $result);
272

    
273
                Cache::config('page', array(
274
                        'duration' => 86400,
275
                        'engine' => 'File',
276
                        'groups' => array(
277
                                'posts', 'archive'
278
                        ),
279
                ));
280

    
281
                $result = Cache::groupConfigs();
282
                $expected = array(
283
                        'posts' => array('latest', 'page'),
284
                        'comments' => array('latest'),
285
                        'archive' => array('page'),
286
                );
287
                $this->assertEquals($expected, $result);
288

    
289
                $result = Cache::groupConfigs('archive');
290
                $this->assertEquals(array('archive' => array('page')), $result);
291

    
292
                Cache::config('archive', array(
293
                        'duration' => 86400 * 30,
294
                        'engine' => 'File',
295
                        'groups' => array(
296
                                'posts', 'archive', 'comments',
297
                        ),
298
                ));
299

    
300
                $result = Cache::groupConfigs('archive');
301
                $this->assertEquals(array('archive' => array('archive', 'page')), $result);
302
        }
303

    
304
/**
305
 * testGroupConfigsThrowsException method
306
 *
307
 * @expectedException CacheException
308
 * @return void
309
 */
310
        public function testGroupConfigsThrowsException() {
311
                Cache::groupConfigs('bogus');
312
        }
313

    
314
/**
315
 * test that configured returns an array of the currently configured cache
316
 * settings
317
 *
318
 * @return void
319
 */
320
        public function testConfigured() {
321
                $result = Cache::configured();
322
                $this->assertTrue(in_array('_cake_core_', $result));
323
                $this->assertTrue(in_array('default', $result));
324
        }
325

    
326
/**
327
 * testInitSettings method
328
 *
329
 * @return void
330
 */
331
        public function testInitSettings() {
332
                $initial = Cache::settings();
333
                $override = array('engine' => 'File', 'path' => TMP . 'tests');
334
                Cache::config('for_test', $override);
335

    
336
                $settings = Cache::settings();
337
                $expecting = $override + $initial;
338
                $this->assertEquals($settings, $expecting);
339
        }
340

    
341
/**
342
 * test that drop removes cache configs, and that further attempts to use that config
343
 * do not work.
344
 *
345
 * @return void
346
 */
347
        public function testDrop() {
348
                App::build(array(
349
                        'Lib' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Lib' . DS),
350
                        'Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS)
351
                ), App::RESET);
352

    
353
                $result = Cache::drop('some_config_that_does_not_exist');
354
                $this->assertFalse($result);
355

    
356
                $_testsConfig = Cache::config('tests');
357
                $result = Cache::drop('tests');
358
                $this->assertTrue($result);
359

    
360
                Cache::config('unconfigTest', array(
361
                        'engine' => 'TestAppCache'
362
                ));
363
                $this->assertTrue(Cache::isInitialized('unconfigTest'));
364

    
365
                $this->assertTrue(Cache::drop('unconfigTest'));
366
                $this->assertFalse(Cache::isInitialized('TestAppCache'));
367

    
368
                Cache::config('tests', $_testsConfig);
369
                App::build();
370
        }
371

    
372
/**
373
 * testWriteEmptyValues method
374
 *
375
 * @return void
376
 */
377
        public function testWriteEmptyValues() {
378
                Cache::write('App.falseTest', false);
379
                $this->assertFalse(Cache::read('App.falseTest'));
380

    
381
                Cache::write('App.trueTest', true);
382
                $this->assertTrue(Cache::read('App.trueTest'));
383

    
384
                Cache::write('App.nullTest', null);
385
                $this->assertNull(Cache::read('App.nullTest'));
386

    
387
                Cache::write('App.zeroTest', 0);
388
                $this->assertSame(Cache::read('App.zeroTest'), 0);
389

    
390
                Cache::write('App.zeroTest2', '0');
391
                $this->assertSame(Cache::read('App.zeroTest2'), '0');
392
        }
393

    
394
/**
395
 * Test that failed writes cause errors to be triggered.
396
 *
397
 * @return void
398
 */
399
        public function testWriteTriggerError() {
400
                App::build(array(
401
                        'Lib' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Lib' . DS),
402
                        'Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS)
403
                ), App::RESET);
404

    
405
                Cache::config('test_trigger', array('engine' => 'TestAppCache', 'prefix' => ''));
406
                try {
407
                        Cache::write('fail', 'value', 'test_trigger');
408
                        $this->fail('No exception thrown');
409
                } catch (PHPUnit_Framework_Error $e) {
410
                        $this->assertTrue(true);
411
                }
412
                Cache::drop('test_trigger');
413
                App::build();
414
        }
415

    
416
/**
417
 * testCacheDisable method
418
 *
419
 * Check that the "Cache.disable" configuration and a change to it
420
 * (even after a cache config has been setup) is taken into account.
421
 *
422
 * @return void
423
 */
424
        public function testCacheDisable() {
425
                Configure::write('Cache.disable', false);
426
                Cache::config('test_cache_disable_1', array('engine' => 'File', 'path' => TMP . 'tests'));
427

    
428
                $this->assertTrue(Cache::write('key_1', 'hello', 'test_cache_disable_1'));
429
                $this->assertSame(Cache::read('key_1', 'test_cache_disable_1'), 'hello');
430

    
431
                Configure::write('Cache.disable', true);
432

    
433
                $this->assertFalse(Cache::write('key_2', 'hello', 'test_cache_disable_1'));
434
                $this->assertFalse(Cache::read('key_2', 'test_cache_disable_1'));
435

    
436
                Configure::write('Cache.disable', false);
437

    
438
                $this->assertTrue(Cache::write('key_3', 'hello', 'test_cache_disable_1'));
439
                $this->assertSame(Cache::read('key_3', 'test_cache_disable_1'), 'hello');
440

    
441
                Configure::write('Cache.disable', true);
442
                Cache::config('test_cache_disable_2', array('engine' => 'File', 'path' => TMP . 'tests'));
443

    
444
                $this->assertFalse(Cache::write('key_4', 'hello', 'test_cache_disable_2'));
445
                $this->assertFalse(Cache::read('key_4', 'test_cache_disable_2'));
446

    
447
                Configure::write('Cache.disable', false);
448

    
449
                $this->assertTrue(Cache::write('key_5', 'hello', 'test_cache_disable_2'));
450
                $this->assertSame(Cache::read('key_5', 'test_cache_disable_2'), 'hello');
451

    
452
                Configure::write('Cache.disable', true);
453

    
454
                $this->assertFalse(Cache::write('key_6', 'hello', 'test_cache_disable_2'));
455
                $this->assertFalse(Cache::read('key_6', 'test_cache_disable_2'));
456
        }
457

    
458
/**
459
 * testSet method
460
 *
461
 * @return void
462
 */
463
        public function testSet() {
464
                $_cacheSet = Cache::set();
465

    
466
                Cache::set(array('duration' => '+1 year'));
467
                $data = Cache::read('test_cache');
468
                $this->assertFalse($data);
469

    
470
                $data = 'this is just a simple test of the cache system';
471
                $write = Cache::write('test_cache', $data);
472
                $this->assertTrue($write);
473

    
474
                Cache::set(array('duration' => '+1 year'));
475
                $data = Cache::read('test_cache');
476
                $this->assertEquals('this is just a simple test of the cache system', $data);
477

    
478
                Cache::delete('test_cache');
479

    
480
                Cache::settings();
481

    
482
                Cache::set($_cacheSet);
483
        }
484

    
485
/**
486
 * test set() parameter handling for user cache configs.
487
 *
488
 * @return void
489
 */
490
        public function testSetOnAlternateConfigs() {
491
                Cache::config('file_config', array('engine' => 'File', 'prefix' => 'test_file_'));
492
                Cache::set(array('duration' => '+1 year'), 'file_config');
493
                $settings = Cache::settings('file_config');
494

    
495
                $this->assertEquals('test_file_', $settings['prefix']);
496
                $this->assertEquals(strtotime('+1 year') - time(), $settings['duration']);
497
        }
498

    
499
/**
500
 * test remember method.
501
 *
502
 * @return void
503
 */
504
        public function testRemember() {
505
                $expected = 'This is some data 0';
506
                $result = Cache::remember('test_key', array($this, 'cacher'), 'default');
507
                $this->assertEquals($expected, $result);
508

    
509
                $this->_count = 1;
510
                $result = Cache::remember('test_key', array($this, 'cacher'), 'default');
511
                $this->assertEquals($expected, $result);
512
        }
513

    
514
/**
515
 * Method for testing Cache::remember()
516
 *
517
 * @return string
518
 */
519
        public function cacher() {
520
                return 'This is some data ' . $this->_count;
521
        }
522
}