]> git.mxchange.org Git - friendica.git/blob - autotest.sh
Add mariadb tests
[friendica.git] / autotest.sh
1 #!/usr/bin/env bash
2
3 DATABASENAME=${MYSQL_DATABASE:-test}
4 DATABASEUSER=${MYSQL_USERNAME:-friendica}
5 DATABASEHOST=${MYSQL_HOST:-localhost}
6 BASEDIR=$PWD
7
8 DBCONFIGS="mysql mariadb"
9
10 export MYSQL_DATABASE="$DATABASENAME"
11 export MYSQL_USERNAME="$DATABASEUSER"
12 export MYSQL_PASSWORD="friendica"
13
14 if [ -z "$PHP_EXE" ]; then
15   PHP_EXE=php
16 fi
17 PHP=$(which "$PHP_EXE")
18 # Use the Friendica internal composer
19 COMPOSER="$BASEDIR/bin/composer.phar"
20
21 set -e
22
23 _XDEBUG_CONFIG=$XDEBUG_CONFIG
24 unset XDEBUG_CONFIG
25
26 if [ -x "$PHP" ]; then
27   echo "Using PHP executable $PHP"
28 else
29   echo "Could not find PHP executable $PHP_EXE" >&2
30   exit 3
31 fi
32
33 echo "Installing depdendencies"
34 $PHP "$COMPOSER" install
35
36 PHPUNIT="$BASEDIR/vendor/bin/phpunit"
37
38 if [ -x "$PHPUNIT" ]; then
39   echo "Using PHPUnit executable $PHPUNIT"
40 else
41   echo "Could not find PHPUnit executable after composer $PHPUNIT" >&2
42   exit 3
43 fi
44
45 if ! [ \( -w config -a ! -f config/local.config.php \) -o \( -f config/local.config.php -a -w config/local.config.php \) ]; then
46         echo "Please enable write permissions on config and config/config.php" >&2
47         exit 1
48 fi
49
50 if [ "$1" ]; then
51   FOUND=0
52   for DBCONFIG in $DBCONFIGS; do
53     if [ "$1" = "$DBCONFIG" ]; then
54       FOUND=1
55       break
56     fi
57   done
58   if [ $FOUND = 0 ]; then
59     echo -e "Unknown database config name \"$1\"\n" >&2
60     exit 2
61   fi
62 fi
63
64 # Back up existing (dev) config if one exists and backup not already there
65 if [ -f config/local.config.php ] && [ ! -f config/local.config-autotest-backup.php ]; then
66   mv config/local.config.php config/local.config-autotest-backup.php
67 fi
68
69 function cleanup_config {
70
71     if [ -n "$DOCKER_CONTAINER_ID" ]; then
72       echo "Kill the docker $DOCKER_CONTAINER_ID"
73       docker stop "$DOCKER_CONTAINER_ID"
74       docker rm -f "$DOCKER_CONTAINER_ID"
75     fi
76
77     cd "$BASEDIR"
78
79     # Restore existing config
80     if [ -f config/local.config-autotest-backup.php ]; then
81       mv config/local.config-autotest-backup.php config/local.config.php
82     fi
83 }
84
85 # restore config on exit
86 trap cleanup_config EXIT
87
88 function execute_tests {
89     DB=$1
90     echo "Setup environment for $DB testing ..."
91     # back to root folder
92     cd "$BASEDIR"
93
94     # backup current config
95     if [ -f config/local.config.php ]; then
96       mv config/local.config.php config/local.config-autotest-backup.php
97     fi
98
99     if [ -z "$NOINSTALL" ]; then
100       #drop database
101       if [ "$DB" == "mysql" ]; then
102           if [ -n "$USEDOCKER" ]; then
103             echo "Fire up the mysql docker"
104             DOCKER_CONTAINER_ID=$(docker run \
105                     -e MYSQL_ROOT_PASSWORD=friendica \
106                     -e MYSQL_USER="$DATABASEUSER" \
107                     -e MYSQL_PASSWORD=friendica \
108                     -e MYSQL_DATABASE="$DATABASENAME" \
109                     -d mysql)
110             DATABASEHOST=$(docker inspect --format="{{.NetworkSettings.IPAddress}}" "$DOCKER_CONTAINER_ID")
111
112           else
113             if [ -z "$DRONE" ]; then  # no need to drop the DB when we are on CI
114               if [ "mysql" != "$(mysql --version | grep -o mysql)" ]; then
115                 echo "Your mysql binary is not provided by mysql"
116                 echo "To use the docker container set the USEDOCKER environment variable"
117                 exit 3
118               fi
119               mysql -u "$DATABASEUSER" -pfriendica -e "DROP DATABASE IF EXISTS $DATABASENAME" -h $DATABASEHOST || true
120               mysql -u "$DATABASEUSER" -pfriendica -e "CREATE DATABASE $DATABASENAME DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci" -h $DATABASEHOST
121             else
122               DATABASEHOST=mysql
123             fi
124           fi
125
126           echo "Waiting for MySQL $DATABASEHOST initialization..."
127           if ! bin/wait-for-connection $DATABASEHOST 3306 300; then
128             echo "[ERROR] Waited 300 seconds, no response" >&2
129             exit 1
130           fi
131
132           echo "MySQL is up."
133       fi
134       if [ "$DB" == "mariadb" ]; then
135           if [ -n "$USEDOCKER" ]; then
136             echo "Fire up the mariadb docker"
137             DOCKER_CONTAINER_ID=$(docker run \
138                     -e MYSQL_ROOT_PASSWORD=friendica \
139                     -e MYSQL_USER="$DATABASEUSER" \
140                     -e MYSQL_PASSWORD=friendica \
141                     -e MYSQL_DATABASE="$DATABASENAME" \
142                     -d mariadb)
143             DATABASEHOST=$(docker inspect --format="{{.NetworkSettings.IPAddress}}" "$DOCKER_CONTAINER_ID")
144
145           else
146             if [ -z "$DRONE" ]; then  # no need to drop the DB when we are on CI
147               if [ "MariaDB" != "$(mysql --version | grep -o MariaDB)" ]; then
148                 echo "Your mysql binary is not provided by mysql"
149                 echo "To use the docker container set the USEDOCKER environment variable"
150                 exit 3
151               fi
152               mysql -u "$DATABASEUSER" -pfriendica -e "DROP DATABASE IF EXISTS $DATABASENAME" -h $DATABASEHOST || true
153               mysql -u "$DATABASEUSER" -pfriendica -e "CREATE DATABASE $DATABASENAME DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci" -h $DATABASEHOST
154             else
155               DATABASEHOST=mariadb
156             fi
157           fi
158
159            echo "Waiting for MariaDB $DATABASEHOST initialization..."
160             if ! bin/wait-for-connection $DATABASEHOST 3306 300; then
161                 echo "[ERROR] Waited 300 seconds, no response" >&2
162                 exit 1
163             fi
164
165             echo "MariaDB is up."
166       fi
167
168       if [ -n "$USEDOCKER" ]; then
169         echo "Initialize database..."
170         docker exec $DOCKER_CONTAINER_ID mysql -u root -pfriendica -e 'CREATE DATABASE IF NOT EXISTS $DATABASENAME;'
171       fi
172
173       export MYSQL_HOST="$DATABASEHOST"
174
175       #call installer
176       echo "Installing Friendica..."
177       "$PHP" ./bin/console.php autoinstall --dbuser="$DATABASEUSER" --dbpass=friendica --dbdata="$DATABASENAME" --dbhost="$DATABASEHOST" --url=https://friendica.local --admin=admin@friendica.local
178     fi
179
180     #test execution
181     echo "Testing..."
182     rm -fr "coverage-html"
183     mkdir "coverage-html"
184     if [[ "$_XDEBUG_CONFIG" ]]; then
185       export XDEBUG_CONFIG=$_XDEBUG_CONFIG
186     fi
187
188     COVER=''
189     if [ -z "$NOCOVERAGE" ]; then
190       COVER="--coverage-clover tests/autotest-clover.xml --coverage-html tests/coverage-html"
191     else
192       echo "No coverage"
193     fi
194
195     # per default, there is no cache installed
196     GROUP='--exclude-group REDIS,MEMCACHE,MEMCACHED,APCU'
197     if [ "$TEST_SELECTION" == "REDIS" ]; then
198       GROUP="--group REDIS"
199     fi
200     if [ "$TEST_SELECTION" == "MEMCACHE" ]; then
201       GROUP="--group MEMCACHE"
202     fi
203     if [ "$TEST_SELECTION" == "MEMCACHED" ]; then
204       GROUP="--group MEMCACHED"
205     fi
206     if [ "$TEST_SELECTION" == "APCU" ]; then
207       GROUP="--group APCU"
208     fi
209     if [ "$TEST_SELECTION" == "NODB" ]; then
210       GROUP="--exclude-group DB,SLOWDB"
211     fi
212
213     INPUT="$BASEDIR/tests"
214     if [ -n "$2" ]; then
215       INPUT="$INPUT/$2"
216     fi
217
218     echo "${PHPUNIT[@]}" --configuration tests/phpunit.xml $GROUP $COVER --log-junit "autotest-results.xml" "$INPUT" "$3"
219     "${PHPUNIT[@]}" --configuration tests/phpunit.xml $GROUP $COVER --log-junit "autotest-results.xml" "$INPUT" "$3"
220     RESULT=$?
221
222     if [ -n "$DOCKER_CONTAINER_ID" ]; then
223       echo "Kill the docker $DOCKER_CONTAINER_ID"
224       docker stop $DOCKER_CONTAINER_ID
225       docker rm -f $DOCKER_CONTAINER_ID
226       unset $DOCKER_CONTAINER_ID
227     fi
228 }
229
230 #
231 # Start the test execution
232 #
233 if [ -z "$1" ] && [ -n "$TEST_SELECTION" ]; then
234   # run all known database configs
235   for DBCONFIG in $DBCONFIGS; do
236     execute_tests "$DBCONFIG"
237   done
238 else
239   FILENAME="$2"
240   if [ -n "$2" ] && [ ! -f "tests/$FILENAME" ] && [ "${FILENAME:0:2}" != "--" ]; then
241     FILENAME="../$FILENAME"
242   fi
243   execute_tests "$1" "$FILENAME" "$3"
244 fi