This repository has been archived by the owner on Jan 31, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 64
Use current time() instead of Request Time for the expiration TTL #85
Closed
MatthiasKuehneEllerhold
wants to merge
4
commits into
zendframework:master
from
MatthiasKuehneEllerhold:container-expiry
Closed
Changes from all commits
Commits
Show all changes
4 commits
Select commit
Hold shift + click to select a range
1b516ad
Use current time() instead of Request Time for the expiration TTL
MatthiasKuehneEllerhold 273e118
Unit-Tests
MatthiasKuehneEllerhold 6d95a70
Add unit-test
MatthiasKuehneEllerhold be48bf9
Fix Unit-Test so that it correctly tests for the new behavior and fai…
MatthiasKuehneEllerhold File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -193,22 +193,24 @@ public function testContainerWritesToStorage() | |
|
||
public function testSettingExpirationSecondsUpdatesStorageMetadataForFullContainer() | ||
{ | ||
$currentTimestamp = time(); | ||
$this->container->setExpirationSeconds(3600); | ||
$storage = $this->manager->getStorage(); | ||
$metadata = $storage->getMetadata($this->container->getName()); | ||
$this->assertArrayHasKey('EXPIRE', $metadata); | ||
$this->assertEquals($_SERVER['REQUEST_TIME'] + 3600, $metadata['EXPIRE']); | ||
$this->assertEquals($currentTimestamp + 3600, $metadata['EXPIRE']); | ||
} | ||
|
||
public function testSettingExpirationSecondsForIndividualKeyUpdatesStorageMetadataForThatKey() | ||
{ | ||
$this->container->foo = 'bar'; | ||
$currentTimestamp = time(); | ||
$this->container->setExpirationSeconds(3600, 'foo'); | ||
$storage = $this->manager->getStorage(); | ||
$metadata = $storage->getMetadata($this->container->getName()); | ||
$this->assertArrayHasKey('EXPIRE_KEYS', $metadata); | ||
$this->assertArrayHasKey('foo', $metadata['EXPIRE_KEYS']); | ||
$this->assertEquals($_SERVER['REQUEST_TIME'] + 3600, $metadata['EXPIRE_KEYS']['foo']); | ||
$this->assertEquals($currentTimestamp + 3600, $metadata['EXPIRE_KEYS']['foo']); | ||
} | ||
|
||
public function testMultipleCallsToExpirationSecondsAggregates() | ||
|
@@ -217,15 +219,40 @@ public function testMultipleCallsToExpirationSecondsAggregates() | |
$this->container->bar = 'baz'; | ||
$this->container->baz = 'bat'; | ||
$this->container->bat = 'bas'; | ||
$currentTimestamp = time(); | ||
$this->container->setExpirationSeconds(3600); | ||
$this->container->setExpirationSeconds(1800, 'foo'); | ||
$this->container->setExpirationSeconds(900, ['baz', 'bat']); | ||
$storage = $this->manager->getStorage(); | ||
$metadata = $storage->getMetadata($this->container->getName()); | ||
$this->assertEquals($_SERVER['REQUEST_TIME'] + 1800, $metadata['EXPIRE_KEYS']['foo']); | ||
$this->assertEquals($_SERVER['REQUEST_TIME'] + 900, $metadata['EXPIRE_KEYS']['baz']); | ||
$this->assertEquals($_SERVER['REQUEST_TIME'] + 900, $metadata['EXPIRE_KEYS']['bat']); | ||
$this->assertEquals($_SERVER['REQUEST_TIME'] + 3600, $metadata['EXPIRE']); | ||
$this->assertEquals($currentTimestamp + 1800, $metadata['EXPIRE_KEYS']['foo']); | ||
$this->assertEquals($currentTimestamp + 900, $metadata['EXPIRE_KEYS']['baz']); | ||
$this->assertEquals($currentTimestamp + 900, $metadata['EXPIRE_KEYS']['bat']); | ||
$this->assertEquals($currentTimestamp + 3600, $metadata['EXPIRE']); | ||
} | ||
|
||
public function testSettingExpirationSecondsUsesCurrentTime() | ||
{ | ||
sleep(3); | ||
$this->container->setExpirationSeconds(2); | ||
$this->container->foo = 'bar'; | ||
|
||
// Simulate a second request, backup the request time and overwrite it with current time() | ||
$requestTimeBackup = $_SERVER['REQUEST_TIME']; | ||
$requestTimeFloatBackup = $_SERVER['REQUEST_TIME_FLOAT'] ?? null; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This library still supports PHP 5.6, so we'll need to do an |
||
|
||
$_SERVER['REQUEST_TIME'] = time(); | ||
$_SERVER['REQUEST_TIME_FLOAT'] = microtime(true); | ||
|
||
try { | ||
$this->assertEquals('bar', $this->container->foo); | ||
} catch (\Throwable $e) { | ||
// Restore the original values | ||
$_SERVER['REQUEST_TIME'] = $requestTimeBackup; | ||
$_SERVER['REQUEST_TIME_FLOAT'] = $requestTimeFloatBackup; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't think we need to do this; PHPUnit restores superglobals between test executions by default, IIRC. I'll try removing it locally when I merge. |
||
|
||
throw $e; | ||
} | ||
} | ||
|
||
public function testPassingUnsetKeyToSetExpirationSecondsDoesNothing() | ||
|
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unfortunately, this test doesn't prove the fix.
To test, I reverted the change you provided (
s/time()/$_SERVER['REQUEST_TIME']/
), and ran just this test; it passed. I tried resetting the sleep and expiration seconds values as well, but they always passed. I also tried putting the assignment prior to thesetExpirationSeconds()
method, and that did not work, either.While I do not doubt that the fix is correct, we need an accurate way to test it that emulates what happens in a normal server-side web request so that we can ensure the fix is correct and will not break with future updates.