361 lines
9.6 KiB
C++
Executable File
361 lines
9.6 KiB
C++
Executable File
/*
|
|
* Copyright (c) 2018-2020 Nokia.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
/*
|
|
* This source code is part of the near-RT RIC (RAN Intelligent Controller)
|
|
* platform project (RICP).
|
|
*/
|
|
|
|
|
|
#include <unistd.h>
|
|
#include <string.h>
|
|
|
|
extern "C" {
|
|
#include "redismodule.h"
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <ctype.h>
|
|
}
|
|
|
|
#include <CppUTest/TestHarness.h>
|
|
#include <CppUTestExt/MockSupport.h>
|
|
|
|
#include "ut_helpers.hpp"
|
|
|
|
RedisModuleCallReply *RedisModule_Call(RedisModuleCtx *ctx, const char *cmdname, const char *fmt, ...)
|
|
{
|
|
(void)ctx;
|
|
(void)fmt;
|
|
return (RedisModuleCallReply *)mock().actualCall("RedisModule_Call")
|
|
.withParameter("cmdname", cmdname)
|
|
.returnPointerValueOrDefault(malloc(UT_DUMMY_BUFFER_SIZE));
|
|
}
|
|
|
|
int RedisModule_ReplyWithString(RedisModuleCtx *ctx, RedisModuleString *str)
|
|
{
|
|
(void)ctx;
|
|
(void)str;
|
|
return mock()
|
|
.actualCall("RedisModule_ReplyWithString")
|
|
.returnIntValueOrDefault(REDISMODULE_OK);
|
|
}
|
|
|
|
RedisModuleString *RedisModule_CreateStringFromCallReply(RedisModuleCallReply *reply)
|
|
{
|
|
(void)reply;
|
|
return (RedisModuleString *)mock().actualCall("RedisModule_CreateStringFromCallReply")
|
|
.returnPointerValue();
|
|
}
|
|
|
|
void RedisModule_CloseKey(RedisModuleKey *kp)
|
|
{
|
|
(void)kp;
|
|
mock().actualCall("RedisModule_CloseKey");
|
|
}
|
|
|
|
size_t RedisModule_CallReplyLength(RedisModuleCallReply *reply)
|
|
{
|
|
(void)reply;
|
|
return (size_t)mock().actualCall("RedisModule_CallReplyLength")
|
|
.returnIntValue();
|
|
}
|
|
|
|
int RedisModule_ReplyWithArray(RedisModuleCtx *ctx, long len)
|
|
{
|
|
(void)ctx;
|
|
return (int)mock().actualCall("RedisModule_ReplyWithArray")
|
|
.withParameter("len", len)
|
|
.returnIntValueOrDefault(REDISMODULE_OK);
|
|
}
|
|
|
|
void RedisModule_ReplySetArrayLength(RedisModuleCtx *ctx, long len)
|
|
{
|
|
(void)ctx;
|
|
mock().actualCall("RedisModule_ReplySetArrayLength")
|
|
.withParameter("len", len);
|
|
}
|
|
|
|
RedisModuleString *RedisModule_CreateString(RedisModuleCtx *ctx, const char *ptr, size_t len)
|
|
{
|
|
(void)ctx;
|
|
(void)ptr;
|
|
(void)len;
|
|
void* buf = malloc(UT_DUMMY_BUFFER_SIZE);
|
|
return (RedisModuleString *) mock()
|
|
.actualCall("RedisModule_CreateString")
|
|
.returnPointerValueOrDefault(buf);
|
|
}
|
|
|
|
RedisModuleString *RedisModule_CreateStringFromLongLong(RedisModuleCtx *ctx, long long ll)
|
|
{
|
|
(void)ctx;
|
|
(void)ll;
|
|
void* buf = malloc(UT_DUMMY_BUFFER_SIZE);
|
|
return (RedisModuleString *)mock()
|
|
.actualCall("RedisModule_CreateStringFromLongLong")
|
|
.returnPointerValueOrDefault(buf);
|
|
}
|
|
|
|
void RedisModule_AutoMemory(RedisModuleCtx *ctx)
|
|
{
|
|
(void)ctx;
|
|
mock().actualCall("RedisModule_AutoMemory");
|
|
}
|
|
|
|
void RedisModule_FreeString(RedisModuleCtx *ctx, RedisModuleString *str)
|
|
{
|
|
(void)ctx;
|
|
free(str);
|
|
mock().actualCall("RedisModule_FreeString");
|
|
}
|
|
|
|
int RedisModule_StringToLongLong(const RedisModuleString *str, long long *ll)
|
|
{
|
|
(void)str;
|
|
return (int)mock().actualCall("RedisModule_StringToLongLong")
|
|
.withOutputParameter("ll", ll)
|
|
.returnIntValueOrDefault(REDISMODULE_OK);
|
|
}
|
|
|
|
void RedisModule_FreeCallReply(RedisModuleCallReply *reply)
|
|
{
|
|
free(reply);
|
|
mock().actualCall("RedisModule_FreeCallReply");
|
|
}
|
|
|
|
RedisModuleCallReply *RedisModule_CallReplyArrayElement(RedisModuleCallReply *reply, size_t idx)
|
|
{
|
|
(void)reply;
|
|
(void)idx;
|
|
return (RedisModuleCallReply *)mock()
|
|
.actualCall("RedisModule_CallReplyArrayElement")
|
|
.returnPointerValueOrDefault(NULL);
|
|
}
|
|
|
|
int RedisModule_ReplyWithLongLong(RedisModuleCtx *ctx, long long ll)
|
|
{
|
|
(void)ctx;
|
|
return (int)mock()
|
|
.actualCall("RedisModule_ReplyWithLongLong")
|
|
.withParameter("ll", (int)ll)
|
|
.returnIntValueOrDefault(REDISMODULE_OK);
|
|
}
|
|
|
|
long long RedisModule_CallReplyInteger(RedisModuleCallReply *reply)
|
|
{
|
|
(void)reply;
|
|
return (long long)mock()
|
|
.actualCall("RedisModule_CallReplyInteger")
|
|
.returnIntValue();
|
|
}
|
|
|
|
int RedisModule_CallReplyType(RedisModuleCallReply *reply)
|
|
{
|
|
(void)reply;
|
|
return (int)mock()
|
|
.actualCall("RedisModule_CallReplyType")
|
|
.returnIntValue();
|
|
}
|
|
|
|
int RedisModule_WrongArity(RedisModuleCtx *ctx)
|
|
{
|
|
(void)ctx;
|
|
return (int)mock()
|
|
.actualCall("RedisModule_WrongArity")
|
|
.returnIntValueOrDefault(REDISMODULE_ERR);
|
|
}
|
|
|
|
int RedisModule_ReplyWithError(RedisModuleCtx *ctx, const char *err)
|
|
{
|
|
(void)ctx;
|
|
(void)err;
|
|
return (int)mock()
|
|
.actualCall("RedisModule_ReplyWithError")
|
|
.returnIntValueOrDefault(REDISMODULE_OK);
|
|
}
|
|
|
|
int RedisModule_ReplyWithCallReply(RedisModuleCtx *ctx, RedisModuleCallReply *reply)
|
|
{
|
|
(void)ctx;
|
|
(void)reply;
|
|
return (int)mock()
|
|
.actualCall("RedisModule_ReplyWithCallReply")
|
|
.returnIntValueOrDefault(REDISMODULE_OK);
|
|
}
|
|
|
|
void *RedisModule_OpenKey(RedisModuleCtx *ctx, RedisModuleString *keyname, int mode)
|
|
{
|
|
(void)ctx;
|
|
(void)keyname;
|
|
(void)mode;
|
|
return (void *)mock()
|
|
.actualCall("RedisModule_OpenKey")
|
|
.returnPointerValue();
|
|
}
|
|
|
|
int RedisModule_KeyType(RedisModuleKey *kp)
|
|
{
|
|
(void)kp;
|
|
return (int)mock()
|
|
.actualCall("RedisModule_KeyType")
|
|
.returnIntValue();
|
|
}
|
|
|
|
const char *RedisModule_StringPtrLen(const RedisModuleString *str, size_t *len)
|
|
{
|
|
(void)str;
|
|
if (len != NULL) {
|
|
return (const char *)mock()
|
|
.actualCall("RedisModule_StringPtrLen")
|
|
.withOutputParameter("len", len)
|
|
.returnPointerValue();
|
|
} else {
|
|
return (const char *)mock()
|
|
.actualCall("RedisModule_StringPtrLen")
|
|
.returnPointerValue();
|
|
}
|
|
}
|
|
|
|
RedisModuleBlockedClient *RedisModule_BlockClient(RedisModuleCtx *ctx, RedisModuleCmdFunc reply_callback,
|
|
RedisModuleCmdFunc timeout_callback,
|
|
void (*free_privdata)(RedisModuleCtx*,void*),
|
|
long long timeout_ms)
|
|
{
|
|
(void)ctx;
|
|
(void)reply_callback;
|
|
(void)timeout_callback;
|
|
(void)free_privdata;
|
|
(void)timeout_ms;
|
|
|
|
void *buf = malloc(UT_DUMMY_BUFFER_SIZE);
|
|
return (RedisModuleBlockedClient *)mock()
|
|
.actualCall("RedisModule_BlockClient")
|
|
.returnPointerValueOrDefault(buf);
|
|
}
|
|
|
|
int RedisModule_UnblockClient(RedisModuleBlockedClient *bc, void *privdata)
|
|
{
|
|
(void)privdata;
|
|
|
|
free(bc);
|
|
return (int)mock()
|
|
.actualCall("RedisModule_UnblockClient")
|
|
.returnIntValueOrDefault(REDISMODULE_OK);
|
|
}
|
|
|
|
const char *RedisModule_CallReplyStringPtr(RedisModuleCallReply *reply, size_t *len)
|
|
{
|
|
(void)reply;
|
|
(void)len;
|
|
|
|
static char cursor_zero_literal[] = "0";
|
|
return (const char *)mock()
|
|
.actualCall("RedisModule_CallReplyStringPtr")
|
|
.returnPointerValueOrDefault(cursor_zero_literal);
|
|
}
|
|
|
|
int RedisModule_AbortBlock(RedisModuleBlockedClient *bc)
|
|
{
|
|
free(bc);
|
|
return mock()
|
|
.actualCall("RedisModule_AbortBlock")
|
|
.returnIntValueOrDefault(REDISMODULE_OK);
|
|
}
|
|
|
|
int RedisModule_ReplyWithNull(RedisModuleCtx *ctx)
|
|
{
|
|
(void)ctx;
|
|
return mock()
|
|
.actualCall("RedisModule_ReplyWithNull")
|
|
.returnIntValueOrDefault(REDISMODULE_OK);
|
|
}
|
|
|
|
void RedisModule_ThreadSafeContextUnlock(RedisModuleCtx *ctx)
|
|
{
|
|
(void)ctx;
|
|
int tmp = mock().getData("TimesThreadSafeContextWasUnlocked").getIntValue();
|
|
mock().setData("TimesThreadSafeContextWasUnlocked", tmp + 1);
|
|
mock()
|
|
.actualCall("RedisModule_ThreadSafeContextUnlock");
|
|
}
|
|
|
|
void RedisModule_ThreadSafeContextLock(RedisModuleCtx *ctx)
|
|
{
|
|
(void)ctx;
|
|
int tmp = mock().getData("TimesThreadSafeContextWasLocked").getIntValue();
|
|
mock().setData("TimesThreadSafeContextWasLocked", tmp + 1);
|
|
mock()
|
|
.actualCall("RedisModule_ThreadSafeContextLock");
|
|
}
|
|
|
|
RedisModuleCtx *RedisModule_GetThreadSafeContext(RedisModuleBlockedClient *bc)
|
|
{
|
|
(void)bc;
|
|
return (RedisModuleCtx *)mock()
|
|
.actualCall("RedisModule_GetThreadSafeContext")
|
|
.returnPointerValueOrDefault(0);
|
|
}
|
|
|
|
void RedisModule_FreeThreadSafeContext(RedisModuleCtx *ctx)
|
|
{
|
|
(void)ctx;
|
|
mock()
|
|
.actualCall("RedisModule_FreeThreadSafeContext");
|
|
}
|
|
|
|
/* This is included inline inside each Redis module. */
|
|
int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int apiver)
|
|
{
|
|
(void)ctx;
|
|
(void)name;
|
|
(void)ver;
|
|
(void)apiver;
|
|
|
|
return mock()
|
|
.actualCall("RedisModule_Init")
|
|
.returnIntValueOrDefault(REDISMODULE_OK);
|
|
}
|
|
|
|
int RedisModule_CreateCommand(RedisModuleCtx *ctx, const char *name, RedisModuleCmdFunc cmdfunc, const char *strflags, int firstkey, int lastkey, int keystep)
|
|
{
|
|
(void)ctx;
|
|
(void)name;
|
|
(void)cmdfunc;
|
|
(void)strflags;
|
|
(void)firstkey;
|
|
(void)lastkey;
|
|
(void)keystep;
|
|
|
|
return mock()
|
|
.actualCall("RedisModule_CreateCommand")
|
|
.returnIntValueOrDefault(REDISMODULE_OK);
|
|
}
|
|
|
|
void *RedisModule_Alloc(size_t bytes)
|
|
{
|
|
void *buf = malloc(bytes);
|
|
return mock()
|
|
.actualCall("RedisModule_Alloc")
|
|
.returnPointerValueOrDefault(buf);
|
|
}
|
|
|
|
void RedisModule_Free(void *ptr)
|
|
{
|
|
free(ptr);
|
|
mock()
|
|
.actualCall("RedisModule_Free");
|
|
}
|