--- /dev/null
+LINK_DIRECTORIES(${CMAKE_BINARY_DIR})
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR})
+
+SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden -Wall -Werror")
+SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Wno-unused-function -Wno-sign-compare")
+SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Wl,-zdefs" )
+SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fPIE")
+SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Werror")
+SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -std=c++11")
+SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS}")
+
+ADD_DEFINITIONS("-DFULLVER=\"${FULLVER}\"")
+
+SET(TEST_SOURCES
+ test_preference_manager_vconf.cpp
+ vconf_mock.cpp
+ ${CMAKE_SOURCE_DIR}/src/preference_manager_vconf.cpp
+)
+
+# Find Packages
+INCLUDE(FindPkgConfig)
+pkg_check_modules(pkgs REQUIRED
+ capi-appfw-application
+ capi-appfw-preference
+ multi-assistant
+ dlog
+ libxml-2.0
+)
+
+FOREACH(flag ${pkgs_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+FIND_PACKAGE(GTest REQUIRED)
+INCLUDE_DIRECTORIES(${GTEST_INCLUDE_DIRS})
+LINK_DIRECTORIES(${GTEST_LIBRARY_DIRS})
+
+SET(TEST_PREFERENCE_MANAGER_VCONF test-preference-manager-vconf)
+ADD_EXECUTABLE(${TEST_PREFERENCE_MANAGER_VCONF}
+ ${TEST_SOURCES}
+ )
+
+TARGET_LINK_LIBRARIES(${TEST_PREFERENCE_MANAGER_VCONF} -ldl ${GTEST_LIBRARIES} pthread
+ ${EXTRA_LDFLAGS} ${pkgs_LDFLAGS})
+
+SET_TARGET_PROPERTIES(${TEST_PREFERENCE_MANAGER_VCONF} PROPERTIES
+ COMPILE_FLAGS "-fPIE"
+ #Never add any space for LINKFLAGS
+ LINK_FLAGS "-Wl,\
+--wrap=vconf_get_int,\
+--wrap=vconf_get_bool,\
+--wrap=vconf_get_str,\
+--wrap=vconf_notify_key_changed,\
+--wrap=vconf_ignore_key_changed,\
+--wrap=vconf_keynode_get_name")
+
+INSTALL(TARGETS ${TEST_PREFERENCE_MANAGER_VCONF} DESTINATION bin)
+
+ADD_TEST(NAME ${TEST_PREFERENCE_MANAGER_VCONF} COMMAND ${TEST_PREFERENCE_MANAGER_VCONF})
--- /dev/null
+/*
+ * Copyright 2020 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * 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.
+ */
+
+#include <gtest/gtest.h>
+
+#include "preference_manager_vconf.h"
+
+#include <string>
+
+class DefaultFixture : public testing::Test
+{
+public:
+ DefaultFixture() {
+ }
+ virtual ~DefaultFixture() {
+ }
+ void SetUp() override {
+ }
+ void TearDown() override {
+ }
+
+ static void dummy_callback(std::string key, void* user_data) {
+ return;
+ }
+ CPreferenceManagerVconf preference_manager;
+};
+
+TEST_F(DefaultFixture, CanRegisterOneCallback) {
+ std::string arbitrary_key{"ArbitraryKey"};
+
+ bool ret = preference_manager.register_changed_callback(arbitrary_key, dummy_callback, nullptr);
+
+ ASSERT_EQ(ret, true);
+}
+
+TEST_F(DefaultFixture, CanRegisterTwoCallbacksForOneKey) {
+ std::string arbitrary_key{"ArbitraryKey"};
+ preference_manager.register_changed_callback(arbitrary_key, dummy_callback, nullptr);
+
+ bool ret = preference_manager.register_changed_callback(arbitrary_key, dummy_callback, nullptr);
+
+ ASSERT_EQ(ret, true);
+}
+
+TEST_F(DefaultFixture, CanRegisterTwoCallbacksForTwoDifferentKeys) {
+ std::string arbitrary_key_1{"ArbitraryKey1"};
+ std::string arbitrary_key_2{"ArbitraryKey2"};
+ preference_manager.register_changed_callback(arbitrary_key_1, dummy_callback, nullptr);
+
+ bool ret = preference_manager.register_changed_callback(arbitrary_key_2, dummy_callback, nullptr);
+
+ ASSERT_EQ(ret, true);
+}
+
+TEST_F(DefaultFixture, CanUnregisterOneCallback) {
+ std::string arbitrary_key{"ArbitraryKey"};
+ preference_manager.register_changed_callback(arbitrary_key, dummy_callback, nullptr);
+
+ bool ret = preference_manager.unregister_changed_callback(arbitrary_key, dummy_callback);
+
+ ASSERT_EQ(ret, true);
+}
+
+TEST_F(DefaultFixture, CanUnregisterTwoCallbacksForOneKey) {
+ std::string arbitrary_key{"ArbitraryKey"};
+ preference_manager.register_changed_callback(arbitrary_key, dummy_callback, nullptr);
+ preference_manager.register_changed_callback(arbitrary_key, dummy_callback, nullptr);
+ preference_manager.unregister_changed_callback(arbitrary_key, dummy_callback);
+
+ bool ret = preference_manager.unregister_changed_callback(arbitrary_key, dummy_callback);
+
+ ASSERT_EQ(ret, true);
+}
+
+TEST_F(DefaultFixture, CanUnregisterTwoCallbacksForTwoDifferentKeys) {
+ std::string arbitrary_key_1{"ArbitraryKey1"};
+ std::string arbitrary_key_2{"ArbitraryKey2"};
+ preference_manager.register_changed_callback(arbitrary_key_1, dummy_callback, nullptr);
+ preference_manager.register_changed_callback(arbitrary_key_2, dummy_callback, nullptr);
+ preference_manager.unregister_changed_callback(arbitrary_key_1, dummy_callback);
+
+ bool ret = preference_manager.unregister_changed_callback(arbitrary_key_2, dummy_callback);
+
+ ASSERT_EQ(ret, true);
+}
+
+TEST_F(DefaultFixture, CanUnregisterThreeCallbacksForThreeDifferentKeysForward) {
+ std::string arbitrary_key_1{"ArbitraryKey1"};
+ std::string arbitrary_key_2{"ArbitraryKey2"};
+ std::string arbitrary_key_3{"ArbitraryKey3"};
+ preference_manager.register_changed_callback(arbitrary_key_1, dummy_callback, nullptr);
+ preference_manager.register_changed_callback(arbitrary_key_2, dummy_callback, nullptr);
+ preference_manager.register_changed_callback(arbitrary_key_3, dummy_callback, nullptr);
+ preference_manager.unregister_changed_callback(arbitrary_key_1, dummy_callback);
+ preference_manager.unregister_changed_callback(arbitrary_key_2, dummy_callback);
+
+ bool ret = preference_manager.unregister_changed_callback(arbitrary_key_3, dummy_callback);
+
+ ASSERT_EQ(ret, true);
+}
+
+TEST_F(DefaultFixture, CanUnregisterThreeCallbacksForThreeDifferentKeysBackward) {
+ std::string arbitrary_key_1{"ArbitraryKey1"};
+ std::string arbitrary_key_2{"ArbitraryKey2"};
+ std::string arbitrary_key_3{"ArbitraryKey3"};
+ preference_manager.register_changed_callback(arbitrary_key_1, dummy_callback, nullptr);
+ preference_manager.register_changed_callback(arbitrary_key_2, dummy_callback, nullptr);
+ preference_manager.register_changed_callback(arbitrary_key_3, dummy_callback, nullptr);
+ preference_manager.unregister_changed_callback(arbitrary_key_3, dummy_callback);
+ preference_manager.unregister_changed_callback(arbitrary_key_2, dummy_callback);
+
+ bool ret = preference_manager.unregister_changed_callback(arbitrary_key_1, dummy_callback);
+
+ ASSERT_EQ(ret, true);
+}
+
+TEST_F(DefaultFixture, UnregisterFailsOnKeyNotExists) {
+ std::string arbitrary_key{"ArbitraryKey"};
+
+ bool ret = preference_manager.unregister_changed_callback(arbitrary_key, dummy_callback);
+
+ ASSERT_EQ(ret, false);
+}
+
+TEST_F(DefaultFixture, UnregisterFailurePreservesExistingEntry) {
+ std::string arbitrary_key_1{"ArbitraryKey1"};
+ std::string arbitrary_key_2{"ArbitraryKey2"};
+ preference_manager.register_changed_callback(arbitrary_key_1, dummy_callback, nullptr);
+ preference_manager.unregister_changed_callback(arbitrary_key_2, dummy_callback);
+
+ bool ret = preference_manager.unregister_changed_callback(arbitrary_key_1, dummy_callback);
+
+ ASSERT_EQ(ret, true);
+}
+
+int main(int argc, char** argv) {
+ testing::InitGoogleTest(&argc, argv);
+ int ret = RUN_ALL_TESTS();
+ return ret;
+}
--- /dev/null
+/*
+ * Copyright 2020 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * 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.
+ */
+
+#ifndef VCONF_MOCK_H
+#define VCONF_MOCK_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _keynode_t {
+ char *keyname; /**< Keyname for keynode */
+ int type; /**< Keynode type */
+ union {
+ int i; /**< Integer type */
+ int b; /**< Bool type */
+ double d; /**< Double type */
+ char *s; /**< String type */
+ } value; /**< Value for keynode */
+} keynode_t;
+typedef void (*vconf_callback_fn) (keynode_t *node, void *user_data);
+
+int __wrap_vconf_get_int(const char *in_key, int *intval);
+int __wrap_vconf_get_bool(const char *in_key, int *boolval);
+char *__wrap_vconf_get_str(const char *in_key);
+int __wrap_vconf_notify_key_changed(const char *in_key, vconf_callback_fn cb, void *user_data);
+int __wrap_vconf_ignore_key_changed(const char *in_key, vconf_callback_fn cb);
+char *__wrap_vconf_keynode_get_name(keynode_t *keynode);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif