Private
Public Access
52 lines
3.1 KiB
Bash
Executable File
52 lines
3.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
repo=$(cd "$(dirname "$0")/.." && pwd)
|
|
bin="$repo/tmp/native-tests/test_php_serialization_native"
|
|
compiler=$(command -v clang++ || command -v g++)
|
|
timeout --signal=TERM --kill-after=2s 60s python3 "$repo/scripts/test_native_build.py" "$bin" -- "$compiler" -std=c++20 -fpermissive -I"$repo" "$repo/scripts/test_php_serialization_native.cpp" -lpcre2-8
|
|
timeout --signal=TERM --kill-after=2s 20s "$bin"
|
|
work=$(mktemp -d "$repo/tmp/native-tests/php-serialization.XXXXXX")
|
|
trap 'rm -rf "$work"' EXIT
|
|
if command -v php >/dev/null; then
|
|
timeout 5s php --version
|
|
timeout 20s "$bin" --fixtures > "$work/native"
|
|
timeout 5s php -r '
|
|
$v = unserialize(file_get_contents($argv[1]), ["allowed_classes" => false]);
|
|
if ($v["list"] !== range(0,19) || array_keys($v["map"]) !== ["a","z"] || $v["binary"] !== "\x00\xff\";\xc0" || $v["none"] !== null || $v["bool"] !== true || $v["fraction"] !== 1.2345678901234567) exit(1);
|
|
echo serialize($v);
|
|
' "$work/native" > "$work/php-native"
|
|
timeout 5s "$bin" --normalize < "$work/php-native" > "$work/native-again"
|
|
cmp "$work/native" "$work/native-again"
|
|
timeout 5s php -r '
|
|
$v = ["z" => "\0\xff\xc0", "a" => range(0,25), "numeric" => [10 => "ten", -1 => "negative", "01" => "leading", "" => "empty"], "float" => [1.2345678901234567, -0.0, INF, -INF, NAN, PHP_FLOAT_MIN, PHP_FLOAT_MAX, 5e-324], "int" => [9007199254740991, 9007199254740992, 9007199254740994, PHP_INT_MIN], "none" => null, "bool" => false];
|
|
echo serialize($v);
|
|
' > "$work/php"
|
|
timeout 5s "$bin" --normalize < "$work/php" > "$work/canonical"
|
|
timeout 5s php -r '
|
|
$a = unserialize(file_get_contents($argv[1]), ["allowed_classes" => false]);
|
|
$b = unserialize(file_get_contents($argv[2]), ["allowed_classes" => false]);
|
|
function same($a, $b) {
|
|
if (is_array($a)) { if (!is_array($b) || count($a) !== count($b)) return false; foreach ($a as $k => $v) if (!array_key_exists($k,$b) || !same($v,$b[$k])) return false; return true; }
|
|
if (is_float($a) && is_nan($a)) return is_float($b) && is_nan($b);
|
|
if (is_float($a) && $a == 0) return is_float($b) && fdiv(1,$a) === fdiv(1,$b);
|
|
return $a == $b;
|
|
}
|
|
if (!same($a,$b)) exit(1);
|
|
if (array_keys($b) !== ["a", "bool", "float", "int", "none", "numeric", "z"]) exit(1);
|
|
' "$work/php" "$work/canonical"
|
|
timeout 5s "$bin" --normalize < "$work/canonical" > "$work/canonical-again"
|
|
cmp "$work/canonical" "$work/canonical-again"
|
|
echo 'PHP differential tests passed'
|
|
else
|
|
echo 'PHP CLI unavailable. Differential tests skipped.'
|
|
fi
|
|
if [[ -x /opt/wasi-sdk/bin/clang++ ]]; then
|
|
printf '#include "src/lib/types.h"\n#include "src/lib/dvalue.h"\n#include "src/lib/php_serialization.h"\nDValue test(const DValue& v, const String& s) { php_encode(v); return php_decode(s); }\n' > "$work/wasi.cpp"
|
|
timeout 15s "$compiler" -std=c++20 -fno-exceptions -fno-rtti -I"$repo" -c "$work/wasi.cpp" -o "$work/native-no-exceptions.o"
|
|
timeout 30s /opt/wasi-sdk/bin/clang++ --target=wasm32-wasip1 -std=c++20 -fno-exceptions -fno-rtti -I"$repo" -c "$work/wasi.cpp" -o "$work/wasi.o"
|
|
else
|
|
echo 'WASI SDK unavailable' >&2
|
|
exit 1
|
|
fi
|
|
printf 'PHP serialization native and WASI compile tests passed\n'
|