Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Tests\simpletest\Unit;
|
Chris@0
|
4
|
Chris@17
|
5 use Drupal\Core\Database\Database;
|
Chris@0
|
6 use Drupal\Core\DependencyInjection\ContainerBuilder;
|
Chris@0
|
7 use Drupal\Core\File\FileSystemInterface;
|
Chris@0
|
8 use PHPUnit\Framework\TestCase;
|
Chris@0
|
9
|
Chris@0
|
10 /**
|
Chris@0
|
11 * Tests simpletest_run_phpunit_tests() handles PHPunit fatals correctly.
|
Chris@0
|
12 *
|
Chris@0
|
13 * We don't extend Drupal\Tests\UnitTestCase here because its $root property is
|
Chris@0
|
14 * not static and we need it to be static here.
|
Chris@0
|
15 *
|
Chris@0
|
16 * @group simpletest
|
Chris@0
|
17 *
|
Chris@0
|
18 * @runTestsInSeparateProcesses
|
Chris@17
|
19 * @preserveGlobalState disabled
|
Chris@0
|
20 */
|
Chris@0
|
21 class SimpletestPhpunitRunCommandTest extends TestCase {
|
Chris@0
|
22
|
Chris@0
|
23 /**
|
Chris@0
|
24 * Path to the app root.
|
Chris@0
|
25 *
|
Chris@0
|
26 * @var string
|
Chris@0
|
27 */
|
Chris@0
|
28 protected static $root;
|
Chris@0
|
29
|
Chris@0
|
30 /**
|
Chris@0
|
31 * {@inheritdoc}
|
Chris@0
|
32 */
|
Chris@0
|
33 public static function setUpBeforeClass() {
|
Chris@0
|
34 parent::setUpBeforeClass();
|
Chris@0
|
35 // Figure out our app root.
|
Chris@0
|
36 self::$root = dirname(dirname(dirname(dirname(dirname(dirname(__DIR__))))));
|
Chris@0
|
37 // Include the files we need for tests. The stub test we will run is
|
Chris@0
|
38 // SimpletestPhpunitRunCommandTestWillDie which is located in
|
Chris@0
|
39 // simpletest_phpunit_run_command_test.php.
|
Chris@0
|
40 include_once self::$root . '/core/modules/simpletest/tests/fixtures/simpletest_phpunit_run_command_test.php';
|
Chris@0
|
41 // Since we're testing simpletest_run_phpunit_tests(), we need to include
|
Chris@0
|
42 // simpletest.module.
|
Chris@0
|
43 include_once self::$root . '/core/modules/simpletest/simpletest.module';
|
Chris@0
|
44 }
|
Chris@0
|
45
|
Chris@0
|
46 /**
|
Chris@0
|
47 * {@inheritdoc}
|
Chris@0
|
48 */
|
Chris@0
|
49 protected function setUp() {
|
Chris@0
|
50 parent::setUp();
|
Chris@0
|
51 // Organize our mock container.
|
Chris@0
|
52 $container = new ContainerBuilder();
|
Chris@0
|
53 $container->set('app.root', self::$root);
|
Chris@0
|
54 $file_system = $this->prophesize(FileSystemInterface::class);
|
Chris@0
|
55 // The simpletest directory wrapper will always point to /tmp.
|
Chris@0
|
56 $file_system->realpath('public://simpletest')->willReturn(sys_get_temp_dir());
|
Chris@0
|
57 $container->set('file_system', $file_system->reveal());
|
Chris@0
|
58 \Drupal::setContainer($container);
|
Chris@0
|
59 }
|
Chris@0
|
60
|
Chris@0
|
61 /**
|
Chris@0
|
62 * Data provider for testSimpletestPhpUnitRunCommand().
|
Chris@0
|
63 *
|
Chris@0
|
64 * @return array
|
Chris@0
|
65 * Arrays of status codes and the label they're expected to have.
|
Chris@0
|
66 */
|
Chris@0
|
67 public function provideStatusCodes() {
|
Chris@0
|
68 $data = [
|
Chris@0
|
69 [0, 'pass'],
|
Chris@0
|
70 [1, 'fail'],
|
Chris@0
|
71 [2, 'exception'],
|
Chris@0
|
72 ];
|
Chris@0
|
73 // All status codes 3 and above should be labeled 'error'.
|
Chris@0
|
74 // @todo: The valid values here would be 3 to 127. But since the test
|
Chris@0
|
75 // touches the file system a lot, we only have 3, 4, and 127 for speed.
|
Chris@0
|
76 foreach ([3, 4, 127] as $status) {
|
Chris@0
|
77 $data[] = [$status, 'error'];
|
Chris@0
|
78 }
|
Chris@0
|
79 return $data;
|
Chris@0
|
80 }
|
Chris@0
|
81
|
Chris@0
|
82 /**
|
Chris@0
|
83 * Test the round trip for PHPUnit execution status codes.
|
Chris@0
|
84 *
|
Chris@0
|
85 * @covers ::simpletest_run_phpunit_tests
|
Chris@0
|
86 *
|
Chris@0
|
87 * @dataProvider provideStatusCodes
|
Chris@0
|
88 */
|
Chris@0
|
89 public function testSimpletestPhpUnitRunCommand($status, $label) {
|
Chris@17
|
90 // Add a default database connection in order for
|
Chris@17
|
91 // Database::getConnectionInfoAsUrl() to return valid information.
|
Chris@17
|
92 Database::addConnectionInfo('default', 'default', [
|
Chris@17
|
93 'driver' => 'mysql',
|
Chris@17
|
94 'username' => 'test_user',
|
Chris@17
|
95 'password' => 'test_pass',
|
Chris@17
|
96 'host' => 'test_host',
|
Chris@17
|
97 'database' => 'test_database',
|
Chris@17
|
98 'port' => 3306,
|
Chris@17
|
99 'namespace' => 'Drupal\Core\Database\Driver\mysql',
|
Chris@17
|
100 ]
|
Chris@17
|
101 );
|
Chris@0
|
102 $test_id = basename(tempnam(sys_get_temp_dir(), 'xxx'));
|
Chris@0
|
103 putenv('SimpletestPhpunitRunCommandTestWillDie=' . $status);
|
Chris@0
|
104 $ret = simpletest_run_phpunit_tests($test_id, [SimpletestPhpunitRunCommandTestWillDie::class]);
|
Chris@0
|
105 $this->assertSame($ret[0]['status'], $label);
|
Chris@0
|
106 putenv('SimpletestPhpunitRunCommandTestWillDie');
|
Chris@0
|
107 unlink(simpletest_phpunit_xml_filepath($test_id));
|
Chris@0
|
108 }
|
Chris@0
|
109
|
Chris@0
|
110 /**
|
Chris@0
|
111 * {@inheritdoc}
|
Chris@0
|
112 */
|
Chris@0
|
113 protected function tearDown() {
|
Chris@0
|
114 // We unset the $base_url global, since the test code sets it as a
|
Chris@0
|
115 // side-effect.
|
Chris@0
|
116 unset($GLOBALS['base_url']);
|
Chris@0
|
117 parent::tearDown();
|
Chris@0
|
118 }
|
Chris@0
|
119
|
Chris@0
|
120 }
|