1--TEST--
2Interface of the class mysqli
3--SKIPIF--
4<?php
5require_once('skipif.inc');
6require_once('skipifemb.inc');
7require_once('skipifconnectfailure.inc');
8?>
9--FILE--
10<?php
11	require('connect.inc');
12
13	$mysqli = new mysqli($host, $user, $passwd, $db, $port, $socket);
14	$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket);
15
16	printf("Parent class:\n");
17	var_dump(get_parent_class($mysqli));
18
19	printf("\nMethods:\n");
20	$methods = get_class_methods($mysqli);
21	$expected_methods = array(
22		'__construct'			=> true,
23		'autocommit'			=> true,
24		'begin_transaction'		=> true,
25		'change_user'			=> true,
26		'character_set_name'	=> true,
27		'close'					=> true,
28		'commit'				=> true,
29		'connect'				=> true,
30		'dump_debug_info'		=> true,
31		'escape_string'			=> true,
32		'get_charset'			=> true,
33		'get_client_info'		=> true,
34		'get_server_info'		=> true,
35		'get_warnings'			=> true,
36		'init'					=> true,
37		'kill'					=> true,
38		'more_results'			=> true,
39		'multi_query'			=> true,
40		'next_result'			=> true,
41		'options'				=> true,
42		'ping'					=> true,
43		'prepare'				=> true,
44		'query'					=> true,
45		'real_connect'			=> true,
46		'real_escape_string'	=> true,
47		'real_query'			=> true,
48		'refresh'				=> true,
49		'rollback'				=> true,
50		'release_savepoint'		=> true,
51		'savepoint'				=> true,
52		'select_db'				=> true,
53		'set_charset'			=> true,
54		'set_opt'				=> true,
55		'ssl_set'				=> true,
56		'stat'					=> true,
57		'stmt_init'				=> true,
58		'store_result'			=> true,
59		'thread_safe'			=> true,
60		'use_result'			=> true,
61	);
62
63	if ($IS_MYSQLND) {
64		// mysqlnd only
65		/* $expected_methods['get_client_stats']	= true; */
66		$expected_methods['get_connection_stats']	= true;
67		$expected_methods['reap_async_query']	= true;
68		$expected_methods['poll'] = true;
69	}
70
71	/* we should add ruled when to expect them */
72	if (function_exists('mysqli_debug'))
73		$expected_methods['debug']		= true;
74	if (function_exists('ssl_set'))
75		$expected_methods['ssl_set']		= true;
76
77	foreach ($methods as $k => $method) {
78		if (isset($expected_methods[$method])) {
79			unset($methods[$k]);
80			unset($expected_methods[$method]);
81		}
82	}
83	if (!empty($methods)) {
84		printf("Dumping list of unexpected methods.\n");
85		var_dump($methods);
86	}
87	if (!empty($expected_methods)) {
88		printf("Dumping list of missing methods.\n");
89		var_dump($expected_methods);
90	}
91	if (empty($methods) && empty($expected_methods))
92		printf("ok\n");
93
94	printf("\nClass variables:\n");
95
96	$expected_class_variables = $expected_object_variables = array(
97		"affected_rows" 	=> true,
98		"client_info"		=> true,
99		"client_version"	=> true,
100		"connect_errno"		=> true,
101		"connect_error"		=> true,
102		"errno"				=> true,
103		"error"				=> true,
104		"field_count"		=> true,
105		"host_info"			=> true,
106		"info"				=> true,
107		"insert_id"			=> true,
108		"protocol_version"	=> true,
109		"server_info"		=> true,
110		"server_version"	=> true,
111		"sqlstate"			=> true,
112		"stat"				=> true,
113		"thread_id"			=> true,
114		"warning_count"		=> true,
115	);
116
117	$expected_class_variables["error_list"] = true;
118	$expected_object_variables["error_list"] = true;
119
120	$variables = get_class_vars(get_class($mysqli));
121	foreach ($variables as $var => $v) {
122		if (isset($expected_class_variables[$var])) {
123			unset($expected_class_variables[$var]);
124			unset($variables[$var]);
125		}
126	}
127
128	if (!empty($expected_class_variables)) {
129	  printf("Dumping list of missing class variables\n");
130	  var_dump($expected_class_variables);
131	}
132	if (!empty($variables)) {
133	  printf("Dumping list of unexpected class variables\n");
134	  var_dump($variables);
135	}
136	echo "ok\n";
137
138	printf("\nObject variables:\n");
139	$variables = get_object_vars($mysqli);
140	foreach ($variables as $var => $v) {
141		if (isset($expected_object_variables[$var])) {
142			unset($expected_object_variables[$var]);
143			unset($variables[$var]);
144		}
145	}
146
147	if (!empty($expected_object_variables)) {
148	  printf("Dumping list of missing object variables\n");
149	  var_dump($expected_object_variables);
150	}
151	if (!empty($variables)) {
152	  printf("Dumping list of unexpected object variables\n");
153	  var_dump($variables);
154	}
155	echo "ok\n";
156
157
158	printf("\nMagic, magic properties:\n");
159
160	assert(mysqli_affected_rows($link) === $mysqli->affected_rows);
161	printf("mysqli->affected_rows = '%s'/%s ('%s'/%s)\n",
162		$mysqli->affected_rows, gettype($mysqli->affected_rows),
163		mysqli_affected_rows($link), gettype(mysqli_affected_rows($link)));
164
165	assert(mysqli_get_client_info() === $mysqli->client_info);
166	printf("mysqli->client_info = '%s'/%s ('%s'/%s)\n",
167		$mysqli->client_info, gettype($mysqli->client_info),
168		mysqli_get_client_info(), gettype(mysqli_get_client_info()));
169
170	assert(mysqli_get_client_version() === $mysqli->client_version);
171	printf("mysqli->client_version =  '%s'/%s ('%s'/%s)\n",
172		$mysqli->client_version, gettype($mysqli->client_version),
173		mysqli_get_client_version(), gettype(mysqli_get_client_version()));
174
175	assert(mysqli_errno($link) === $mysqli->errno);
176	printf("mysqli->errno = '%s'/%s ('%s'/%s)\n",
177		$mysqli->errno, gettype($mysqli->errno),
178		mysqli_errno($link), gettype(mysqli_errno($link)));
179
180	assert(mysqli_error($link) === $mysqli->error);
181	printf("mysqli->error = '%s'/%s ('%s'/%s)\n",
182		$mysqli->error, gettype($mysqli->error),
183		mysqli_error($link), gettype(mysqli_error($link)));
184
185	assert(mysqli_error_list($link) === $mysqli->error_list);
186	assert(is_array($mysqli->error_list));
187
188	assert(mysqli_field_count($link) === $mysqli->field_count);
189	printf("mysqli->field_count = '%s'/%s ('%s'/%s)\n",
190		$mysqli->field_count, gettype($mysqli->field_count),
191		mysqli_field_count($link), gettype(mysqli_field_count($link)));
192
193	assert(mysqli_insert_id($link) === $mysqli->insert_id);
194	printf("mysqli->insert_id = '%s'/%s ('%s'/%s)\n",
195		$mysqli->insert_id, gettype($mysqli->insert_id),
196		mysqli_insert_id($link), gettype(mysqli_insert_id($link)));
197
198	assert(mysqli_sqlstate($link) === $mysqli->sqlstate);
199	printf("mysqli->sqlstate = '%s'/%s ('%s'/%s)\n",
200		$mysqli->sqlstate, gettype($mysqli->sqlstate),
201		mysqli_sqlstate($link), gettype(mysqli_sqlstate($link)));
202
203	assert(soundex(mysqli_stat($link)) == soundex($mysqli->stat));
204	printf("mysqli->stat = '%s'/%s ('%s'/%s)\n",
205		$mysqli->stat, gettype($mysqli->stat),
206		mysqli_stat($link), gettype(mysqli_stat($link)));
207
208	assert(mysqli_get_host_info($link) === $mysqli->host_info);
209	printf("mysqli->host_info = '%s'/%s ('%s'/%s)\n",
210		$mysqli->host_info, gettype($mysqli->host_info),
211		mysqli_get_host_info($link), gettype(mysqli_get_host_info($link)));
212
213	/* note that the data types are different */
214	assert(mysqli_info($link) == $mysqli->info);
215	printf("mysqli->info = '%s'/%s ('%s'/%s)\n",
216		$mysqli->info, gettype($mysqli->info),
217		mysqli_info($link), gettype(mysqli_info($link)));
218
219	assert(mysqli_thread_id($link) > $mysqli->thread_id);
220	assert(gettype($mysqli->thread_id) == gettype(mysqli_thread_id($link)));
221	printf("mysqli->thread_id = '%s'/%s ('%s'/%s)\n",
222		$mysqli->thread_id, gettype($mysqli->thread_id),
223		mysqli_thread_id($link), gettype(mysqli_thread_id($link)));
224
225	assert(mysqli_get_proto_info($link) === $mysqli->protocol_version);
226	printf("mysqli->protocol_version = '%s'/%s ('%s'/%s)\n",
227		$mysqli->protocol_version, gettype($mysqli->protocol_version),
228		mysqli_get_proto_info($link), gettype(mysqli_get_proto_info($link)));
229
230	assert(mysqli_get_server_info($link) === $mysqli->server_info);
231	printf("mysqli->server_info = '%s'/%s ('%s'/%s)\n",
232		$mysqli->server_info, gettype($mysqli->server_info),
233		mysqli_get_server_info($link), gettype(mysqli_get_server_info($link)));
234
235	assert(mysqli_get_server_version($link) === $mysqli->server_version);
236	printf("mysqli->server_version = '%s'/%s ('%s'/%s)\n",
237		$mysqli->server_version, gettype($mysqli->server_version),
238		mysqli_get_server_version($link), gettype(mysqli_get_server_version($link)));
239
240	assert(mysqli_warning_count($link) === $mysqli->warning_count);
241	printf("mysqli->warning_count = '%s'/%s ('%s'/%s)\n",
242		$mysqli->warning_count, gettype($mysqli->warning_count),
243		mysqli_warning_count($link), gettype(mysqli_warning_count($link)));
244
245	printf("\nAccess to undefined properties:\n");
246	printf("mysqli->unknown = '%s'\n", @$mysqli->unknown);
247
248	@$mysqli->unknown = 13;
249	printf("setting mysqli->unknown, mysqli_unknown = '%s'\n", @$mysqli->unknown);
250
251	$unknown = 'friday';
252	@$mysqli->unknown = $unknown;
253	printf("setting mysqli->unknown, mysqli_unknown = '%s'\n", @$mysqli->unknown);
254
255	$mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket);
256	printf("\nAccess hidden properties for MYSLQI_STATUS_INITIALIZED (TODO documentation):\n");
257	assert(mysqli_connect_error() === $mysqli->connect_error);
258	printf("mysqli->connect_error = '%s'/%s ('%s'/%s)\n",
259		$mysqli->connect_error, gettype($mysqli->connect_error),
260		mysqli_connect_error(), gettype(mysqli_connect_error()));
261
262	assert(mysqli_connect_errno() === $mysqli->connect_errno);
263	printf("mysqli->connect_errno = '%s'/%s ('%s'/%s)\n",
264		$mysqli->connect_errno, gettype($mysqli->connect_errno),
265		mysqli_connect_errno(), gettype(mysqli_connect_errno()));
266
267	print "done!";
268?>
269--EXPECTF--
270Parent class:
271bool(false)
272
273Methods:
274ok
275
276Class variables:
277ok
278
279Object variables:
280ok
281
282Magic, magic properties:
283mysqli->affected_rows = '%s'/integer ('%s'/integer)
284mysqli->client_info = '%s'/string ('%s'/string)
285mysqli->client_version =  '%d'/integer ('%d'/integer)
286mysqli->errno = '0'/integer ('0'/integer)
287mysqli->error = ''/string (''/string)
288mysqli->field_count = '0'/integer ('0'/integer)
289mysqli->insert_id = '0'/integer ('0'/integer)
290mysqli->sqlstate = '00000'/string ('00000'/string)
291mysqli->stat = 'Uptime: %d  Threads: %d  Questions: %d  Slow queries: %d  Opens: %d  Flush tables: %d  Open tables: %d  Queries per second avg: %d.%d'/string ('Uptime: %d  Threads: %d  Questions: %d  Slow queries: %d  Opens: %d  Flush tables: %d  Open tables: %d  Queries per second avg: %d.%d'/string)
292mysqli->host_info = '%s'/string ('%s'/string)
293mysqli->info = ''/NULL (''/NULL)
294mysqli->thread_id = '%d'/integer ('%d'/integer)
295mysqli->protocol_version = '%d'/integer ('%d'/integer)
296mysqli->server_info = '%s'/string ('%s'/string)
297mysqli->server_version = '%d'/integer ('%d'/integer)
298mysqli->warning_count = '0'/integer ('0'/integer)
299
300Access to undefined properties:
301mysqli->unknown = ''
302setting mysqli->unknown, mysqli_unknown = '13'
303setting mysqli->unknown, mysqli_unknown = 'friday'
304
305Access hidden properties for MYSLQI_STATUS_INITIALIZED (TODO documentation):
306mysqli->connect_error = ''/NULL (''/NULL)
307mysqli->connect_errno = '0'/integer ('0'/integer)
308done!
309