123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401 |
- <?php
- namespace EasySwoole\Utility\Tests;
- use EasySwoole\Utility\FileSystem;
- use PHPUnit\Framework\Assert;
- use PHPUnit\Framework\TestCase;
- /**
- * Class FileSystemTest
- * @package EasySwoole\Utility\Tests
- * reference link https://github.com/laravel/framework/blob/8.x/tests/Filesystem/FilesystemTest.php
- */
- class FileSystemTest extends TestCase
- {
- protected static $tempDir;
- public static function setUpBeforeClass(): void
- {
- static::$tempDir = __DIR__ . '/Temp';
- $files = new FileSystem();
- $files->makeDirectory(static::$tempDir);
- }
- public static function tearDownAfterClass(): void
- {
- $files = new FileSystem();
- $files->deleteDirectory(static::$tempDir);
- }
- protected function tearDown(): void
- {
- $files = new FileSystem();
- $files->deleteDirectory(static::$tempDir, true);
- }
- public function testGet()
- {
- file_put_contents(self::$tempDir . '/file.txt', 'Hello World');
- $files = new Filesystem;
- $this->assertEquals('Hello World', $files->get(self::$tempDir . '/file.txt'));
- }
- public function testPut()
- {
- $files = new Filesystem;
- $files->put(self::$tempDir . '/file.txt', 'Hello World');
- $this->assertStringEqualsFile(self::$tempDir . '/file.txt', 'Hello World');
- }
- public function testReplace()
- {
- $tempFile = self::$tempDir . '/file.txt';
- $filesystem = new Filesystem;
- $filesystem->replace($tempFile, 'Hello World');
- $this->assertStringEqualsFile($tempFile, 'Hello World');
- }
- public function testSetChmod()
- {
- file_put_contents(self::$tempDir . '/file.txt', 'Hello World');
- $files = new Filesystem;
- $files->chmod(self::$tempDir . '/file.txt', 0755);
- $filePermission = substr(sprintf('%o', fileperms(self::$tempDir . '/file.txt')), -4);
- $expectedPermissions = DIRECTORY_SEPARATOR == '\\' ? '0666' : '0755';
- $this->assertEquals($expectedPermissions, $filePermission);
- }
- public function testGetChmod()
- {
- file_put_contents(self::$tempDir . '/file.txt', 'Hello World');
- chmod(self::$tempDir . '/file.txt', 0755);
- $files = new Filesystem;
- $filePermission = $files->chmod(self::$tempDir . '/file.txt');
- $expectedPermissions = DIRECTORY_SEPARATOR == '\\' ? '0666' : '0755';
- $this->assertEquals($expectedPermissions, $filePermission);
- }
- public function testDelete()
- {
- file_put_contents(self::$tempDir . '/file1.txt', 'Hello World');
- file_put_contents(self::$tempDir . '/file2.txt', 'Hello World');
- file_put_contents(self::$tempDir . '/file3.txt', 'Hello World');
- $files = new Filesystem;
- $files->delete(self::$tempDir . '/file1.txt');
- Assert::assertFileDoesNotExist(self::$tempDir . '/file1.txt');
- $files->delete([self::$tempDir . '/file2.txt', self::$tempDir . '/file3.txt']);
- Assert::assertFileDoesNotExist(self::$tempDir . '/file2.txt');
- Assert::assertFileDoesNotExist(self::$tempDir . '/file3.txt');
- }
- public function testPrependExistingFiles()
- {
- $files = new Filesystem;
- $files->put(self::$tempDir . '/file.txt', 'World');
- $files->prepend(self::$tempDir . '/file.txt', 'Hello ');
- $this->assertStringEqualsFile(self::$tempDir . '/file.txt', 'Hello World');
- }
- public function testPrependNewFiles()
- {
- $files = new Filesystem;
- $files->prepend(self::$tempDir . '/file.txt', 'Hello World');
- $this->assertStringEqualsFile(self::$tempDir . '/file.txt', 'Hello World');
- }
- public function testMissingFile()
- {
- $files = new Filesystem;
- $this->assertTrue($files->missing(self::$tempDir . '/file.txt'));
- }
- public function testDeleteDirectory()
- {
- mkdir(self::$tempDir . '/foo');
- file_put_contents(self::$tempDir . '/foo/file.txt', 'Hello World');
- $files = new Filesystem;
- $files->deleteDirectory(self::$tempDir . '/foo');
- Assert::assertDirectoryDoesNotExist(self::$tempDir . '/foo');
- Assert::assertFileDoesNotExist(self::$tempDir . '/foo/file.txt');
- }
- public function testDeleteDirectoryReturnFalseWhenNotADirectory()
- {
- mkdir(self::$tempDir . '/bar');
- file_put_contents(self::$tempDir . '/bar/file.txt', 'Hello World');
- $files = new Filesystem;
- $this->assertFalse($files->deleteDirectory(self::$tempDir . '/bar/file.txt'));
- }
- public function testCleanDirectory()
- {
- mkdir(self::$tempDir . '/baz');
- file_put_contents(self::$tempDir . '/baz/file.txt', 'Hello World');
- $files = new Filesystem;
- $files->cleanDirectory(self::$tempDir . '/baz');
- $this->assertDirectoryExists(self::$tempDir . '/baz');
- Assert::assertFileDoesNotExist(self::$tempDir . '/baz/file.txt');
- }
- public function testCopyDirectoryReturnsFalse()
- {
- $files = new Filesystem;
- $this->assertFalse($files->copyDirectory(self::$tempDir . '/breeze/boom/foo/bar/baz', self::$tempDir));
- }
- public function testCopyDirectoryMovesEntireDirectory()
- {
- mkdir(self::$tempDir . '/tmp', 0777, true);
- file_put_contents(self::$tempDir . '/tmp/foo.txt', '');
- file_put_contents(self::$tempDir . '/tmp/bar.txt', '');
- mkdir(self::$tempDir . '/tmp/nested', 0777, true);
- file_put_contents(self::$tempDir . '/tmp/nested/baz.txt', '');
- $files = new Filesystem;
- $files->copyDirectory(self::$tempDir . '/tmp', self::$tempDir . '/tmp2');
- $this->assertDirectoryExists(self::$tempDir . '/tmp2');
- $this->assertFileExists(self::$tempDir . '/tmp2/foo.txt');
- $this->assertFileExists(self::$tempDir . '/tmp2/bar.txt');
- $this->assertDirectoryExists(self::$tempDir . '/tmp2/nested');
- $this->assertFileExists(self::$tempDir . '/tmp2/nested/baz.txt');
- }
- public function testMoveDirectoryMovesEntireDirectory()
- {
- mkdir(self::$tempDir . '/tmp2', 0777, true);
- file_put_contents(self::$tempDir . '/tmp2/foo.txt', '');
- file_put_contents(self::$tempDir . '/tmp2/bar.txt', '');
- mkdir(self::$tempDir . '/tmp2/nested', 0777, true);
- file_put_contents(self::$tempDir . '/tmp2/nested/baz.txt', '');
- $files = new Filesystem;
- $files->moveDirectory(self::$tempDir . '/tmp2', self::$tempDir . '/tmp3');
- $this->assertDirectoryExists(self::$tempDir . '/tmp3');
- $this->assertFileExists(self::$tempDir . '/tmp3/foo.txt');
- $this->assertFileExists(self::$tempDir . '/tmp3/bar.txt');
- $this->assertDirectoryExists(self::$tempDir . '/tmp3/nested');
- $this->assertFileExists(self::$tempDir . '/tmp3/nested/baz.txt');
- Assert::assertDirectoryDoesNotExist(self::$tempDir . '/tmp2');
- }
- public function testMoveDirectoryMovesEntireDirectoryAndOverwrites()
- {
- mkdir(self::$tempDir . '/tmp4', 0777, true);
- file_put_contents(self::$tempDir . '/tmp4/foo.txt', '');
- file_put_contents(self::$tempDir . '/tmp4/bar.txt', '');
- mkdir(self::$tempDir . '/tmp4/nested', 0777, true);
- file_put_contents(self::$tempDir . '/tmp4/nested/baz.txt', '');
- mkdir(self::$tempDir . '/tmp5', 0777, true);
- file_put_contents(self::$tempDir . '/tmp5/foo2.txt', '');
- file_put_contents(self::$tempDir . '/tmp5/bar2.txt', '');
- $files = new Filesystem;
- $files->moveDirectory(self::$tempDir . '/tmp4', self::$tempDir . '/tmp5', true);
- $this->assertDirectoryExists(self::$tempDir . '/tmp5');
- $this->assertFileExists(self::$tempDir . '/tmp5/foo.txt');
- $this->assertFileExists(self::$tempDir . '/tmp5/bar.txt');
- $this->assertDirectoryExists(self::$tempDir . '/tmp5/nested');
- $this->assertFileExists(self::$tempDir . '/tmp5/nested/baz.txt');
- Assert::assertFileDoesNotExist(self::$tempDir . '/tmp5/foo2.txt');
- Assert::assertFileDoesNotExist(self::$tempDir . '/tmp5/bar2.txt');
- Assert::assertDirectoryDoesNotExist(self::$tempDir . '/tmp4');
- }
- public function testMoveDirectoryReturns()
- {
- mkdir(self::$tempDir . '/tmp6', 0777, true);
- file_put_contents(self::$tempDir . '/tmp6/foo.txt', '');
- mkdir(self::$tempDir . '/tmp7', 0777, true);
- $files = new FileSystem();
- $this->assertTrue($files->moveDirectory(self::$tempDir . '/tmp6', self::$tempDir . '/tmp7', true));
- }
- public function testGetThrowsException()
- {
- $this->expectException(\Exception::class);
- $files = new Filesystem;
- $files->get(self::$tempDir . '/unknown-file.txt');
- }
- public function testAppendAddsDataToFile()
- {
- file_put_contents(self::$tempDir . '/file.txt', 'foo');
- $files = new Filesystem;
- $bytesWritten = $files->append(self::$tempDir . '/file.txt', 'bar');
- $this->assertEquals(mb_strlen('bar', '8bit'), $bytesWritten);
- $this->assertFileExists(self::$tempDir . '/file.txt');
- $this->assertStringEqualsFile(self::$tempDir . '/file.txt', 'foobar');
- }
- public function testMoveMovesFiles()
- {
- file_put_contents(self::$tempDir . '/foo.txt', 'foo');
- $files = new Filesystem;
- $files->move(self::$tempDir . '/foo.txt', self::$tempDir . '/bar.txt');
- $this->assertFileExists(self::$tempDir . '/bar.txt');
- Assert::assertFileDoesNotExist(self::$tempDir . '/foo.txt');
- }
- public function testNameReturnsName()
- {
- file_put_contents(self::$tempDir . '/foobar.txt', 'foo');
- $filesystem = new Filesystem;
- $this->assertSame('foobar', $filesystem->name(self::$tempDir . '/foobar.txt'));
- }
- public function testExtensionReturnsExtension()
- {
- file_put_contents(self::$tempDir . '/foo.txt', 'foo');
- $files = new Filesystem;
- $this->assertSame('txt', $files->extension(self::$tempDir . '/foo.txt'));
- }
- public function testBasenameReturnsBasename()
- {
- file_put_contents(self::$tempDir . '/foo.txt', 'foo');
- $files = new Filesystem;
- $this->assertSame('foo.txt', $files->basename(self::$tempDir . '/foo.txt'));
- }
- public function testDirnameReturnsDirectory()
- {
- file_put_contents(self::$tempDir . '/foo.txt', 'foo');
- $files = new Filesystem;
- $this->assertEquals(self::$tempDir, $files->dirname(self::$tempDir . '/foo.txt'));
- }
- public function testTypeIdentifiesFile()
- {
- file_put_contents(self::$tempDir . '/foo.txt', 'foo');
- $files = new Filesystem;
- $this->assertSame('file', $files->type(self::$tempDir . '/foo.txt'));
- }
- public function testTypeIdentifiesDirectory()
- {
- mkdir(self::$tempDir . '/foo-dir');
- $files = new Filesystem;
- $this->assertSame('dir', $files->type(self::$tempDir . '/foo-dir'));
- }
- public function testSizeOutputsSize()
- {
- $size = file_put_contents(self::$tempDir . '/foo.txt', 'foo');
- $files = new Filesystem;
- $this->assertEquals($size, $files->size(self::$tempDir . '/foo.txt'));
- }
- public function testIsWritable()
- {
- file_put_contents(self::$tempDir . '/foo.txt', 'foo');
- $files = new Filesystem;
- @chmod(self::$tempDir . '/foo.txt', 0444);
- $this->assertFalse($files->isWritable(self::$tempDir . '/foo.txt'));
- @chmod(self::$tempDir . '/foo.txt', 0777);
- $this->assertTrue($files->isWritable(self::$tempDir . '/foo.txt'));
- }
- public function testIsReadable()
- {
- file_put_contents(self::$tempDir . '/foo.txt', 'foo');
- $files = new Filesystem;
- // chmod is noneffective on Windows
- if (DIRECTORY_SEPARATOR === '\\') {
- $this->assertTrue($files->isReadable(self::$tempDir . '/foo.txt'));
- } else {
- @chmod(self::$tempDir . '/foo.txt', 0000);
- $this->assertFalse($files->isReadable(self::$tempDir . '/foo.txt'));
- @chmod(self::$tempDir . '/foo.txt', 0777);
- $this->assertTrue($files->isReadable(self::$tempDir . '/foo.txt'));
- }
- $this->assertFalse($files->isReadable(self::$tempDir . '/doesnotexist.txt'));
- }
- public function testGlobFindsFiles()
- {
- file_put_contents(self::$tempDir . '/foo.txt', 'foo');
- file_put_contents(self::$tempDir . '/bar.txt', 'bar');
- $files = new Filesystem;
- $glob = $files->glob(self::$tempDir . '/*.txt');
- $this->assertContains(self::$tempDir . '/foo.txt', $glob);
- $this->assertContains(self::$tempDir . '/bar.txt', $glob);
- }
- public function testMakeDirectory()
- {
- $files = new Filesystem;
- $this->assertTrue($files->makeDirectory(self::$tempDir . '/created'));
- $this->assertFileExists(self::$tempDir . '/created');
- }
- /**
- * @requires extension pcntl
- * @requires function pcntl_fork
- */
- public function testSharedGet()
- {
- if (PHP_OS == 'Darwin') {
- $this->markTestSkipped('The operating system is MacOS.');
- }
- $content = str_repeat('123456', 1000000);
- $result = 1;
- posix_setpgid(0, 0);
- for ($i = 1; $i <= 20; $i++) {
- $pid = pcntl_fork();
- if (!$pid) {
- $files = new Filesystem;
- $files->put(self::$tempDir . '/file.txt', $content, true);
- $read = $files->get(self::$tempDir . '/file.txt', true);
- exit(strlen($read) === strlen($content) ? 1 : 0);
- }
- }
- while (pcntl_waitpid(0, $status) != -1) {
- $status = pcntl_wexitstatus($status);
- $result *= $status;
- }
- $this->assertSame(1, $result);
- }
- public function testCopyCopiesFileProperly()
- {
- $filesystem = new Filesystem;
- $data = 'contents';
- mkdir(self::$tempDir . '/text');
- file_put_contents(self::$tempDir . '/text/foo.txt', $data);
- $filesystem->copy(self::$tempDir . '/text/foo.txt', self::$tempDir . '/text/foo2.txt');
- $this->assertFileExists(self::$tempDir . '/text/foo2.txt');
- $this->assertEquals($data, file_get_contents(self::$tempDir . '/text/foo2.txt'));
- }
- public function testIsFileChecksFilesProperly()
- {
- $filesystem = new Filesystem;
- mkdir(self::$tempDir . '/help');
- file_put_contents(self::$tempDir . '/help/foo.txt', 'contents');
- $this->assertTrue($filesystem->isFile(self::$tempDir . '/help/foo.txt'));
- $this->assertFalse($filesystem->isFile(self::$tempDir . './help'));
- }
- public function testHash()
- {
- file_put_contents(self::$tempDir . '/foo.txt', 'foo');
- $filesystem = new Filesystem;
- $this->assertSame('acbd18db4cc2f85cedef654fccc4a4d8', $filesystem->hash(self::$tempDir . '/foo.txt'));
- }
- }
|