--- /dev/null
+<?php
+
+/**
+* @file
+* Assure that context API behaves as designed. Mostly implicitly tested, but we
+* do have some edges that need explicit testing.
+*
+* @see drush/includes/context.inc.
+*
+* @group base
+*/
+
+namespace Unish;
+
+class contextCase extends CommandUnishTestCase {
+
+ function setUpPaths() {
+ $this->log("webroot: " . $this->webroot() . "\n", 'warning');
+ $this->env = key($this->getSites());
+ $this->site = $this->webroot() . '/sites/' . $this->env;
+ $this->home = UNISH_SANDBOX . '/home';
+ $this->paths = array(
+ 'custom' => UNISH_SANDBOX,
+ 'site' => $this->site,
+ 'drupal' => $this->webroot() . '/sites/all/drush',
+ 'drupal-parent' => dirname($this->webroot()) . '/drush',
+ 'user' => $this->home,
+ 'home.drush' => $this->home . '/.drush',
+ 'system' => UNISH_SANDBOX . '/etc/drush',
+ // We don't want to write a file into drush dir since it is not in the sandbox.
+ // 'drush' => dirname(realpath(UNISH_DRUSH)),
+ );
+ // Run each path through realpath() since the paths we'll compare against
+ // will have already run through drush_load_config_file().
+ foreach ($this->paths as $key => $path) {
+ @mkdir($path);
+ $this->paths[$key] = realpath($path);
+ }
+ }
+
+ /**
+ * Try to write a tiny drushrc.php to each place that Drush checks. Also
+ * write a sites/dev/aliases.drushrc.php file to the sandbox.
+ */
+ function setUp() {
+ parent::setUp();
+
+ if (!$this->getSites()) {
+ $this->setUpDrupal();
+ }
+ $this->setUpPaths();
+
+ // These files are only written to sandbox so get automatically cleaned up.
+ foreach ($this->paths as $key => $path) {
+ $contents = <<<EOD
+<?php
+// Written by Drush's contextCase::setUp(). This file is safe to delete.
+\$options['contextConfig'] = '$key';
+\$command_specific['unit-eval']['contextConfig'] = '$key-specific';
+EOD;
+ $path .= $key == 'user' ? '/.drushrc.php' : '/drushrc.php';
+ if (file_put_contents($path, $contents)) {
+ $this->written[] = $this->convert_path($path);
+ }
+ }
+
+ // Also write a site alias so we can test its supremacy in context hierarchy.
+ $path = $this->webroot() . '/sites/' . $this->env . '/aliases.drushrc.php';
+ $aliases['contextAlias'] = array(
+ 'contextConfig' => 'alias1',
+ 'command-specific' => array (
+ 'unit-eval' => array (
+ 'contextConfig' => 'alias-specific',
+ ),
+ ),
+ );
+ $contents = $this->unish_file_aliases($aliases);
+ $return = file_put_contents($path, $contents);
+ }
+
+ /**
+ * Assure that all possible config files get loaded.
+ */
+ function testConfigSearchPaths() {
+ $options = array(
+ 'pipe' => NULL,
+ 'config' => UNISH_SANDBOX,
+ 'root' => $this->webroot(),
+ 'uri' => key($this->getSites())
+ );
+ $this->drush('core-status', array('Drush configuration'), $options);
+ $loaded = $this->getOutputFromJSON('drush-conf');
+ $loaded = array_map(array(&$this, 'convert_path'), $loaded);
+ $this->assertSame($this->written, $loaded);
+ }
+
+ /**
+ * Assure that matching version-specific config files are loaded and others are ignored.
+ */
+ function testConfigVersionSpecific() {
+ $major = $this->drush_major_version();
+ // Arbitrarily choose the system search path.
+ $path = realpath(UNISH_SANDBOX . '/etc/drush');
+ $contents = <<<EOD
+<?php
+// Written by Unish. This file is safe to delete.
+\$options['unish_foo'] = 'bar';
+EOD;
+
+ // Write matched and unmatched files to the system search path.
+ $files = array(
+ $path . '/drush' . $major . 'rc.php',
+ $path . '/drush999' . 'rc.php',
+ );
+ mkdir($path . '/drush' . $major);
+ mkdir($path . '/drush999');
+ foreach ($files as $file) {
+ file_put_contents($file, $contents);
+ }
+
+ $this->drush('core-status', array('Drush configuration'), array('pipe' => NULL));
+ $loaded = $this->getOutputFromJSON('drush-conf');
+ // Next 2 lines needed for Windows compatibility.
+ $loaded = array_map(array(&$this, 'convert_path'), $loaded);
+ $files = array_map(array(&$this, 'convert_path'), $files);
+ $this->assertTrue(in_array($files[0], $loaded), 'Loaded a version-specific config file.');
+ $this->assertFalse(in_array($files[1], $loaded), 'Did not load a mismatched version-specific config file.');
+ }
+
+ /**
+ * Assure that options are loaded into right context and hierarchy is
+ * respected by drush_get_option().
+ *
+ * Stdin context not exercised here. See backendCase::testTarget().
+ */
+ function testContextHierarchy() {
+ // The 'custom' config file has higher priority than cli and regular config files.
+ $eval = '$contextConfig = drush_get_option("contextConfig", "n/a");';
+ $eval .= '$cli1 = drush_get_option("cli1");';
+ $eval .= 'print json_encode(get_defined_vars());';
+ $config = UNISH_SANDBOX . '/drushrc.php';
+ $options = array(
+ 'cli1' => NULL,
+ 'config' => $config,
+ 'root' => $this->webroot(),
+ 'uri' => key($this->getSites()),
+ );
+ $this->drush('php-eval', array($eval), $options);
+ $output = $this->getOutput();
+ $actuals = json_decode(trim($output));
+ $this->assertEquals('custom', $actuals->contextConfig);
+ $this->assertTrue($actuals->cli1);
+
+ // Site alias trumps 'custom'.
+ $eval = '$contextConfig = drush_get_option("contextConfig", "n/a");';
+ $eval .= 'print json_encode(get_defined_vars());';
+ $options = array(
+ 'config' => $config,
+ 'root' => $this->webroot(),
+ 'uri' => key($this->getSites()),
+ );
+ $this->drush('php-eval', array($eval), $options, '@contextAlias');
+ $output = $this->getOutput();
+ $actuals = json_decode(trim($output));
+ $this->assertEquals('alias1', $actuals->contextConfig);
+
+ // Command specific wins over non-specific. If it did not, $expected would
+ // be 'site'. Note we call unit-eval command in order not to purturb
+ // php-eval with options in config file.
+ $eval = '$contextConfig = drush_get_option("contextConfig", "n/a");';
+ $eval .= 'print json_encode(get_defined_vars());';
+ $options = array(
+ 'root' => $this->webroot(),
+ 'uri' => key($this->getSites()),
+ 'include' => dirname(__FILE__), // Find unit.drush.inc commandfile.
+ );
+ $this->drush('unit-eval', array($eval), $options);
+ $output = $this->getOutput();
+ $actuals = json_decode(trim($output));
+ $this->assertEquals('site-specific', $actuals->contextConfig);
+ }
+}