ClientPoolTest.php #1

  • //
  • guest/
  • thomas_gray/
  • jambox/
  • main/
  • swarm/
  • tests/
  • phpunit/
  • P4Test/
  • ClientPool/
  • ClientPoolTest.php
  • View
  • Commits
  • Open Download .zip Download (10 KB)
<?php
/**
 * Tests for the client pool.
 *
 * @copyright   2013 Perforce Software. All rights reserved.
 * @license     Please see LICENSE.txt in top-level folder of this distribution.
 * @version     <release>/<patch>
 */

namespace P4Test\ClientPool;

use P4\Spec\Depot;
use P4Test\TestCase;
use P4\Spec\Client;
use P4\ClientPool\ClientPool;

class ClientPoolTest extends TestCase
{
    public function testBasicFunction()
    {
        new ClientPool;
    }

    public function testBasicGet()
    {
        $clients = new ClientPool($this->p4);
        $clients->setMax(3)->setRoot(DATA_PATH . '/clients');

        // get a client and verify re-requesting gives the same one
        $id1 = $clients->grab();
        $this->assertSame(
            $id1,
            $clients->grab(),
            'expected to get the same client on two requests'
        );
    }

    public function testViewCreation()
    {
        $clients = new ClientPool($this->p4);
        $clients->setMax(3)->setRoot(DATA_PATH . '/clients');

        // get a client and verify re-requesting gives the same one
        $id1 = $clients->grab();
        $this->assertSame(
            array(
                 array(
                     'depot'  => '//depot/...',
                     'client' => '//' . $id1 . '/depot/...'
                 )
            ),
            Client::fetch($id1, $this->p4)->get('View'),
            'expected matching view'
        );
    }

    /**
     * @expectedException \P4\ClientPool\Exception
     */
    public function testNoFolderPermissions()
    {
        // ensure the clients folder exists and we lack write access to it
        $path = DATA_PATH . '/clients';
        mkdir($path);
        chmod($path, 0100);

        $this->assertSame(array(), glob($path . '/*'));

        $clients = new ClientPool($this->p4);
        $clients->setMax(3)->setRoot(DATA_PATH . '/clients');

        // expect the blocking grab to toss our expected exception
        $clients->grab();
    }

    /**
     * @expectedException \P4\ClientPool\Exception
     */
    public function testNoFilePermissions()
    {
        // ensure the clients folder exists and we lack write access to the lock files
        $path = DATA_PATH . '/clients';
        mkdir($path);
        touch($path . '/00000000-0000-0000-0000-000000000001' . ClientPool::LOCK_EXTENSION);
        chmod($path . '/00000000-0000-0000-0000-000000000001' . ClientPool::LOCK_EXTENSION, 0100);
        touch($path . '/00000000-0000-0000-0000-000000000002' . ClientPool::LOCK_EXTENSION);
        chmod($path . '/00000000-0000-0000-0000-000000000002' . ClientPool::LOCK_EXTENSION, 0100);
        touch($path . '/00000000-0000-0000-0000-000000000003' . ClientPool::LOCK_EXTENSION);
        chmod($path . '/00000000-0000-0000-0000-000000000003' . ClientPool::LOCK_EXTENSION, 0100);

        // test a single file to verify we indeed cannot open it
        $this->assertTrue(
            @fopen($path . '/00000000-0000-0000-0000-000000000001' . ClientPool::LOCK_EXTENSION, 'c') === false
        );

        // setup the client pool to test blocking and non-blocking grab
        $clients = new ClientPool($this->p4);
        $clients->setMax(3)->setRoot(DATA_PATH . '/clients');

        // expect the blocking grab to toss our expected exception
        $clients->grab();
    }

    public function testGettingMax()
    {
        $clients = new ClientPool($this->p4);
        $clients->setMax(3)->setRoot(DATA_PATH . '/clients');

        // get a client and verify re-requesting gives the same one
        $id1 = $clients->grab();
        $this->assertSame(
            $id1,
            $clients->grab(),
            'expected to get the same client on two requests'
        );

        // get another client by passing reuse=false
        $id2 = $clients->grab(false);
        $this->assertFalse(
            $id1 == $id2,
            'expected different id for client 2! ' . $id2
        );

        $id3 = $clients->grab(false);
        $this->assertFalse(
            $id1 == $id3 || $id2 == $id3,
            'expected different id for client 3! ' . $id3
        );

        $this->assertSame(
            false,
            $clients->grab(false, false),
            'Expected false on non blocking request for client 4'
        );

        $this->assertSame(
            $id1,
            $clients->grab(),
            'Expected first client to be returned when several available and re-using'
        );
    }

    public function testTwoCopies()
    {
        $clients1 = new ClientPool($this->p4);
        $clients1->setMax(3)->setPrefix('test-')->setRoot(DATA_PATH . '/clients');

        $clients2 = new ClientPool($this->p4);
        $clients2->setMax(3)->setPrefix('test-')->setRoot(DATA_PATH . '/clients');

        $id1 = $clients1->grab();
        $id2 = $clients2->grab();

        $this->assertTrue(
            strpos($id1, $clients1->getPrefix()) === 0,
            'expected valid looking id1'
        );
        $this->assertTrue(
            strpos($id2, $clients2->getPrefix()) === 0,
            'expected valid looking id2'
        );

        $this->assertTrue(
            $id1 != $id2,
            'expected two different ids'
        );
    }

    public function testRelease()
    {
        $clients1 = new ClientPool($this->p4);
        $clients1->setMax(3)->setPrefix('test-')->setRoot(DATA_PATH . '/clients');

        $clients2 = new ClientPool($this->p4);
        $clients2->setMax(3)->setPrefix('test-')->setRoot(DATA_PATH . '/clients');

        $id1 = $clients1->grab();
        $id2 = $clients2->grab();

        $this->assertTrue(
            strpos($id1, $clients1->getPrefix()) === 0,
            'expected valid looking id1'
        );
        $this->assertTrue(
            strpos($id2, $clients2->getPrefix()) === 0,
            'expected valid looking id2'
        );
        $this->assertTrue(
            $id1 != $id2,
            'expected two different ids'
        );

        $clients2->release();
        $this->assertSame(
            $id2,
            $clients1->grab(false),
            'expected id2 to be freed up for ClientPool1 to get'
        );
    }

    public function testSimpleHistory()
    {
        $clients = new ClientPool($this->p4);
        $clients->setMax(3)->setPrefix('test-')->setRoot(DATA_PATH . '/clients');

        $starting = $this->p4->getClient($this->p4);
        $clients->grab();
        $this->assertFalse($starting == $this->p4->getClient(), 'expected client to change');
        $this->assertTrue(strpos($this->p4->getClient(), 'test-') == 0, 'expected test prefix');

        $clients->release();
        $this->assertSame($starting, $this->p4->getClient(), 'expected original client to be restored');
    }

    public function testDeeperHistory()
    {
        $clients = new ClientPool($this->p4);
        $clients->setMax(3)->setPrefix('test-')->setRoot(DATA_PATH . '/clients');

        $starting = $this->p4->getClient($this->p4);
        $clients->grab();
        $this->assertFalse($starting == $this->p4->getClient($this->p4), 'expected client to change');
        $this->assertTrue(strpos($this->p4->getClient(), 'test-') == 0, 'expected test prefix');

        $grab1 = $this->p4->getClient();
        $clients->grab(false);
        $this->assertFalse($grab1 == $this->p4->getClient(), 'expected client to change2');
        $this->assertTrue(strpos($this->p4->getClient(), 'test-') == 0, 'expected test prefix2');

        $grab2 = $this->p4->getClient();
        $clients->grab(false);
        $this->assertFalse($grab2 == $this->p4->getClient(), 'expected client to change3');
        $this->assertTrue(strpos($this->p4->getClient(), 'test-') == 0, 'expected test prefix3');

        $clients->release();
        $this->assertSame($grab2, $this->p4->getClient(), 'expected original grab2 to be restored');

        $clients->release();
        $this->assertSame($grab1, $this->p4->getClient(), 'expected original grab1 to be restored');

        $clients->release();
        $this->assertSame($starting, $this->p4->getClient(), 'expected original to be restored');
    }

    public function testStreamReset()
    {
        // create a stream depot and stream //stream/main
        $depot = $this->p4->run('depot', array('-o', 'stream'))->getData(-1);
        $this->p4->run('depot', '-i', array('Type' => 'stream') + $depot);
        $stream = array('Type' => 'mainline') + $this->p4->run('stream', array('-o', '//stream/main'))->getData(-1);
        $this->p4->run('stream', '-i', $stream)->getData(-1);
        $this->p4->disconnect();    // required for 2010.2 p4d to pick up the new depot

        $clients = new ClientPool($this->p4);
        $clients->setMax(3)->setPrefix('test-')->setRoot(DATA_PATH . '/clients');
        $id = $clients->grab();
        $clients->reset(true, '//stream/main');

        $this->assertSame(
            '//stream/main',
            Client::fetch($id, $this->p4)->get('Stream')
        );
    }

    /**
     * @expectedException \P4\Connection\Exception\CommandException
     */
    public function testBadDepotStreamReset()
    {
        $clients = new ClientPool($this->p4);
        $clients->setMax(3)->setPrefix('test-')->setRoot(DATA_PATH . '/clients');
        $clients->grab();
        $clients->reset(true, '//madeup/madeup');
    }

    /**
     * @expectedException \P4\Connection\Exception\CommandException
     */
    public function testBadStreamReset()
    {
        $depot = $this->p4->run('depot', array('-o', 'stream'))->getData(-1);
        $this->p4->run('depot', '-i', array('Type' => 'stream') + $depot);

        $clients = new ClientPool($this->p4);
        $clients->setMax(3)->setPrefix('test-')->setRoot(DATA_PATH . '/clients');
        $clients->grab();
        $clients->reset(true, '//stream/madeup');
    }
}
# Change User Description Committed
#1 18730 Liz Lam clean up code and move things around