Merge in additional for last disconnected server.
[m6w6/libmemcached] / tests / parser.cc
1 /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
2 *
3 * Libmemcached Client and Server
4 *
5 * Copyright (C) 2011 Data Differential, http://datadifferential.com/
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are
10 * met:
11 *
12 * * Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 *
15 * * Redistributions in binary form must reproduce the above
16 * copyright notice, this list of conditions and the following disclaimer
17 * in the documentation and/or other materials provided with the
18 * distribution.
19 *
20 * * The names of its contributors may not be used to endorse or
21 * promote products derived from this software without specific prior
22 * written permission.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 *
36 */
37
38 #include <config.h>
39
40 #include <vector>
41 #include <iostream>
42 #include <string>
43 #include <cerrno>
44 #include <cassert>
45
46 #define BUILDING_LIBMEMCACHED
47 // !NEVER use common.h, always use memcached.h in your own apps
48 #include <libmemcached/common.h>
49
50 #include "tests/parser.h"
51 #include "tests/print.h"
52
53 enum scanner_type_t
54 {
55 NIL,
56 UNSIGNED,
57 SIGNED,
58 ARRAY
59 };
60
61
62 struct scanner_string_st {
63 const char *c_str;
64 size_t size;
65 };
66
67 static inline scanner_string_st scanner_string(const char *arg, size_t arg_size)
68 {
69 scanner_string_st local= { arg, arg_size };
70 return local;
71 }
72
73 #define make_scanner_string(X) scanner_string((X), static_cast<size_t>(sizeof(X) - 1))
74
75 static struct scanner_string_st scanner_string_null= { 0, 0};
76
77 struct scanner_variable_t {
78 enum scanner_type_t type;
79 struct scanner_string_st option;
80 struct scanner_string_st result;
81 test_return_t (*check_func)(memcached_st *memc, const scanner_string_st &hostname);
82 };
83
84 // Check and make sure the first host is what we expect it to be
85 static test_return_t __check_host(memcached_st *memc, const scanner_string_st &hostname)
86 {
87 memcached_server_instance_st instance=
88 memcached_server_instance_by_position(memc, 0);
89
90 test_true(instance);
91
92 const char *first_hostname = memcached_server_name(instance);
93 test_true(first_hostname);
94 test_strcmp(first_hostname, hostname.c_str);
95
96 return TEST_SUCCESS;
97 }
98
99 // Check and make sure the prefix_key is what we expect it to be
100 static test_return_t __check_prefix_key(memcached_st *memc, const scanner_string_st &hostname)
101 {
102 memcached_server_instance_st instance=
103 memcached_server_instance_by_position(memc, 0);
104
105 test_true(instance);
106
107 const char *first_hostname = memcached_server_name(instance);
108 test_true(first_hostname);
109 test_strcmp(first_hostname, hostname.c_str);
110
111 return TEST_SUCCESS;
112 }
113
114 static test_return_t __check_IO_MSG_WATERMARK(memcached_st *memc, const scanner_string_st &value)
115 {
116 uint64_t value_number;
117
118 value_number= atoll(value.c_str);
119
120 test_true(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK) == value_number);
121 return TEST_SUCCESS;
122 }
123
124 static test_return_t __check_REMOVE_FAILED_SERVERS(memcached_st *memc, const scanner_string_st &)
125 {
126 test_true(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_REMOVE_FAILED_SERVERS));
127 return TEST_SUCCESS;
128 }
129
130 static test_return_t __check_NOREPLY(memcached_st *memc, const scanner_string_st &)
131 {
132 test_true(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NOREPLY));
133 return TEST_SUCCESS;
134 }
135
136 static test_return_t __check_VERIFY_KEY(memcached_st *memc, const scanner_string_st &)
137 {
138 test_true(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_VERIFY_KEY));
139 return TEST_SUCCESS;
140 }
141
142 static test_return_t __check_distribution_RANDOM(memcached_st *memc, const scanner_string_st &)
143 {
144 test_true(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION) == MEMCACHED_DISTRIBUTION_RANDOM);
145 return TEST_SUCCESS;
146 }
147
148 scanner_variable_t test_server_strings[]= {
149 { ARRAY, make_scanner_string("--server=localhost"), make_scanner_string("localhost"), __check_host },
150 { ARRAY, make_scanner_string("--server=10.0.2.1"), make_scanner_string("10.0.2.1"), __check_host },
151 { ARRAY, make_scanner_string("--server=example.com"), make_scanner_string("example.com"), __check_host },
152 { ARRAY, make_scanner_string("--server=localhost:30"), make_scanner_string("localhost"), __check_host },
153 { ARRAY, make_scanner_string("--server=10.0.2.1:20"), make_scanner_string("10.0.2.1"), __check_host },
154 { ARRAY, make_scanner_string("--server=example.com:1024"), make_scanner_string("example.com"), __check_host },
155 { NIL, scanner_string_null, scanner_string_null, NULL }
156 };
157
158 scanner_variable_t test_server_strings_with_weights[]= {
159 { ARRAY, make_scanner_string("--server=10.0.2.1:30/?40"), make_scanner_string("10.0.2.1"), __check_host },
160 { ARRAY, make_scanner_string("--server=example.com:1024/?30"), make_scanner_string("example.com"), __check_host },
161 { ARRAY, make_scanner_string("--server=10.0.2.1/?20"), make_scanner_string("10.0.2.1"), __check_host },
162 { ARRAY, make_scanner_string("--server=example.com/?10"), make_scanner_string("example.com"), __check_host },
163 { NIL, scanner_string_null, scanner_string_null, NULL }
164 };
165
166 scanner_variable_t bad_test_strings[]= {
167 { ARRAY, make_scanner_string("-servers=localhost:11221,localhost:11222,localhost:11223,localhost:11224,localhost:11225"), scanner_string_null, NULL },
168 { ARRAY, make_scanner_string("-- servers=a.example.com:81,localhost:82,b.example.com"), scanner_string_null, NULL },
169 { ARRAY, make_scanner_string("--servers=localhost:+80"), scanner_string_null, NULL},
170 { ARRAY, make_scanner_string("--servers=localhost.com."), scanner_string_null, NULL},
171 { ARRAY, make_scanner_string("--server=localhost.com."), scanner_string_null, NULL},
172 { ARRAY, make_scanner_string("--server=localhost.com.:80"), scanner_string_null, NULL},
173 { NIL, scanner_string_null, scanner_string_null, NULL}
174 };
175
176 scanner_variable_t test_number_options[]= {
177 { ARRAY, make_scanner_string("--CONNECT-TIMEOUT=456"), scanner_string_null, NULL },
178 { ARRAY, make_scanner_string("--IO-BYTES-WATERMARK=456"), scanner_string_null, NULL },
179 { ARRAY, make_scanner_string("--IO-KEY-PREFETCH=456"), scanner_string_null, NULL },
180 { ARRAY, make_scanner_string("--IO-MSG-WATERMARK=456"), make_scanner_string("456"), __check_IO_MSG_WATERMARK },
181 { ARRAY, make_scanner_string("--NUMBER-OF-REPLICAS=456"), scanner_string_null, NULL },
182 { ARRAY, make_scanner_string("--POLL-TIMEOUT=456"), scanner_string_null, NULL },
183 { ARRAY, make_scanner_string("--RCV-TIMEOUT=456"), scanner_string_null, NULL },
184 { ARRAY, make_scanner_string("--REMOVE-FAILED-SERVERS=3"), scanner_string_null, __check_REMOVE_FAILED_SERVERS },
185 { ARRAY, make_scanner_string("--RETRY-TIMEOUT=456"), scanner_string_null, NULL },
186 { ARRAY, make_scanner_string("--SND-TIMEOUT=456"), scanner_string_null, NULL },
187 { ARRAY, make_scanner_string("--SOCKET-RECV-SIZE=456"), scanner_string_null, NULL },
188 { ARRAY, make_scanner_string("--SOCKET-SEND-SIZE=456"), scanner_string_null, NULL },
189 { NIL, scanner_string_null, scanner_string_null, NULL}
190 };
191
192 scanner_variable_t test_boolean_options[]= {
193 { ARRAY, make_scanner_string("--BINARY-PROTOCOL"), scanner_string_null, NULL },
194 { ARRAY, make_scanner_string("--BUFFER-REQUESTS"), scanner_string_null, NULL },
195 { ARRAY, make_scanner_string("--HASH-WITH-NAMESPACE"), scanner_string_null, NULL },
196 { ARRAY, make_scanner_string("--NOREPLY"), scanner_string_null, __check_NOREPLY },
197 { ARRAY, make_scanner_string("--RANDOMIZE-REPLICA-READ"), scanner_string_null, NULL },
198 { ARRAY, make_scanner_string("--SORT-HOSTS"), scanner_string_null, NULL },
199 { ARRAY, make_scanner_string("--SUPPORT-CAS"), scanner_string_null, NULL },
200 { ARRAY, make_scanner_string("--TCP-NODELAY"), scanner_string_null, NULL },
201 { ARRAY, make_scanner_string("--TCP-KEEPALIVE"), scanner_string_null, NULL },
202 { ARRAY, make_scanner_string("--TCP-KEEPIDLE"), scanner_string_null, NULL },
203 { ARRAY, make_scanner_string("--USE-UDP"), scanner_string_null, NULL },
204 { ARRAY, make_scanner_string("--VERIFY-KEY"), scanner_string_null, __check_VERIFY_KEY },
205 { NIL, scanner_string_null, scanner_string_null, NULL}
206 };
207
208 scanner_variable_t prefix_key_strings[]= {
209 { ARRAY, make_scanner_string("--NAMESPACE=foo"), make_scanner_string("foo"), __check_prefix_key },
210 { ARRAY, make_scanner_string("--NAMESPACE=\"foo\""), make_scanner_string("foo"), __check_prefix_key },
211 { ARRAY, make_scanner_string("--NAMESPACE=\"This_is_a_very_long_key\""), make_scanner_string("This_is_a_very_long_key"), __check_prefix_key },
212 { NIL, scanner_string_null, scanner_string_null, NULL}
213 };
214
215 scanner_variable_t distribution_strings[]= {
216 { ARRAY, make_scanner_string("--DISTRIBUTION=consistent"), scanner_string_null, NULL },
217 { ARRAY, make_scanner_string("--DISTRIBUTION=consistent,CRC"), scanner_string_null, NULL },
218 { ARRAY, make_scanner_string("--DISTRIBUTION=consistent,MD5"), scanner_string_null, NULL },
219 { ARRAY, make_scanner_string("--DISTRIBUTION=random"), scanner_string_null, __check_distribution_RANDOM },
220 { ARRAY, make_scanner_string("--DISTRIBUTION=modula"), scanner_string_null, NULL },
221 { NIL, scanner_string_null, scanner_string_null, NULL}
222 };
223
224 scanner_variable_t hash_strings[]= {
225 { ARRAY, make_scanner_string("--HASH=CRC"), scanner_string_null, NULL },
226 { ARRAY, make_scanner_string("--HASH=FNV1A_32"), scanner_string_null, NULL },
227 { ARRAY, make_scanner_string("--HASH=FNV1A_64"), scanner_string_null, NULL },
228 { ARRAY, make_scanner_string("--HASH=FNV1_32"), scanner_string_null, NULL },
229 { ARRAY, make_scanner_string("--HASH=FNV1_64"), scanner_string_null, NULL },
230 { ARRAY, make_scanner_string("--HASH=JENKINS"), scanner_string_null, NULL },
231 { ARRAY, make_scanner_string("--HASH=MD5"), scanner_string_null, NULL },
232 { ARRAY, make_scanner_string("--HASH=MURMUR"), scanner_string_null, NULL },
233 { NIL, scanner_string_null, scanner_string_null, NULL}
234 };
235
236
237 static test_return_t _test_option(scanner_variable_t *scanner, bool test_true= true)
238 {
239 (void)test_true;
240
241 for (scanner_variable_t *ptr= scanner; ptr->type != NIL; ptr++)
242 {
243 memcached_st *memc;
244 memc= memcached(ptr->option.c_str, ptr->option.size);
245 if (test_true)
246 {
247 if (not memc)
248 {
249 char buffer[2048];
250 memcached_return_t rc= libmemcached_check_configuration(ptr->option.c_str, ptr->option.size, buffer, sizeof(buffer));
251 std::cerr << "About error for " << memcached_strerror(NULL, rc) << " : " << buffer << std::endl;
252 }
253
254 test_true(memc);
255
256 if (ptr->check_func)
257 {
258 test_return_t test_rc= (*ptr->check_func)(memc, ptr->result);
259 if (test_rc != TEST_SUCCESS)
260 {
261 memcached_free(memc);
262 return test_rc;
263 }
264 }
265
266 memcached_free(memc);
267 }
268 else
269 {
270 test_false_with(memc, ptr->option.c_str);
271 }
272 }
273
274 return TEST_SUCCESS;
275 }
276
277 test_return_t server_test(memcached_st *)
278 {
279 return _test_option(test_server_strings);
280 }
281
282 test_return_t server_with_weight_test(memcached_st *)
283 {
284 return _test_option(test_server_strings_with_weights);
285 }
286
287 test_return_t servers_bad_test(memcached_st *)
288 {
289 test_return_t rc;
290 if ((rc= _test_option(bad_test_strings, false)) != TEST_SUCCESS)
291 {
292 return rc;
293 }
294
295 return TEST_SUCCESS;
296 }
297
298 test_return_t parser_number_options_test(memcached_st*)
299 {
300 return _test_option(test_number_options);
301 }
302
303 test_return_t parser_boolean_options_test(memcached_st*)
304 {
305 return _test_option(test_boolean_options);
306 }
307
308 test_return_t behavior_parser_test(memcached_st*)
309 {
310 return TEST_SUCCESS;
311 }
312
313 test_return_t parser_hash_test(memcached_st*)
314 {
315 return _test_option(hash_strings);
316 }
317
318 test_return_t parser_distribution_test(memcached_st*)
319 {
320 return _test_option(distribution_strings);
321 }
322
323 test_return_t parser_key_prefix_test(memcached_st*)
324 {
325 return _test_option(distribution_strings);
326 }
327
328 #define SUPPORT_EXAMPLE_CNF "support/example.cnf"
329
330 test_return_t memcached_create_with_options_with_filename(memcached_st*)
331 {
332 if (access(SUPPORT_EXAMPLE_CNF, R_OK))
333 return TEST_SKIPPED;
334
335 memcached_st *memc_ptr;
336 memc_ptr= memcached(STRING_WITH_LEN("--CONFIGURE-FILE=\"support/example.cnf\""));
337 test_true_got(memc_ptr, "memcached() failed");
338 test_strcmp(SUPPORT_EXAMPLE_CNF, memcached_array_string(memc_ptr->configure.filename));
339 memcached_free(memc_ptr);
340
341 return TEST_SUCCESS;
342 }
343
344 test_return_t libmemcached_check_configuration_with_filename_test(memcached_st*)
345 {
346 if (access(SUPPORT_EXAMPLE_CNF, R_OK))
347 return TEST_SKIPPED;
348
349 memcached_return_t rc;
350 char buffer[BUFSIZ];
351
352 rc= libmemcached_check_configuration(STRING_WITH_LEN("--CONFIGURE-FILE=\"support/example.cnf\""), buffer, sizeof(buffer));
353 test_true_got(rc == MEMCACHED_SUCCESS, (rc == MEMCACHED_ERRNO) ? strerror(errno) : memcached_strerror(NULL, rc));
354
355 rc= libmemcached_check_configuration(STRING_WITH_LEN("--CONFIGURE-FILE=support/example.cnf"), buffer, sizeof(buffer));
356 test_false_with(rc == MEMCACHED_SUCCESS, memcached_strerror(NULL, rc));
357
358 rc= libmemcached_check_configuration(STRING_WITH_LEN("--CONFIGURE-FILE=\"bad-path/example.cnf\""), buffer, sizeof(buffer));
359 test_true_got(rc == MEMCACHED_ERRNO, memcached_strerror(NULL, rc));
360
361 return TEST_SUCCESS;
362 }
363
364 test_return_t libmemcached_check_configuration_test(memcached_st*)
365 {
366 memcached_return_t rc;
367 char buffer[BUFSIZ];
368
369 rc= libmemcached_check_configuration(STRING_WITH_LEN("--server=localhost"), buffer, sizeof(buffer));
370 test_true_got(rc == MEMCACHED_SUCCESS, buffer);
371
372 rc= libmemcached_check_configuration(STRING_WITH_LEN("--dude=localhost"), buffer, sizeof(buffer));
373 test_false_with(rc == MEMCACHED_SUCCESS, buffer);
374 test_true(rc == MEMCACHED_PARSE_ERROR);
375
376 return TEST_SUCCESS;
377 }
378
379 test_return_t memcached_create_with_options_test(memcached_st*)
380 {
381 memcached_st *memc_ptr;
382 memc_ptr= memcached(STRING_WITH_LEN("--server=localhost"));
383 test_true_got(memc_ptr, memcached_last_error_message(memc_ptr));
384 memcached_free(memc_ptr);
385
386 memc_ptr= memcached(STRING_WITH_LEN("--dude=localhost"));
387 test_false_with(memc_ptr, memcached_last_error_message(memc_ptr));
388
389 return TEST_SUCCESS;
390 }
391
392 test_return_t test_include_keyword(memcached_st*)
393 {
394 if (access(SUPPORT_EXAMPLE_CNF, R_OK))
395 return TEST_SKIPPED;
396
397 char buffer[BUFSIZ];
398 memcached_return_t rc;
399 rc= libmemcached_check_configuration(STRING_WITH_LEN("INCLUDE \"support/example.cnf\""), buffer, sizeof(buffer));
400 test_true_got(rc == MEMCACHED_SUCCESS, buffer);
401
402 return TEST_SUCCESS;
403 }
404
405 test_return_t test_end_keyword(memcached_st*)
406 {
407 char buffer[BUFSIZ];
408 memcached_return_t rc;
409 rc= libmemcached_check_configuration(STRING_WITH_LEN("--server=localhost END bad keywords"), buffer, sizeof(buffer));
410 test_true_got(rc == MEMCACHED_SUCCESS, buffer);
411
412 return TEST_SUCCESS;
413 }
414
415 test_return_t test_reset_keyword(memcached_st*)
416 {
417 char buffer[BUFSIZ];
418 memcached_return_t rc;
419 rc= libmemcached_check_configuration(STRING_WITH_LEN("--server=localhost reset --server=bad.com"), buffer, sizeof(buffer));
420 test_true_got(rc == MEMCACHED_SUCCESS, buffer);
421
422 return TEST_SUCCESS;
423 }
424
425 test_return_t test_error_keyword(memcached_st*)
426 {
427 char buffer[BUFSIZ];
428 memcached_return_t rc;
429 rc= libmemcached_check_configuration(STRING_WITH_LEN("--server=localhost ERROR --server=bad.com"), buffer, sizeof(buffer));
430 test_true_got(rc != MEMCACHED_SUCCESS, buffer);
431
432 return TEST_SUCCESS;
433 }
434
435 #define RANDOM_STRINGS 100
436 test_return_t random_statement_build_test(memcached_st*)
437 {
438 std::vector<scanner_string_st *> option_list;
439
440 for (scanner_variable_t *ptr= test_server_strings; ptr->type != NIL; ptr++)
441 option_list.push_back(&ptr->option);
442
443 for (scanner_variable_t *ptr= test_number_options; ptr->type != NIL; ptr++)
444 option_list.push_back(&ptr->option);
445
446 for (scanner_variable_t *ptr= test_boolean_options; ptr->type != NIL; ptr++)
447 option_list.push_back(&ptr->option);
448
449 for (scanner_variable_t *ptr= prefix_key_strings; ptr->type != NIL; ptr++)
450 option_list.push_back(&ptr->option);
451
452 for (scanner_variable_t *ptr= distribution_strings; ptr->type != NIL; ptr++)
453 option_list.push_back(&ptr->option);
454
455 for (scanner_variable_t *ptr= hash_strings; ptr->type != NIL; ptr++)
456 option_list.push_back(&ptr->option);
457
458 for (uint32_t x= 0; x < RANDOM_STRINGS; x++)
459 {
460 std::string random_options;
461
462 uint32_t number_of= random() % option_list.size();
463 for (uint32_t options= 0; options < number_of; options++)
464 {
465 random_options+= option_list[random() % option_list.size()]->c_str;
466 random_options+= " ";
467 }
468
469 memcached_st *memc_ptr= memcached(random_options.c_str(), random_options.size() -1);
470 if (not memc_ptr)
471 {
472 switch (errno)
473 {
474 case EINVAL:
475 #if 0 // Testing framework is not smart enough for this just yet.
476 {
477 // We will try to find the specific error
478 char buffer[2048];
479 memcached_return_t rc= libmemcached_check_configuration(random_options.c_str(), random_options.size(), buffer, sizeof(buffer));
480 test_true_got(rc != MEMCACHED_SUCCESS, "memcached_create_with_options() failed whiled libmemcached_check_configuration() was successful");
481 std::cerr << "Error occured on " << random_options.c_str() << " : " << buffer << std::endl;
482 return TEST_FAILURE;
483 }
484 #endif
485 break;
486 case ENOMEM:
487 std::cerr << "Failed to allocate memory for memcached_create_with_options()" << std::endl;
488 memcached_free(memc_ptr);
489 return TEST_FAILURE;
490 default:
491 std::cerr << "Unknown error from memcached_create_with_options?!!" << std::endl;
492 memcached_free(memc_ptr);
493 return TEST_FAILURE;
494 }
495 }
496 memcached_free(memc_ptr);
497 }
498
499 return TEST_SUCCESS;
500 }
501
502 static memcached_return_t dump_server_information(const memcached_st *,
503 const memcached_server_st *instance,
504 void *)
505 {
506 if (strcmp(memcached_server_name(instance), "localhost"))
507 {
508 assert(not memcached_server_name(instance));
509 return MEMCACHED_FAILURE;
510 }
511
512 if (memcached_server_port(instance) < 8888 or memcached_server_port(instance) > 8892)
513 {
514 assert(not memcached_server_port(instance));
515 return MEMCACHED_FAILURE;
516 }
517
518 if (instance->weight > 5 or instance->weight < 2)
519 {
520 assert(not instance->weight);
521 return MEMCACHED_FAILURE;
522 }
523
524 return MEMCACHED_SUCCESS;
525 }
526
527
528 test_return_t test_hostname_port_weight(memcached_st *)
529 {
530 const char *server_string= "--server=localhost:8888/?2 --server=localhost:8889/?3 --server=localhost:8890/?4 --server=localhost:8891/?5 --server=localhost:8892/?3";
531 char buffer[BUFSIZ];
532
533 memcached_return_t rc;
534 test_compare_got(MEMCACHED_SUCCESS,
535 rc= libmemcached_check_configuration(server_string, strlen(server_string), buffer, sizeof(buffer)),
536 memcached_strerror(NULL, rc));
537
538 memcached_st *memc= memcached(server_string, strlen(server_string));
539 test_true(memc);
540
541 memcached_server_fn callbacks[]= { dump_server_information };
542 test_true(memcached_success(memcached_server_cursor(memc, callbacks, NULL, 1)));
543
544 memcached_free(memc);
545
546 return TEST_SUCCESS;
547 }