1 /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3 * Libmemcached Client and Server
5 * Copyright (C) 2012 Data Differential, http://datadifferential.com/
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are
12 * * Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
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
20 * * The names of its contributors may not be used to endorse or
21 * promote products derived from this software without specific prior
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.
39 #include <libtest/test.hpp>
41 #include <libmemcached-1.0/memcached.h>
42 #include <libmemcached/util.h>
44 #include "tests/libmemcached-1.0/encoding_key.h"
46 using namespace libtest
;
48 test_return_t
memcached_set_encoding_key_TEST(memcached_st
* memc
)
50 test_compare(MEMCACHED_SUCCESS
, memcached_set_encoding_key(memc
, test_literal_param(__func__
)));
55 test_return_t
memcached_set_encoding_key_set_get_TEST(memcached_st
* memc
)
57 memcached_st
*memc_no_crypt
= memcached_clone(NULL
, memc
);
58 test_true(memc_no_crypt
);
59 test_compare(MEMCACHED_SUCCESS
, memcached_set_encoding_key(memc
, test_literal_param(__func__
)));
61 test_compare_hint(MEMCACHED_SUCCESS
, memcached_set(memc
,
62 test_literal_param(__func__
), // Key
63 test_literal_param(__func__
), // Value
66 memcached_last_error_message(memc
));
69 memcached_return_t rc
;
72 test_true((value
= memcached_get(memc
,
73 test_literal_param(__func__
), // Key
74 &value_length
, NULL
, &rc
)));
75 test_compare(MEMCACHED_SUCCESS
, rc
);
76 test_compare(test_literal_param_size(__func__
), value_length
);
77 test_memcmp(__func__
, value
, value_length
);
79 size_t raw_value_length
;
81 test_true((raw_value
= memcached_get(memc_no_crypt
,
82 test_literal_param(__func__
), // Key
83 &raw_value_length
, NULL
, &rc
)));
84 test_compare(MEMCACHED_SUCCESS
, rc
);
85 test_ne_compare(value_length
, raw_value_length
);
86 test_ne_compare(0, memcmp(value
, raw_value
, raw_value_length
));
92 memcached_free(memc_no_crypt
);
97 test_return_t
memcached_set_encoding_key_add_get_TEST(memcached_st
* memc
)
99 test_compare(MEMCACHED_SUCCESS
, memcached_set_encoding_key(memc
, test_literal_param(__func__
)));
101 test_compare_hint(MEMCACHED_SUCCESS
, memcached_add(memc
,
102 test_literal_param(__func__
), // Key
103 test_literal_param(__func__
), // Value
106 memcached_last_error_message(memc
));
109 memcached_return_t rc
;
112 test_true((value
= memcached_get(memc
,
113 test_literal_param(__func__
), // Key
114 &value_length
, NULL
, &rc
)));
115 test_compare(MEMCACHED_SUCCESS
, rc
);
116 test_compare(test_literal_param_size(__func__
), value_length
);
117 test_memcmp(__func__
, value
, value_length
);
124 test_return_t
memcached_set_encoding_key_replace_get_TEST(memcached_st
* memc
)
126 test_compare(MEMCACHED_SUCCESS
, memcached_set_encoding_key(memc
, test_literal_param(__func__
)));
128 // First we add the key
130 test_compare_hint(MEMCACHED_SUCCESS
, memcached_add(memc
,
131 test_literal_param(__func__
), // Key
132 test_literal_param(__func__
), // Value
135 memcached_last_error_message(memc
));
137 memcached_return_t rc
;
140 test_true((value
= memcached_get(memc
,
141 test_literal_param(__func__
), // Key
142 &value_length
, NULL
, &rc
)));
143 test_compare(MEMCACHED_SUCCESS
, rc
);
144 test_compare(test_literal_param_size(__func__
), value_length
);
145 test_memcmp(__func__
, value
, value_length
);
149 // Then we replace the key
151 libtest::vchar_t new_value
;
152 vchar::make(new_value
);
154 test_compare_hint(MEMCACHED_SUCCESS
, memcached_replace(memc
,
155 test_literal_param(__func__
), // Key
156 vchar_param(new_value
), // Value
159 memcached_last_error_message(memc
));
161 memcached_return_t rc
;
164 test_true((value
= memcached_get(memc
,
165 test_literal_param(__func__
), // Key
166 &value_length
, NULL
, &rc
)));
167 test_compare(MEMCACHED_SUCCESS
, rc
);
168 test_compare(new_value
.size(), value_length
);
169 test_compare(0, vchar::compare(new_value
, value
, value_length
));
176 test_return_t
memcached_set_encoding_key_increment_TEST(memcached_st
* memc
)
178 test_compare(MEMCACHED_SUCCESS
, memcached_set_encoding_key(memc
, test_literal_param(__func__
)));
180 test_compare(MEMCACHED_NOT_SUPPORTED
, memcached_increment(memc
,
181 test_literal_param(__func__
), // Key
188 test_return_t
memcached_set_encoding_key_decrement_TEST(memcached_st
* memc
)
190 test_compare(MEMCACHED_SUCCESS
, memcached_set_encoding_key(memc
, test_literal_param(__func__
)));
192 test_compare(MEMCACHED_NOT_SUPPORTED
, memcached_decrement(memc
,
193 test_literal_param(__func__
), // Key
200 test_return_t
memcached_set_encoding_key_increment_with_initial_TEST(memcached_st
* memc
)
202 test_compare(MEMCACHED_SUCCESS
, memcached_set_encoding_key(memc
, test_literal_param(__func__
)));
204 test_compare(MEMCACHED_NOT_SUPPORTED
, memcached_increment_with_initial(memc
,
205 test_literal_param(__func__
), // Key
214 test_return_t
memcached_set_encoding_key_decrement_with_initial_TEST(memcached_st
* memc
)
216 test_compare(MEMCACHED_SUCCESS
, memcached_set_encoding_key(memc
, test_literal_param(__func__
)));
218 test_compare(MEMCACHED_NOT_SUPPORTED
, memcached_decrement_with_initial(memc
,
219 test_literal_param(__func__
), // Key
228 test_return_t
memcached_set_encoding_key_append_TEST(memcached_st
* memc
)
230 test_compare(MEMCACHED_SUCCESS
, memcached_set_encoding_key(memc
, test_literal_param(__func__
)));
232 test_compare(MEMCACHED_NOT_SUPPORTED
, memcached_append(memc
,
233 test_literal_param(__func__
), // Key
234 test_literal_param(__func__
), // Value
241 test_return_t
memcached_set_encoding_key_prepend_TEST(memcached_st
* memc
)
243 test_compare(MEMCACHED_SUCCESS
, memcached_set_encoding_key(memc
, test_literal_param(__func__
)));
245 test_compare(MEMCACHED_NOT_SUPPORTED
, memcached_prepend(memc
,
246 test_literal_param(__func__
), // Key
247 test_literal_param(__func__
), // Value
254 test_return_t
memcached_set_encoding_key_set_get_clone_TEST(memcached_st
* memc
)
256 memcached_st
*memc_no_crypt
= memcached_clone(NULL
, memc
);
257 test_true(memc_no_crypt
);
259 test_compare(MEMCACHED_SUCCESS
, memcached_set_encoding_key(memc
, test_literal_param(__func__
)));
261 memcached_st
*memc_crypt
= memcached_clone(NULL
, memc
);
262 test_true(memc_crypt
);
264 test_compare_hint(MEMCACHED_SUCCESS
, memcached_set(memc
,
265 test_literal_param(__func__
), // Key
266 test_literal_param(__func__
), // Value
269 memcached_last_error_message(memc
));
272 memcached_return_t rc
;
275 test_true((value
= memcached_get(memc
,
276 test_literal_param(__func__
), // Key
277 &value_length
, NULL
, &rc
)));
278 test_compare(MEMCACHED_SUCCESS
, rc
);
279 test_compare(test_literal_param_size(__func__
), value_length
);
280 test_memcmp(__func__
, value
, value_length
);
283 Check to make sure that the raw value is not the original.
285 size_t raw_value_length
;
287 test_true((raw_value
= memcached_get(memc_no_crypt
,
288 test_literal_param(__func__
), // Key
289 &raw_value_length
, NULL
, &rc
)));
290 test_compare(MEMCACHED_SUCCESS
, rc
);
291 test_ne_compare(test_literal_param_size(__func__
), raw_value_length
);
292 test_ne_compare(0, memcmp(__func__
, raw_value
, raw_value_length
));
295 Now we will use our clone, and make sure the encrypted values are the same.
297 size_t second_value_length
;
299 test_true((second_value
= memcached_get(memc_crypt
,
300 test_literal_param(__func__
), // Key
301 &second_value_length
, NULL
, &rc
)));
302 test_compare(MEMCACHED_SUCCESS
, rc
);
303 test_compare(value_length
, second_value_length
);
304 test_compare(0, memcmp(value
, second_value
, second_value_length
));
305 test_compare(test_literal_param_size(__func__
), second_value_length
);
306 test_compare(value_length
, second_value_length
);
307 test_memcmp(__func__
, second_value
, second_value_length
);
308 test_memcmp(value
, second_value
, second_value_length
);
315 memcached_free(memc_no_crypt
);
316 memcached_free(memc_crypt
);
321 test_return_t
memcached_set_encoding_key_set_grow_key_TEST(memcached_st
* memc
)
323 memcached_st
*memc_no_crypt
= memcached_clone(NULL
, memc
);
324 test_true(memc_no_crypt
);
325 test_compare(MEMCACHED_SUCCESS
, memcached_set_encoding_key(memc
, test_literal_param(__func__
)));
327 size_t payload_size
[] = { 100, 1000, 10000, 1000000, 1000000, 0 };
328 libtest::vchar_t payload
;
329 for (size_t *ptr
= payload_size
; *ptr
; ptr
++)
331 payload
.reserve(*ptr
);
332 for (size_t x
= payload
.size(); x
< *ptr
; x
++)
334 payload
.push_back(rand());
338 memcached_return_t rc
= memcached_set(memc
,
339 test_literal_param(__func__
), // Key
340 &payload
[0], payload
.size(), // Value
344 // If we run out of space on the server, we just end the test early.
345 if (rc
== MEMCACHED_SERVER_MEMORY_ALLOCATION_FAILURE
)
349 test_compare_hint(MEMCACHED_SUCCESS
, rc
, memcached_last_error_message(memc
));
353 memcached_return_t rc
;
356 test_true((value
= memcached_get(memc
,
357 test_literal_param(__func__
), // Key
358 &value_length
, NULL
, &rc
)));
359 test_compare(MEMCACHED_SUCCESS
, rc
);
360 test_compare(payload
.size(), value_length
);
361 test_memcmp(&payload
[0], value
, value_length
);
363 size_t raw_value_length
;
365 test_true((raw_value
= memcached_get(memc_no_crypt
,
366 test_literal_param(__func__
), // Key
367 &raw_value_length
, NULL
, &rc
)));
368 test_compare(MEMCACHED_SUCCESS
, rc
);
369 test_ne_compare(payload
.size(), raw_value_length
);
370 test_ne_compare(0, memcmp(&payload
[0], raw_value
, raw_value_length
));
377 memcached_free(memc_no_crypt
);