4 * This file is part of the Symfony package.
6 * (c) Fabien Potencier <fabien@symfony.com>
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Symfony\Component\Process\Tests;
14 use PHPUnit\Framework\TestCase;
15 use Symfony\Component\Process\ProcessBuilder;
17 class ProcessBuilderTest extends TestCase
19 public function testInheritEnvironmentVars()
21 $_ENV['MY_VAR_1'] = 'foo';
23 $proc = ProcessBuilder::create()
27 unset($_ENV['MY_VAR_1']);
29 $env = $proc->getEnv();
30 $this->assertArrayHasKey('MY_VAR_1', $env);
31 $this->assertEquals('foo', $env['MY_VAR_1']);
34 public function testAddEnvironmentVariables()
36 $pb = new ProcessBuilder();
43 ->setEnv('foo', 'bar2')
44 ->addEnvironmentVariables($env)
45 ->inheritEnvironmentVariables(false)
49 $this->assertSame($env, $proc->getEnv());
52 public function testProcessShouldInheritAndOverrideEnvironmentVars()
54 $_ENV['MY_VAR_1'] = 'foo';
56 $proc = ProcessBuilder::create()
57 ->setEnv('MY_VAR_1', 'bar')
61 unset($_ENV['MY_VAR_1']);
63 $env = $proc->getEnv();
64 $this->assertArrayHasKey('MY_VAR_1', $env);
65 $this->assertEquals('bar', $env['MY_VAR_1']);
69 * @expectedException \Symfony\Component\Process\Exception\InvalidArgumentException
71 public function testNegativeTimeoutFromSetter()
73 $pb = new ProcessBuilder();
77 public function testNullTimeout()
79 $pb = new ProcessBuilder();
81 $pb->setTimeout(null);
83 $r = new \ReflectionObject($pb);
84 $p = $r->getProperty('timeout');
85 $p->setAccessible(true);
87 $this->assertNull($p->getValue($pb));
90 public function testShouldSetArguments()
92 $pb = new ProcessBuilder(array('initial'));
93 $pb->setArguments(array('second'));
95 $proc = $pb->getProcess();
97 $this->assertContains('second', $proc->getCommandLine());
100 public function testPrefixIsPrependedToAllGeneratedProcess()
102 $pb = new ProcessBuilder();
103 $pb->setPrefix('/usr/bin/php');
105 $proc = $pb->setArguments(array('-v'))->getProcess();
106 if ('\\' === DIRECTORY_SEPARATOR) {
107 $this->assertEquals('"/usr/bin/php" "-v"', $proc->getCommandLine());
109 $this->assertEquals("'/usr/bin/php' '-v'", $proc->getCommandLine());
112 $proc = $pb->setArguments(array('-i'))->getProcess();
113 if ('\\' === DIRECTORY_SEPARATOR) {
114 $this->assertEquals('"/usr/bin/php" "-i"', $proc->getCommandLine());
116 $this->assertEquals("'/usr/bin/php' '-i'", $proc->getCommandLine());
120 public function testArrayPrefixesArePrependedToAllGeneratedProcess()
122 $pb = new ProcessBuilder();
123 $pb->setPrefix(array('/usr/bin/php', 'composer.phar'));
125 $proc = $pb->setArguments(array('-v'))->getProcess();
126 if ('\\' === DIRECTORY_SEPARATOR) {
127 $this->assertEquals('"/usr/bin/php" "composer.phar" "-v"', $proc->getCommandLine());
129 $this->assertEquals("'/usr/bin/php' 'composer.phar' '-v'", $proc->getCommandLine());
132 $proc = $pb->setArguments(array('-i'))->getProcess();
133 if ('\\' === DIRECTORY_SEPARATOR) {
134 $this->assertEquals('"/usr/bin/php" "composer.phar" "-i"', $proc->getCommandLine());
136 $this->assertEquals("'/usr/bin/php' 'composer.phar' '-i'", $proc->getCommandLine());
140 public function testShouldEscapeArguments()
142 $pb = new ProcessBuilder(array('%path%', 'foo " bar', '%baz%baz'));
143 $proc = $pb->getProcess();
145 if ('\\' === DIRECTORY_SEPARATOR) {
146 $this->assertSame('^%"path"^% "foo \\" bar" "%baz%baz"', $proc->getCommandLine());
148 $this->assertSame("'%path%' 'foo \" bar' '%baz%baz'", $proc->getCommandLine());
152 public function testShouldEscapeArgumentsAndPrefix()
154 $pb = new ProcessBuilder(array('arg'));
155 $pb->setPrefix('%prefix%');
156 $proc = $pb->getProcess();
158 if ('\\' === DIRECTORY_SEPARATOR) {
159 $this->assertSame('^%"prefix"^% "arg"', $proc->getCommandLine());
161 $this->assertSame("'%prefix%' 'arg'", $proc->getCommandLine());
166 * @expectedException \Symfony\Component\Process\Exception\LogicException
168 public function testShouldThrowALogicExceptionIfNoPrefixAndNoArgument()
170 ProcessBuilder::create()->getProcess();
173 public function testShouldNotThrowALogicExceptionIfNoArgument()
175 $process = ProcessBuilder::create()
176 ->setPrefix('/usr/bin/php')
179 if ('\\' === DIRECTORY_SEPARATOR) {
180 $this->assertEquals('"/usr/bin/php"', $process->getCommandLine());
182 $this->assertEquals("'/usr/bin/php'", $process->getCommandLine());
186 public function testShouldNotThrowALogicExceptionIfNoPrefix()
188 $process = ProcessBuilder::create(array('/usr/bin/php'))
191 if ('\\' === DIRECTORY_SEPARATOR) {
192 $this->assertEquals('"/usr/bin/php"', $process->getCommandLine());
194 $this->assertEquals("'/usr/bin/php'", $process->getCommandLine());
198 public function testShouldReturnProcessWithDisabledOutput()
200 $process = ProcessBuilder::create(array('/usr/bin/php'))
204 $this->assertTrue($process->isOutputDisabled());
207 public function testShouldReturnProcessWithEnabledOutput()
209 $process = ProcessBuilder::create(array('/usr/bin/php'))
214 $this->assertFalse($process->isOutputDisabled());
218 * @expectedException \Symfony\Component\Process\Exception\InvalidArgumentException
219 * @expectedExceptionMessage Symfony\Component\Process\ProcessBuilder::setInput only accepts strings or stream resources.
221 public function testInvalidInput()
223 $builder = ProcessBuilder::create();
224 $builder->setInput(array());