diff --git a/support/startup/__tests__/PreambleUtilsTestCase.php b/support/startup/__tests__/PreambleUtilsTestCase.php new file mode 100755 --- /dev/null +++ b/support/startup/__tests__/PreambleUtilsTestCase.php @@ -0,0 +1,123 @@ +#!/usr/bin/env php + 'abc', + $null_value => $undefined, + '' => $undefined, + + // Strange, unexpected cases: + 144 => '144', + ); + + foreach ($test_cases as $input => $expected) { + switch ($input) { + case $undefined: + unset($_SERVER['HTTP_X_FORWARDED_FOR']); + break; + + case $null_value: + $_SERVER['HTTP_X_FORWARDED_FOR'] = null; + break; + + default: + $_SERVER['HTTP_X_FORWARDED_FOR'] = $input; + break; + } + + unset($_SERVER['REMOTE_ADDR']); + + preamble_trust_x_forwarded_for_header(); + + if (!isset($_SERVER['REMOTE_ADDR'])) { + if ($expected === $undefined) { + // test pass + continue; + } else { + $this->failTest("Failed for input {$input} - result is not defined!"); + } + } + + $actual = $_SERVER['REMOTE_ADDR']; + + if ($actual !== $expected) { + var_dump($actual); + + $this->failTest( + "Failed for input {$input} - actual output is {$actual}"); + } + + } + + } + + + private function failTest($message = null) { + echo $message; + echo "\n"; + throw new Exception(); + } + + /** + * Run all tests in this class. + * + * Return: True if all tests passed; False if any test failed. + */ + final public function run() { + $reflection = new ReflectionClass($this); + $methods = $reflection->getMethods(); + + $any_fail = false; + + // Try to ensure that poorly-written tests which depend on execution order + // (and are thus not properly isolated) will fail. + shuffle($methods); + + foreach ($methods as $method) { + $name = $method->getName(); + if (!preg_match('/^test/', $name)) { + continue; + } + + try { + call_user_func_array( + array($this, $name), + array()); + echo "Test passed: {$name}\n"; + } catch (Throwable $ex) { + $any_fail = true; + echo "Failed test: {$name}\n"; + } + } + return !$any_fail; + } + +} + +require_once dirname(__DIR__).'/preamble-utils.php'; + +$test_case = new PreambleUtilsTestCase(); +$good = $test_case->run(); + +if (!$good) { + exit(3); +} diff --git a/support/startup/preamble-utils.php b/support/startup/preamble-utils.php --- a/support/startup/preamble-utils.php +++ b/support/startup/preamble-utils.php @@ -21,7 +21,7 @@ } $forwarded_for = $_SERVER['HTTP_X_FORWARDED_FOR']; - if (!phutil_nonempty_string($forwarded_for)) { + if (!strlen($forwarded_for)) { return; }