nginxsonarrradarrplexorganizrdashboardbookmarkapplication-dashboardmuximuxlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdallembycouchpotatonzbget
		
		
		
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							350 lines
						
					
					
						
							13 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							350 lines
						
					
					
						
							13 KiB
						
					
					
				| <?php | |
| 
 | |
| /* | |
|  * This file is part of the Symfony package. | |
|  * | |
|  * (c) Fabien Potencier <fabien@symfony.com> | |
|  * | |
|  * For the full copyright and license information, please view the LICENSE | |
|  * file that was distributed with this source code. | |
|  */ | |
| 
 | |
| namespace Symfony\Component\HttpKernel\Tests\Profiler; | |
| 
 | |
| use PHPUnit\Framework\TestCase; | |
| use Symfony\Component\HttpKernel\Profiler\FileProfilerStorage; | |
| use Symfony\Component\HttpKernel\Profiler\Profile; | |
| 
 | |
| class FileProfilerStorageTest extends TestCase | |
| { | |
|     private $tmpDir; | |
|     private $storage; | |
| 
 | |
|     protected function setUp() | |
|     { | |
|         $this->tmpDir = sys_get_temp_dir().'/sf2_profiler_file_storage'; | |
|         if (is_dir($this->tmpDir)) { | |
|             self::cleanDir(); | |
|         } | |
|         $this->storage = new FileProfilerStorage('file:'.$this->tmpDir); | |
|         $this->storage->purge(); | |
|     } | |
| 
 | |
|     protected function tearDown() | |
|     { | |
|         self::cleanDir(); | |
|     } | |
| 
 | |
|     public function testStore() | |
|     { | |
|         for ($i = 0; $i < 10; ++$i) { | |
|             $profile = new Profile('token_'.$i); | |
|             $profile->setIp('127.0.0.1'); | |
|             $profile->setUrl('http://foo.bar'); | |
|             $profile->setMethod('GET'); | |
|             $this->storage->write($profile); | |
|         } | |
|         $this->assertCount(10, $this->storage->find('127.0.0.1', 'http://foo.bar', 20, 'GET'), '->write() stores data in the storage'); | |
|     } | |
| 
 | |
|     public function testChildren() | |
|     { | |
|         $parentProfile = new Profile('token_parent'); | |
|         $parentProfile->setIp('127.0.0.1'); | |
|         $parentProfile->setUrl('http://foo.bar/parent'); | |
| 
 | |
|         $childProfile = new Profile('token_child'); | |
|         $childProfile->setIp('127.0.0.1'); | |
|         $childProfile->setUrl('http://foo.bar/child'); | |
| 
 | |
|         $parentProfile->addChild($childProfile); | |
| 
 | |
|         $this->storage->write($parentProfile); | |
|         $this->storage->write($childProfile); | |
| 
 | |
|         // Load them from storage | |
|         $parentProfile = $this->storage->read('token_parent'); | |
|         $childProfile = $this->storage->read('token_child'); | |
| 
 | |
|         // Check child has link to parent | |
|         $this->assertNotNull($childProfile->getParent()); | |
|         $this->assertEquals($parentProfile->getToken(), $childProfile->getParentToken()); | |
| 
 | |
|         // Check parent has child | |
|         $children = $parentProfile->getChildren(); | |
|         $this->assertCount(1, $children); | |
|         $this->assertEquals($childProfile->getToken(), $children[0]->getToken()); | |
|     } | |
| 
 | |
|     public function testStoreSpecialCharsInUrl() | |
|     { | |
|         // The storage accepts special characters in URLs (Even though URLs are not | |
|         // supposed to contain them) | |
|         $profile = new Profile('simple_quote'); | |
|         $profile->setUrl('http://foo.bar/\''); | |
|         $this->storage->write($profile); | |
|         $this->assertTrue(false !== $this->storage->read('simple_quote'), '->write() accepts single quotes in URL'); | |
| 
 | |
|         $profile = new Profile('double_quote'); | |
|         $profile->setUrl('http://foo.bar/"'); | |
|         $this->storage->write($profile); | |
|         $this->assertTrue(false !== $this->storage->read('double_quote'), '->write() accepts double quotes in URL'); | |
| 
 | |
|         $profile = new Profile('backslash'); | |
|         $profile->setUrl('http://foo.bar/\\'); | |
|         $this->storage->write($profile); | |
|         $this->assertTrue(false !== $this->storage->read('backslash'), '->write() accepts backslash in URL'); | |
| 
 | |
|         $profile = new Profile('comma'); | |
|         $profile->setUrl('http://foo.bar/,'); | |
|         $this->storage->write($profile); | |
|         $this->assertTrue(false !== $this->storage->read('comma'), '->write() accepts comma in URL'); | |
|     } | |
| 
 | |
|     public function testStoreDuplicateToken() | |
|     { | |
|         $profile = new Profile('token'); | |
|         $profile->setUrl('http://example.com/'); | |
| 
 | |
|         $this->assertTrue($this->storage->write($profile), '->write() returns true when the token is unique'); | |
| 
 | |
|         $profile->setUrl('http://example.net/'); | |
| 
 | |
|         $this->assertTrue($this->storage->write($profile), '->write() returns true when the token is already present in the storage'); | |
|         $this->assertEquals('http://example.net/', $this->storage->read('token')->getUrl(), '->write() overwrites the current profile data'); | |
| 
 | |
|         $this->assertCount(1, $this->storage->find('', '', 1000, ''), '->find() does not return the same profile twice'); | |
|     } | |
| 
 | |
|     public function testRetrieveByIp() | |
|     { | |
|         $profile = new Profile('token'); | |
|         $profile->setIp('127.0.0.1'); | |
|         $profile->setMethod('GET'); | |
|         $this->storage->write($profile); | |
| 
 | |
|         $this->assertCount(1, $this->storage->find('127.0.0.1', '', 10, 'GET'), '->find() retrieve a record by IP'); | |
|         $this->assertCount(0, $this->storage->find('127.0.%.1', '', 10, 'GET'), '->find() does not interpret a "%" as a wildcard in the IP'); | |
|         $this->assertCount(0, $this->storage->find('127.0._.1', '', 10, 'GET'), '->find() does not interpret a "_" as a wildcard in the IP'); | |
|     } | |
| 
 | |
|     public function testRetrieveByStatusCode() | |
|     { | |
|         $profile200 = new Profile('statuscode200'); | |
|         $profile200->setStatusCode(200); | |
|         $this->storage->write($profile200); | |
| 
 | |
|         $profile404 = new Profile('statuscode404'); | |
|         $profile404->setStatusCode(404); | |
|         $this->storage->write($profile404); | |
| 
 | |
|         $this->assertCount(1, $this->storage->find(null, null, 10, null, null, null, '200'), '->find() retrieve a record by Status code 200'); | |
|         $this->assertCount(1, $this->storage->find(null, null, 10, null, null, null, '404'), '->find() retrieve a record by Status code 404'); | |
|     } | |
| 
 | |
|     public function testRetrieveByUrl() | |
|     { | |
|         $profile = new Profile('simple_quote'); | |
|         $profile->setIp('127.0.0.1'); | |
|         $profile->setUrl('http://foo.bar/\''); | |
|         $profile->setMethod('GET'); | |
|         $this->storage->write($profile); | |
| 
 | |
|         $profile = new Profile('double_quote'); | |
|         $profile->setIp('127.0.0.1'); | |
|         $profile->setUrl('http://foo.bar/"'); | |
|         $profile->setMethod('GET'); | |
|         $this->storage->write($profile); | |
| 
 | |
|         $profile = new Profile('backslash'); | |
|         $profile->setIp('127.0.0.1'); | |
|         $profile->setUrl('http://foo\\bar/'); | |
|         $profile->setMethod('GET'); | |
|         $this->storage->write($profile); | |
| 
 | |
|         $profile = new Profile('percent'); | |
|         $profile->setIp('127.0.0.1'); | |
|         $profile->setUrl('http://foo.bar/%'); | |
|         $profile->setMethod('GET'); | |
|         $this->storage->write($profile); | |
| 
 | |
|         $profile = new Profile('underscore'); | |
|         $profile->setIp('127.0.0.1'); | |
|         $profile->setUrl('http://foo.bar/_'); | |
|         $profile->setMethod('GET'); | |
|         $this->storage->write($profile); | |
| 
 | |
|         $profile = new Profile('semicolon'); | |
|         $profile->setIp('127.0.0.1'); | |
|         $profile->setUrl('http://foo.bar/;'); | |
|         $profile->setMethod('GET'); | |
|         $this->storage->write($profile); | |
| 
 | |
|         $this->assertCount(1, $this->storage->find('127.0.0.1', 'http://foo.bar/\'', 10, 'GET'), '->find() accepts single quotes in URLs'); | |
|         $this->assertCount(1, $this->storage->find('127.0.0.1', 'http://foo.bar/"', 10, 'GET'), '->find() accepts double quotes in URLs'); | |
|         $this->assertCount(1, $this->storage->find('127.0.0.1', 'http://foo\\bar/', 10, 'GET'), '->find() accepts backslash in URLs'); | |
|         $this->assertCount(1, $this->storage->find('127.0.0.1', 'http://foo.bar/;', 10, 'GET'), '->find() accepts semicolon in URLs'); | |
|         $this->assertCount(1, $this->storage->find('127.0.0.1', 'http://foo.bar/%', 10, 'GET'), '->find() does not interpret a "%" as a wildcard in the URL'); | |
|         $this->assertCount(1, $this->storage->find('127.0.0.1', 'http://foo.bar/_', 10, 'GET'), '->find() does not interpret a "_" as a wildcard in the URL'); | |
|     } | |
| 
 | |
|     public function testStoreTime() | |
|     { | |
|         $dt = new \DateTime('now'); | |
|         $start = $dt->getTimestamp(); | |
| 
 | |
|         for ($i = 0; $i < 3; ++$i) { | |
|             $dt->modify('+1 minute'); | |
|             $profile = new Profile('time_'.$i); | |
|             $profile->setIp('127.0.0.1'); | |
|             $profile->setUrl('http://foo.bar'); | |
|             $profile->setTime($dt->getTimestamp()); | |
|             $profile->setMethod('GET'); | |
|             $this->storage->write($profile); | |
|         } | |
| 
 | |
|         $records = $this->storage->find('', '', 3, 'GET', $start, time() + 3 * 60); | |
|         $this->assertCount(3, $records, '->find() returns all previously added records'); | |
|         $this->assertEquals($records[0]['token'], 'time_2', '->find() returns records ordered by time in descendant order'); | |
|         $this->assertEquals($records[1]['token'], 'time_1', '->find() returns records ordered by time in descendant order'); | |
|         $this->assertEquals($records[2]['token'], 'time_0', '->find() returns records ordered by time in descendant order'); | |
| 
 | |
|         $records = $this->storage->find('', '', 3, 'GET', $start, time() + 2 * 60); | |
|         $this->assertCount(2, $records, '->find() should return only first two of the previously added records'); | |
|     } | |
| 
 | |
|     public function testRetrieveByEmptyUrlAndIp() | |
|     { | |
|         for ($i = 0; $i < 5; ++$i) { | |
|             $profile = new Profile('token_'.$i); | |
|             $profile->setMethod('GET'); | |
|             $this->storage->write($profile); | |
|         } | |
|         $this->assertCount(5, $this->storage->find('', '', 10, 'GET'), '->find() returns all previously added records'); | |
|         $this->storage->purge(); | |
|     } | |
| 
 | |
|     public function testRetrieveByMethodAndLimit() | |
|     { | |
|         foreach (array('POST', 'GET') as $method) { | |
|             for ($i = 0; $i < 5; ++$i) { | |
|                 $profile = new Profile('token_'.$i.$method); | |
|                 $profile->setMethod($method); | |
|                 $this->storage->write($profile); | |
|             } | |
|         } | |
| 
 | |
|         $this->assertCount(5, $this->storage->find('', '', 5, 'POST')); | |
| 
 | |
|         $this->storage->purge(); | |
|     } | |
| 
 | |
|     public function testPurge() | |
|     { | |
|         $profile = new Profile('token1'); | |
|         $profile->setIp('127.0.0.1'); | |
|         $profile->setUrl('http://example.com/'); | |
|         $profile->setMethod('GET'); | |
|         $this->storage->write($profile); | |
| 
 | |
|         $this->assertTrue(false !== $this->storage->read('token1')); | |
|         $this->assertCount(1, $this->storage->find('127.0.0.1', '', 10, 'GET')); | |
| 
 | |
|         $profile = new Profile('token2'); | |
|         $profile->setIp('127.0.0.1'); | |
|         $profile->setUrl('http://example.net/'); | |
|         $profile->setMethod('GET'); | |
|         $this->storage->write($profile); | |
| 
 | |
|         $this->assertTrue(false !== $this->storage->read('token2')); | |
|         $this->assertCount(2, $this->storage->find('127.0.0.1', '', 10, 'GET')); | |
| 
 | |
|         $this->storage->purge(); | |
| 
 | |
|         $this->assertEmpty($this->storage->read('token'), '->purge() removes all data stored by profiler'); | |
|         $this->assertCount(0, $this->storage->find('127.0.0.1', '', 10, 'GET'), '->purge() removes all items from index'); | |
|     } | |
| 
 | |
|     public function testDuplicates() | |
|     { | |
|         for ($i = 1; $i <= 5; ++$i) { | |
|             $profile = new Profile('foo'.$i); | |
|             $profile->setIp('127.0.0.1'); | |
|             $profile->setUrl('http://example.net/'); | |
|             $profile->setMethod('GET'); | |
| 
 | |
|             ///three duplicates | |
|             $this->storage->write($profile); | |
|             $this->storage->write($profile); | |
|             $this->storage->write($profile); | |
|         } | |
|         $this->assertCount(3, $this->storage->find('127.0.0.1', 'http://example.net/', 3, 'GET'), '->find() method returns incorrect number of entries'); | |
|     } | |
| 
 | |
|     public function testStatusCode() | |
|     { | |
|         $profile = new Profile('token1'); | |
|         $profile->setStatusCode(200); | |
|         $this->storage->write($profile); | |
| 
 | |
|         $profile = new Profile('token2'); | |
|         $profile->setStatusCode(404); | |
|         $this->storage->write($profile); | |
| 
 | |
|         $tokens = $this->storage->find('', '', 10, ''); | |
|         $this->assertCount(2, $tokens); | |
|         $this->assertContains($tokens[0]['status_code'], array(200, 404)); | |
|         $this->assertContains($tokens[1]['status_code'], array(200, 404)); | |
|     } | |
| 
 | |
|     public function testMultiRowIndexFile() | |
|     { | |
|         $iteration = 3; | |
|         for ($i = 0; $i < $iteration; ++$i) { | |
|             $profile = new Profile('token'.$i); | |
|             $profile->setIp('127.0.0.'.$i); | |
|             $profile->setUrl('http://foo.bar/'.$i); | |
| 
 | |
|             $this->storage->write($profile); | |
|             $this->storage->write($profile); | |
|             $this->storage->write($profile); | |
|         } | |
| 
 | |
|         $handle = fopen($this->tmpDir.'/index.csv', 'r'); | |
|         for ($i = 0; $i < $iteration; ++$i) { | |
|             $row = fgetcsv($handle); | |
|             $this->assertEquals('token'.$i, $row[0]); | |
|             $this->assertEquals('127.0.0.'.$i, $row[1]); | |
|             $this->assertEquals('http://foo.bar/'.$i, $row[3]); | |
|         } | |
|         $this->assertFalse(fgetcsv($handle)); | |
|     } | |
| 
 | |
|     public function testReadLineFromFile() | |
|     { | |
|         $r = new \ReflectionMethod($this->storage, 'readLineFromFile'); | |
| 
 | |
|         $r->setAccessible(true); | |
| 
 | |
|         $h = tmpfile(); | |
| 
 | |
|         fwrite($h, "line1\n\n\nline2\n"); | |
|         fseek($h, 0, SEEK_END); | |
| 
 | |
|         $this->assertEquals('line2', $r->invoke($this->storage, $h)); | |
|         $this->assertEquals('line1', $r->invoke($this->storage, $h)); | |
|     } | |
| 
 | |
|     protected function cleanDir() | |
|     { | |
|         $flags = \FilesystemIterator::SKIP_DOTS; | |
|         $iterator = new \RecursiveDirectoryIterator($this->tmpDir, $flags); | |
|         $iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::SELF_FIRST); | |
| 
 | |
|         foreach ($iterator as $file) { | |
|             if (is_file($file)) { | |
|                 unlink($file); | |
|             } | |
|         } | |
|     } | |
| }
 | |
| 
 |