| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 | <?phpnamespace Elgg;/** * Tests the commit message validation shell script used by the git hook and travis */class CommitMessageGitHookTest extends \PHPUnit_Framework_TestCase {	protected $scriptsDir;	protected $filesDir;	protected $validateScript;	public function setUp() {		if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {			$this->markTestSkipped('Can only test in *nix envs.');		}		$this->scriptsDir = dirname(dirname(dirname(dirname(__DIR__)))) . '/.scripts/';		$this->filesDir = dirname(__DIR__) . '/test_files/commit_messages/';		$this->validateScript = "php {$this->scriptsDir}validate_commit_msg.php";		parent::setUp();	}		/**	 * Test failures for missing input	 */	public function testRejectsEmptyStringInput() {		// have to pass an empty arg because it looks for stdin		$cmd = "$this->validateScript ''";		$result = $this->runCmd($cmd, $output);		$this->assertFalse($result, $output);	}		public function testRejectsEmptyFileInput() {		$cmd = "$this->validateScript /dev/null";		$result = $this->runCmd($cmd, $output);		$this->assertFalse($result, $output);	}		public function testRejectsEmptyPipeInput() {		$cmd = "echo '' | $this->validateScript";		$result = $this->runCmd($cmd, $output);		$this->assertFalse($result, $output);	}	public function testRejectsInvalidFileInput() {		$cmd = "$this->validateScript {$this->filesDir}invalid_format.txt";		$result = $this->runCmd($cmd, $output);		$this->assertFalse($result, $output);	}	public function testAcceptsValidFileInput() {		$cmd = "$this->validateScript {$this->filesDir}valid.txt";		$result = $this->runCmd($cmd, $output);		$this->assertTrue($result, $output);	}		public function testAcceptsValidPipeInput() {		$msg = escapeshellarg(file_get_contents("{$this->filesDir}valid.txt"));		$cmd = "echo $msg | $this->validateScript";		$result = $this->runCmd($cmd, $output);		$this->assertTrue($result, $output);	}	public function testAcceptsValidStringInput() {		$msg = escapeshellarg(file_get_contents("{$this->filesDir}valid.txt"));		$cmd = "$this->validateScript $msg";		$result = $this->runCmd($cmd, $output);		$this->assertTrue($result, $output);	}	/**	 * Executes a command and returns true if the cmd	 * exited with 0.	 *	 * @param string $cmd    Shell command to execute	 * @param string $output Output from stdout and stderr will be written to this variable	 * @param array  $env    Array of environment variables to be passed to sub-process	 * @return bool Result depending on process exit code.	 */	protected function runCmd($cmd, &$output, array $env = array()) {		$descriptorspec = array(			0 => array("pipe", "r"),// stdin			1 => array("pipe", "w"),// stdout			2 => array("pipe", "w"),// stderr		);		$defaultEnv = array(			'PATH' => getenv('PATH'),// we need to copy PATH variable to run php without specifying absolute path		);		$env = array_merge($defaultEnv, $env);		$process = proc_open($cmd, $descriptorspec, $pipes, null, $env);		$this->assertTrue(is_resource($process));		// unfortunately we separate errors from output, but it should be good enough for current usage		$output = stream_get_contents($pipes[1]) . stream_get_contents($pipes[2]);		$exit = proc_close($process);		return $exit > 0 ? false : true;	}}
 |