Version 1
[yaffs-website] / vendor / mikey179 / vfsStream / src / test / php / org / bovigo / vfs / vfsStreamWrapperFileTimesTestCase.php
diff --git a/vendor/mikey179/vfsStream/src/test/php/org/bovigo/vfs/vfsStreamWrapperFileTimesTestCase.php b/vendor/mikey179/vfsStream/src/test/php/org/bovigo/vfs/vfsStreamWrapperFileTimesTestCase.php
new file mode 100644 (file)
index 0000000..33247f6
--- /dev/null
@@ -0,0 +1,314 @@
+<?php
+/**
+ * This file is part of vfsStream.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @package  org\bovigo\vfs
+ */
+namespace org\bovigo\vfs;
+/**
+ * Test for org\bovigo\vfs\vfsStreamWrapper.
+ *
+ * @since  0.9.0
+ */
+class vfsStreamWrapperFileTimesTestCase extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * URL of foo.txt file
+     *
+     * @var  string
+     */
+    protected $fooUrl;
+    /**
+     * URL of bar directory
+     *
+     * @var  string
+     */
+    protected $barUrl;
+    /**
+     * URL of baz.txt file
+     *
+     * @var  string
+     */
+    protected $bazUrl;
+
+    /**
+     * set up test environment
+     */
+    public function setUp()
+    {
+        vfsStream::setup()
+                 ->lastModified(50)
+                 ->lastAccessed(50)
+                 ->lastAttributeModified(50);
+        $this->fooUrl = vfsStream::url('root/foo.txt');
+        $this->barUrl = vfsStream::url('root/bar');
+        $this->bazUrl = vfsStream::url('root/bar/baz.txt');
+    }
+
+    /**
+     * helper assertion for the tests
+     *
+     * @param  string            $url      url to check
+     * @param  vfsStreamContent  $content  content to compare
+     */
+    protected function assertFileTimesEqualStreamTimes($url, vfsStreamContent $content)
+    {
+        $this->assertEquals(filemtime($url), $content->filemtime());
+        $this->assertEquals(fileatime($url), $content->fileatime());
+        $this->assertEquals(filectime($url), $content->filectime());
+    }
+
+    /**
+     * @test
+     * @group  issue_7
+     * @group  issue_26
+     */
+    public function openFileChangesAttributeTimeOnly()
+    {
+        $file = vfsStream::newFile('foo.txt')
+                         ->withContent('test')
+                         ->at(vfsStreamWrapper::getRoot())
+                         ->lastModified(100)
+                         ->lastAccessed(100)
+                         ->lastAttributeModified(100);
+        fclose(fopen($this->fooUrl, 'rb'));
+        $this->assertGreaterThan(time() - 2, fileatime($this->fooUrl));
+        $this->assertLessThanOrEqual(time(), fileatime($this->fooUrl));
+        $this->assertLessThanOrEqual(100, filemtime($this->fooUrl));
+        $this->assertEquals(100, filectime($this->fooUrl));
+        $this->assertFileTimesEqualStreamTimes($this->fooUrl, $file);
+    }
+
+    /**
+     * @test
+     * @group  issue_7
+     * @group  issue_26
+     */
+    public function fileGetContentsChangesAttributeTimeOnly()
+    {
+        $file = vfsStream::newFile('foo.txt')
+                         ->withContent('test')
+                         ->at(vfsStreamWrapper::getRoot())
+                         ->lastModified(100)
+                         ->lastAccessed(100)
+                         ->lastAttributeModified(100);
+        file_get_contents($this->fooUrl);
+        $this->assertGreaterThan(time() - 2, fileatime($this->fooUrl));
+        $this->assertLessThanOrEqual(time(), fileatime($this->fooUrl));
+        $this->assertLessThanOrEqual(100, filemtime($this->fooUrl));
+        $this->assertEquals(100, filectime($this->fooUrl));
+        $this->assertFileTimesEqualStreamTimes($this->fooUrl, $file);
+    }
+
+    /**
+     * @test
+     * @group  issue_7
+     * @group  issue_26
+     */
+    public function openFileWithTruncateChangesAttributeAndModificationTime()
+    {
+        $file = vfsStream::newFile('foo.txt')
+                         ->withContent('test')
+                         ->at(vfsStreamWrapper::getRoot())
+                         ->lastModified(100)
+                         ->lastAccessed(100)
+                         ->lastAttributeModified(100);
+        fclose(fopen($this->fooUrl, 'wb'));
+        $this->assertGreaterThan(time() - 2, filemtime($this->fooUrl));
+        $this->assertGreaterThan(time() - 2, fileatime($this->fooUrl));
+        $this->assertLessThanOrEqual(time(), filemtime($this->fooUrl));
+        $this->assertLessThanOrEqual(time(), fileatime($this->fooUrl));
+        $this->assertEquals(100, filectime($this->fooUrl));
+        $this->assertFileTimesEqualStreamTimes($this->fooUrl, $file);
+    }
+
+    /**
+     * @test
+     * @group  issue_7
+     */
+    public function readFileChangesAccessTime()
+    {
+        $file = vfsStream::newFile('foo.txt')
+                         ->withContent('test')
+                         ->at(vfsStreamWrapper::getRoot())
+                         ->lastModified(100)
+                         ->lastAccessed(100)
+                         ->lastAttributeModified(100);
+        $fp = fopen($this->fooUrl, 'rb');
+        $openTime = time();
+        sleep(2);
+        fread($fp, 1024);
+        fclose($fp);
+        $this->assertLessThanOrEqual($openTime, filemtime($this->fooUrl));
+        $this->assertLessThanOrEqual($openTime + 3, fileatime($this->fooUrl));
+        $this->assertEquals(100, filectime($this->fooUrl));
+        $this->assertFileTimesEqualStreamTimes($this->fooUrl, $file);
+    }
+
+    /**
+     * @test
+     * @group  issue_7
+     */
+    public function writeFileChangesModificationTime()
+    {
+        $file = vfsStream::newFile('foo.txt')
+                         ->at(vfsStreamWrapper::getRoot())
+                         ->lastModified(100)
+                         ->lastAccessed(100)
+                         ->lastAttributeModified(100);
+        $fp = fopen($this->fooUrl, 'wb');
+        $openTime = time();
+        sleep(2);
+        fwrite($fp, 'test');
+        fclose($fp);
+        $this->assertLessThanOrEqual($openTime + 3, filemtime($this->fooUrl));
+        $this->assertLessThanOrEqual($openTime, fileatime($this->fooUrl));
+        $this->assertEquals(100, filectime($this->fooUrl));
+        $this->assertFileTimesEqualStreamTimes($this->fooUrl, $file);
+
+    }
+
+    /**
+     * @test
+     * @group  issue_7
+     */
+    public function createNewFileSetsAllTimesToCurrentTime()
+    {
+        file_put_contents($this->fooUrl, 'test');
+        $this->assertLessThanOrEqual(time(), filemtime($this->fooUrl));
+        $this->assertEquals(fileatime($this->fooUrl), filectime($this->fooUrl));
+        $this->assertEquals(fileatime($this->fooUrl), filemtime($this->fooUrl));
+        $this->assertFileTimesEqualStreamTimes($this->fooUrl, vfsStreamWrapper::getRoot()->getChild('foo.txt'));
+    }
+
+    /**
+     * @test
+     * @group  issue_7
+     */
+    public function createNewFileChangesAttributeAndModificationTimeOfContainingDirectory()
+    {
+        $dir = vfsStream::newDirectory('bar')
+                        ->at(vfsStreamWrapper::getRoot())
+                        ->lastModified(100)
+                        ->lastAccessed(100)
+                        ->lastAttributeModified(100);
+        file_put_contents($this->bazUrl, 'test');
+        $this->assertLessThanOrEqual(time(), filemtime($this->barUrl));
+        $this->assertLessThanOrEqual(time(), filectime($this->barUrl));
+        $this->assertEquals(100, fileatime($this->barUrl));
+        $this->assertFileTimesEqualStreamTimes($this->barUrl, $dir);
+    }
+
+    /**
+     * @test
+     * @group  issue_7
+     */
+    public function addNewFileNameWithLinkFunctionChangesAttributeTimeOfOriginalFile()
+    {
+        $this->markTestSkipped('Links are currently not supported by vfsStream.');
+    }
+
+    /**
+     * @test
+     * @group  issue_7
+     */
+    public function addNewFileNameWithLinkFunctionChangesAttributeAndModificationTimeOfDirectoryContainingLink()
+    {
+        $this->markTestSkipped('Links are currently not supported by vfsStream.');
+    }
+
+    /**
+     * @test
+     * @group  issue_7
+     */
+    public function removeFileChangesAttributeAndModificationTimeOfContainingDirectory()
+    {
+        $dir = vfsStream::newDirectory('bar')
+                        ->at(vfsStreamWrapper::getRoot());
+        $file = vfsStream::newFile('baz.txt')
+                         ->at($dir)
+                         ->lastModified(100)
+                         ->lastAccessed(100)
+                         ->lastAttributeModified(100);
+        $dir->lastModified(100)
+            ->lastAccessed(100)
+            ->lastAttributeModified(100);
+        unlink($this->bazUrl);
+        $this->assertLessThanOrEqual(time(), filemtime($this->barUrl));
+        $this->assertLessThanOrEqual(time(), filectime($this->barUrl));
+        $this->assertEquals(100, fileatime($this->barUrl));
+        $this->assertFileTimesEqualStreamTimes($this->barUrl, $dir);
+    }
+
+    /**
+     * @test
+     * @group  issue_7
+     */
+    public function renameFileChangesAttributeAndModificationTimeOfAffectedDirectories()
+    {
+        $target = vfsStream::newDirectory('target')
+                           ->at(vfsStreamWrapper::getRoot())
+                           ->lastModified(200)
+                           ->lastAccessed(200)
+                           ->lastAttributeModified(200);
+        $source = vfsStream::newDirectory('bar')
+                           ->at(vfsStreamWrapper::getRoot());
+        $file = vfsStream::newFile('baz.txt')
+                         ->at($source)
+                         ->lastModified(300)
+                         ->lastAccessed(300)
+                         ->lastAttributeModified(300);
+        $source->lastModified(100)
+               ->lastAccessed(100)
+               ->lastAttributeModified(100);
+        rename($this->bazUrl, vfsStream::url('root/target/baz.txt'));
+        $this->assertLessThanOrEqual(time(), filemtime($this->barUrl));
+        $this->assertLessThanOrEqual(time(), filectime($this->barUrl));
+        $this->assertEquals(100, fileatime($this->barUrl));
+        $this->assertFileTimesEqualStreamTimes($this->barUrl, $source);
+        $this->assertLessThanOrEqual(time(), filemtime(vfsStream::url('root/target')));
+        $this->assertLessThanOrEqual(time(), filectime(vfsStream::url('root/target')));
+        $this->assertEquals(200, fileatime(vfsStream::url('root/target')));
+        $this->assertFileTimesEqualStreamTimes(vfsStream::url('root/target'), $target);
+    }
+
+    /**
+     * @test
+     * @group  issue_7
+     */
+    public function renameFileDoesNotChangeFileTimesOfFileItself()
+    {
+        $target = vfsStream::newDirectory('target')
+                           ->at(vfsStreamWrapper::getRoot())
+                           ->lastModified(200)
+                           ->lastAccessed(200)
+                           ->lastAttributeModified(200);
+        $source = vfsStream::newDirectory('bar')
+                           ->at(vfsStreamWrapper::getRoot());
+        $file = vfsStream::newFile('baz.txt')
+                         ->at($source)
+                         ->lastModified(300)
+                         ->lastAccessed(300)
+                         ->lastAttributeModified(300);
+        $source->lastModified(100)
+               ->lastAccessed(100)
+               ->lastAttributeModified(100);
+        rename($this->bazUrl, vfsStream::url('root/target/baz.txt'));
+        $this->assertEquals(300, filemtime(vfsStream::url('root/target/baz.txt')));
+        $this->assertEquals(300, filectime(vfsStream::url('root/target/baz.txt')));
+        $this->assertEquals(300, fileatime(vfsStream::url('root/target/baz.txt')));
+        $this->assertFileTimesEqualStreamTimes(vfsStream::url('root/target/baz.txt'), $file);
+    }
+
+    /**
+     * @test
+     * @group  issue_7
+     */
+    public function changeFileAttributesChangesAttributeTimeOfFileItself()
+    {
+        $this->markTestSkipped('Changing file attributes via stream wrapper for self-defined streams is not supported by PHP.');
+    }
+}