+/*
+ * 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).
+ */
+
+extern "C" {
+#include "exstringsStub.h"
+#include "redismodule.h"
+}
+
+#include "CppUTest/TestHarness.h"
+#include "CppUTestExt/MockSupport.h"
+
+#include "ut_helpers.hpp"
+
+void nDelReturnNKeysFromUnlink(int count)
+{
+ mock()
+ .expectOneCall("RedisModule_CallReplyInteger")
+ .andReturnValue(count);
+
+}
+
+TEST_GROUP(exstrings_ndel)
+{
+ void setup()
+ {
+ mock().enable();
+ mock().ignoreOtherCalls();
+ }
+
+ void teardown()
+ {
+ mock().clear();
+ mock().disable();
+ }
+
+};
+
+TEST(exstrings_ndel, ndel_atomic_automemory_enabled)
+{
+ RedisModuleCtx ctx;
+ RedisModuleString ** redisStrVec = createRedisStrVec(2);
+
+ mock().ignoreOtherCalls();
+ mock().expectOneCall("RedisModule_AutoMemory");
+ int ret = NDel_Atomic_RedisCommand(&ctx, redisStrVec, 3);
+ mock().checkExpectations();
+ CHECK_EQUAL(ret, REDISMODULE_ERR);
+
+ delete []redisStrVec;
+}
+
+TEST(exstrings_ndel, ndel_atomic_command_parameter_parameter_number_incorrect)
+{
+ RedisModuleCtx ctx;
+ RedisModuleString ** redisStrVec = createRedisStrVec(2);
+
+ mock().ignoreOtherCalls();
+ mock().expectOneCall("RedisModule_WrongArity");
+ int ret = NDel_Atomic_RedisCommand(&ctx, redisStrVec, 3);
+ mock().checkExpectations();
+ CHECK_EQUAL(ret, REDISMODULE_ERR);
+
+ delete []redisStrVec;
+}
+
+TEST(exstrings_ndel, ndel_atomic_command_scan_0_keys_found)
+{
+ RedisModuleCtx ctx;
+ RedisModuleString ** redisStrVec = createRedisStrVec(2);
+
+ mock().ignoreOtherCalls();
+ returnNKeysFromScanSome(0);
+ mock().expectOneCall("RedisModule_ReplyWithLongLong")
+ .withParameter("ll", 0);
+ int ret = NDel_Atomic_RedisCommand(&ctx, redisStrVec, 2);
+ mock().checkExpectations();
+ CHECK_EQUAL(ret, REDISMODULE_OK);
+
+ delete []redisStrVec;
+}
+
+TEST(exstrings_ndel, ndel_atomic_command_scan_3_keys_found_3_keys_deleted)
+{
+ RedisModuleCtx ctx;
+ RedisModuleString ** redisStrVec = createRedisStrVec(2);
+
+ mock().ignoreOtherCalls();
+ mock().expectOneCall("RedisModule_Call")
+ .withParameter("cmdname", "SCAN");
+ returnNKeysFromScanSome(3);
+ mock()
+ .expectOneCall("RedisModule_Call")
+ .withParameter("cmdname", "UNLINK");
+ nDelReturnNKeysFromUnlink(3);
+ mock().expectOneCall("RedisModule_ReplyWithLongLong")
+ .withParameter("ll", 3);
+ int ret = NDel_Atomic_RedisCommand(&ctx, redisStrVec, 2);
+ mock().checkExpectations();
+ CHECK_EQUAL(ret, REDISMODULE_OK);
+
+ delete []redisStrVec;
+}
+
+TEST(exstrings_ndel, ndel_atomic_command_scan_3_keys_found_0_keys_deleted)
+{
+ RedisModuleCtx ctx;
+ RedisModuleString ** redisStrVec = createRedisStrVec(2);
+
+ mock().ignoreOtherCalls();
+ mock().expectOneCall("RedisModule_Call")
+ .withParameter("cmdname", "SCAN");
+ returnNKeysFromScanSome(3);
+ mock()
+ .expectOneCall("RedisModule_Call")
+ .withParameter("cmdname", "UNLINK");
+ nDelReturnNKeysFromUnlink(0);
+ mock().expectOneCall("RedisModule_ReplyWithLongLong")
+ .withParameter("ll", 0);
+ int ret = NDel_Atomic_RedisCommand(&ctx, redisStrVec, 2);
+ mock().checkExpectations();
+ CHECK_EQUAL(ret, REDISMODULE_OK);
+
+ delete []redisStrVec;
+}
+
+TEST(exstrings_ndel, ndel_atomic_command_scan_3_keys_found_1_keys_deleted)
+{
+ RedisModuleCtx ctx;
+ RedisModuleString ** redisStrVec = createRedisStrVec(2);
+
+ mock().ignoreOtherCalls();
+ mock().expectOneCall("RedisModule_Call")
+ .withParameter("cmdname", "SCAN");
+ returnNKeysFromScanSome(3);
+ mock()
+ .expectOneCall("RedisModule_Call")
+ .withParameter("cmdname", "UNLINK");
+ nDelReturnNKeysFromUnlink(1);
+ mock().expectOneCall("RedisModule_ReplyWithLongLong")
+ .withParameter("ll", 1);
+ int ret = NDel_Atomic_RedisCommand(&ctx, redisStrVec, 2);
+ mock().checkExpectations();
+ CHECK_EQUAL(ret, REDISMODULE_OK);
+
+ delete []redisStrVec;
+}