Remove excessive indenting of parameters on newlines
[lhc/web/wiklou.git] / tests / phpunit / includes / shell / ShellTest.php
1 <?php
2
3 use MediaWiki\Shell\Command;
4 use MediaWiki\Shell\Shell;
5 use Wikimedia\TestingAccessWrapper;
6
7 /**
8 * @covers \MediaWiki\Shell\Shell
9 * @group Shell
10 */
11 class ShellTest extends MediaWikiTestCase {
12
13 use MediaWikiCoversValidator;
14
15 public function testIsDisabled() {
16 $this->assertInternalType( 'bool', Shell::isDisabled() ); // sanity
17 }
18
19 /**
20 * @dataProvider provideEscape
21 */
22 public function testEscape( $args, $expected ) {
23 if ( wfIsWindows() ) {
24 $this->markTestSkipped( 'This test requires a POSIX environment.' );
25 }
26 $this->assertSame( $expected, call_user_func_array( [ Shell::class, 'escape' ], $args ) );
27 }
28
29 public function provideEscape() {
30 return [
31 'simple' => [ [ 'true' ], "'true'" ],
32 'with args' => [ [ 'convert', '-font', 'font name' ], "'convert' '-font' 'font name'" ],
33 'array' => [ [ [ 'convert', '-font', 'font name' ] ], "'convert' '-font' 'font name'" ],
34 'skip nulls' => [ [ 'ls', null ], "'ls'" ],
35 ];
36 }
37
38 /**
39 * @covers \MediaWiki\Shell\Shell::makeScriptCommand
40 * @dataProvider provideMakeScriptCommand
41 *
42 * @param string $expected
43 * @param string $script
44 * @param string[] $parameters
45 * @param string[] $options
46 * @param callable|null $hook
47 */
48 public function testMakeScriptCommand(
49 $expected,
50 $script,
51 $parameters,
52 $options = [],
53 $hook = null
54 ) {
55 // Running tests under Vagrant involves MWMultiVersion that uses the below hook
56 $this->setMwGlobals( 'wgHooks', [] );
57
58 if ( $hook ) {
59 $this->setTemporaryHook( 'wfShellWikiCmd', $hook );
60 }
61
62 $command = Shell::makeScriptCommand( $script, $parameters, $options );
63 $command->params( 'safe' )
64 ->unsafeParams( 'unsafe' );
65
66 $this->assertType( Command::class, $command );
67
68 $wrapper = TestingAccessWrapper::newFromObject( $command );
69 $this->assertEquals( $expected, $wrapper->command );
70 $this->assertEquals( 0, $wrapper->restrictions & Shell::NO_LOCALSETTINGS );
71 }
72
73 public function provideMakeScriptCommand() {
74 global $wgPhpCli;
75
76 return [
77 [
78 "'$wgPhpCli' 'maintenance/foobar.php' 'bar'\\''\"baz' 'safe' unsafe",
79 'maintenance/foobar.php',
80 [ 'bar\'"baz' ],
81 ],
82 [
83 "'$wgPhpCli' 'changed.php' '--wiki=somewiki' 'bar'\\''\"baz' 'safe' unsafe",
84 'maintenance/foobar.php',
85 [ 'bar\'"baz' ],
86 [],
87 function ( &$script, array &$parameters ) {
88 $script = 'changed.php';
89 array_unshift( $parameters, '--wiki=somewiki' );
90 }
91 ],
92 [
93 "'/bin/perl' 'maintenance/foobar.php' 'bar'\\''\"baz' 'safe' unsafe",
94 'maintenance/foobar.php',
95 [ 'bar\'"baz' ],
96 [ 'php' => '/bin/perl' ],
97 ],
98 [
99 "'$wgPhpCli' 'foobinize' 'maintenance/foobar.php' 'bar'\\''\"baz' 'safe' unsafe",
100 'maintenance/foobar.php',
101 [ 'bar\'"baz' ],
102 [ 'wrapper' => 'foobinize' ],
103 ],
104 ];
105 }
106 }