aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/Profiler/Profile.php
blob: c611d79e259383d0f782e96e0a7255f20c74059f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<?php

declare(strict_types = 1);
/**
 * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
 * SPDX-License-Identifier: AGPL-3.0-or-later
 */

namespace OC\Profiler;

use OCP\DataCollector\IDataCollector;
use OCP\Profiler\IProfile;

class Profile implements \JsonSerializable, IProfile {
	private string $token;

	private ?int $time = null;

	private ?string $url = null;

	private ?string $method = null;

	private ?int $statusCode = null;

	/** @var array<string, IDataCollector> */
	private array $collectors = [];

	private ?IProfile $parent = null;

	/** @var IProfile[] */
	private array $children = [];

	public function __construct(string $token) {
		$this->token = $token;
	}

	public function getToken(): string {
		return $this->token;
	}

	public function setToken(string $token): void {
		$this->token = $token;
	}

	public function getTime(): ?int {
		return $this->time;
	}

	public function setTime(int $time): void {
		$this->time = $time;
	}

	public function getUrl(): ?string {
		return $this->url;
	}

	public function setUrl(string $url): void {
		$this->url = $url;
	}

	public function getMethod(): ?string {
		return $this->method;
	}

	public function setMethod(string $method): void {
		$this->method = $method;
	}

	public function getStatusCode(): ?int {
		return $this->statusCode;
	}

	public function setStatusCode(int $statusCode): void {
		$this->statusCode = $statusCode;
	}

	public function addCollector(IDataCollector $collector) {
		$this->collectors[$collector->getName()] = $collector;
	}

	public function getParent(): ?IProfile {
		return $this->parent;
	}

	public function setParent(?IProfile $parent): void {
		$this->parent = $parent;
	}

	public function getParentToken(): ?string {
		return $this->parent ? $this->parent->getToken() : null;
	}

	/** @return IProfile[] */
	public function getChildren(): array {
		return $this->children;
	}

	/**
	 * @param IProfile[] $children
	 */
	public function setChildren(array $children): void {
		$this->children = [];
		foreach ($children as $child) {
			$this->addChild($child);
		}
	}

	public function addChild(IProfile $profile): void {
		$this->children[] = $profile;
		$profile->setParent($this);
	}

	/**
	 * @return IDataCollector[]
	 */
	public function getCollectors(): array {
		return $this->collectors;
	}

	/**
	 * @param IDataCollector[] $collectors
	 */
	public function setCollectors(array $collectors): void {
		$this->collectors = $collectors;
	}

	public function __sleep(): array {
		return ['token', 'parent', 'children', 'collectors', 'method', 'url', 'time', 'statusCode'];
	}

	#[\ReturnTypeWillChange]
	public function jsonSerialize() {
		// Everything but parent
		return [
			'token' => $this->token,
			'method' => $this->method,
			'children' => $this->children,
			'url' => $this->url,
			'statusCode' => $this->statusCode,
			'time' => $this->time,
			'collectors' => $this->collectors,
		];
	}

	public function getCollector(string $collectorName): ?IDataCollector {
		if (!array_key_exists($collectorName, $this->collectors)) {
			return null;
		}
		return $this->collectors[$collectorName];
	}
}
="k">then echo "phpunit executable not found, please install phpunit version >= 6.5" >&2 exit 3 fi # PHPUnit might also be installed via a facade binary script if [[ "$PHPUNIT" =~ \.phar$ ]]; then PHPUNIT=( "$PHP" "$PHPUNIT" ) else PHPUNIT=( "$PHPUNIT" ) fi PHPUNIT_VERSION=$($PHPUNIT --version | cut -d" " -f2) PHPUNIT_MAJOR_VERSION=$(echo "$PHPUNIT_VERSION" | cut -d"." -f1) PHPUNIT_MINOR_VERSION=$(echo "$PHPUNIT_VERSION" | cut -d"." -f2) if ! [ "$PHPUNIT_MAJOR_VERSION" -gt 6 -o \( "$PHPUNIT_MAJOR_VERSION" -eq 6 -a "$PHPUNIT_MINOR_VERSION" -ge 5 \) ]; then echo "phpunit version >= 6.5 required. Version found: $PHPUNIT_VERSION" >&2 exit 4 fi if ! [ \( -w config -a ! -f config/config.php \) -o \( -f config/config.php -a -w config/config.php \) ]; then echo "Please enable write permissions on config and config/config.php" >&2 exit 1 fi if [ "$1" ]; then FOUND=0 for DBCONFIG in $DBCONFIGS; do if [ "$1" = "$DBCONFIG" ]; then FOUND=1 break fi done if [ $FOUND = 0 ]; then echo -e "Unknown database config name \"$1\"\n" >&2 print_syntax exit 2 fi fi if [ "$PRIMARY_STORAGE_CONFIG" ]; then FOUND=0 for PSC in $PRIMARY_STORAGE_CONFIGS; do if [ "$PRIMARY_STORAGE_CONFIG" = "$PSC" ]; then FOUND=1 break fi done if [ $FOUND = 0 ]; then echo -e "Unknown primary storage config name \"$PRIMARY_STORAGE_CONFIG\"\n" >&2 print_syntax exit 2 fi else PRIMARY_STORAGE_CONFIG="local" fi # Back up existing (dev) config if one exists and backup not already there if [ -f config/config.php ] && [ ! -f config/config-autotest-backup.php ]; then mv config/config.php config/config-autotest-backup.php fi function cleanup_config { if [ ! -z "$DOCKER_CONTAINER_ID" ]; then echo "Kill the docker $DOCKER_CONTAINER_ID" docker stop "$DOCKER_CONTAINER_ID" docker rm -f "$DOCKER_CONTAINER_ID" fi cd "$BASEDIR" if [ "$PRIMARY_STORAGE_CONFIG" == "swift" ] ; then echo "Kill the swift docker" tests/objectstore/stop-swift-ceph.sh fi # Restore existing config if [ -f config/config-autotest-backup.php ]; then mv config/config-autotest-backup.php config/config.php fi # Remove autotest config if [ -f config/autoconfig.php ]; then rm config/autoconfig.php fi # Remove autotest swift storage config if [ -f config/autotest-storage-swift.config.php ]; then rm config/autotest-storage-swift.config.php fi # Remove autotest redis config if [ -f config/redis.config.php ]; then rm config/redis.config.php fi # Remove mysqlmb4.config.php rm -f config/mysqlmb4.config.php } # restore config on exit trap cleanup_config EXIT # use tmpfs for datadir - should speedup unit test execution if [ -d /dev/shm ]; then DATADIR=/dev/shm/data-autotest$EXECUTOR_NUMBER else DATADIR=$BASEDIR/data-autotest fi echo "Using database $DATABASENAME" function execute_tests { DB=$1 echo "Setup environment for $DB testing on $PRIMARY_STORAGE_CONFIG storage ..." # back to root folder cd "$BASEDIR" # revert changes to tests/data git checkout tests/data # reset data directory rm -rf "$DATADIR" mkdir "$DATADIR" if [ "$PRIMARY_STORAGE_CONFIG" == "swift" ] ; then tests/objectstore/start-swift-ceph.sh cp tests/objectstore/swift.config.php config/autotest-storage-swift.config.php fi cp tests/preseed-config.php config/config.php if [ "$ENABLE_REDIS" == "true" ] ; then cp tests/redis.config.php config/redis.config.php elif [ "$ENABLE_REDIS_CLUSTER" == "true" ] ; then cp tests/redis-cluster.config.php config/redis.config.php fi _DB=$DB # drop database if [ "$DB" == "mysql" ] ; then if [ ! -z "$USEDOCKER" ] ; then echo "Fire up the mysql docker" DOCKER_CONTAINER_ID=$(docker run \ -v $BASEDIR/tests/docker/mariadb:/etc/mysql/conf.d \ -e MYSQL_ROOT_PASSWORD=owncloud \ -e MYSQL_USER="$DATABASEUSER" \ -e MYSQL_PASSWORD=owncloud \ -e MYSQL_DATABASE="$DATABASENAME" \ -d mysql) DATABASEHOST=$(docker inspect --format="{{.NetworkSettings.IPAddress}}" "$DOCKER_CONTAINER_ID") else if [ -z "$DRONE" ] ; then # no need to drop the DB when we are on CI if [ "mysql" != "$(mysql --version | grep -o mysql)" ] ; then echo "Your mysql binary is not provided by mysql" echo "To use the docker container set the USEDOCKER environment variable" exit -1 fi mysql -u "$DATABASEUSER" -powncloud -e "DROP DATABASE IF EXISTS $DATABASENAME" -h $DATABASEHOST || true else DATABASEHOST=mysql fi fi echo "Waiting for MySQL initialisation ..." if ! apps/files_external/tests/env/wait-for-connection $DATABASEHOST 3306 300; then echo "[ERROR] Waited 300 seconds, no response" >&2 exit 1 fi fi if [ "$DB" == "mysqlmb4" ] ; then if [ ! -z "$USEDOCKER" ] ; then echo "Fire up the mysql docker" DOCKER_CONTAINER_ID=$(docker run \ -v $BASEDIR/tests/docker/mysqlmb4:/etc/mysql/conf.d \ -e MYSQL_ROOT_PASSWORD=owncloud \ -e MYSQL_USER="$DATABASEUSER" \ -e MYSQL_PASSWORD=owncloud \ -e MYSQL_DATABASE="$DATABASENAME" \ -d mysql:5.7 \ --innodb_large_prefix=true \ --innodb_file_format=barracuda \ --innodb_file_per_table=true) DATABASEHOST=$(docker inspect --format="{{.NetworkSettings.IPAddress}}" "$DOCKER_CONTAINER_ID") else if [ -z "$DRONE" ] ; then # no need to drop the DB when we are on CI if [ "mysql" != "$(mysql --version | grep -o mysql)" ] ; then echo "Your mysql binary is not provided by mysql" echo "To use the docker container set the USEDOCKER environment variable" exit -1 fi mysql -u "$DATABASEUSER" -powncloud -e "DROP DATABASE IF EXISTS $DATABASENAME" -h $DATABASEHOST || true else DATABASEHOST=mysqlmb4 fi fi echo "Waiting for MySQL(utf8mb4) initialisation ..." if ! apps/files_external/tests/env/wait-for-connection $DATABASEHOST 3306 300; then echo "[ERROR] Waited 300 seconds, no response" >&2 exit 1 fi sleep 1 echo "MySQL(utf8mb4) is up." _DB="mysql" cp tests/docker/mysqlmb4.config.php config fi if [ "$DB" == "mariadb" ] ; then if [ ! -z "$USEDOCKER" ] ; then echo "Fire up the mariadb docker" DOCKER_CONTAINER_ID=$(docker run \ -v $BASEDIR/tests/docker/mariadb:/etc/mysql/conf.d \ -e MYSQL_ROOT_PASSWORD=owncloud \ -e MYSQL_USER="$DATABASEUSER" \ -e MYSQL_PASSWORD=owncloud \ -e MYSQL_DATABASE="$DATABASENAME" \ -d mariadb) DATABASEHOST=$(docker inspect --format="{{.NetworkSettings.IPAddress}}" "$DOCKER_CONTAINER_ID") echo "Waiting for MariaDB initialisation ..." if ! apps/files_external/tests/env/wait-for-connection $DATABASEHOST 3306 300; then echo "[ERROR] Waited 300 seconds, no response" >&2 exit 1 fi echo "MariaDB is up." else if [ -z "$DRONE" ] ; then # no need to drop the DB when we are on CI if [ "MariaDB" != "$(mysql --version | grep -o MariaDB)" ] ; then echo "Your mysql binary is not provided by MariaDB" echo "To use the docker container set the USEDOCKER environment variable" exit -1 fi mysql -u "$DATABASEUSER" -powncloud -e "DROP DATABASE IF EXISTS $DATABASENAME" -h $DATABASEHOST || true else DATABASEHOST=mariadb fi fi echo "Waiting for MariaDB initialisation ..." if ! apps/files_external/tests/env/wait-for-connection $DATABASEHOST 3306 300; then echo "[ERROR] Waited 300 seconds, no response" >&2 exit 1 fi #Reset _DB to mysql since that is what we use internally _DB="mysql" fi if [ "$DB" == "pgsql" ] ; then if [ ! -z "$USEDOCKER" ] ; then echo "Fire up the postgres docker" DOCKER_CONTAINER_ID=$(docker run -e POSTGRES_USER="$DATABASEUSER" -e POSTGRES_PASSWORD=owncloud -d postgres) DATABASEHOST=$(docker inspect --format="{{.NetworkSettings.IPAddress}}" "$DOCKER_CONTAINER_ID") echo "Waiting for Postgres initialisation ..." if ! apps/files_external/tests/env/wait-for-connection $DATABASEHOST 5432 60; then echo "[ERROR] Waited 60 seconds for $DATABASEHOST, no response" >&2 exit 1 fi echo "Postgres is up." else if [ ! -z "$DRONE" ] ; then DATABASEHOST="postgres-$POSTGRES" fi echo "Waiting for Postgres to be available ..." if ! apps/files_external/tests/env/wait-for-connection $DATABASEHOST 5432 60; then echo "[ERROR] Waited 60 seconds for $DATABASEHOST, no response" >&2 exit 1 fi echo "Give it 10 additional seconds ..." sleep 10 if [ -z "$DRONE" ] ; then # no need to drop the DB when we are on CI dropdb -U "$DATABASEUSER" "$DATABASENAME" || true fi fi fi if [ "$DB" == "oci" ] ; then echo "Fire up the oracle docker" DOCKER_CONTAINER_ID=$(docker run -d deepdiver/docker-oracle-xe-11g) DATABASEHOST=$(docker inspect --format="{{.NetworkSettings.IPAddress}}" "$DOCKER_CONTAINER_ID") echo "Waiting for Oracle initialization ... " # Try to connect to the OCI host via sqlplus to ensure that the connection is already running for i in {1..48} do if sqlplus "autotest/owncloud@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=$DATABASEHOST)(Port=1521))(CONNECT_DATA=(SID=XE)))" < /dev/null | grep 'Connected to'; then break; fi sleep 5 done DATABASEUSER=autotest DATABASENAME='XE' fi # trigger installation echo "Installing ...." "$PHP" ./occ maintenance:install -vvv --database="$_DB" --database-name="$DATABASENAME" --database-host="$DATABASEHOST" --database-user="$DATABASEUSER" --database-pass=owncloud --admin-user="$ADMINLOGIN" --admin-pass=admin --data-dir="$DATADIR" #test execution echo "Testing with $DB ..." cd tests rm -rf "coverage-html-$DB" mkdir "coverage-html-$DB" "$PHP" -f enable_all.php | grep -i -C9999 error && echo "Error during setup" && exit 101 if [[ "$_XDEBUG_CONFIG" ]]; then export XDEBUG_CONFIG=$_XDEBUG_CONFIG fi GROUP='' if [ "$TEST_SELECTION" == "QUICKDB" ]; then GROUP='--group DB --exclude-group=SLOWDB' fi if [ "$TEST_SELECTION" == "DB" ]; then GROUP='--group DB,SLOWDB' fi if [ "$TEST_SELECTION" == "NODB" ]; then GROUP='--exclude-group DB,SLOWDB' fi if [ "$TEST_SELECTION" == "PRIMARY-s3" ]; then GROUP='--group PRIMARY-s3' fi if [ "$TEST_SELECTION" == "PRIMARY-azure" ]; then GROUP='--group PRIMARY-azure' fi if [ "$TEST_SELECTION" == "PRIMARY-swift" ]; then GROUP='--group PRIMARY-swift' fi COVER='' if [ -z "$NOCOVERAGE" ]; then COVER="--coverage-clover autotest-clover-$DB.xml --coverage-html coverage-html-$DB" else echo "No coverage" fi echo "$PHP" "${PHPUNIT[@]}" --configuration phpunit-autotest.xml $GROUP $COVER --log-junit "autotest-results-$DB.xml" "$2" "$3" "$PHP" "${PHPUNIT[@]}" --configuration phpunit-autotest.xml $GROUP $COVER --log-junit "autotest-results-$DB.xml" "$2" "$3" RESULT=$? if [ "$PRIMARY_STORAGE_CONFIG" == "swift" ] ; then cd .. echo "Kill the swift docker" tests/objectstore/stop-swift-ceph.sh fi if [ ! -z "$DOCKER_CONTAINER_ID" ] ; then echo "Kill the docker $DOCKER_CONTAINER_ID" docker stop $DOCKER_CONTAINER_ID docker rm -f $DOCKER_CONTAINER_ID unset DOCKER_CONTAINER_ID fi } # # start test execution # if [ -z "$1" ] then # run all known database configs for DBCONFIG in $DBCONFIGS; do execute_tests "$DBCONFIG" done else FILENAME="$2" if [ ! -z "$2" ] && [ ! -f "tests/$FILENAME" ] && [ "${FILENAME:0:2}" != "--" ]; then FILENAME="../$FILENAME" fi execute_tests "$1" "$FILENAME" "$3" fi # # NOTES on mysql: # - CREATE DATABASE oc_autotest; # - CREATE USER 'oc_autotest'@'localhost' IDENTIFIED BY 'owncloud'; # - grant all on oc_autotest.* to 'oc_autotest'@'localhost'; # # - for parallel executor support with EXECUTOR_NUMBER=0: # - CREATE DATABASE oc_autotest0; # - CREATE USER 'oc_autotest0'@'localhost' IDENTIFIED BY 'owncloud'; # - grant all on oc_autotest0.* to 'oc_autotest0'@'localhost'; # # NOTES on pgsql: # - su - postgres # - createuser -P oc_autotest (enter password and enable superuser) # - 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): # local all all trust # # - for parallel executor support with EXECUTOR_NUMBER=0: # - createuser -P oc_autotest0 (enter password and enable superuser) # # NOTES on oci: # - it's a pure nightmare to install Oracle on a Linux-System # - DON'T TRY THIS AT HOME! # - if you really need it: we feel sorry for you #