/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
*
* Libmemcached Client and Server
*
* Copyright (C) 2012 Data Differential, http://datadifferential.com/
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
*
* * The names of its contributors may not be used to endorse or
* promote products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#include <mem_config.h>
#include <libtest/test.hpp>
#include <libmemcached-1.0/memcached.h>
#include <libmemcachedutil-1.0/util.h>
#include "tests/libmemcached-1.0/encoding_key.h"
using namespace libtest;
test_return_t memcached_set_encoding_key_TEST(memcached_st* memc)
{
test_compare(MEMCACHED_SUCCESS, memcached_set_encoding_key(memc, test_literal_param(__func__)));
return TEST_SUCCESS;
}
test_return_t memcached_set_encoding_key_set_get_TEST(memcached_st* memc)
{
memcached_st *memc_no_crypt= memcached_clone(NULL, memc);
test_true(memc_no_crypt);
test_compare(MEMCACHED_SUCCESS, memcached_set_encoding_key(memc, test_literal_param(__func__)));
test_compare(MEMCACHED_SUCCESS, memcached_set(memc,
test_literal_param(__func__), // Key
test_literal_param(__func__), // Value
time_t(0),
uint32_t(0)));
{
memcached_return_t rc;
size_t value_length;
char *value;
test_true((value= memcached_get(memc,
test_literal_param(__func__), // Key
&value_length, NULL, &rc)));
test_compare(MEMCACHED_SUCCESS, rc);
test_compare(test_literal_param_size(__func__), value_length);
test_memcmp(__func__, value, value_length);
size_t raw_value_length;
char *raw_value;
test_true((raw_value= memcached_get(memc_no_crypt,
test_literal_param(__func__), // Key
&raw_value_length, NULL, &rc)));
test_compare(MEMCACHED_SUCCESS, rc);
test_ne_compare(value_length, raw_value_length);
test_ne_compare(0, memcmp(value, raw_value, raw_value_length));
free(value);
free(raw_value);
}
memcached_free(memc_no_crypt);
return TEST_SUCCESS;
}
test_return_t memcached_set_encoding_key_add_get_TEST(memcached_st* memc)
{
test_compare(MEMCACHED_SUCCESS, memcached_set_encoding_key(memc, test_literal_param(__func__)));
test_compare(MEMCACHED_SUCCESS, memcached_add(memc,
test_literal_param(__func__), // Key
test_literal_param(__func__), // Value
time_t(0),
uint32_t(0)));
{
memcached_return_t rc;
size_t value_length;
char *value;
test_true((value= memcached_get(memc,
test_literal_param(__func__), // Key
&value_length, NULL, &rc)));
test_compare(MEMCACHED_SUCCESS, rc);
test_compare(test_literal_param_size(__func__), value_length);
test_memcmp(__func__, value, value_length);
free(value);
}
return TEST_SUCCESS;
}
test_return_t memcached_set_encoding_key_replace_get_TEST(memcached_st* memc)
{
test_compare(MEMCACHED_SUCCESS, memcached_set_encoding_key(memc, test_literal_param(__func__)));
// First we add the key
{
test_compare(MEMCACHED_SUCCESS, memcached_add(memc,
test_literal_param(__func__), // Key
test_literal_param(__func__), // Value
time_t(0),
uint32_t(0)));
memcached_return_t rc;
size_t value_length;
char *value;
test_true((value= memcached_get(memc,
test_literal_param(__func__), // Key
&value_length, NULL, &rc)));
test_compare(MEMCACHED_SUCCESS, rc);
test_compare(test_literal_param_size(__func__), value_length);
test_memcmp(__func__, value, value_length);
free(value);
}
// Then we replace the key
{
libtest::vchar_t new_value;
vchar::make(new_value);
test_compare(MEMCACHED_SUCCESS, memcached_replace(memc,
test_literal_param(__func__), // Key
vchar_param(new_value), // Value
time_t(0),
uint32_t(0)));
memcached_return_t rc;
size_t value_length;
char *value;
test_true((value= memcached_get(memc,
test_literal_param(__func__), // Key
&value_length, NULL, &rc)));
test_compare(MEMCACHED_SUCCESS, rc);
test_compare(new_value.size(), value_length);
test_compare(0, vchar::compare(new_value, value, value_length));
free(value);
}
return TEST_SUCCESS;
}
test_return_t memcached_set_encoding_key_increment_TEST(memcached_st* memc)
{
test_compare(MEMCACHED_SUCCESS, memcached_set_encoding_key(memc, test_literal_param(__func__)));
test_compare(MEMCACHED_NOT_SUPPORTED, memcached_increment(memc,
test_literal_param(__func__), // Key
uint32_t(0),
NULL));
return TEST_SUCCESS;
}
test_return_t memcached_set_encoding_key_decrement_TEST(memcached_st* memc)
{
test_compare(MEMCACHED_SUCCESS, memcached_set_encoding_key(memc, test_literal_param(__func__)));
test_compare(MEMCACHED_NOT_SUPPORTED, memcached_decrement(memc,
test_literal_param(__func__), // Key
uint32_t(0),
NULL));
return TEST_SUCCESS;
}
test_return_t memcached_set_encoding_key_increment_with_initial_TEST(memcached_st* memc)
{
test_compare(MEMCACHED_SUCCESS, memcached_set_encoding_key(memc, test_literal_param(__func__)));
test_compare(MEMCACHED_NOT_SUPPORTED, memcached_increment_with_initial(memc,
test_literal_param(__func__), // Key
uint32_t(0),
uint32_t(0),
time_t(0),
NULL));
return TEST_SUCCESS;
}
test_return_t memcached_set_encoding_key_decrement_with_initial_TEST(memcached_st* memc)
{
test_compare(MEMCACHED_SUCCESS, memcached_set_encoding_key(memc, test_literal_param(__func__)));
test_compare(MEMCACHED_NOT_SUPPORTED, memcached_decrement_with_initial(memc,
test_literal_param(__func__), // Key
uint32_t(0),
uint32_t(0),
time_t(0),
NULL));
return TEST_SUCCESS;
}
test_return_t memcached_set_encoding_key_append_TEST(memcached_st* memc)
{
test_compare(MEMCACHED_SUCCESS, memcached_set_encoding_key(memc, test_literal_param(__func__)));
test_compare(MEMCACHED_NOT_SUPPORTED, memcached_append(memc,
test_literal_param(__func__), // Key
test_literal_param(__func__), // Value
time_t(0),
uint32_t(0)));
return TEST_SUCCESS;
}
test_return_t memcached_set_encoding_key_prepend_TEST(memcached_st* memc)
{
test_compare(MEMCACHED_SUCCESS, memcached_set_encoding_key(memc, test_literal_param(__func__)));
test_compare(MEMCACHED_NOT_SUPPORTED, memcached_prepend(memc,
test_literal_param(__func__), // Key
test_literal_param(__func__), // Value
time_t(0),
uint32_t(0)));
return TEST_SUCCESS;
}
test_return_t memcached_set_encoding_key_set_get_clone_TEST(memcached_st* memc)
{
memcached_st *memc_no_crypt= memcached_clone(NULL, memc);
test_true(memc_no_crypt);
test_compare(MEMCACHED_SUCCESS, memcached_set_encoding_key(memc, test_literal_param(__func__)));
memcached_st *memc_crypt= memcached_clone(NULL, memc);
test_true(memc_crypt);
test_compare(MEMCACHED_SUCCESS, memcached_set(memc,
test_literal_param(__func__), // Key
test_literal_param(__func__), // Value
time_t(0),
uint32_t(0)));
{
memcached_return_t rc;
size_t value_length;
char *value;
test_true((value= memcached_get(memc,
test_literal_param(__func__), // Key
&value_length, NULL, &rc)));
test_compare(MEMCACHED_SUCCESS, rc);
test_compare(test_literal_param_size(__func__), value_length);
test_memcmp(__func__, value, value_length);
/*
Check to make sure that the raw value is not the original.
*/
size_t raw_value_length;
char *raw_value;
test_true((raw_value= memcached_get(memc_no_crypt,
test_literal_param(__func__), // Key
&raw_value_length, NULL, &rc)));
test_compare(MEMCACHED_SUCCESS, rc);
test_ne_compare(test_literal_param_size(__func__), raw_value_length);
test_ne_compare(0, memcmp(__func__, raw_value, raw_value_length));
/*
Now we will use our clone, and make sure the encrypted values are the same.
*/
size_t second_value_length;
char *second_value;
test_true((second_value= memcached_get(memc_crypt,
test_literal_param(__func__), // Key
&second_value_length, NULL, &rc)));
test_compare(MEMCACHED_SUCCESS, rc);
test_compare(value_length, second_value_length);
test_compare(0, memcmp(value, second_value, second_value_length));
test_compare(test_literal_param_size(__func__), second_value_length);
test_compare(value_length, second_value_length);
test_memcmp(__func__, second_value, second_value_length);
test_memcmp(value, second_value, second_value_length);
free(value);
free(raw_value);
free(second_value);
}
memcached_free(memc_no_crypt);
memcached_free(memc_crypt);
return TEST_SUCCESS;
}
test_return_t memcached_set_encoding_key_set_grow_key_TEST(memcached_st* memc)
{
memcached_st *memc_no_crypt= memcached_clone(NULL, memc);
test_true(memc_no_crypt);
test_compare(MEMCACHED_SUCCESS, memcached_set_encoding_key(memc, test_literal_param(__func__)));
size_t payload_size[] = { 100, 1000, 10000, 1000000, 1000000, 0 };
libtest::vchar_t payload;
for (size_t *ptr= payload_size; *ptr; ptr++)
{
payload.reserve(*ptr);
for (size_t x= payload.size(); x < *ptr; x++)
{
payload.push_back(rand());
}
{
memcached_return_t rc= memcached_set(memc,
test_literal_param(__func__), // Key
&payload[0], payload.size(), // Value
time_t(0),
uint32_t(0));
// If we run out of space on the server, we just end the test early.
if (rc == MEMCACHED_SERVER_MEMORY_ALLOCATION_FAILURE)
{
break;
}
test_compare(MEMCACHED_SUCCESS, rc);
}
{
memcached_return_t rc;
size_t value_length;
char *value;
test_true((value= memcached_get(memc,
test_literal_param(__func__), // Key
&value_length, NULL, &rc)));
test_compare(MEMCACHED_SUCCESS, rc);
test_compare(payload.size(), value_length);
test_memcmp(&payload[0], value, value_length);
size_t raw_value_length;
char *raw_value;
test_true((raw_value= memcached_get(memc_no_crypt,
test_literal_param(__func__), // Key
&raw_value_length, NULL, &rc)));
test_compare(MEMCACHED_SUCCESS, rc);
test_ne_compare(payload.size(), raw_value_length);
test_ne_compare(0, memcmp(&payload[0], raw_value, raw_value_length));
free(value);
free(raw_value);
}
}
memcached_free(memc_no_crypt);
return TEST_SUCCESS;
}