- <?php
- /**
- * Test methods for the P4 Connection.
- *
- * @copyright 2012 Perforce Software. All rights reserved.
- * @license Please see LICENSE.txt in top-level folder of this distribution.
- * @version <release>/<patch>
- */
-
- namespace P4Test\Connection;
-
- use P4\Connection\CommandResult;
- use P4\Connection\Exception\CommandException;
- use P4Test\TestCase;
- use P4\Connection\Connection;
- use P4\Environment\Environment;
-
- class Test extends TestCase
- {
- /**
- * Test setDefaultConnection.
- */
- public function testSetDefaultConnection()
- {
- // test an invalid connection
- try {
- Connection::setDefaultConnection(null);
- $this->fail('Unexpected success setting empty default connection.');
- } catch (\Exception $e) {
- $this->assertTrue(true);
- }
-
- // test a valid connection.
- $connection = new \P4\Connection\Extension;
- Connection::setDefaultConnection($connection);
- $this->assertSame(
- $connection,
- Connection::getDefaultConnection(),
- 'Expected connection'
- );
- }
-
- /**
- * Test isValidType.
- */
- public function testIsValidType()
- {
- $tests = array(
- '' => false,
- 'bogus' => false,
- 'P4\\File\\File' => false,
- 'P4\\Connection\\Extension' => true,
- );
-
- foreach ($tests as $class => $expectation) {
- $this->assertSame(
- $expectation,
- Connection::isValidType($class),
- "Expected result for '$class'"
- );
- }
- }
-
- /**
- * Test getClientRoot with invalid client.
- */
- public function testGetClientRoot()
- {
- // by default, the test suite can connect; test the normal case
- $connection = $this->createP4Connection();
- $this->assertSame(
- realpath($this->getP4Params('clientRoot') .'/superuser'),
- realpath($connection->getClientRoot()),
- 'Expected client root'
- );
-
- // skip the following test if P4PHP is loaded; we cannot manipulate P4PHP
- // to make this test pass.
- if (!extension_loaded('perforce')) {
-
- // now override P4 to get unexpected behaviour
- $connection->clearInfo();
- $script = ASSETS_PATH . '/scripts/serializedArray.';
- $script .= Environment::isWindows() ? 'bat' : 'sh';
- $connection->setP4Path($script);
- $this->assertSame(
- false,
- $connection->getClientRoot(),
- 'Expect no root for bogus P4'
- );
- }
- }
-
- public function timeZoneTranslationProvider()
- {
- return array(
- array('2014/02/26 17:26:31 -0800 PST', 'America/Los_Angeles'),
- array('2014/02/26 17:35:12 -0800 Pacific Standard Time', 'America/Los_Angeles'),
- array('2014/02/20 16:44:53 -0600 Central Standard Time', 'America/Chicago'),
- array('2014/04/07 19:35:29 -0500 Central Daylight Time', 'America/Chicago'),
- array('2014/02/20 16:44:53 -0500 Eastern Standard Time', 'America/New_York'),
- array('2014/02/20 16:44:53 -0500 EST', 'America/New_York'),
- array('2014/02/20 16:44:53 -0330 Newfoundland Standard Time', 'America/St_Johns'),
- array('2014/02/20 16:44:53 -0330 NST', 'America/St_Johns'),
- array('2013/09/17 10:20:21 +1000 EST', array('Antarctica/Macquarie', 'Australia/ACT')),
-
- // and some bunk options to confirm they kaboom
- array('2014/02/26 17:26:31 -0100 MZF'),
- array('2014/02/26 17:26:31 -0200 El Timezono Invalidito'),
- );
- }
-
- /**
- * Verify that the timezone, for a handful of values, pareses out ok
- * @dataProvider timeZoneTranslationProvider
- */
- public function testGetTimeZone($serverDate, $zone = false)
- {
- // eval a mock object into existence which adds a 'setInfo' function
- $mockCode = 'class P4_ConnectionMock extends \\P4\\Connection\\Extension {
- public static function setInfo($connection, $key, $value)
- {
- $connection->info[$key] = $value;
- }
- }';
-
- if (!class_exists('P4_ConnectionMock')) {
- eval($mockCode);
- }
-
- \P4_ConnectionMock::setInfo($this->p4, 'serverDate', $serverDate);
- $info = $this->p4->getInfo();
- $this->assertSame($info['serverDate'], $serverDate, 'expected setting time in info to work');
-
- try {
- $dateTimeZone = $this->p4->getTimeZone();
- } catch (\Exception $e) {
- // if we didn't expect an earth shattering kaboom rethrow
- if ($zone !== false) {
- throw $e;
- }
-
- // if we did expect an exception, just stop at this point, we're done
- return;
- }
-
- if (!in_array($dateTimeZone->getName(), (array) $zone)) {
- $this->assertSame(implode(' or ', (array) $zone), $dateTimeZone->getName(), 'unexpected zone');
- }
- }
-
- public function testPrePostRun()
- {
- $preRuns = array();
- $postRuns = array();
-
- $this->p4->addPreRunCallback(
- function () use (&$preRuns) {
- $preRuns[] = func_get_args();
- }
- );
- $this->p4->addPostRunCallback(
- function () use (&$postRuns) {
- $postRuns[] = func_get_args();
- }
- );
-
- $this->assertSame(array(), $preRuns);
- $this->assertSame(array(), $postRuns);
-
- try {
- $this->p4->run('user', '-i', 'test-input!');
- } catch (CommandException $e) {
- // expected the exception
- }
-
- if (!isset($e)) {
- $this->fail('did not get the anticipated command exception');
- }
-
- // verify pre-run data was correct
- $this->assertSame(1, count($preRuns));
- $this->assertTrue(isset($preRuns[0][0]) && $preRuns[0][0] == $this->p4);
- unset($preRuns[0][0]);
- $this->assertSame(
- array(
- 1 => 'user',
- 2 => array('-i'),
- 3 => 'test-input!',
- 4 => true
- ),
- $preRuns[0]
- );
-
- // verify post-run data was correct
- $this->assertSame(1, count($postRuns));
- $this->assertSame(2, count($postRuns[0]));
- $this->assertTrue(isset($postRuns[0][0]) && $postRuns[0][0] == $this->p4);
- $this->assertTrue(isset($postRuns[0][1]) && $postRuns[0][1] instanceof CommandResult);
- $this->assertSame('user', $postRuns[0][1]->getCommand());
- $this->assertSame(
- USE_NOISY_TRIGGERS ? array("user-form-in stdout\nuser-form-in stderr") : array(),
- $postRuns[0][1]->getData()
- );
- $this->assertSame(
- array("Error in user specification.\nError detected at line 1.\nSyntax error in 'test-input!'."),
- $postRuns[0][1]->getErrors()
- );
- $this->assertSame(array(), $postRuns[0][1]->getWarnings());
- $this->assertSame(true, $postRuns[0][1]->isTagged());
- }
- }