From bd9fde76e7dc66df77be41356ce3038e4f6c7d32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20M=C3=B6ller?= Date: Fri, 15 Dec 2023 13:15:35 +0100 Subject: [PATCH] Enhancement: Run end-to-end test asserting HTTP response status code --- .github/workflows/integrate.yaml | 26 +- .gitignore | 2 + Makefile | 8 +- composer.json | 1 + composer.lock | 6 +- ...-return-http-response-status-code-200.phpt | 665 ++++++++++++++++++ tests/server | 171 +++++ 7 files changed, 873 insertions(+), 6 deletions(-) create mode 100644 tests/EndToEnd/paths-return-http-response-status-code-200.phpt create mode 100755 tests/server diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml index 406548d0bf..dc736a56ca 100644 --- a/.github/workflows/integrate.yaml +++ b/.github/workflows/integrate.yaml @@ -27,7 +27,7 @@ jobs: uses: "shivammathur/setup-php@v2" with: coverage: "none" - extensions: "none, json, mbstring, tokenizer" + extensions: "none, curl, json, mbstring, tokenizer" php-version: "${{ matrix.php-version }}" - name: "Set up problem matchers for PHP" @@ -64,6 +64,9 @@ jobs: php-version: - "8.2" + env: + HTTP_HOST: "localhost:8080" + steps: - name: "Checkout" uses: "actions/checkout@v4" @@ -72,11 +75,30 @@ jobs: uses: "shivammathur/setup-php@v2" with: coverage: "none" - extensions: "none" + extensions: "none, curl, mbstring, tokenizer" php-version: "${{ matrix.php-version }}" - name: "Set up problem matchers for PHP" run: "echo \"::add-matcher::${{ runner.tool_cache }}/php.json\"" + - name: "Validate composer.json and composer.lock" + run: "composer validate --ansi --strict" + + - name: "Determine composer cache directory" + run: "echo \"COMPOSER_CACHE_DIR=$(composer config cache-dir)\" >> $GITHUB_ENV" + + - name: "Cache dependencies installed with composer" + uses: "actions/cache@v3" + with: + path: "${{ env.COMPOSER_CACHE_DIR }}" + key: "php-${{ matrix.php-version }}-composer-${{ hashFiles('composer.lock') }}" + restore-keys: "php-${{ matrix.php-version }}-composer-" + + - name: "Install dependencies with composer" + run: "composer install --ansi --no-interaction --no-progress" + + - name: "Start built-in web server for PHP" + run: "php -S ${{ env.HTTP_HOST }} .router.php &" + - name: "Run tests" run: "php tests/run-tests.php -j3 -q --show-diff" diff --git a/.gitignore b/.gitignore index 3dbdaf9958..9ad0f321dc 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,6 @@ vendor/ .idea .DS_Store .DS_Store? +tests/server.log +tests/server.pid .php-cs-fixer.cache diff --git a/Makefile b/Makefile index af1d9278e1..505d6ac764 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,7 @@ +.EXPORT_ALL_VARIABLES: + +HTTP_HOST:=localhost:8080 + .PHONY: help help: ## Displays this list of targets with descriptions @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[32m%-30s\033[0m %s\n", $$1, $$2}' @@ -7,8 +11,8 @@ coding-standards: vendor ## Fixes code style issues with friendsofphp/php-cs-fix vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.php --diff --verbose .PHONY: tests -tests: ## Runs tests - php tests/run-tests.php -j3 -q +tests: vendor ## Runs tests + tests/server start; php tests/run-tests.php -j3 -q; tests/server stop vendor: composer.json composer.lock composer validate --strict diff --git a/composer.json b/composer.json index e876277579..828a9c4890 100644 --- a/composer.json +++ b/composer.json @@ -11,6 +11,7 @@ "php": "~8.2.0" }, "require-dev": { + "ext-curl": "*", "friendsofphp/php-cs-fixer": "^3.40.2" }, "autoload": { diff --git a/composer.lock b/composer.lock index a9ba8a885e..ce9b352127 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1533d38ddadf64023c5c85ea970b6ab0", + "content-hash": "c5d7affcdce069dec449e3bf7d31be2b", "packages": [], "packages-dev": [ { @@ -1840,7 +1840,9 @@ "platform": { "php": "~8.2.0" }, - "platform-dev": [], + "platform-dev": { + "ext-curl": "*" + }, "platform-overrides": { "php": "8.2.0" }, diff --git a/tests/EndToEnd/paths-return-http-response-status-code-200.phpt b/tests/EndToEnd/paths-return-http-response-status-code-200.phpt new file mode 100644 index 0000000000..60a6b69e00 --- /dev/null +++ b/tests/EndToEnd/paths-return-http-response-status-code-200.phpt @@ -0,0 +1,665 @@ +--TEST-- +paths return HTTP response status code 200 +--FILE-- + true, + CURLOPT_URL => sprintf( + '%s%s', + $baseUrl, + $url, + ), + ]; + + curl_setopt_array($handle, $options); + + curl_exec($handle); + + return curl_getinfo($handle, CURLINFO_HTTP_CODE); + }, $paths), +); + +$pathsWithUnexpectedStatusCodes = array_filter($pathsToStatusCodes, static function (int $statusCode): bool { + return $statusCode !== 200; +}); + +var_dump($pathsWithUnexpectedStatusCodes); +?> +--EXPECT-- +array(0) { +} diff --git a/tests/server b/tests/server new file mode 100755 index 0000000000..e6da625552 --- /dev/null +++ b/tests/server @@ -0,0 +1,171 @@ +#!/bin/bash + +# https://github.com/cubny/php-built-in-server-manager/blob/9a5cbeaad50a108d6058b882b83ba23fbd7722a9/server + +# default hostname +HOST=localhost +# default port number +PORT=8080 +# script name +NAME=${0##*/} + +usage () { + cat < [:] + + Available commands: + + start Starts PHP built-in web server server on specified hostname:port, default is localhost:$PORT + stop Stops the PHP built-in web server + restart Stops and Starts on previously specified hostname:port + status Status of "$NAME" process + log Show the PHP built-in web server logs. Use the -f option for a live update + + + report bugs to me@cubny.com + $NAME homepage: + +EOF +return 0 +} + +setup_colors() { + +if which tput >/dev/null 2>&1; then + ncolors=$(tput colors) + fi + if [ -t 1 ] && [ -n "$ncolors" ] && [ "$ncolors" -ge 8 ]; then + RED="$(tput setaf 1)" + GREEN="$(tput setaf 2)" + YELLOW="$(tput setaf 3)" + BLUE="$(tput setaf 4)" + BOLD="$(tput bold)" + NORMAL="$(tput sgr0)" + else + RED="" + GREEN="" + YELLOW="" + BLUE="" + BOLD="" + NORMAL="" + fi +} + +# if no command specified exit and show usage +if [[ $# < 1 ]]; then + echo $NAME: no command specified + usage + exit 1 +fi + +# if hostname:port specified override defaults +if [[ $# > 1 ]]; then + IFS=':' read -r -a hostport <<< "$2" + if [[ ! -z "${hostport[0]}" ]]; then + HOST=${hostport[0]} + fi + if [[ ! -z "${hostport[1]}" ]]; then + PORT=${hostport[1]} + fi +fi + +# pidfile contents would be hostname:port:pid +PIDFILE=tests/server.pid +LOGFILE=tests/server.log + +validate_server () { + which php &> /dev/null + if [[ $? -eq 1 ]]; then + printf "${YELLOW}Error: PHP not found. ${NORMAL}Please install PHP version 5.4 or greater!\n" + return 1 + fi + + php -h | grep -q -- '-S' + if [[ $? -eq 1 ]]; then + printf "${YELLOW}Error: PHP version must be 5.4 or greater!${NORMAL}\n" + return 1 + fi + + return 0 +} + +start_server () { + + validate_server + if [[ $? -eq 1 ]]; then + return 1 + fi + + if [[ -e "$PIDFILE" ]]; then + printf "${YELLOW}Server seems to be running!${NORMAL}\n" + echo + echo if not, there is probably a zombie "$PIDFILE" in this directory. + echo if you are sure no server is running just remove "$PIDFILE" manually and start again + return 1 + else + printf "${GREEN}"$NAME" started on $HOST:$PORT${NORMAL}\n" + php -S "$HOST":"$PORT" >> "$LOGFILE" 2>&1 & + echo "$HOST":"$PORT":$! > $PIDFILE + return 0 + fi +} + +read_pidfile() { + if [[ -e "$PIDFILE" ]]; then + PIDFILECONTENT=`cat "$PIDFILE"` + IFS=: read HOST PORT PID <<< "$PIDFILECONTENT:" + return 0 + else + return 1 + fi + +} +stop_server () { + if read_pidfile; then + kill -9 "$PID" + rm -f "$PIDFILE" + printf "${GREEN}"$NAME" stopped!${NORMAL}\n" + return 0 + else + printf "${YELLOW}"$NAME" is not running!${NORMAL}\n" + return 1 + fi +} + +status_server() { + if read_pidfile && kill -0 "$PID" ; then + printf "${BLUE}"$NAME" is running on ${HOST}:${PORT}${NORMAL}\n" + else + printf "${YELLOW}"$NAME" is not running!${NORMAL}\n" + fi +} + + +log_server() { + if read_pidfile && kill -0 "$PID" ; then + if [[ "$1" = "-f" ]]; then + TAIL_OPTS="-f" + fi + tail $TAIL_OPTS "$LOGFILE" + else + printf "${YELLOW}"$NAME" is not running!${NORMAL}\n" + fi +} + + +setup_colors + +case $1 in + start) start_server;; + stop) stop_server;; + restart) stop_server; start_server ;; + status) status_server;; + log) log_server $2;; + -h) usage ;; + --help) usage ;; + *) usage;; +esac