You are here

class BuildTestTest in Drupal 9

Same name and namespace in other branches
  1. 8 core/tests/Drupal/BuildTests/Framework/Tests/BuildTestTest.php \Drupal\BuildTests\Framework\Tests\BuildTestTest
  2. 10 core/tests/Drupal/BuildTests/Framework/Tests/BuildTestTest.php \Drupal\BuildTests\Framework\Tests\BuildTestTest

@coversDefaultClass \Drupal\BuildTests\Framework\BuildTestBase @group Build

Hierarchy

Expanded class hierarchy of BuildTestTest

File

core/tests/Drupal/BuildTests/Framework/Tests/BuildTestTest.php, line 14

Namespace

Drupal\BuildTests\Framework\Tests
View source
class BuildTestTest extends BuildTestBase {

  /**
   * Ensure that workspaces work.
   */
  public function testWorkspace() {
    $test_directory = 'test_directory';

    // Execute an empty command through the shell to build out a working
    // directory.
    $process = $this
      ->executeCommand('', $test_directory);
    $this
      ->assertCommandSuccessful();

    // Assert that our working directory exists and is in use by the process.
    $workspace = $this
      ->getWorkspaceDirectory();
    $working_path = $workspace . '/' . $test_directory;
    $this
      ->assertDirectoryExists($working_path);
    $this
      ->assertEquals($working_path, $process
      ->getWorkingDirectory());
  }

  /**
   * @covers ::copyCodebase
   */
  public function testCopyCodebase() {
    $test_directory = 'copied_codebase';
    $this
      ->copyCodebase(NULL, $test_directory);
    $full_path = $this
      ->getWorkspaceDirectory() . '/' . $test_directory;
    $files = [
      'autoload.php',
      'composer.json',
      'index.php',
      'README.md',
      '.git',
      '.ht.router.php',
    ];
    foreach ($files as $file) {
      $this
        ->assertFileExists($full_path . '/' . $file);
    }
  }

  /**
   * Ensure we're not copying directories we wish to exclude.
   *
   * @covers ::copyCodebase
   */
  public function testCopyCodebaseExclude() {

    // Create a virtual file system containing items that should be
    // excluded. Exception being modules directory.
    vfsStream::setup('drupal', NULL, [
      'sites' => [
        'default' => [
          'files' => [
            'a_file.txt' => 'some file.',
          ],
          'settings.php' => '<?php $settings = stuff;',
          'settings.local.php' => '<?php $settings = override;',
        ],
        'simpletest' => [
          'simpletest_hash' => [
            'some_results.xml' => '<xml/>',
          ],
        ],
      ],
      'vendor' => [
        'composer' => [
          'composer' => [
            'installed.json' => '"items": {"things"}',
          ],
        ],
      ],
      'modules' => [
        'my_module' => [
          'vendor' => [
            'my_vendor' => [
              'composer.json' => "{\n}",
            ],
          ],
        ],
      ],
    ]);

    // Mock BuildTestBase so that it thinks our VFS is the Drupal root.

    /** @var \PHPUnit\Framework\MockObject\MockBuilder|\Drupal\BuildTests\Framework\BuildTestBase $base */
    $base = $this
      ->getMockBuilder(BuildTestBase::class)
      ->setMethods([
      'getDrupalRoot',
    ])
      ->getMockForAbstractClass();
    $base
      ->expects($this
      ->exactly(2))
      ->method('getDrupalRoot')
      ->willReturn(vfsStream::url('drupal'));
    $base
      ->setUp();

    // Perform the copy.
    $test_directory = 'copied_codebase';
    $base
      ->copyCodebase(NULL, $test_directory);
    $full_path = $base
      ->getWorkspaceDirectory() . '/' . $test_directory;
    $this
      ->assertDirectoryExists($full_path);

    // Verify nested vendor directory was not excluded. Then remove it for next
    // validation.
    $this
      ->assertFileExists($full_path . DIRECTORY_SEPARATOR . 'modules/my_module/vendor/my_vendor/composer.json');
    $file_system = new Filesystem();
    $file_system
      ->remove($full_path . DIRECTORY_SEPARATOR . 'modules');

    // Use scandir() to determine if our target directory is empty. It should
    // only contain the system dot directories.
    $this
      ->assertTrue(($files = @scandir($full_path)) && count($files) <= 2, 'Directory is not empty: ' . implode(', ', $files));
    $base
      ->tearDown();
  }

  /**
   * @covers ::findAvailablePort
   */
  public function testPortMany() {
    $iterator = (new Finder())
      ->in($this
      ->getDrupalRoot())
      ->ignoreDotFiles(FALSE)
      ->exclude([
      'sites/simpletest',
    ])
      ->path('/^.ht.router.php$/')
      ->getIterator();
    $this
      ->copyCodebase($iterator);

    /** @var \Symfony\Component\Process\Process[] $processes */
    $processes = [];
    $count = 15;
    for ($i = 0; $i <= $count; $i++) {
      $port = $this
        ->findAvailablePort();
      $this
        ->assertArrayNotHasKey($port, $processes, 'Port ' . $port . ' was already in use by a process.');
      $processes[$port] = $this
        ->instantiateServer($port);
      $this
        ->assertNotEmpty($processes[$port]);
      $this
        ->assertTrue($processes[$port]
        ->isRunning(), 'Process on port ' . $port . ' is not still running.');
      $this
        ->assertFalse($this
        ->checkPortIsAvailable($port));
    }

    // Clean up after ourselves.
    foreach ($processes as $process) {
      $process
        ->stop();
    }
  }

  /**
   * @covers ::standUpServer
   */
  public function testStandUpServer() {

    // Stand up a server with working directory 'first'.
    $this
      ->standUpServer('first');

    // Get the process object for the server.
    $ref_process = new \ReflectionProperty(parent::class, 'serverProcess');
    $ref_process
      ->setAccessible(TRUE);
    $first_process = $ref_process
      ->getValue($this);

    // Standing up the server again should not change the server process.
    $this
      ->standUpServer('first');
    $this
      ->assertSame($first_process, $ref_process
      ->getValue($this));

    // Standing up the server with working directory 'second' should give us a
    // new server process.
    $this
      ->standUpServer('second');
    $this
      ->assertNotSame($first_process, $second_process = $ref_process
      ->getValue($this));

    // And even with the original working directory name, we should get a new
    // server process.
    $this
      ->standUpServer('first');
    $this
      ->assertNotSame($first_process, $ref_process
      ->getValue($this));
    $this
      ->assertNotSame($second_process, $ref_process
      ->getValue($this));
  }

}

Members

Namesort descending Modifiers Type Description Overrides
BuildTestBase::$commandProcess private property The most recent command process.
BuildTestBase::$destroyBuild protected property Default to destroying build artifacts after a test finishes.
BuildTestBase::$hostName private static property Our native host name, used by PHP when it starts up the server.
BuildTestBase::$hostPort private property Port that will be tested.
BuildTestBase::$mink private property The Mink session manager.
BuildTestBase::$portLocks private property A list of ports used by the test.
BuildTestBase::$serverDocroot private property The docroot for the server process.
BuildTestBase::$serverProcess private property The process that's running the HTTP server.
BuildTestBase::$workspaceDir private property The working directory where this test will manipulate files.
BuildTestBase::assertCommandExitCode public function Asserts that the last command returned the specified exit code.
BuildTestBase::assertCommandOutputContains public function Assert that text is present in the output of the most recent command.
BuildTestBase::assertCommandSuccessful public function Asserts that the last command ran without error.
BuildTestBase::assertDrupalVisit public function Helper function to assert that the last visit was a Drupal site.
BuildTestBase::assertErrorOutputContains public function Assert that text is present in the error output of the most recent command.
BuildTestBase::checkPortIsAvailable protected function Checks whether a port is available.
BuildTestBase::copyCodebase public function Copy the current working codebase into a workspace.
BuildTestBase::executeCommand public function Run a command.
BuildTestBase::findAvailablePort protected function Discover an available port number.
BuildTestBase::getCodebaseFinder public function Get a default Finder object for a Drupal codebase.
BuildTestBase::getDrupalRoot protected function Get the root path of this Drupal codebase.
BuildTestBase::getMink public function Get the Mink instance.
BuildTestBase::getPortNumber protected function Get the port number for requests.
BuildTestBase::getWorkingPath protected function Get the working directory within the workspace, creating if necessary.
BuildTestBase::getWorkspaceDirectory public function Full path to the workspace where this test can build.
BuildTestBase::initMink protected function Set up the Mink session manager.
BuildTestBase::instantiateServer protected function Do the work of making a server process.
BuildTestBase::setUp protected function 1
BuildTestBase::setUpBeforeClass public static function
BuildTestBase::standUpServer protected function Makes a local test server using PHP's internal HTTP server.
BuildTestBase::stopServer protected function Stop the HTTP server, zero out all necessary variables.
BuildTestBase::tearDown protected function
BuildTestBase::visit public function Visit a URI on the HTTP server.
BuildTestTest::testCopyCodebase public function @covers ::copyCodebase
BuildTestTest::testCopyCodebaseExclude public function Ensure we're not copying directories we wish to exclude.
BuildTestTest::testPortMany public function @covers ::findAvailablePort
BuildTestTest::testStandUpServer public function @covers ::standUpServer
BuildTestTest::testWorkspace public function Ensure that workspaces work.
ExternalCommandRequirementsTrait::$existingCommands private static property A list of existing external commands we've already discovered.
ExternalCommandRequirementsTrait::checkClassCommandRequirements private static function Checks whether required external commands are available per test class.
ExternalCommandRequirementsTrait::checkExternalCommandRequirements private static function Checks missing external command requirements.
ExternalCommandRequirementsTrait::checkMethodCommandRequirements private static function Checks whether required external commands are available per method.
ExternalCommandRequirementsTrait::externalCommandIsAvailable private static function Determine if an external command is available. 3
PhpUnitWarnings::$deprecationWarnings private static property Deprecation warnings from PHPUnit to raise with @trigger_error().
PhpUnitWarnings::addWarning public function Converts PHPUnit deprecation warnings to E_USER_DEPRECATED.