You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

преди 8 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 7 години
преди 7 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 8 години
преди 12 години
преди 8 години
преди 8 години
преди 8 години
преди 8 години
преди 12 години
преди 11 години
преди 12 години
преди 12 години
преди 12 години
преди 8 години
преди 8 години
преди 12 години
преди 11 години
преди 11 години
преди 11 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 11 години
преди 12 години
преди 11 години
преди 11 години
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. #!/usr/bin/env bash
  2. #
  3. # ownCloud
  4. #
  5. # @author Vincent Petry
  6. # @author Morris Jobke
  7. # @author Robin McCorkell
  8. # @author Thomas Müller
  9. # @author Andreas Fischer
  10. # @author Joas Schilling
  11. # @author Lukas Reschke
  12. # @author Jörn Friedrich Dreyer
  13. # @copyright 2012-2015 Thomas Müller thomas.mueller@tmit.eu
  14. #
  15. #$EXECUTOR_NUMBER is set by Jenkins and allows us to run autotest in parallel
  16. DATABASENAME=oc_autotest$EXECUTOR_NUMBER
  17. DATABASEUSER=oc_autotest$EXECUTOR_NUMBER
  18. DATABASEHOST=localhost
  19. ADMINLOGIN=admin$EXECUTOR_NUMBER
  20. BASEDIR=$PWD
  21. PRIMARY_STORAGE_CONFIGS="local swift"
  22. DBCONFIGS="sqlite mysql mariadb pgsql oci mysqlmb4"
  23. # $PHP_EXE is run through 'which' and as such e.g. 'php' or 'hhvm' is usually
  24. # sufficient. Due to the behaviour of 'which', $PHP_EXE may also be a path
  25. # (absolute or not) to an executable, e.g. ./code/projects/php-src/sapi/cli/php.
  26. if [ -z "$PHP_EXE" ]; then
  27. PHP_EXE=php
  28. fi
  29. PHP=$(which "$PHP_EXE")
  30. PHPUNIT=$(which phpunit)
  31. set -e
  32. _XDEBUG_CONFIG=$XDEBUG_CONFIG
  33. unset XDEBUG_CONFIG
  34. function print_syntax {
  35. echo -e "Syntax: ./autotest.sh [dbconfigname] [testfile]\n" >&2
  36. echo -e "\t\"dbconfigname\" can be one of: $DBCONFIGS" >&2
  37. echo -e "\t\"testfile\" is the name of a test file, for example lib/template.php" >&2
  38. echo -e "\nExample: ./autotest.sh sqlite lib/template.php" >&2
  39. echo "will run the test suite from \"tests/lib/template.php\"" >&2
  40. echo -e "\nIf no arguments are specified, all tests will be run with all database configs" >&2
  41. }
  42. if [ -x "$PHP" ]; then
  43. echo "Using PHP executable $PHP"
  44. else
  45. echo "Could not find PHP executable $PHP_EXE" >&2
  46. exit 3
  47. fi
  48. if ! [ -x "$PHPUNIT" ]; then
  49. echo "phpunit executable not found, please install phpunit version >= 4.8" >&2
  50. exit 3
  51. fi
  52. # PHPUnit might also be installed via a facade binary script
  53. if [[ "$PHPUNIT" =~ \.phar$ ]]; then
  54. PHPUNIT=( "$PHP" "$PHPUNIT" )
  55. else
  56. PHPUNIT=( "$PHPUNIT" )
  57. fi
  58. PHPUNIT_VERSION=$($PHPUNIT --version | cut -d" " -f2)
  59. PHPUNIT_MAJOR_VERSION=$(echo "$PHPUNIT_VERSION" | cut -d"." -f1)
  60. PHPUNIT_MINOR_VERSION=$(echo "$PHPUNIT_VERSION" | cut -d"." -f2)
  61. if ! [ "$PHPUNIT_MAJOR_VERSION" -gt 4 -o \( "$PHPUNIT_MAJOR_VERSION" -eq 4 -a "$PHPUNIT_MINOR_VERSION" -ge 8 \) ]; then
  62. echo "phpunit version >= 4.8 required. Version found: $PHPUNIT_VERSION" >&2
  63. exit 4
  64. fi
  65. if ! [ \( -w config -a ! -f config/config.php \) -o \( -f config/config.php -a -w config/config.php \) ]; then
  66. echo "Please enable write permissions on config and config/config.php" >&2
  67. exit 1
  68. fi
  69. if [ "$1" ]; then
  70. FOUND=0
  71. for DBCONFIG in $DBCONFIGS; do
  72. if [ "$1" = "$DBCONFIG" ]; then
  73. FOUND=1
  74. break
  75. fi
  76. done
  77. if [ $FOUND = 0 ]; then
  78. echo -e "Unknown database config name \"$1\"\n" >&2
  79. print_syntax
  80. exit 2
  81. fi
  82. fi
  83. if [ "$PRIMARY_STORAGE_CONFIG" ]; then
  84. FOUND=0
  85. for PSC in $PRIMARY_STORAGE_CONFIGS; do
  86. if [ "$PRIMARY_STORAGE_CONFIG" = "$PSC" ]; then
  87. FOUND=1
  88. break
  89. fi
  90. done
  91. if [ $FOUND = 0 ]; then
  92. echo -e "Unknown primary storage config name \"$PRIMARY_STORAGE_CONFIG\"\n" >&2
  93. print_syntax
  94. exit 2
  95. fi
  96. else
  97. PRIMARY_STORAGE_CONFIG="local"
  98. fi
  99. # check for the presence of @since in all OCP methods
  100. $PHP build/OCPSinceChecker.php
  101. # Back up existing (dev) config if one exists and backup not already there
  102. if [ -f config/config.php ] && [ ! -f config/config-autotest-backup.php ]; then
  103. mv config/config.php config/config-autotest-backup.php
  104. fi
  105. function cleanup_config {
  106. if [ ! -z "$DOCKER_CONTAINER_ID" ]; then
  107. echo "Kill the docker $DOCKER_CONTAINER_ID"
  108. docker stop "$DOCKER_CONTAINER_ID"
  109. docker rm -f "$DOCKER_CONTAINER_ID"
  110. fi
  111. cd "$BASEDIR"
  112. if [ "$PRIMARY_STORAGE_CONFIG" == "swift" ] ; then
  113. echo "Kill the swift docker"
  114. tests/objectstore/stop-swift-ceph.sh
  115. fi
  116. # Restore existing config
  117. if [ -f config/config-autotest-backup.php ]; then
  118. mv config/config-autotest-backup.php config/config.php
  119. fi
  120. # Remove autotest config
  121. if [ -f config/autoconfig.php ]; then
  122. rm config/autoconfig.php
  123. fi
  124. # Remove autotest swift storage config
  125. if [ -f config/autotest-storage-swift.config.php ]; then
  126. rm config/autotest-storage-swift.config.php
  127. fi
  128. }
  129. # restore config on exit
  130. trap cleanup_config EXIT
  131. # use tmpfs for datadir - should speedup unit test execution
  132. if [ -d /dev/shm ]; then
  133. DATADIR=/dev/shm/data-autotest$EXECUTOR_NUMBER
  134. else
  135. DATADIR=$BASEDIR/data-autotest
  136. fi
  137. echo "Using database $DATABASENAME"
  138. function execute_tests {
  139. DB=$1
  140. echo "Setup environment for $DB testing on $PRIMARY_STORAGE_CONFIG storage ..."
  141. # back to root folder
  142. cd "$BASEDIR"
  143. # revert changes to tests/data
  144. git checkout tests/data
  145. # reset data directory
  146. rm -rf "$DATADIR"
  147. mkdir "$DATADIR"
  148. if [ "$PRIMARY_STORAGE_CONFIG" == "swift" ] ; then
  149. tests/objectstore/start-swift-ceph.sh
  150. cp tests/objectstore/swift.config.php config/autotest-storage-swift.config.php
  151. fi
  152. cp tests/preseed-config.php config/config.php
  153. _DB=$DB
  154. # drop database
  155. if [ "$DB" == "mysql" ] ; then
  156. if [ ! -z "$USEDOCKER" ] ; then
  157. echo "Fire up the mysql docker"
  158. DOCKER_CONTAINER_ID=$(docker run \
  159. -v $BASEDIR/tests/docker/mariadb:/etc/mysql/conf.d \
  160. -e MYSQL_ROOT_PASSWORD=owncloud \
  161. -e MYSQL_USER="$DATABASEUSER" \
  162. -e MYSQL_PASSWORD=owncloud \
  163. -e MYSQL_DATABASE="$DATABASENAME" \
  164. -d mysql)
  165. DATABASEHOST=$(docker inspect --format="{{.NetworkSettings.IPAddress}}" "$DOCKER_CONTAINER_ID")
  166. else
  167. if [ -z "$DRONE" ] ; then # no need to drop the DB when we are on CI
  168. if [ "mysql" != "$(mysql --version | grep -o mysql)" ] ; then
  169. echo "Your mysql binary is not provided by mysql"
  170. echo "To use the docker container set the USEDOCKER environment variable"
  171. exit -1
  172. fi
  173. mysql -u "$DATABASEUSER" -powncloud -e "DROP DATABASE IF EXISTS $DATABASENAME" -h $DATABASEHOST || true
  174. else
  175. DATABASEHOST=127.0.0.1
  176. fi
  177. fi
  178. echo "Waiting for MySQL initialisation ..."
  179. if ! apps/files_external/tests/env/wait-for-connection $DATABASEHOST 3306 600; then
  180. echo "[ERROR] Waited 600 seconds, no response" >&2
  181. exit 1
  182. fi
  183. fi
  184. if [ "$DB" == "mysqlmb4" ] ; then
  185. if [ ! -z "$USEDOCKER" ] ; then
  186. echo "Fire up the mysql docker"
  187. DOCKER_CONTAINER_ID=$(docker run \
  188. -v $BASEDIR/tests/docker/mysqlmb4:/etc/mysql/conf.d \
  189. -e MYSQL_ROOT_PASSWORD=owncloud \
  190. -e MYSQL_USER="$DATABASEUSER" \
  191. -e MYSQL_PASSWORD=owncloud \
  192. -e MYSQL_DATABASE="$DATABASENAME" \
  193. -d mysql:5.7
  194. --innodb_large_prefix=true
  195. --innodb_file_format=barracuda
  196. --innodb_file_per_table=true)
  197. DATABASEHOST=$(docker inspect --format="{{.NetworkSettings.IPAddress}}" "$DOCKER_CONTAINER_ID")
  198. else
  199. if [ -z "$DRONE" ] ; then # no need to drop the DB when we are on CI
  200. if [ "mysql" != "$(mysql --version | grep -o mysql)" ] ; then
  201. echo "Your mysql binary is not provided by mysql"
  202. echo "To use the docker container set the USEDOCKER environment variable"
  203. exit -1
  204. fi
  205. mysql -u "$DATABASEUSER" -powncloud -e "DROP DATABASE IF EXISTS $DATABASENAME" -h $DATABASEHOST || true
  206. else
  207. DATABASEHOST=127.0.0.1
  208. fi
  209. fi
  210. echo "Waiting for MySQL(utf8mb4) initialisation ..."
  211. if ! apps/files_external/tests/env/wait-for-connection $DATABASEHOST 3306 600; then
  212. echo "[ERROR] Waited 600 seconds, no response" >&2
  213. exit 1
  214. fi
  215. sleep 1
  216. echo "MySQL(utf8mb4) is up."
  217. _DB="mysql"
  218. cp tests/docker/mysqlmb4.config.php config
  219. fi
  220. if [ "$DB" == "mariadb" ] ; then
  221. if [ ! -z "$USEDOCKER" ] ; then
  222. echo "Fire up the mariadb docker"
  223. DOCKER_CONTAINER_ID=$(docker run \
  224. -v $BASEDIR/tests/docker/mariadb:/etc/mysql/conf.d \
  225. -e MYSQL_ROOT_PASSWORD=owncloud \
  226. -e MYSQL_USER="$DATABASEUSER" \
  227. -e MYSQL_PASSWORD=owncloud \
  228. -e MYSQL_DATABASE="$DATABASENAME" \
  229. -d mariadb)
  230. DATABASEHOST=$(docker inspect --format="{{.NetworkSettings.IPAddress}}" "$DOCKER_CONTAINER_ID")
  231. echo "Waiting for MariaDB initialisation ..."
  232. if ! apps/files_external/tests/env/wait-for-connection $DATABASEHOST 3306 600; then
  233. echo "[ERROR] Waited 600 seconds, no response" >&2
  234. exit 1
  235. fi
  236. echo "MariaDB is up."
  237. else
  238. if [ "MariaDB" != "$(mysql --version | grep -o MariaDB)" ] ; then
  239. echo "Your mysql binary is not provided by MariaDB"
  240. echo "To use the docker container set the USEDOCKER environment variable"
  241. exit -1
  242. fi
  243. mysql -u "$DATABASEUSER" -powncloud -e "DROP DATABASE IF EXISTS $DATABASENAME" -h $DATABASEHOST || true
  244. fi
  245. #Reset _DB to mysql since that is what we use internally
  246. _DB="mysql"
  247. fi
  248. if [ "$DB" == "pgsql" ] ; then
  249. if [ ! -z "$USEDOCKER" ] ; then
  250. echo "Fire up the postgres docker"
  251. DOCKER_CONTAINER_ID=$(docker run -e POSTGRES_USER="$DATABASEUSER" -e POSTGRES_PASSWORD=owncloud -d postgres)
  252. DATABASEHOST=$(docker inspect --format="{{.NetworkSettings.IPAddress}}" "$DOCKER_CONTAINER_ID")
  253. echo "Waiting for Postgres initialisation ..."
  254. # grep exits on the first match and then the script continues
  255. docker logs -f "$DOCKER_CONTAINER_ID" 2>&1 | grep -q "database system is ready to accept connections"
  256. echo "Postgres is up."
  257. else
  258. if [ -z "$DRONE" ] ; then # no need to drop the DB when we are on CI
  259. dropdb -U "$DATABASEUSER" "$DATABASENAME" || true
  260. fi
  261. fi
  262. fi
  263. if [ "$DB" == "oci" ] ; then
  264. echo "Fire up the oracle docker"
  265. DOCKER_CONTAINER_ID=$(docker run -d deepdiver/docker-oracle-xe-11g)
  266. DATABASEHOST=$(docker inspect --format="{{.NetworkSettings.IPAddress}}" "$DOCKER_CONTAINER_ID")
  267. echo "Waiting for Oracle initialization ... "
  268. # Try to connect to the OCI host via sqlplus to ensure that the connection is already running
  269. for i in {1..48}
  270. do
  271. if sqlplus "autotest/owncloud@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=$DATABASEHOST)(Port=1521))(CONNECT_DATA=(SID=XE)))" < /dev/null | grep 'Connected to'; then
  272. break;
  273. fi
  274. sleep 5
  275. done
  276. DATABASEUSER=autotest
  277. DATABASENAME='XE'
  278. fi
  279. # trigger installation
  280. echo "Installing ...."
  281. "$PHP" ./occ maintenance:install -vvv --database="$_DB" --database-name="$DATABASENAME" --database-host="$DATABASEHOST" --database-user="$DATABASEUSER" --database-pass=owncloud --database-table-prefix=oc_ --admin-user="$ADMINLOGIN" --admin-pass=admin --data-dir="$DATADIR"
  282. #test execution
  283. echo "Testing with $DB ..."
  284. cd tests
  285. rm -rf "coverage-html-$DB"
  286. mkdir "coverage-html-$DB"
  287. "$PHP" -f enable_all.php | grep -i -C9999 error && echo "Error during setup" && exit 101
  288. if [[ "$_XDEBUG_CONFIG" ]]; then
  289. export XDEBUG_CONFIG=$_XDEBUG_CONFIG
  290. fi
  291. GROUP=''
  292. if [ "$TEST_SELECTION" == "QUICKDB" ]; then
  293. GROUP='--group DB --exclude-group=SLOWDB'
  294. fi
  295. if [ "$TEST_SELECTION" == "DB" ]; then
  296. GROUP='--group DB,SLOWDB'
  297. fi
  298. if [ "$TEST_SELECTION" == "NODB" ]; then
  299. GROUP='--exclude-group DB,SLOWDB'
  300. fi
  301. COVER=''
  302. if [ -z "$NOCOVERAGE" ]; then
  303. COVER="--coverage-clover autotest-clover-$DB.xml --coverage-html coverage-html-$DB"
  304. else
  305. echo "No coverage"
  306. fi
  307. if [ -d "$2" ]; then
  308. for f in $(find "$2" -name '*.php'); do
  309. echo "${PHPUNIT[@]}" --configuration phpunit-autotest.xml $GROUP $COVER --log-junit "autotest-results-$DB.xml" "$2" / "$f" "$3"
  310. "${PHPUNIT[@]}" --configuration phpunit-autotest.xml $GROUP $COVER --log-junit "autotest-results-$DB.xml" "$f" "$3"
  311. RESULT=$?
  312. done;
  313. else
  314. echo "${PHPUNIT[@]}" --configuration phpunit-autotest.xml $GROUP $COVER --log-junit "autotest-results-$DB.xml" "$2" "$3"
  315. "${PHPUNIT[@]}" --configuration phpunit-autotest.xml $GROUP $COVER --log-junit "autotest-results-$DB.xml" "$2" "$3"
  316. RESULT=$?
  317. fi
  318. if [ "$PRIMARY_STORAGE_CONFIG" == "swift" ] ; then
  319. cd ..
  320. echo "Kill the swift docker"
  321. tests/objectstore/stop-swift-ceph.sh
  322. fi
  323. if [ ! -z "$DOCKER_CONTAINER_ID" ] ; then
  324. echo "Kill the docker $DOCKER_CONTAINER_ID"
  325. docker stop $DOCKER_CONTAINER_ID
  326. docker rm -f $DOCKER_CONTAINER_ID
  327. unset DOCKER_CONTAINER_ID
  328. fi
  329. }
  330. #
  331. # start test execution
  332. #
  333. if [ -z "$1" ]
  334. then
  335. # run all known database configs
  336. for DBCONFIG in $DBCONFIGS; do
  337. execute_tests "$DBCONFIG"
  338. done
  339. else
  340. FILENAME="$2"
  341. if [ ! -z "$2" ] && [ ! -f "tests/$FILENAME" ] && [ "${FILENAME:0:2}" != "--" ]; then
  342. FILENAME="../$FILENAME"
  343. fi
  344. execute_tests "$1" "$FILENAME" "$3"
  345. fi
  346. #
  347. # NOTES on mysql:
  348. # - CREATE DATABASE oc_autotest;
  349. # - CREATE USER 'oc_autotest'@'localhost' IDENTIFIED BY 'owncloud';
  350. # - grant all on oc_autotest.* to 'oc_autotest'@'localhost';
  351. #
  352. # - for parallel executor support with EXECUTOR_NUMBER=0:
  353. # - CREATE DATABASE oc_autotest0;
  354. # - CREATE USER 'oc_autotest0'@'localhost' IDENTIFIED BY 'owncloud';
  355. # - grant all on oc_autotest0.* to 'oc_autotest0'@'localhost';
  356. #
  357. # NOTES on pgsql:
  358. # - su - postgres
  359. # - createuser -P oc_autotest (enter password and enable superuser)
  360. # - to enable dropdb I decided to add following line to pg_hba.conf (this is not the safest way but I don't care for the testing machine):
  361. # local all all trust
  362. #
  363. # - for parallel executor support with EXECUTOR_NUMBER=0:
  364. # - createuser -P oc_autotest0 (enter password and enable superuser)
  365. #
  366. # NOTES on oci:
  367. # - it's a pure nightmare to install Oracle on a Linux-System
  368. # - DON'T TRY THIS AT HOME!
  369. # - if you really need it: we feel sorry for you
  370. #