1
0
Fork 0
composer/tests/Composer/Test/Util/PerforceTest.php

659 lines
21 KiB
PHP
Raw Normal View History

2022-02-23 15:58:18 +00:00
<?php declare(strict_types=1);
2013-10-11 23:12:02 +00:00
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
2013-08-09 19:24:58 +00:00
*/
namespace Composer\Test\Util;
use Composer\Json\JsonFile;
use Composer\Test\Mock\ProcessExecutorMock;
use Composer\Util\Perforce;
2020-02-07 03:18:45 +00:00
use Composer\Test\TestCase;
use Composer\Util\ProcessExecutor;
2013-08-09 19:24:58 +00:00
/**
* @author Matt Whittom <Matt.Whittom@veteransunited.com>
*/
class PerforceTest extends TestCase
{
2021-10-27 14:18:46 +00:00
/** @var Perforce */
2013-08-09 19:24:58 +00:00
protected $perforce;
/** @var ProcessExecutorMock */
2013-08-09 19:24:58 +00:00
protected $processExecutor;
2021-10-27 14:18:46 +00:00
/** @var array<string, string> */
protected $repoConfig;
2021-10-27 14:18:46 +00:00
/** @var \PHPUnit\Framework\MockObject\MockObject&\Composer\IO\IOInterface */
protected $io;
2013-08-09 19:24:58 +00:00
private const TEST_DEPOT = 'depot';
private const TEST_BRANCH = 'branch';
private const TEST_P4USER = 'user';
private const TEST_CLIENT_NAME = 'TEST';
private const TEST_PORT = 'port';
private const TEST_PATH = 'path';
2021-12-08 16:03:05 +00:00
protected function setUp(): void
{
$this->processExecutor = $this->getProcessExecutorMock();
$this->repoConfig = $this->getTestRepoConfig();
$this->io = $this->getMockIOInterface();
$this->createNewPerforceWithWindowsFlag(true);
}
2021-10-27 14:18:46 +00:00
/**
* @return array<string, string>
*/
public function getTestRepoConfig(): array
{
2022-08-17 12:20:07 +00:00
return [
2017-03-08 14:07:29 +00:00
'depot' => self::TEST_DEPOT,
'branch' => self::TEST_BRANCH,
'p4user' => self::TEST_P4USER,
2015-09-28 09:51:14 +00:00
'unique_perforce_client_name' => self::TEST_CLIENT_NAME,
2022-08-17 12:20:07 +00:00
];
}
2021-10-27 14:18:46 +00:00
/**
* @return \PHPUnit\Framework\MockObject\MockObject&\Composer\IO\IOInterface
*/
public function getMockIOInterface()
{
return $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
}
2022-02-22 15:47:09 +00:00
protected function createNewPerforceWithWindowsFlag(bool $flag): void
{
$this->perforce = new Perforce($this->repoConfig, self::TEST_PORT, self::TEST_PATH, $this->processExecutor, $flag, $this->io);
}
public function testGetClientWithoutStream(): void
{
$client = $this->perforce->getClient();
$expected = 'composer_perforce_TEST_depot';
2013-08-09 19:24:58 +00:00
$this->assertEquals($expected, $client);
}
public function testGetClientFromStream(): void
{
$this->setPerforceToStream();
$client = $this->perforce->getClient();
2013-08-09 19:24:58 +00:00
$expected = 'composer_perforce_TEST_depot_branch';
2013-08-09 19:24:58 +00:00
$this->assertEquals($expected, $client);
}
public function testGetStreamWithoutStream(): void
{
$stream = $this->perforce->getStream();
2013-08-09 19:24:58 +00:00
$this->assertEquals("//depot", $stream);
}
public function testGetStreamWithStream(): void
{
$this->setPerforceToStream();
$stream = $this->perforce->getStream();
$this->assertEquals('//depot/branch', $stream);
2013-08-09 19:24:58 +00:00
}
public function testGetStreamWithoutLabelWithStreamWithoutLabel(): void
{
$stream = $this->perforce->getStreamWithoutLabel('//depot/branch');
$this->assertEquals('//depot/branch', $stream);
}
public function testGetStreamWithoutLabelWithStreamWithLabel(): void
{
$stream = $this->perforce->getStreamWithoutLabel('//depot/branching@label');
$this->assertEquals('//depot/branching', $stream);
2013-08-09 19:24:58 +00:00
}
public function testGetClientSpec(): void
{
$clientSpec = $this->perforce->getP4ClientSpec();
$expected = 'path/composer_perforce_TEST_depot.p4.spec';
2013-08-09 19:24:58 +00:00
$this->assertEquals($expected, $clientSpec);
}
public function testGenerateP4Command(): void
{
$command = 'do something';
$p4Command = $this->perforce->generateP4Command($command);
$expected = 'p4 -u user -c composer_perforce_TEST_depot -p port do something';
2013-08-09 19:24:58 +00:00
$this->assertEquals($expected, $p4Command);
}
public function testQueryP4UserWithUserAlreadySet(): void
{
$this->perforce->queryP4user();
$this->assertEquals(self::TEST_P4USER, $this->perforce->getUser());
2013-08-09 19:24:58 +00:00
}
public function testQueryP4UserWithUserSetInP4VariablesWithWindowsOS(): void
{
$this->createNewPerforceWithWindowsFlag(true);
$this->perforce->setUser(null);
$this->processExecutor->expects(
[['cmd' => 'p4 set', 'stdout' => 'P4USER=TEST_P4VARIABLE_USER' . PHP_EOL, 'return' => 0]],
true
);
$this->perforce->queryP4user();
$this->assertEquals('TEST_P4VARIABLE_USER', $this->perforce->getUser());
2013-08-09 19:24:58 +00:00
}
public function testQueryP4UserWithUserSetInP4VariablesNotWindowsOS(): void
{
$this->createNewPerforceWithWindowsFlag(false);
$this->perforce->setUser(null);
$this->processExecutor->expects(
[['cmd' => 'echo $P4USER', 'stdout' => 'TEST_P4VARIABLE_USER' . PHP_EOL, 'return' => 0]],
true
);
$this->perforce->queryP4user();
$this->assertEquals('TEST_P4VARIABLE_USER', $this->perforce->getUser());
2013-08-09 19:24:58 +00:00
}
public function testQueryP4UserQueriesForUser(): void
{
$this->perforce->setUser(null);
$expectedQuestion = 'Enter P4 User:';
$this->io->method('ask')
->with($this->equalTo($expectedQuestion))
->willReturn('TEST_QUERY_USER');
$this->perforce->queryP4user();
$this->assertEquals('TEST_QUERY_USER', $this->perforce->getUser());
2013-08-09 19:24:58 +00:00
}
public function testQueryP4UserStoresResponseToQueryForUserWithWindows(): void
{
$this->createNewPerforceWithWindowsFlag(true);
$this->perforce->setUser(null);
$expectedQuestion = 'Enter P4 User:';
2017-03-08 14:07:29 +00:00
$expectedCommand = 'p4 set P4USER=TEST_QUERY_USER';
$this->io->expects($this->once())
->method('ask')
->with($this->equalTo($expectedQuestion))
->willReturn('TEST_QUERY_USER');
$this->processExecutor->expects(
[
'p4 set',
2022-02-18 07:50:11 +00:00
$expectedCommand,
],
true
);
$this->perforce->queryP4user();
2013-08-09 19:24:58 +00:00
}
public function testQueryP4UserStoresResponseToQueryForUserWithoutWindows(): void
{
$this->createNewPerforceWithWindowsFlag(false);
$this->perforce->setUser(null);
$expectedQuestion = 'Enter P4 User:';
2017-03-08 14:07:29 +00:00
$expectedCommand = 'export P4USER=TEST_QUERY_USER';
$this->io->expects($this->once())
->method('ask')
->with($this->equalTo($expectedQuestion))
->willReturn('TEST_QUERY_USER');
$this->processExecutor->expects(
[
'echo $P4USER',
2022-02-18 07:50:11 +00:00
$expectedCommand,
],
true
);
$this->perforce->queryP4user();
2013-08-09 19:24:58 +00:00
}
public function testQueryP4PasswordWithPasswordAlreadySet(): void
{
2022-08-17 12:20:07 +00:00
$repoConfig = [
2017-03-08 14:07:29 +00:00
'depot' => 'depot',
'branch' => 'branch',
'p4user' => 'user',
2015-09-28 09:51:14 +00:00
'p4password' => 'TEST_PASSWORD',
2022-08-17 12:20:07 +00:00
];
$this->perforce = new Perforce($repoConfig, 'port', 'path', $this->processExecutor, false, $this->getMockIOInterface());
$password = $this->perforce->queryP4Password();
$this->assertEquals('TEST_PASSWORD', $password);
2013-08-09 19:24:58 +00:00
}
public function testQueryP4PasswordWithPasswordSetInP4VariablesWithWindowsOS(): void
{
$this->createNewPerforceWithWindowsFlag(true);
$this->processExecutor->expects(
[['cmd' => 'p4 set', 'stdout' => 'P4PASSWD=TEST_P4VARIABLE_PASSWORD' . PHP_EOL, 'return' => 0]],
true
);
$password = $this->perforce->queryP4Password();
$this->assertEquals('TEST_P4VARIABLE_PASSWORD', $password);
2013-08-09 19:24:58 +00:00
}
public function testQueryP4PasswordWithPasswordSetInP4VariablesNotWindowsOS(): void
{
$this->createNewPerforceWithWindowsFlag(false);
2014-06-10 14:02:44 +00:00
$this->processExecutor->expects(
[['cmd' => 'echo $P4PASSWD', 'stdout' => 'TEST_P4VARIABLE_PASSWORD' . PHP_EOL, 'return' => 0]],
true
);
$password = $this->perforce->queryP4Password();
$this->assertEquals('TEST_P4VARIABLE_PASSWORD', $password);
2013-08-09 19:24:58 +00:00
}
public function testQueryP4PasswordQueriesForPassword(): void
{
$expectedQuestion = 'Enter password for Perforce user user: ';
$this->io->expects($this->once())
->method('askAndHideAnswer')
->with($this->equalTo($expectedQuestion))
->willReturn('TEST_QUERY_PASSWORD');
2013-08-09 19:24:58 +00:00
$password = $this->perforce->queryP4Password();
$this->assertEquals('TEST_QUERY_PASSWORD', $password);
2013-08-09 19:24:58 +00:00
}
public function testWriteP4ClientSpecWithoutStream(): void
{
$stream = fopen('php://memory', 'w+');
if (false === $stream) {
self::fail('Could not open memory stream');
}
$this->perforce->writeClientSpecToFile($stream);
rewind($stream);
$expectedArray = $this->getExpectedClientSpec(false);
2013-08-09 19:24:58 +00:00
try {
foreach ($expectedArray as $expected) {
$this->assertStringStartsWith($expected, fgets($stream));
2013-08-09 19:24:58 +00:00
}
$this->assertFalse(fgets($stream));
} catch (\Exception $e) {
fclose($stream);
2013-08-09 19:24:58 +00:00
throw $e;
}
fclose($stream);
2013-08-09 19:24:58 +00:00
}
public function testWriteP4ClientSpecWithStream(): void
{
$this->setPerforceToStream();
$stream = fopen('php://memory', 'w+');
if (false === $stream) {
self::fail('Could not open memory stream');
}
$this->perforce->writeClientSpecToFile($stream);
rewind($stream);
$expectedArray = $this->getExpectedClientSpec(true);
2013-08-09 19:24:58 +00:00
try {
foreach ($expectedArray as $expected) {
$this->assertStringStartsWith($expected, fgets($stream));
2013-08-09 19:24:58 +00:00
}
$this->assertFalse(fgets($stream));
} catch (\Exception $e) {
fclose($stream);
2013-08-09 19:24:58 +00:00
throw $e;
}
fclose($stream);
2013-08-09 19:24:58 +00:00
}
public function testIsLoggedIn(): void
{
$this->processExecutor->expects(
[['cmd' => 'p4 -u user -p port login -s']],
true
);
$this->perforce->isLoggedIn();
2013-08-09 19:24:58 +00:00
}
public function testConnectClient(): void
{
$this->processExecutor->expects(
['p4 -u user -c composer_perforce_TEST_depot -p port client -i < '.ProcessExecutor::escape('path/composer_perforce_TEST_depot.p4.spec')],
true
);
2013-08-09 19:24:58 +00:00
$this->perforce->connectClient();
}
public function testGetBranchesWithStream(): void
{
$this->setPerforceToStream();
$this->processExecutor->expects(
[
[
'cmd' => 'p4 -u user -c composer_perforce_TEST_depot_branch -p port streams '.ProcessExecutor::escape('//depot/...'),
2022-02-18 07:50:11 +00:00
'stdout' => 'Stream //depot/branch mainline none \'branch\'' . PHP_EOL,
],
[
'cmd' => 'p4 -u user -p port changes '.ProcessExecutor::escape('//depot/branch/...'),
2022-02-18 07:50:11 +00:00
'stdout' => 'Change 1234 on 2014/03/19 by Clark.Stuth@Clark.Stuth_test_client \'test changelist\'',
],
],
true
);
2013-08-09 19:24:58 +00:00
$branches = $this->perforce->getBranches();
$this->assertEquals('//depot/branch@1234', $branches['master']);
2013-08-09 19:24:58 +00:00
}
public function testGetBranchesWithoutStream(): void
{
$this->processExecutor->expects(
[
[
'cmd' => 'p4 -u user -p port changes '.ProcessExecutor::escape('//depot/...'),
2022-02-18 07:50:11 +00:00
'stdout' => 'Change 5678 on 2014/03/19 by Clark.Stuth@Clark.Stuth_test_client \'test changelist\'',
],
],
true
);
2014-06-10 14:02:44 +00:00
2013-08-09 19:24:58 +00:00
$branches = $this->perforce->getBranches();
$this->assertEquals('//depot@5678', $branches['master']);
2013-08-09 19:24:58 +00:00
}
public function testGetTagsWithoutStream(): void
{
$this->processExecutor->expects(
[
[
'cmd' => 'p4 -u user -c composer_perforce_TEST_depot -p port labels',
2022-02-18 07:50:11 +00:00
'stdout' => 'Label 0.0.1 2013/07/31 \'First Label!\'' . PHP_EOL . 'Label 0.0.2 2013/08/01 \'Second Label!\'' . PHP_EOL,
],
],
true
);
2013-08-09 19:24:58 +00:00
$tags = $this->perforce->getTags();
$this->assertEquals('//depot@0.0.1', $tags['0.0.1']);
$this->assertEquals('//depot@0.0.2', $tags['0.0.2']);
2013-08-09 19:24:58 +00:00
}
public function testGetTagsWithStream(): void
{
$this->setPerforceToStream();
$this->processExecutor->expects(
[
[
'cmd' => 'p4 -u user -c composer_perforce_TEST_depot_branch -p port labels',
2022-02-18 07:50:11 +00:00
'stdout' => 'Label 0.0.1 2013/07/31 \'First Label!\'' . PHP_EOL . 'Label 0.0.2 2013/08/01 \'Second Label!\'' . PHP_EOL,
],
],
true
);
2013-08-09 19:24:58 +00:00
$tags = $this->perforce->getTags();
$this->assertEquals('//depot/branch@0.0.1', $tags['0.0.1']);
$this->assertEquals('//depot/branch@0.0.2', $tags['0.0.2']);
2013-08-09 19:24:58 +00:00
}
public function testCheckStreamWithoutStream(): void
{
2021-10-27 14:18:46 +00:00
$result = $this->perforce->checkStream();
2013-08-09 19:24:58 +00:00
$this->assertFalse($result);
$this->assertFalse($this->perforce->isStream());
2013-08-09 19:24:58 +00:00
}
public function testCheckStreamWithStream(): void
{
$this->processExecutor->expects(
[
[
'cmd' => 'p4 -u user -p port depots',
2022-02-18 07:50:11 +00:00
'stdout' => 'Depot depot 2013/06/25 stream /p4/1/depots/depot/... \'Created by Me\'',
],
],
true
);
2021-10-27 14:18:46 +00:00
$result = $this->perforce->checkStream();
$this->assertTrue($result);
$this->assertTrue($this->perforce->isStream());
2013-08-09 19:24:58 +00:00
}
public function testGetComposerInformationWithoutLabelWithoutStream(): void
{
$this->processExecutor->expects(
[
[
'cmd' => 'p4 -u user -c composer_perforce_TEST_depot -p port print '.ProcessExecutor::escape('//depot/composer.json'),
2022-02-18 07:50:11 +00:00
'stdout' => PerforceTest::getComposerJson(),
],
],
true
);
2013-08-09 19:24:58 +00:00
$result = $this->perforce->getComposerInformation('//depot');
2022-08-17 12:20:07 +00:00
$expected = [
2017-03-08 14:07:29 +00:00
'name' => 'test/perforce',
'description' => 'Basic project for testing',
'minimum-stability' => 'dev',
2022-08-17 12:20:07 +00:00
'autoload' => ['psr-0' => []],
];
2013-08-09 19:24:58 +00:00
$this->assertEquals($expected, $result);
}
public function testGetComposerInformationWithLabelWithoutStream(): void
{
$this->processExecutor->expects(
[
[
'cmd' => 'p4 -u user -p port files '.ProcessExecutor::escape('//depot/composer.json@0.0.1'),
2022-02-18 07:50:11 +00:00
'stdout' => '//depot/composer.json#1 - branch change 10001 (text)',
],
[
'cmd' => 'p4 -u user -c composer_perforce_TEST_depot -p port print '.ProcessExecutor::escape('//depot/composer.json@10001'),
2022-02-18 07:50:11 +00:00
'stdout' => PerforceTest::getComposerJson(),
],
],
true
);
2013-08-09 19:24:58 +00:00
$result = $this->perforce->getComposerInformation('//depot@0.0.1');
2013-08-09 19:24:58 +00:00
2022-08-17 12:20:07 +00:00
$expected = [
2017-03-08 14:07:29 +00:00
'name' => 'test/perforce',
'description' => 'Basic project for testing',
'minimum-stability' => 'dev',
2022-08-17 12:20:07 +00:00
'autoload' => ['psr-0' => []],
];
2013-08-09 19:24:58 +00:00
$this->assertEquals($expected, $result);
}
public function testGetComposerInformationWithoutLabelWithStream(): void
{
$this->setPerforceToStream();
$this->processExecutor->expects(
[
[
'cmd' => 'p4 -u user -c composer_perforce_TEST_depot_branch -p port print '.ProcessExecutor::escape('//depot/branch/composer.json'),
2022-02-18 07:50:11 +00:00
'stdout' => PerforceTest::getComposerJson(),
],
],
true
);
2013-08-09 19:24:58 +00:00
$result = $this->perforce->getComposerInformation('//depot/branch');
2013-08-09 19:24:58 +00:00
2022-08-17 12:20:07 +00:00
$expected = [
2017-03-08 14:07:29 +00:00
'name' => 'test/perforce',
'description' => 'Basic project for testing',
'minimum-stability' => 'dev',
2022-08-17 12:20:07 +00:00
'autoload' => ['psr-0' => []],
];
2013-08-09 19:24:58 +00:00
$this->assertEquals($expected, $result);
}
public function testGetComposerInformationWithLabelWithStream(): void
{
$this->processExecutor->expects(
[
[
'cmd' => 'p4 -u user -p port files '.ProcessExecutor::escape('//depot/branch/composer.json@0.0.1'),
'stdout' => '//depot/composer.json#1 - branch change 10001 (text)',
],
[
'cmd' => 'p4 -u user -c composer_perforce_TEST_depot_branch -p port print '.ProcessExecutor::escape('//depot/branch/composer.json@10001'),
'stdout' => PerforceTest::getComposerJson(),
],
],
true
);
2013-08-09 19:24:58 +00:00
$this->setPerforceToStream();
2013-08-09 19:24:58 +00:00
$result = $this->perforce->getComposerInformation('//depot/branch@0.0.1');
2013-08-09 19:24:58 +00:00
2022-08-17 12:20:07 +00:00
$expected = [
2017-03-08 14:07:29 +00:00
'name' => 'test/perforce',
'description' => 'Basic project for testing',
'minimum-stability' => 'dev',
2022-08-17 12:20:07 +00:00
'autoload' => ['psr-0' => []],
];
2013-08-09 19:24:58 +00:00
$this->assertEquals($expected, $result);
}
public function testSyncCodeBaseWithoutStream(): void
{
$this->processExecutor->expects(
['p4 -u user -c composer_perforce_TEST_depot -p port sync -f @label'],
true
);
2013-08-09 19:24:58 +00:00
$this->perforce->syncCodeBase('label');
2013-08-09 19:24:58 +00:00
}
public function testSyncCodeBaseWithStream(): void
{
$this->setPerforceToStream();
$this->processExecutor->expects(
['p4 -u user -c composer_perforce_TEST_depot_branch -p port sync -f @label'],
true
);
2013-08-09 19:24:58 +00:00
$this->perforce->syncCodeBase('label');
2013-08-09 19:24:58 +00:00
}
public function testCheckServerExists(): void
{
$this->processExecutor->expects(
['p4 -p '.ProcessExecutor::escape('perforce.does.exist:port').' info -s'],
true
);
2013-08-09 19:24:58 +00:00
$result = $this->perforce->checkServerExists('perforce.does.exist:port', $this->processExecutor);
2013-08-09 19:24:58 +00:00
$this->assertTrue($result);
}
2014-06-10 14:02:44 +00:00
/**
* Test if "p4" command is missing.
2014-06-10 14:02:44 +00:00
*
* @covers \Composer\Util\Perforce::checkServerExists
*/
public function testCheckServerClientError(): void
{
$processExecutor = $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
$expectedCommand = 'p4 -p '.ProcessExecutor::escape('perforce.does.exist:port').' info -s';
$processExecutor->expects($this->once())
->method('execute')
->with($this->equalTo($expectedCommand), $this->equalTo(null))
->willReturn(127);
2014-06-10 14:02:44 +00:00
$result = $this->perforce->checkServerExists('perforce.does.exist:port', $processExecutor);
$this->assertFalse($result);
}
2013-08-09 19:24:58 +00:00
public static function getComposerJson(): string
{
return JsonFile::encode([
'name' => 'test/perforce',
'description' => 'Basic project for testing',
'minimum-stability' => 'dev',
'autoload' => [
2022-02-18 07:50:11 +00:00
'psr-0' => [],
],
], JSON_FORCE_OBJECT);
2013-08-09 19:24:58 +00:00
}
2021-10-27 14:18:46 +00:00
/**
* @return string[]
*/
2022-02-22 15:47:09 +00:00
private function getExpectedClientSpec(bool $withStream): array
{
2022-08-17 12:20:07 +00:00
$expectedArray = [
'Client: composer_perforce_TEST_depot',
PHP_EOL,
'Update:',
PHP_EOL,
'Access:',
'Owner: user',
PHP_EOL,
'Description:',
' Created by user from composer.',
PHP_EOL,
'Root: path',
PHP_EOL,
'Options: noallwrite noclobber nocompress unlocked modtime rmdir',
PHP_EOL,
'SubmitOptions: revertunchanged',
PHP_EOL,
'LineEnd: local',
2015-09-28 09:51:14 +00:00
PHP_EOL,
2022-08-17 12:20:07 +00:00
];
2013-08-09 19:24:58 +00:00
if ($withStream) {
$expectedArray[] = 'Stream:';
$expectedArray[] = ' //depot/branch';
} else {
$expectedArray[] = 'View: //depot/... //composer_perforce_TEST_depot/...';
2013-08-09 19:24:58 +00:00
}
return $expectedArray;
}
private function setPerforceToStream(): void
{
$this->perforce->setStream('//depot/branch');
2013-08-09 19:24:58 +00:00
}
2014-03-18 19:39:47 +00:00
public function testCleanupClientSpecShouldDeleteClient(): void
2014-03-18 19:39:47 +00:00
{
$fs = $this->getMockBuilder('Composer\Util\Filesystem')->getMock();
2014-03-18 19:39:47 +00:00
$this->perforce->setFilesystem($fs);
$testClient = $this->perforce->getClient();
$this->processExecutor->expects(
['p4 -u ' . self::TEST_P4USER . ' -p ' . self::TEST_PORT . ' client -d ' . ProcessExecutor::escape($testClient)],
true
);
2014-03-18 19:39:47 +00:00
$fs->expects($this->once())->method('remove')->with($this->perforce->getP4ClientSpec());
$this->perforce->cleanupClientSpec();
}
2013-08-09 19:24:58 +00:00
}