Login   Register  
PHP Classes
elePHPant
Icontem

File: Sync.test.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Ninsuo  >  PHP Sync Files  >  Sync.test.php  >  Download  
File: Sync.test.php
Role: Unit test script
Content type: text/plain
Description: PHPUnit tests
Class: PHP Sync Files
Share variables across applications using files
Author: By
Last change: Added die() at the beginning of the file, to force user to check if the test suite can be run safely.
Date: 2013-05-25 10:24
Size: 12,714 bytes
 

Contents

Class file image Download
<?php

require("Sync.php");

die("Please read warning inside that file and comment this die() before running tests.");

/**
 * Test Case for Sync class
 *
 * Warning:
 * This test case creates a directory in /tmp, check that
 * permissions are granted and the 'sync' directory not
 * already in use.
 *
 * Requires PHPUnit (developped using 3.6.12)
 */
class SyncTest extends PHPUnit_Framework_TestCase
{

    const DIR = "/tmp/sync";

    public function setUp()
    {
        if (!is_dir(self::DIR))
        {
            if (!mkdir(self::DIR))
            {
                throw new \Exception(sprintf("Could not create test directory: %s\n", self::DIR));
            }
        }
    }

    public function tearDown()
    {
        // Removes all files and directories inside self::DIR
        $files = new \RecursiveIteratorIterator(
           new \RecursiveDirectoryIterator(self::DIR, \RecursiveDirectoryIterator::SKIP_DOTS),
           \RecursiveIteratorIterator::CHILD_FIRST
        );
        foreach ($files as $fileinfo)
        {
            $todo = ($fileinfo->isDir() ? 'rmdir' : 'unlink');
            $todo($fileinfo->getRealPath());
        }
        rmdir(self::DIR);
    }

    public function testGetNoFile()
    {
        $file = self::DIR . "/test.sync";
        $sync = new Sync($file);

        $this->assertNull($sync->test);
        $this->assertFalse(is_file($file));
    }

    public function testGetFileExistsButNotReadable()
    {
        $file = self::DIR . "/test.sync";

        $fd = fopen($file, 'w');
        fclose($fd);
        chmod($file, 0000);

        $sync = new Sync($file);
        try
        {
            $test = $sync->test;
        }
        catch (\Exception $e)
        {
            $expected = sprintf("File '%s' is not readable.", $file);
            $this->assertEquals($expected, $e->getMessage());
            return;
        }

        $this->fail("Expected exception, but never raised.");
    }

    public function testGetPropertyNotFound()
    {
        $file = self::DIR . "/test.sync";
        $sync = new Sync($file);

        $this->assertNull($sync->not_found);
        $this->assertNull($sync->{0});
        $this->assertNull($sync->{'&#37325;&#24198;'});
    }

    public function testGetSetSmallValue()
    {
        $file = self::DIR . "/test.sync";
        $sync = new Sync($file);

        $sync->data = "test a";
        $this->assertEquals("test a", $sync->data);

        $sync->{0} = "test b";
        $this->assertEquals("test b", $sync->{0});

        $sync->{'&#37325;&#24198;'} = "test e";
        $this->assertEquals("test e", $sync->{'&#37325;&#24198;'});

        $test = $sync->hello = 'world';
        $this->assertEquals('world', $test);
    }

    public function testGetSetBigValue()
    {
        $value = str_repeat("abcdefghijklmnopqrstuvwxyz", 64 * 1024 + 1);

        $file = self::DIR . "/test.sync";
        $sync = new Sync($file);

        $sync->data = $value;
        $this->assertEquals($value, $sync->data);

        $sync->{0} = $value;
        $this->assertEquals($value, $sync->{0});

        $sync->{'&#37325;&#24198;'} = $value;
        $this->assertEquals($value, $sync->{'&#37325;&#24198;'});

        $test = $sync->hello = $value;
        $this->assertEquals($value, $test);
    }

    public function testSetDirectoryDoesNotExists()
    {
        $dir = self::DIR . "/xxx";
        $file = $dir . "/test.sync";

        $sync = new Sync($file);
        try
        {
            $sync->test = "fail";
        }
        catch (\Exception $e)
        {
            $expected = sprintf("Directory '%s' does not exist or is not writable.", $dir);
            $this->assertEquals($expected, $e->getMessage());
            return;
        }

        $this->fail("Expected exception, but never raised.");
    }

    public function testSetNoFileDirectoryNotWritable()
    {
        $dir = self::DIR . "/xxx";
        mkdir($dir);
        chmod($dir, 000);

        $file = $dir . "/test.sync";

        $sync = new Sync($file);
        try
        {
            $sync->test = "fail";
        }
        catch (\Exception $e)
        {
            $expected = sprintf("Directory '%s' does not exist or is not writable.", $dir);
            $this->assertEquals($expected, $e->getMessage());
            chmod($dir, 770);
            return;
        }

        chmod($dir, 770);
        $this->fail("Expected exception, but never raised.");
    }

    public function testSetFileExistsButNotWritable()
    {
        $file = self::DIR . "/test.sync";

        $fd = fopen($file, 'w');
        fclose($fd);
        chmod($file, 0000);

        $sync = new Sync($file);
        try
        {
            $sync->test = "fail";
        }
        catch (\Exception $e)
        {
            $expected = sprintf("File '%s' is not writable.", $file);
            $this->assertEquals($expected, $e->getMessage());
            return;
        }

        $this->fail("Expected exception, but never raised.");
    }

    public function testSetNoFileButDirectoryWritable()
    {
        $file = self::DIR . "/test.sync";
        $sync = new Sync($file);
        $this->assertFalse(file_exists($file));
        $sync->hello = "world";
        $this->assertTrue(file_exists($file));
        $this->assertEquals("world", $sync->hello);
    }

    public function testSetFileAlreadyExisting()
    {
        $file = self::DIR . "/test.sync";
        $sync = new Sync($file);
        $this->assertFalse(file_exists($file));
        $sync->hello = "world";
        $this->assertTrue(file_exists($file));
        $this->assertEquals("world", $sync->hello);
        $sync->hello = "foo";
        $this->assertEquals("foo", $sync->hello);
    }

    public function testIssetNotSetFileDoesNotExists()
    {
        $file = self::DIR . "/test.sync";
        $sync = new Sync($file);
        $sync->hello = "world";
        unlink($file);
        $this->assertFalse(isset($sync->hello));
    }

    public function testIssetNotSetPropertyDoesNotExists()
    {
        $file = self::DIR . "/test.sync";
        $sync = new Sync($file);
        $sync->hello = "world";
        $this->assertFalse(isset($sync->foo));
    }

    public function testIssetNotSetPropertyIsNull()
    {
        $file = self::DIR . "/test.sync";
        $sync = new Sync($file);
        $sync->hello = null;
        $this->assertFalse(isset($sync->hello));
    }

    public function testIssetPropertyExists()
    {
        $file = self::DIR . "/test.sync";
        $sync = new Sync($file);
        $sync->hello = 0;
        $this->assertTrue(isset($sync->hello));
        $sync->hello = '';
        $this->assertTrue(isset($sync->hello));
        $sync->hello = false;
        $this->assertTrue(isset($sync->hello));
        $sync->hello = array();
        $this->assertTrue(isset($sync->hello));
        $sync->hello = new \stdClass();
        $this->assertTrue(isset($sync->hello));
        $sync->hello = 42;
        $this->assertTrue(isset($sync->hello));
    }

    public function testUnsetNoFile()
    {
        $file = self::DIR . "/test.sync";
        $sync = new Sync($file);
        $sync->hello = "world";
        unlink($file);
        unset($sync->hello);
    }

    public function testUnsetPropertyNeverSet()
    {
        $file = self::DIR . "/test.sync";
        $sync = new Sync($file);
        $sync->hello = "world";
        unset($sync->test);
    }

    public function testUnsetPropertyExists()
    {
        $file = self::DIR . "/test.sync";
        $sync = new Sync($file);
        $sync->hello = "world";
        $sync->foo = "bar";
        unset($sync->hello);
        $this->assertNull($sync->hello);
        $this->assertEquals("bar", $sync->foo);
    }

    public function testAliases()
    {
        $file = self::DIR . "/test.sync";
        $sync = new Sync($file);

        $this->assertNull($sync->get('hello'));
        $this->assertNull($sync->get('foo'));

        $this->assertFalse($sync->has('hello'));
        $this->assertFalse($sync->has('foo'));

        $this->assertEquals('world', $sync->set('hello', 'world'));
        $this->assertEquals('bar', $sync->set('foo', 'bar'));

        $this->assertEquals('world', $sync->get('hello'));
        $this->assertEquals('bar', $sync->get('foo'));

        $this->assertTrue($sync->has('hello'));
        $this->assertTrue($sync->has('foo'));

        $sync->remove('foo');

        $this->assertNull($sync->get('foo'));
        $this->assertFalse($sync->has('foo'));
    }

    public function testLockTimeoutNotNumeric()
    {
        $file = self::DIR . "/test.sync";
        $sync = new Sync($file);

        try
        {
            $sync->lock(array());
        }
        catch (\Exception $e)
        {
            $expected = 'Lock timeout should be an integer greater or equals to 0.';
            $this->assertEquals($expected, $e->getMessage());
            return;
        }

        $this->fail("Expected exception, but never raised.");
    }

    public function testLockTimeoutLesserThanZero()
    {
        $file = self::DIR . "/test.sync";
        $sync = new Sync($file);

        try
        {
            $sync->lock(-42);
        }
        catch (\Exception $e)
        {
            $expected = 'Lock timeout should be an integer greater or equals to 0.';
            $this->assertEquals($expected, $e->getMessage());
            return;
        }

        $this->fail("Expected exception, but never raised.");
    }

    public function testLockIntervalNotNumeric()
    {
        $file = self::DIR . "/test.sync";
        $sync = new Sync($file);

        try
        {
            $sync->lock(0, array());
        }
        catch (\Exception $e)
        {
            $expected = 'Lock check interval should be an integer greater or equals to 5000.';
            $this->assertEquals($expected, $e->getMessage());
            return;
        }

        $this->fail("Expected exception, but never raised.");
    }

    public function testLockIntervalLesserThan5000()
    {
        $file = self::DIR . "/test.sync";
        $sync = new Sync($file);

        try
        {
            $sync->lock(4999, array());
        }
        catch (\Exception $e)
        {
            $expected = 'Lock check interval should be an integer greater or equals to 5000.';
            $this->assertEquals($expected, $e->getMessage());
            return;
        }

        $this->fail("Expected exception, but never raised.");
    }

    public function testLock()
    {
        $file = self::DIR . "/test.sync";
        $syncA = new Sync($file);
        $syncA->hello = 'world';
        $syncA->lock(1);

        $syncB = new Sync($file);
        try
        {
            $syncB->hello;
        }
        catch (\Exception $e)
        {
            $expected = "Can't access shared object, it is still locked after 1 second(s).";
            $this->assertEquals($expected, $e->getMessage());
            return;
        }

        $this->fail("Expected exception, but never raised.");
    }

    public function testUnlock()
    {
        $file = self::DIR . "/test.sync";
        $syncA = new Sync($file);
        $syncA->hello = 'world';
        $syncA->lock(1);
        $syncA->foo = 'bar';
        $syncA->unlock();
        $syncB = new Sync($file);
        try
        {
            $test = $syncB->hello;
        }
        catch (\Exception $e)
        {
            $this->fail(sprintf("Unexpected exception has been raised: %s.", $e->getMessage()));
            return;
        }
        $this->assertEquals('world', $test);
    }

    public function testGetSetFile()
    {
        $fileA = self::DIR . "/testA.sync";
        $fileB = self::DIR . "/testB.sync";
        $sync = new Sync($fileA);
        $this->assertEquals($fileA, $sync->getFile());
        $sync->hello = 'world';
        $this->assertEquals('world', $sync->hello);
        $this->assertEquals($fileB, $sync->setFile($fileB)->getFile());
        $sync->foo = 'bar';
        $this->assertEquals('bar', $sync->foo);
        $this->assertNull($sync->hello);
        $this->assertEquals($fileA, $sync->setFile($fileA)->getFile());
        $this->assertNull($sync->foo);
        $this->assertEquals('world', $sync->hello);
    }

}