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.
38 #include <mem_config.h>
39 #include <libtest/test.hpp>
41 #include <libmemcached-1.0/memcached.h>
42 #include <libmemcachedutil-1.0/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(MEMCACHED_SUCCESS
, memcached_set(memc
,
62 test_literal_param(__func__
), // Key
63 test_literal_param(__func__
), // Value
68 memcached_return_t rc
;
71 test_true((value
= memcached_get(memc
,
72 test_literal_param(__func__
), // Key
73 &value_length
, NULL
, &rc
)));
74 test_compare(MEMCACHED_SUCCESS
, rc
);
75 test_compare(test_literal_param_size(__func__
), value_length
);
76 test_memcmp(__func__
, value
, value_length
);
78 size_t raw_value_length
;
80 test_true((raw_value
= memcached_get(memc_no_crypt
,
81 test_literal_param(__func__
), // Key
82 &raw_value_length
, NULL
, &rc
)));
83 test_compare(MEMCACHED_SUCCESS
, rc
);
84 test_ne_compare(value_length
, raw_value_length
);
85 test_ne_compare(0, memcmp(value
, raw_value
, raw_value_length
));
91 memcached_free(memc_no_crypt
);
96 test_return_t
memcached_set_encoding_key_add_get_TEST(memcached_st
* memc
)
98 test_compare(MEMCACHED_SUCCESS
, memcached_set_encoding_key(memc
, test_literal_param(__func__
)));
100 test_compare(MEMCACHED_SUCCESS
, memcached_add(memc
,
101 test_literal_param(__func__
), // Key
102 test_literal_param(__func__
), // Value
107 memcached_return_t rc
;
110 test_true((value
= memcached_get(memc
,
111 test_literal_param(__func__
), // Key
112 &value_length
, NULL
, &rc
)));
113 test_compare(MEMCACHED_SUCCESS
, rc
);
114 test_compare(test_literal_param_size(__func__
), value_length
);
115 test_memcmp(__func__
, value
, value_length
);
122 test_return_t
memcached_set_encoding_key_replace_get_TEST(memcached_st
* memc
)
124 test_compare(MEMCACHED_SUCCESS
, memcached_set_encoding_key(memc
, test_literal_param(__func__
)));
126 // First we add the key
128 test_compare(MEMCACHED_SUCCESS
, memcached_add(memc
,
129 test_literal_param(__func__
), // Key
130 test_literal_param(__func__
), // Value
134 memcached_return_t rc
;
137 test_true((value
= memcached_get(memc
,
138 test_literal_param(__func__
), // Key
139 &value_length
, NULL
, &rc
)));
140 test_compare(MEMCACHED_SUCCESS
, rc
);
141 test_compare(test_literal_param_size(__func__
), value_length
);
142 test_memcmp(__func__
, value
, value_length
);
146 // Then we replace the key
148 libtest::vchar_t new_value
;
149 vchar::make(new_value
);
151 test_compare(MEMCACHED_SUCCESS
, memcached_replace(memc
,
152 test_literal_param(__func__
), // Key
153 vchar_param(new_value
), // Value
157 memcached_return_t rc
;
160 test_true((value
= memcached_get(memc
,
161 test_literal_param(__func__
), // Key
162 &value_length
, NULL
, &rc
)));
163 test_compare(MEMCACHED_SUCCESS
, rc
);
164 test_compare(new_value
.size(), value_length
);
165 test_compare(0, vchar::compare(new_value
, value
, value_length
));
172 test_return_t
memcached_set_encoding_key_increment_TEST(memcached_st
* memc
)
174 test_compare(MEMCACHED_SUCCESS
, memcached_set_encoding_key(memc
, test_literal_param(__func__
)));
176 test_compare(MEMCACHED_NOT_SUPPORTED
, memcached_increment(memc
,
177 test_literal_param(__func__
), // Key
184 test_return_t
memcached_set_encoding_key_decrement_TEST(memcached_st
* memc
)
186 test_compare(MEMCACHED_SUCCESS
, memcached_set_encoding_key(memc
, test_literal_param(__func__
)));
188 test_compare(MEMCACHED_NOT_SUPPORTED
, memcached_decrement(memc
,
189 test_literal_param(__func__
), // Key
196 test_return_t
memcached_set_encoding_key_increment_with_initial_TEST(memcached_st
* memc
)
198 test_compare(MEMCACHED_SUCCESS
, memcached_set_encoding_key(memc
, test_literal_param(__func__
)));
200 test_compare(MEMCACHED_NOT_SUPPORTED
, memcached_increment_with_initial(memc
,
201 test_literal_param(__func__
), // Key
210 test_return_t
memcached_set_encoding_key_decrement_with_initial_TEST(memcached_st
* memc
)
212 test_compare(MEMCACHED_SUCCESS
, memcached_set_encoding_key(memc
, test_literal_param(__func__
)));
214 test_compare(MEMCACHED_NOT_SUPPORTED
, memcached_decrement_with_initial(memc
,
215 test_literal_param(__func__
), // Key
224 test_return_t
memcached_set_encoding_key_append_TEST(memcached_st
* memc
)
226 test_compare(MEMCACHED_SUCCESS
, memcached_set_encoding_key(memc
, test_literal_param(__func__
)));
228 test_compare(MEMCACHED_NOT_SUPPORTED
, memcached_append(memc
,
229 test_literal_param(__func__
), // Key
230 test_literal_param(__func__
), // Value
237 test_return_t
memcached_set_encoding_key_prepend_TEST(memcached_st
* memc
)
239 test_compare(MEMCACHED_SUCCESS
, memcached_set_encoding_key(memc
, test_literal_param(__func__
)));
241 test_compare(MEMCACHED_NOT_SUPPORTED
, memcached_prepend(memc
,
242 test_literal_param(__func__
), // Key
243 test_literal_param(__func__
), // Value
250 test_return_t
memcached_set_encoding_key_set_get_clone_TEST(memcached_st
* memc
)
252 memcached_st
*memc_no_crypt
= memcached_clone(NULL
, memc
);
253 test_true(memc_no_crypt
);
255 test_compare(MEMCACHED_SUCCESS
, memcached_set_encoding_key(memc
, test_literal_param(__func__
)));
257 memcached_st
*memc_crypt
= memcached_clone(NULL
, memc
);
258 test_true(memc_crypt
);
260 test_compare(MEMCACHED_SUCCESS
, memcached_set(memc
,
261 test_literal_param(__func__
), // Key
262 test_literal_param(__func__
), // Value
267 memcached_return_t rc
;
270 test_true((value
= memcached_get(memc
,
271 test_literal_param(__func__
), // Key
272 &value_length
, NULL
, &rc
)));
273 test_compare(MEMCACHED_SUCCESS
, rc
);
274 test_compare(test_literal_param_size(__func__
), value_length
);
275 test_memcmp(__func__
, value
, value_length
);
278 Check to make sure that the raw value is not the original.
280 size_t raw_value_length
;
282 test_true((raw_value
= memcached_get(memc_no_crypt
,
283 test_literal_param(__func__
), // Key
284 &raw_value_length
, NULL
, &rc
)));
285 test_compare(MEMCACHED_SUCCESS
, rc
);
286 test_ne_compare(test_literal_param_size(__func__
), raw_value_length
);
287 test_ne_compare(0, memcmp(__func__
, raw_value
, raw_value_length
));
290 Now we will use our clone, and make sure the encrypted values are the same.
292 size_t second_value_length
;
294 test_true((second_value
= memcached_get(memc_crypt
,
295 test_literal_param(__func__
), // Key
296 &second_value_length
, NULL
, &rc
)));
297 test_compare(MEMCACHED_SUCCESS
, rc
);
298 test_compare(value_length
, second_value_length
);
299 test_compare(0, memcmp(value
, second_value
, second_value_length
));
300 test_compare(test_literal_param_size(__func__
), second_value_length
);
301 test_compare(value_length
, second_value_length
);
302 test_memcmp(__func__
, second_value
, second_value_length
);
303 test_memcmp(value
, second_value
, second_value_length
);
310 memcached_free(memc_no_crypt
);
311 memcached_free(memc_crypt
);
316 test_return_t
memcached_set_encoding_key_set_grow_key_TEST(memcached_st
* memc
)
318 memcached_st
*memc_no_crypt
= memcached_clone(NULL
, memc
);
319 test_true(memc_no_crypt
);
320 test_compare(MEMCACHED_SUCCESS
, memcached_set_encoding_key(memc
, test_literal_param(__func__
)));
322 size_t payload_size
[] = { 100, 1000, 10000, 1000000, 1000000, 0 };
323 libtest::vchar_t payload
;
324 for (size_t *ptr
= payload_size
; *ptr
; ptr
++)
326 payload
.reserve(*ptr
);
327 for (size_t x
= payload
.size(); x
< *ptr
; x
++)
329 payload
.push_back(rand());
333 memcached_return_t rc
= memcached_set(memc
,
334 test_literal_param(__func__
), // Key
335 &payload
[0], payload
.size(), // Value
339 // If we run out of space on the server, we just end the test early.
340 if (rc
== MEMCACHED_SERVER_MEMORY_ALLOCATION_FAILURE
)
344 test_compare(MEMCACHED_SUCCESS
, rc
);
348 memcached_return_t rc
;
351 test_true((value
= memcached_get(memc
,
352 test_literal_param(__func__
), // Key
353 &value_length
, NULL
, &rc
)));
354 test_compare(MEMCACHED_SUCCESS
, rc
);
355 test_compare(payload
.size(), value_length
);
356 test_memcmp(&payload
[0], value
, value_length
);
358 size_t raw_value_length
;
360 test_true((raw_value
= memcached_get(memc_no_crypt
,
361 test_literal_param(__func__
), // Key
362 &raw_value_length
, NULL
, &rc
)));
363 test_compare(MEMCACHED_SUCCESS
, rc
);
364 test_ne_compare(payload
.size(), raw_value_length
);
365 test_ne_compare(0, memcmp(&payload
[0], raw_value
, raw_value_length
));
372 memcached_free(memc_no_crypt
);