Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

12 роки тому
12 роки тому
12 роки тому
12 роки тому
12 роки тому
12 роки тому
12 роки тому
12 роки тому
12 роки тому
12 роки тому
12 роки тому
12 роки тому
12 роки тому
12 роки тому
8 роки тому
8 роки тому
12 роки тому
12 роки тому
12 роки тому
12 роки тому
12 роки тому
12 роки тому
11 роки тому
11 роки тому
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  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"
  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 >= 3.7" >&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 4 \) ]; then
  62. echo "phpunit version >= 4.4 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. echo "Waiting for MySQL initialisation ..."
  167. if ! apps/files_external/tests/env/wait-for-connection $DATABASEHOST 3306 60; then
  168. echo "[ERROR] Waited 60 seconds, no response" >&2
  169. exit 1
  170. fi
  171. echo "MySQL is up."
  172. else
  173. if [ "mysql" != "$(mysql --version | grep -o mysql)" ] ; then
  174. echo "Your mysql binary is not provided by mysql"
  175. echo "To use the docker container set the USEDOCKER environment variable"
  176. exit -1
  177. fi
  178. mysql -u "$DATABASEUSER" -powncloud -e "DROP DATABASE IF EXISTS $DATABASENAME" -h $DATABASEHOST || true
  179. fi
  180. fi
  181. if [ "$DB" == "mariadb" ] ; then
  182. if [ ! -z "$USEDOCKER" ] ; then
  183. echo "Fire up the mariadb docker"
  184. DOCKER_CONTAINER_ID=$(docker run \
  185. -v $BASEDIR/tests/docker/mariadb:/etc/mysql/conf.d \
  186. -e MYSQL_ROOT_PASSWORD=owncloud \
  187. -e MYSQL_USER="$DATABASEUSER" \
  188. -e MYSQL_PASSWORD=owncloud \
  189. -e MYSQL_DATABASE="$DATABASENAME" \
  190. -d mariadb)
  191. DATABASEHOST=$(docker inspect --format="{{.NetworkSettings.IPAddress}}" "$DOCKER_CONTAINER_ID")
  192. echo "Waiting for MariaDB initialisation ..."
  193. if ! apps/files_external/tests/env/wait-for-connection $DATABASEHOST 3306 60; then
  194. echo "[ERROR] Waited 60 seconds, no response" >&2
  195. exit 1
  196. fi
  197. echo "MariaDB is up."
  198. else
  199. if [ "MariaDB" != "$(mysql --version | grep -o MariaDB)" ] ; then
  200. echo "Your mysql binary is not provided by MariaDB"
  201. echo "To use the docker container set the USEDOCKER environment variable"
  202. exit -1
  203. fi
  204. mysql -u "$DATABASEUSER" -powncloud -e "DROP DATABASE IF EXISTS $DATABASENAME" -h $DATABASEHOST || true
  205. fi
  206. #Reset _DB to mysql since that is what we use internally
  207. _DB="mysql"
  208. fi
  209. if [ "$DB" == "pgsql" ] ; then
  210. if [ ! -z "$USEDOCKER" ] ; then
  211. echo "Fire up the postgres docker"
  212. DOCKER_CONTAINER_ID=$(docker run -e POSTGRES_USER="$DATABASEUSER" -e POSTGRES_PASSWORD=owncloud -d postgres)
  213. DATABASEHOST=$(docker inspect --format="{{.NetworkSettings.IPAddress}}" "$DOCKER_CONTAINER_ID")
  214. echo "Waiting for Postgres initialisation ..."
  215. # grep exits on the first match and then the script continues
  216. docker logs -f "$DOCKER_CONTAINER_ID" 2>&1 | grep -q "database system is ready to accept connections"
  217. echo "Postgres is up."
  218. else
  219. dropdb -U "$DATABASEUSER" "$DATABASENAME" || true
  220. fi
  221. fi
  222. if [ "$DB" == "oci" ] ; then
  223. echo "Fire up the oracle docker"
  224. DOCKER_CONTAINER_ID=$(docker run -d deepdiver/docker-oracle-xe-11g)
  225. DATABASEHOST=$(docker inspect --format="{{.NetworkSettings.IPAddress}}" "$DOCKER_CONTAINER_ID")
  226. echo "Waiting for Oracle initialization ... "
  227. # Try to connect to the OCI host via sqlplus to ensure that the connection is already running
  228. for i in {1..48}
  229. do
  230. if sqlplus "autotest/owncloud@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=$DATABASEHOST)(Port=1521))(CONNECT_DATA=(SID=XE)))" < /dev/null | grep 'Connected to'; then
  231. break;
  232. fi
  233. sleep 5
  234. done
  235. DATABASEUSER=autotest
  236. DATABASENAME='XE'
  237. fi
  238. # trigger installation
  239. echo "Installing ...."
  240. "$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"
  241. #test execution
  242. echo "Testing with $DB ..."
  243. cd tests
  244. rm -rf "coverage-html-$DB"
  245. mkdir "coverage-html-$DB"
  246. "$PHP" -f enable_all.php | grep -i -C9999 error && echo "Error during setup" && exit 101
  247. if [[ "$_XDEBUG_CONFIG" ]]; then
  248. export XDEBUG_CONFIG=$_XDEBUG_CONFIG
  249. fi
  250. GROUP=''
  251. if [ "$TEST_SELECTION" == "DB" ]; then
  252. GROUP='--group DB'
  253. fi
  254. if [ "$TEST_SELECTION" == "NODB" ]; then
  255. GROUP='--exclude-group DB'
  256. fi
  257. COVER=''
  258. if [ -z "$NOCOVERAGE" ]; then
  259. COVER="--coverage-clover autotest-clover-$DB.xml --coverage-html coverage-html-$DB"
  260. else
  261. echo "No coverage"
  262. fi
  263. echo "${PHPUNIT[@]}" --configuration phpunit-autotest.xml $GROUP $COVER --log-junit "autotest-results-$DB.xml" "$2" "$3"
  264. "${PHPUNIT[@]}" --configuration phpunit-autotest.xml $GROUP $COVER --log-junit "autotest-results-$DB.xml" "$2" "$3"
  265. RESULT=$?
  266. if [ "$PRIMARY_STORAGE_CONFIG" == "swift" ] ; then
  267. cd ..
  268. echo "Kill the swift docker"
  269. tests/objectstore/stop-swift-ceph.sh
  270. fi
  271. if [ ! -z "$DOCKER_CONTAINER_ID" ] ; then
  272. echo "Kill the docker $DOCKER_CONTAINER_ID"
  273. docker stop $DOCKER_CONTAINER_ID
  274. docker rm -f $DOCKER_CONTAINER_ID
  275. unset DOCKER_CONTAINER_ID
  276. fi
  277. }
  278. #
  279. # start test execution
  280. #
  281. if [ -z "$1" ]
  282. then
  283. # run all known database configs
  284. for DBCONFIG in $DBCONFIGS; do
  285. execute_tests "$DBCONFIG"
  286. done
  287. else
  288. FILENAME="$2"
  289. if [ ! -z "$2" ] && [ ! -f "tests/$FILENAME" ]; then
  290. FILENAME="../$FILENAME"
  291. fi
  292. execute_tests "$1" "$FILENAME" "$3"
  293. fi
  294. #
  295. # NOTES on mysql:
  296. # - CREATE DATABASE oc_autotest;
  297. # - CREATE USER 'oc_autotest'@'localhost' IDENTIFIED BY 'owncloud';
  298. # - grant all on oc_autotest.* to 'oc_autotest'@'localhost';
  299. #
  300. # - for parallel executor support with EXECUTOR_NUMBER=0:
  301. # - CREATE DATABASE oc_autotest0;
  302. # - CREATE USER 'oc_autotest0'@'localhost' IDENTIFIED BY 'owncloud';
  303. # - grant all on oc_autotest0.* to 'oc_autotest0'@'localhost';
  304. #
  305. # NOTES on pgsql:
  306. # - su - postgres
  307. # - createuser -P oc_autotest (enter password and enable superuser)
  308. # - 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):
  309. # local all all trust
  310. #
  311. # - for parallel executor support with EXECUTOR_NUMBER=0:
  312. # - createuser -P oc_autotest0 (enter password and enable superuser)
  313. #
  314. # NOTES on oci:
  315. # - it's a pure nightmare to install Oracle on a Linux-System
  316. # - DON'T TRY THIS AT HOME!
  317. # - if you really need it: we feel sorry for you
  318. #