Skip to content

Commit d155f32

Browse files
authored
Merge branch 'main' into try/os
2 parents d0d9bda + ad66177 commit d155f32

File tree

7 files changed

+979
-86
lines changed

7 files changed

+979
-86
lines changed

bin/install-package-tests

Lines changed: 47 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,16 @@ fi
8787

8888
echo "Detecting database version..."
8989

90-
TYPE="MySQL"
91-
CLIENT_VERSION=$(mysql --version 2>/dev/null)
92-
93-
case "${CLIENT_VERSION}" in
94-
*"MariaDB"*)
95-
TYPE="MariaDB"
96-
;;
97-
esac
90+
# Detect which client binary is available.
91+
CLIENT_BINARY=""
92+
if command -v mysql >/dev/null 2>&1; then
93+
CLIENT_BINARY="mysql"
94+
elif command -v mariadb >/dev/null 2>&1; then
95+
CLIENT_BINARY="mariadb"
96+
else
97+
echo "${C_RED}Error: Neither 'mysql' nor 'mariadb' client binary found.${NO_FORMAT}"
98+
exit 1
99+
fi
98100

99101
if [ -z "$PS1" ]; then
100102
# These vars are because github actions gave problems in the past.
@@ -105,11 +107,16 @@ else
105107
MYSQL_WAIT=0
106108
fi
107109

108-
if [ "${TYPE}" = "MySQL" ]; then
109-
SERVER_VERSION=$(mysql -e "SELECT VERSION()" --skip-column-names ${HOST_STRING} -u"${USER}" "${PASSWORD_STRING}")
110-
else
111-
SERVER_VERSION=$(mariadb -e "SELECT VERSION()" --skip-column-names ${HOST_STRING} -u"${USER}" "${PASSWORD_STRING}")
112-
fi
110+
# Use the detected client binary to query the server version.
111+
SERVER_VERSION=$(${CLIENT_BINARY} -e "SELECT VERSION()" --skip-column-names ${HOST_STRING} -u"${USER}" "${PASSWORD_STRING}" 2>/dev/null)
112+
113+
# Detect the database type from the server version string.
114+
TYPE="MySQL"
115+
case "${SERVER_VERSION}" in
116+
*"MariaDB"*|*"mariadb"*)
117+
TYPE="MariaDB"
118+
;;
119+
esac
113120

114121
VERSION=$(echo "${SERVER_VERSION}" | grep -o '^[^-]*')
115122
MAJOR=$(echo "${VERSION}" | cut -d. -f1)
@@ -119,66 +126,49 @@ echo "Detected ${TYPE} at version ${MAJOR}.${MINOR}"
119126

120127
echo 'Checking if database is ready...'
121128

122-
if [ "${TYPE}" = "MySQL" ]; then
123-
while ! mysql ${HOST_STRING} --user="${USER}" "${PASSWORD_STRING}" --execute="SHOW DATABASES;" | grep 'information_schema' >/dev/null;
124-
do
125-
i=$((i+1))
126-
if [ "${MYSQL_TRIES}" -gt 1 ]; then
127-
echo "Waiting for MySQL(${i}/${MYSQL_TRIES})..."
128-
sleep ${MYSQL_WAIT}
129-
fi
130-
131-
if [ $i -ge $MYSQL_TRIES ]; then
132-
echo "${C_RED}MySQL failed to start. Aborting.${NO_FORMAT}"
133-
echo "Cannot connect to MySQL server. For all available variables, check the documentation at:"
134-
echo " ${C_BLUE}https://github.com/wp-cli/wp-cli-tests?tab=readme-ov-file#the-database-credentials${NO_FORMAT}"
135-
exit 1
136-
fi
137-
done
138-
else
139-
while ! mariadb ${HOST_STRING} --user="${USER}" "${PASSWORD_STRING}" --execute="SHOW DATABASES;" | grep 'information_schema' >/dev/null;
140-
do
141-
i=$((i+1))
142-
if [ "${MYSQL_TRIES}" -gt 1 ]; then
143-
echo "Waiting for MariaDB(${i}/${MYSQL_TRIES})..."
144-
sleep ${MYSQL_WAIT}
145-
fi
129+
i=0
130+
while ! ${CLIENT_BINARY} ${HOST_STRING} --user="${USER}" "${PASSWORD_STRING}" --execute="SHOW DATABASES;" 2>/dev/null | grep 'information_schema' >/dev/null;
131+
do
132+
i=$((i+1))
133+
if [ "${MYSQL_TRIES}" -gt 1 ]; then
134+
echo "Waiting for database server (${i}/${MYSQL_TRIES})..."
135+
sleep ${MYSQL_WAIT}
136+
fi
146137

147-
if [ $i -ge $MYSQL_TRIES ]; then
148-
echo "${C_RED}MariaDB failed to start. Aborting.${NO_FORMAT}"
149-
echo "Cannot connect to MariaDB server. For all available variables, check the documentation at:"
150-
echo " ${C_BLUE}https://github.com/wp-cli/wp-cli-tests?tab=readme-ov-file#the-database-credentials${NO_FORMAT}"
151-
exit 1
152-
fi
153-
done
154-
fi
138+
if [ $i -ge $MYSQL_TRIES ]; then
139+
echo "${C_RED}Database server failed to start. Aborting.${NO_FORMAT}"
140+
echo "Cannot connect to database server. For all available variables, check the documentation at:"
141+
echo " ${C_BLUE}https://github.com/wp-cli/wp-cli-tests?tab=readme-ov-file#the-database-credentials${NO_FORMAT}"
142+
exit 1
143+
fi
144+
done
155145

156146
# Prepare the database for running the tests with a MySQL version 8.0 or higher.
157147
install_mysql_db_8_0_plus() {
158148
set -ex # print all the commands.
159-
mysql -e "CREATE DATABASE IF NOT EXISTS \`${TEST_DB}\`;" ${HOST_STRING} -u"${USER}" "${PASSWORD_STRING}"
160-
mysql -e "CREATE USER IF NOT EXISTS \`${TEST_USER}\`@'%' IDENTIFIED WITH caching_sha2_password BY '${TEST_PASSWORD}'" ${HOST_STRING} -u"${USER}" "${PASSWORD_STRING}"
161-
mysql -e "GRANT ALL PRIVILEGES ON \`${TEST_DB}\`.* TO '${TEST_USER}'@'%'" ${HOST_STRING} -u"${USER}" "${PASSWORD_STRING}"
162-
mysql -e "GRANT ALL PRIVILEGES ON \`${TEST_DB}_scaffold\`.* TO '${TEST_USER}'@'%'" ${HOST_STRING} -u"${USER}" "${PASSWORD_STRING}"
149+
${CLIENT_BINARY} -e "CREATE DATABASE IF NOT EXISTS \`${TEST_DB}\`;" ${HOST_STRING} -u"${USER}" "${PASSWORD_STRING}"
150+
${CLIENT_BINARY} -e "CREATE USER IF NOT EXISTS \`${TEST_USER}\`@'%' IDENTIFIED WITH caching_sha2_password BY '${TEST_PASSWORD}'" ${HOST_STRING} -u"${USER}" "${PASSWORD_STRING}"
151+
${CLIENT_BINARY} -e "GRANT ALL PRIVILEGES ON \`${TEST_DB}\`.* TO '${TEST_USER}'@'%'" ${HOST_STRING} -u"${USER}" "${PASSWORD_STRING}"
152+
${CLIENT_BINARY} -e "GRANT ALL PRIVILEGES ON \`${TEST_DB}_scaffold\`.* TO '${TEST_USER}'@'%'" ${HOST_STRING} -u"${USER}" "${PASSWORD_STRING}"
163153
{ set +ex; } 2> /dev/null # stop printing the commands
164154
}
165155

166156
# Prepare the database for running the tests with a MySQL version lower than 8.0.
167157
install_mysql_db_lower_than_8_0() {
168158
set -ex # print all the commands.
169-
mysql -e "CREATE DATABASE IF NOT EXISTS \`${TEST_DB}\`;" ${HOST_STRING} -u"${USER}" "${PASSWORD_STRING}"
170-
mysql -e "GRANT ALL ON \`${TEST_DB}\`.* TO '${TEST_USER}'@'%' IDENTIFIED BY '${TEST_PASSWORD}'" ${HOST_STRING} -u"${USER}" "${PASSWORD_STRING}"
171-
mysql -e "GRANT ALL ON \`${TEST_DB}_scaffold\`.* TO '${TEST_USER}'@'%' IDENTIFIED BY '${TEST_PASSWORD}'" ${HOST_STRING} -u"${USER}" "${PASSWORD_STRING}"
159+
${CLIENT_BINARY} -e "CREATE DATABASE IF NOT EXISTS \`${TEST_DB}\`;" ${HOST_STRING} -u"${USER}" "${PASSWORD_STRING}"
160+
${CLIENT_BINARY} -e "GRANT ALL ON \`${TEST_DB}\`.* TO '${TEST_USER}'@'%' IDENTIFIED BY '${TEST_PASSWORD}'" ${HOST_STRING} -u"${USER}" "${PASSWORD_STRING}"
161+
${CLIENT_BINARY} -e "GRANT ALL ON \`${TEST_DB}_scaffold\`.* TO '${TEST_USER}'@'%' IDENTIFIED BY '${TEST_PASSWORD}'" ${HOST_STRING} -u"${USER}" "${PASSWORD_STRING}"
172162
{ set +ex; } 2> /dev/null # stop printing the commands
173163
}
174164

175165
# Prepare the database for running the tests with MariaDB
176166
install_mariadb() {
177167
set -ex
178-
mariadb -e "CREATE DATABASE IF NOT EXISTS \`${TEST_DB}\`;" ${HOST_STRING} -u"${USER}" "${PASSWORD_STRING}"
179-
mariadb -e "CREATE USER IF NOT EXISTS \`${TEST_USER}\`@'%' IDENTIFIED BY '${TEST_PASSWORD}'" ${HOST_STRING} -u"${USER}" "${PASSWORD_STRING}"
180-
mariadb -e "GRANT ALL PRIVILEGES ON \`${TEST_DB}\`.* TO '${TEST_USER}'@'%'" ${HOST_STRING} -u"${USER}" "${PASSWORD_STRING}"
181-
mariadb -e "GRANT ALL PRIVILEGES ON \`${TEST_DB}_scaffold\`.* TO '${TEST_USER}'@'%'" ${HOST_STRING} -u"${USER}" "${PASSWORD_STRING}"
168+
${CLIENT_BINARY} -e "CREATE DATABASE IF NOT EXISTS \`${TEST_DB}\`;" ${HOST_STRING} -u"${USER}" "${PASSWORD_STRING}"
169+
${CLIENT_BINARY} -e "CREATE USER IF NOT EXISTS \`${TEST_USER}\`@'%' IDENTIFIED BY '${TEST_PASSWORD}'" ${HOST_STRING} -u"${USER}" "${PASSWORD_STRING}"
170+
${CLIENT_BINARY} -e "GRANT ALL PRIVILEGES ON \`${TEST_DB}\`.* TO '${TEST_USER}'@'%'" ${HOST_STRING} -u"${USER}" "${PASSWORD_STRING}"
171+
${CLIENT_BINARY} -e "GRANT ALL PRIVILEGES ON \`${TEST_DB}_scaffold\`.* TO '${TEST_USER}'@'%'" ${HOST_STRING} -u"${USER}" "${PASSWORD_STRING}"
182172
}
183173

184174
if [ "${TYPE}" = "MariaDB" ]; then
@@ -189,5 +179,5 @@ else
189179
install_mysql_db_lower_than_8_0
190180
fi
191181

192-
echo "Succesfully prepared the database for running tests."
182+
echo "Successfully prepared the database for running tests."
193183
echo "This command does not have to be run again."

bin/run-behat-tests

Lines changed: 88 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,90 @@
33
# Run the Behat tests only if a Behat config file is found.
44
if [ ! -f "behat.yml" ]; then
55
echo 'Did not detect "behat.yml" file, skipping Behat tests.'
6-
exit 0;
6+
exit 0;
77
fi
88

99
if ! command -v jq &> /dev/null
1010
then
11-
echo 'The required "jq" command was not found, please install it to run the Behat tests.'
12-
echo "See https://stedolan.github.io/jq/download/ for installation instructions."
13-
exit 1;
11+
echo 'The required "jq" command was not found, please install it to run the Behat tests.'
12+
echo "See https://stedolan.github.io/jq/download/ for installation instructions."
13+
exit 1;
1414
fi
1515

1616
if [[ "$@" == *"--help"* ]]; then
17-
vendor/bin/behat "$@"
18-
ret=$?
19-
exit $ret
17+
vendor/bin/behat "$@"
18+
ret=$?
19+
exit $ret
20+
fi
21+
22+
# POSIX compliant function to check if a string is numeric.
23+
is_numeric() {
24+
case $1 in
25+
''|*[!0-9]*) return 1;; # returns 1 if not numeric
26+
*) return 0;; # returns 0 if numeric
27+
esac
28+
}
29+
30+
# If DB type is already set to SQLite, there's nothing to do.
31+
if [ "${WP_CLI_TEST_DBTYPE-}" = "sqlite" ]; then
32+
echo "WP_CLI_TEST_DBTYPE is set to 'sqlite', skipping database check."
33+
else
34+
# Check for database client and connectivity.
35+
DB_CLIENT=""
36+
if command -v mysql &> /dev/null; then
37+
DB_CLIENT="mysql"
38+
elif command -v mariadb &> /dev/null; then
39+
DB_CLIENT="mariadb"
40+
fi
41+
42+
if [ -z "${DB_CLIENT}" ]; then
43+
echo "Warning: Could not find 'mysql' or 'mariadb' client."
44+
echo "The tests will continue to be run, but with WP_CLI_TEST_DBTYPE=sqlite."
45+
export WP_CLI_TEST_DBTYPE=sqlite
46+
else
47+
HOST_STRING=''
48+
if [ -n "${WP_CLI_TEST_DBHOST}" ]; then
49+
case ${WP_CLI_TEST_DBHOST##*[]]} in
50+
(*:*) HOST=${WP_CLI_TEST_DBHOST%:*} PORT=${WP_CLI_TEST_DBHOST##*:};;
51+
(*) HOST=${WP_CLI_TEST_DBHOST};;
52+
esac
53+
HOST_STRING="-h${HOST}"
54+
if [ -n "${PORT}" ]; then
55+
# If the port is not numeric, then we assume it is a socket path.
56+
if is_numeric "${PORT}"; then
57+
HOST_STRING="${HOST_STRING} --port=${PORT} --protocol=tcp"
58+
else
59+
HOST_STRING="${HOST_STRING} --socket=${PORT} --protocol=socket"
60+
fi
61+
fi
62+
fi
63+
64+
USER=${WP_CLI_TEST_DBUSER:-wp_cli_test}
65+
66+
if [ -z "${WP_CLI_TEST_DBPASS+x}" ]; then
67+
# not set, use default
68+
PASSWORD="password1"
69+
else
70+
# is set, use its value (could be empty)
71+
PASSWORD="${WP_CLI_TEST_DBPASS}"
72+
fi
73+
74+
PASSWORD_ARG=""
75+
if [ -n "${PASSWORD}" ]; then
76+
PASSWORD_ARG="-p${PASSWORD}"
77+
fi
78+
79+
DBNAME=${WP_CLI_TEST_DBNAME:-wp_cli_test}
80+
81+
# We need to test the connection.
82+
# Let's try to connect to the specific test database.
83+
if ! ${DB_CLIENT} ${HOST_STRING} --user="${USER}" ${PASSWORD_ARG} --execute="USE \`${DBNAME}\`;" 2>/dev/null; then
84+
echo "Warning: Could not connect to the MySQL/MariaDB database."
85+
echo "Please make sure the database is running and run 'composer prepare-tests' once to set it up."
86+
echo "The tests will continue to be run, but with WP_CLI_TEST_DBTYPE=sqlite."
87+
export WP_CLI_TEST_DBTYPE=sqlite
88+
fi
89+
fi
2090
fi
2191

2292
# Turn WP_VERSION into an actual number to make sure our tags work correctly.
@@ -30,11 +100,11 @@ SOURCE="${BASH_SOURCE[0]}"
30100

31101
# Resolve $SOURCE until the file is no longer a symlink.
32102
while [ -h "$SOURCE" ]; do
33-
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
34-
SOURCE="$(readlink "$SOURCE")"
35-
# If $SOURCE was a relative symlink, we need to resolve it relative to the
36-
# path where the symlink file was located.
37-
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
103+
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
104+
SOURCE="$(readlink "$SOURCE")"
105+
# If $SOURCE was a relative symlink, we need to resolve it relative to the
106+
# path where the symlink file was located.
107+
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
38108
done
39109

40110
# Fetch the root folder of the WP-CLI tests package.
@@ -44,5 +114,10 @@ export WP_CLI_TESTS_ROOT
44114
# Generate the tags to apply environment-specific filters.
45115
BEHAT_TAGS=$(php "$WP_CLI_TESTS_ROOT"/utils/behat-tags.php)
46116

117+
BEHAT_EXTRA_ARGS=()
118+
if [[ "${WP_CLI_TEST_COVERAGE}" == "true" ]] && vendor/bin/behat --help 2>/dev/null | grep -q 'xdebug'; then
119+
BEHAT_EXTRA_ARGS+=('--xdebug')
120+
fi
121+
47122
# Run the functional tests.
48-
vendor/bin/behat --format progress "$BEHAT_TAGS" --strict "$@"
123+
vendor/bin/behat --format progress "$BEHAT_TAGS" --strict "${BEHAT_EXTRA_ARGS[@]}" "$@"

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
},
4444
"extra": {
4545
"branch-alias": {
46-
"dev-main": "4.0.x-dev"
46+
"dev-main": "5.0.x-dev"
4747
},
4848
"phpstan": {
4949
"includes": [

0 commit comments

Comments
 (0)