1--TEST--
2mysqli_debug() - mysqlnd only control strings
3--SKIPIF--
4<?php
5require_once('skipif.inc');
6require_once('skipifemb.inc');
7require_once('skipifconnectfailure.inc');
8require_once('connect.inc');
9
10if (!function_exists('mysqli_debug'))
11 	die("skip mysqli_debug() not available");
12
13if (!defined('MYSQLI_DEBUG_TRACE_ENABLED'))
14	die("skip: can't say for sure if mysqli_debug works");
15
16if (defined('MYSQLI_DEBUG_TRACE_ENABLED') && !MYSQLI_DEBUG_TRACE_ENABLED)
17	die("skip: debug functionality not enabled");
18
19if (!$IS_MYSQLND)
20	die("skip mysqlnd only test");
21?>
22--FILE--
23<?php
24	require_once('connect.inc');
25	require_once('table.inc');
26
27	function try_control_string($link, $control_string, $trace_file, $offset) {
28
29		@unlink($trace_file);
30		if (true !== ($tmp = @mysqli_debug($control_string))) {
31			printf("[%03d][control string '%s'] Expecting boolean/true, got %s/%s.\n",
32				$offset + 1,
33				$control_string,
34				gettype($tmp),
35				$tmp);
36			return false;
37		}
38
39		if (!$res = mysqli_query($link, 'SELECT * FROM test')) {
40			printf("[%03d][control string '%s'] [%d] %s.\n",
41				$offset + 2,
42				$control_string,
43				mysqli_errno($link),
44				mysqli_error($link));
45			return false;
46		}
47		while ($row = mysqli_fetch_assoc($res))
48			;
49		mysqli_free_result($res);
50
51		clearstatcache();
52		if (!file_exists($trace_file)) {
53			printf("[%03d][control string '%s'] Trace file has not been written.\n",
54				$offset + 3,
55				$control_string,
56				gettype($tmp),
57				$tmp);
58			return false;
59		}
60
61		return trim(substr(file_get_contents($trace_file), 0, 100024));
62	}
63
64	$memory_funcs = array(
65		'_mysqlnd_ecalloc',
66		'_mysqlnd_emalloc',
67		'_mysqlnd_palloc_free_thd_cache_reference',
68		'_mysqlnd_pecalloc',
69		'_mysqlnd_pefree',
70		'_mysqlnd_pemalloc',
71		'_mysqlnd_perealloc',
72	);
73	$trace_file = sprintf('%s%s%s', sys_get_temp_dir(), DIRECTORY_SEPARATOR, 'mysqli_debug_phpt.trace');
74
75	$trace = try_control_string($link, 't:m:O,' . $trace_file, $trace_file, 10);
76	if (!strstr($trace, 'SELECT * FROM test') && !strstr($trace, 'mysql_real_query'))
77		printf("[015] SELECT query cannot be found in trace. Trace contents seems wrong.\n");
78
79	$lines_trace = explode("\n", $trace);
80	$functions_trace = array();
81	foreach ($lines_trace as $k => $line) {
82		$line = trim($line);
83		if (preg_match("@^[|\s]*>([\w:]+)@ism", $line, $matches)) {
84			$functions_trace[$matches[1]] = $matches[1];
85		}
86	}
87
88	$found = 0;
89	foreach ($memory_funcs as $k => $name)
90		if (isset($functions_trace[$name]))
91			$found++;
92
93	if ($found < 1) {
94		printf("[016] Only %d memory functions have been found, expecting at least %d.\n",
95			$found, 1);
96		var_dump($trace);
97	}
98
99	$trace = try_control_string($link, 't:O,' . $trace_file, $trace_file, 20);
100	if (!strstr($trace, 'SELECT * FROM test') && !strstr($trace, 'mysql_real_query'))
101		printf("[025] SELECT query cannot be found in trace. Trace contents seems wrong.\n");
102
103	$lines_trace = explode("\n", $trace);
104	$functions_trace = array();
105	foreach ($lines_trace as $k => $line) {
106		$line = trim($line);
107		if (preg_match("@^[|\s]*>([\w:]+)@ism", $line, $matches)) {
108			$functions_trace[$matches[1]] = $matches[1];
109		}
110	}
111
112	$found = 0;
113	foreach ($memory_funcs as $k => $name)
114		if (isset($functions_trace[$name]))
115			$found++;
116
117	if ($found > 2) {
118		printf("[026] More than %d memory functions have been recorded, that's strange.\n",
119			$found);
120		var_dump($trace);
121	}
122
123	mysqli_close($link);
124	@unlink($trace_file);
125	print "done!";
126?>
127--CLEAN--
128<?php
129	require_once("clean_table.inc");
130?>
131--EXPECT--
132done!
133