#include "config.h"
#include "iotests.h"
class ArithmeticUnitTest : public MockUnitTest
{
};
static lcb_uint64_t arithm_val;
extern "C" {
static void arithmetic_incr_callback(lcb_t, const void *,
lcb_error_t error,
const lcb_arithmetic_resp_t *resp)
{
ASSERT_EQ(LCB_SUCCESS, error);
ASSERT_EQ(7, resp->v.v0.nkey);
ASSERT_EQ(0, memcmp(resp->v.v0.key, "counter", 7));
ASSERT_EQ(arithm_val + 1, resp->v.v0.value);
arithm_val = resp->v.v0.value;
}
static void arithmetic_decr_callback(lcb_t, const void *,
lcb_error_t error,
const lcb_arithmetic_resp_t *resp)
{
ASSERT_EQ(LCB_SUCCESS, error);
ASSERT_EQ(7, resp->v.v0.nkey);
ASSERT_EQ(0, memcmp(resp->v.v0.key, "counter", 7));
ASSERT_EQ(arithm_val - 1, resp->v.v0.value);
arithm_val = resp->v.v0.value;
}
static void arithmetic_create_callback(lcb_t, const void *,
lcb_error_t error,
const lcb_arithmetic_resp_t *resp)
{
ASSERT_EQ(LCB_SUCCESS, error);
ASSERT_EQ(9, resp->v.v0.nkey);
ASSERT_EQ(0, memcmp(resp->v.v0.key, "mycounter", 9));
ASSERT_EQ(0xdeadbeef, resp->v.v0.value);
}
}
static void initArithmeticKey(lcb_t instance, std::string key,
lcb_uint64_t value)
{
std::stringstream ss;
ss << value;
storeKey(instance, key, ss.str());
arithm_val = value;
}
TEST_F(ArithmeticUnitTest, testIncr)
{
lcb_t instance;
HandleWrap hw;
createConnection(hw, instance);
(void)lcb_set_arithmetic_callback(instance, arithmetic_incr_callback);
initArithmeticKey(instance, "counter", 0);
for (int ii = 0; ii < 10; ++ii) {
lcb_arithmetic_cmd_t cmd("counter", 7, 1);
lcb_arithmetic_cmd_t *cmds[] = { &cmd };
lcb_arithmetic(instance, NULL, 1, cmds);
lcb_wait(instance);
}
}
TEST_F(ArithmeticUnitTest, testDecr)
{
lcb_t instance;
HandleWrap hw;
createConnection(hw, instance);
(void)lcb_set_arithmetic_callback(instance, arithmetic_decr_callback);
initArithmeticKey(instance, "counter", 100);
for (int ii = 0; ii < 10; ++ii) {
lcb_arithmetic_cmd_t cmd("counter", 7, -1);
lcb_arithmetic_cmd_t *cmds[] = { &cmd };
lcb_arithmetic(instance, NULL, 1, cmds);
lcb_wait(instance);
}
}
TEST_F(ArithmeticUnitTest, testArithmeticCreate)
{
lcb_t instance;
HandleWrap hw;
createConnection(hw, instance);
removeKey(instance, "mycounter");
(void)lcb_set_arithmetic_callback(instance, arithmetic_create_callback);
lcb_arithmetic_cmd_t cmd("mycounter", 9, 0x77, 1, 0xdeadbeef);
lcb_arithmetic_cmd_t *cmds[] = { &cmd };
lcb_arithmetic(instance, NULL, 1, cmds);
lcb_wait(instance);
}