sonarrradarrplexorganizrnginxdashboardmuximuxlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdallembycouchpotatonzbgetbookmarkapplication-dashboard
		
		
		
		
			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.
		
		
		
		
		
			
		
			
				
					
					
						
							222 lines
						
					
					
						
							8.1 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							222 lines
						
					
					
						
							8.1 KiB
						
					
					
				| <?php | |
| 
 | |
| /* | |
|  * This file is part of the Symfony package. | |
|  * | |
|  * (c) Fabien Potencier <fabien@symfony.com> | |
|  * | |
|  * This code is partially based on the Rack-Cache library by Ryan Tomayko, | |
|  * which is released under the MIT license. | |
|  * (based on commit 02d2b48d75bcb63cf1c0c7149c077ad256542801) | |
|  * | |
|  * For the full copyright and license information, please view the LICENSE | |
|  * file that was distributed with this source code. | |
|  */ | |
| 
 | |
| namespace Symfony\Component\HttpKernel\Tests\HttpCache; | |
| 
 | |
| use PHPUnit\Framework\TestCase; | |
| use Symfony\Component\HttpFoundation\Response; | |
| use Symfony\Component\HttpKernel\HttpCache\ResponseCacheStrategy; | |
| 
 | |
| class ResponseCacheStrategyTest extends TestCase | |
| { | |
|     public function testMinimumSharedMaxAgeWins() | |
|     { | |
|         $cacheStrategy = new ResponseCacheStrategy(); | |
| 
 | |
|         $response1 = new Response(); | |
|         $response1->setSharedMaxAge(60); | |
|         $cacheStrategy->add($response1); | |
| 
 | |
|         $response2 = new Response(); | |
|         $response2->setSharedMaxAge(3600); | |
|         $cacheStrategy->add($response2); | |
| 
 | |
|         $response = new Response(); | |
|         $response->setSharedMaxAge(86400); | |
|         $cacheStrategy->update($response); | |
| 
 | |
|         $this->assertSame('60', $response->headers->getCacheControlDirective('s-maxage')); | |
|     } | |
| 
 | |
|     public function testSharedMaxAgeNotSetIfNotSetInAnyEmbeddedRequest() | |
|     { | |
|         $cacheStrategy = new ResponseCacheStrategy(); | |
| 
 | |
|         $response1 = new Response(); | |
|         $response1->setSharedMaxAge(60); | |
|         $cacheStrategy->add($response1); | |
| 
 | |
|         $response2 = new Response(); | |
|         $cacheStrategy->add($response2); | |
| 
 | |
|         $response = new Response(); | |
|         $response->setSharedMaxAge(86400); | |
|         $cacheStrategy->update($response); | |
| 
 | |
|         $this->assertFalse($response->headers->hasCacheControlDirective('s-maxage')); | |
|     } | |
| 
 | |
|     public function testSharedMaxAgeNotSetIfNotSetInMasterRequest() | |
|     { | |
|         $cacheStrategy = new ResponseCacheStrategy(); | |
| 
 | |
|         $response1 = new Response(); | |
|         $response1->setSharedMaxAge(60); | |
|         $cacheStrategy->add($response1); | |
| 
 | |
|         $response2 = new Response(); | |
|         $response2->setSharedMaxAge(3600); | |
|         $cacheStrategy->add($response2); | |
| 
 | |
|         $response = new Response(); | |
|         $cacheStrategy->update($response); | |
| 
 | |
|         $this->assertFalse($response->headers->hasCacheControlDirective('s-maxage')); | |
|     } | |
| 
 | |
|     public function testMasterResponseNotCacheableWhenEmbeddedResponseRequiresValidation() | |
|     { | |
|         $cacheStrategy = new ResponseCacheStrategy(); | |
| 
 | |
|         $embeddedResponse = new Response(); | |
|         $embeddedResponse->setLastModified(new \DateTime()); | |
|         $cacheStrategy->add($embeddedResponse); | |
| 
 | |
|         $masterResponse = new Response(); | |
|         $masterResponse->setSharedMaxAge(3600); | |
|         $cacheStrategy->update($masterResponse); | |
| 
 | |
|         $this->assertTrue($masterResponse->headers->hasCacheControlDirective('no-cache')); | |
|         $this->assertTrue($masterResponse->headers->hasCacheControlDirective('must-revalidate')); | |
|         $this->assertFalse($masterResponse->isFresh()); | |
|     } | |
| 
 | |
|     public function testValidationOnMasterResponseIsNotPossibleWhenItContainsEmbeddedResponses() | |
|     { | |
|         $cacheStrategy = new ResponseCacheStrategy(); | |
| 
 | |
|         // This master response uses the "validation" model | |
|         $masterResponse = new Response(); | |
|         $masterResponse->setLastModified(new \DateTime()); | |
|         $masterResponse->setEtag('foo'); | |
| 
 | |
|         // Embedded response uses "expiry" model | |
|         $embeddedResponse = new Response(); | |
|         $masterResponse->setSharedMaxAge(3600); | |
|         $cacheStrategy->add($embeddedResponse); | |
| 
 | |
|         $cacheStrategy->update($masterResponse); | |
| 
 | |
|         $this->assertFalse($masterResponse->isValidateable()); | |
|         $this->assertFalse($masterResponse->headers->has('Last-Modified')); | |
|         $this->assertFalse($masterResponse->headers->has('ETag')); | |
|         $this->assertTrue($masterResponse->headers->hasCacheControlDirective('no-cache')); | |
|         $this->assertTrue($masterResponse->headers->hasCacheControlDirective('must-revalidate')); | |
|     } | |
| 
 | |
|     public function testMasterResponseWithValidationIsUnchangedWhenThereIsNoEmbeddedResponse() | |
|     { | |
|         $cacheStrategy = new ResponseCacheStrategy(); | |
| 
 | |
|         $masterResponse = new Response(); | |
|         $masterResponse->setLastModified(new \DateTime()); | |
|         $cacheStrategy->update($masterResponse); | |
| 
 | |
|         $this->assertTrue($masterResponse->isValidateable()); | |
|     } | |
| 
 | |
|     public function testMasterResponseWithExpirationIsUnchangedWhenThereIsNoEmbeddedResponse() | |
|     { | |
|         $cacheStrategy = new ResponseCacheStrategy(); | |
| 
 | |
|         $masterResponse = new Response(); | |
|         $masterResponse->setSharedMaxAge(3600); | |
|         $cacheStrategy->update($masterResponse); | |
| 
 | |
|         $this->assertTrue($masterResponse->isFresh()); | |
|     } | |
| 
 | |
|     public function testMasterResponseIsNotCacheableWhenEmbeddedResponseIsNotCacheable() | |
|     { | |
|         $cacheStrategy = new ResponseCacheStrategy(); | |
| 
 | |
|         $masterResponse = new Response(); | |
|         $masterResponse->setSharedMaxAge(3600); // Public, cacheable | |
|  | |
|         /* This response has no validation or expiration information. | |
|            That makes it uncacheable, it is always stale. | |
|            (It does *not* make this private, though.) */ | |
|         $embeddedResponse = new Response(); | |
|         $this->assertFalse($embeddedResponse->isFresh()); // not fresh, as no lifetime is provided | |
|  | |
|         $cacheStrategy->add($embeddedResponse); | |
|         $cacheStrategy->update($masterResponse); | |
| 
 | |
|         $this->assertTrue($masterResponse->headers->hasCacheControlDirective('no-cache')); | |
|         $this->assertTrue($masterResponse->headers->hasCacheControlDirective('must-revalidate')); | |
|         $this->assertFalse($masterResponse->isFresh()); | |
|     } | |
| 
 | |
|     public function testEmbeddingPrivateResponseMakesMainResponsePrivate() | |
|     { | |
|         $cacheStrategy = new ResponseCacheStrategy(); | |
| 
 | |
|         $masterResponse = new Response(); | |
|         $masterResponse->setSharedMaxAge(3600); // public, cacheable | |
|  | |
|         // The embedded response might for example contain per-user data that remains valid for 60 seconds | |
|         $embeddedResponse = new Response(); | |
|         $embeddedResponse->setPrivate(); | |
|         $embeddedResponse->setMaxAge(60); // this would implicitly set "private" as well, but let's be explicit | |
|  | |
|         $cacheStrategy->add($embeddedResponse); | |
|         $cacheStrategy->update($masterResponse); | |
| 
 | |
|         $this->assertTrue($masterResponse->headers->hasCacheControlDirective('private')); | |
|         // Not sure if we should pass "max-age: 60" in this case, as long as the response is private and | |
|         // that's the more conservative of both the master and embedded response...? | |
|     } | |
| 
 | |
|     public function testResponseIsExiprableWhenEmbeddedResponseCombinesExpiryAndValidation() | |
|     { | |
|         /* When "expiration wins over validation" (https://symfony.com/doc/current/http_cache/validation.html) | |
|          * and both the main and embedded response provide s-maxage, then the more restricting value of both | |
|          * should be fine, regardless of whether the embedded response can be validated later on or must be | |
|          * completely regenerated. | |
|          */ | |
|         $cacheStrategy = new ResponseCacheStrategy(); | |
| 
 | |
|         $masterResponse = new Response(); | |
|         $masterResponse->setSharedMaxAge(3600); | |
| 
 | |
|         $embeddedResponse = new Response(); | |
|         $embeddedResponse->setSharedMaxAge(60); | |
|         $embeddedResponse->setEtag('foo'); | |
| 
 | |
|         $cacheStrategy->add($embeddedResponse); | |
|         $cacheStrategy->update($masterResponse); | |
| 
 | |
|         $this->assertSame('60', $masterResponse->headers->getCacheControlDirective('s-maxage')); | |
|     } | |
| 
 | |
|     public function testResponseIsExpirableButNotValidateableWhenMasterResponseCombinesExpirationAndValidation() | |
|     { | |
|         $cacheStrategy = new ResponseCacheStrategy(); | |
| 
 | |
|         $masterResponse = new Response(); | |
|         $masterResponse->setSharedMaxAge(3600); | |
|         $masterResponse->setEtag('foo'); | |
|         $masterResponse->setLastModified(new \DateTime()); | |
| 
 | |
|         $embeddedResponse = new Response(); | |
|         $embeddedResponse->setSharedMaxAge(60); | |
| 
 | |
|         $cacheStrategy->add($embeddedResponse); | |
|         $cacheStrategy->update($masterResponse); | |
| 
 | |
|         $this->assertSame('60', $masterResponse->headers->getCacheControlDirective('s-maxage')); | |
|         $this->assertFalse($masterResponse->isValidateable()); | |
|     } | |
| }
 | |
| 
 |