Add unit tests for mm_radio.c 60/317860/6 tizen
authorGilbok Lee <gilbok.lee@samsung.com>
Thu, 19 Sep 2024 10:52:45 +0000 (19:52 +0900)
committerGilbok Lee <gilbok.lee@samsung.com>
Fri, 20 Sep 2024 09:14:27 +0000 (18:14 +0900)
- These tests use Google Mock to create mock objects and verify the behavior of the tested functions.
  The tests cover both positive and negative scenarios,
  including invalid input parameters and internal errors.
- With this addition, we significantly enhance the robustness and reliability of the mm-radio library,
  making it easier to maintain and extend over time.

[Version] 0.3.5
[Issue Type] Add unittest

Change-Id: Ie97ff03457ad0efde023156817156776672ad209

configure.ac
packaging/libmm-radio.spec
src/mm_radio.c
unittest/Makefile.am
unittest/gtest_libmm-radio.cpp [changed mode: 0755->0644]
unittest/libmm-radio-mock.cpp [new file with mode: 0644]
unittest/libmm-radio-mock.h [new file with mode: 0644]
unittest/ut_base.hpp [moved from unittest/gtest_libmm-radio.h with 55% similarity]

index 95ce7cd..6cc2f93 100755 (executable)
@@ -3,7 +3,7 @@
 
 AC_PREREQ(2.61)
 AC_INIT(libmm-radio, 0.1.0, heechul.jeon@samsung.com)
-AM_INIT_AUTOMAKE([-Wall -Werror foreign])
+AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
 AC_CONFIG_SRCDIR([src/mm_radio.c])
 AC_CONFIG_HEADER([config.h])
 
index 57ca42b..b70e7aa 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libmm-radio
 Summary:    Multimedia Framework Radio Library
-Version:    0.3.4
+Version:    0.3.5
 Release:    0
 Group:      System/Libraries
 License:    Apache-2.0
@@ -42,8 +42,10 @@ cp %{SOURCE1001} .
 
 export CFLAGS+=" %{optflags} -Wall"
 %ifarch %{arm}
-export CFLAGS+=" -DTIZEN_FEATURE_RADIO_HAL "
-export CFLAGS+=" -DPATH_LIBDIR=\\\"%{_libdir}\\\""
+export CFLAGS+=" -DTIZEN_FEATURE_RADIO_HAL -DPATH_LIBDIR=\\\"%{_libdir}\\\""
+%if 0%{?gtests:1}
+export CXXFLAGS+=" -DTIZEN_FEATURE_RADIO_HAL -DPATH_LIBDIR=\\\"%{_libdir}\\\""
+%endif
 %endif
 export LDFLAGS+=" -Wl,--as-needed -Wl,--rpath=%{_libdir}/hal"
 
index 38f737a..8c28091 100644 (file)
@@ -173,19 +173,23 @@ int mm_radio_unrealize(MMHandleType hradio)
 {
        int result = MM_ERROR_NONE;
        mm_radio_t *radio = (mm_radio_t *)hradio;
-       MMRadioStateType state = 0;
+       int state = MM_RADIO_STATE_NUM;
 
        MMRADIO_LOG_FENTER();
 
        MMRADIO_RETURN_VAL_IF_FAIL(radio, MM_ERROR_RADIO_NOT_INITIALIZED);
 
-       mm_radio_get_state((hradio), &state);
-       MMRADIO_LOG_DEBUG("mm_radio_unrealize state: %d", state);
+       MMRADIO_CMD_LOCK(radio);
 
-       if (state == MM_RADIO_STATE_SCANNING)
-               mm_radio_scan_stop(hradio);
+       _mmradio_get_state(radio, &state);
+       MMRADIO_LOG_DEBUG("_mmradio_get_state state: %d", state);
 
-       MMRADIO_CMD_LOCK(radio);
+       if ((MMRadioStateType)state == MM_RADIO_STATE_SCANNING) {
+               MMRADIO_LOG_DEBUG("state is scanning, stop scan");
+               _mmradio_stop_scan(radio);
+       } else {
+               MMRADIO_LOG_DEBUG("state not scanning");
+       }
 
        result = _mmradio_unrealize(radio);
 
@@ -231,7 +235,7 @@ int mm_radio_get_state(MMHandleType hradio, MMRadioStateType *pState)
 
        result = _mmradio_get_state(radio, &state);
 
-       *pState = state;
+       *pState = (MMRadioStateType)state;
 
        MMRADIO_CMD_UNLOCK(radio);
 
index efaf7e8..5c21298 100644 (file)
@@ -1,10 +1,9 @@
 # Unit tests
 bin_PROGRAMS = gtest_libmm_radio
 
-gtest_libmm_radio_SOURCES = gtest_libmm-radio.cpp
+gtest_libmm_radio_SOURCES = gtest_libmm-radio.cpp libmm-radio-mock.cpp
 
 gtest_libmm_radio_CXXFLAGS = -I$(top_srcdir)/src/include \
-                       $(GTHREAD_CFLAGS) \
                        $(MMCOMMON_CFLAGS) \
                        $(RM_CFLAGS) \
                        $(RI_CFLAGS) \
@@ -14,8 +13,6 @@ gtest_libmm_radio_CXXFLAGS = -I$(top_srcdir)/src/include \
                        $(SOUNDMGR_CFLAGS) \
                        -Werror -Wno-deprecated -Wno-deprecated-declarations -Wno-cpp
 
-gtest_libmm_radio_DEPENDENCIES = $(top_srcdir)/src/.libs/libmmfradio.la
-
 gtest_libmm_radio_LDADD = $(GTHREAD_LIBS) \
                        $(MMCOMMON_LIBS) \
                        $(RM_LIBS) \
@@ -23,8 +20,7 @@ gtest_libmm_radio_LDADD = $(GTHREAD_LIBS) \
                        $(RC_LIBS) \
                        $(DLOG_LIBS) \
                        $(GTESTS_LIBS) \
-                       $(SOUNDMGR_LIBS) \
-                       $(top_srcdir)/src/.libs/libmmfradio.la
+                       $(SOUNDMGR_LIBS)
 
 if ENABLE_EMULATOR
 gtest_libmm_radio_CXXFLAGS += $(GST_CFLAGS) \
old mode 100755 (executable)
new mode 100644 (file)
index bd3500a..d9f78c9
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018 Samsung Electronics Co., Ltd All Rights Reserved
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd All Rights Reserved
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * limitations under the License.
  */
 
+#include <gtest/gtest.h>
+#include <gmock/gmock.h>
 
-#include "gtest_libmm-radio.h"
-#include "mm_error.h"
-#include "mm_radio.h"
+#include "ut_base.hpp"
 
 using ::testing::InitGoogleTest;
 using ::testing::Test;
 using ::testing::TestCase;
+using ::testing::_;
+using ::testing::Return;
+using ::testing::ReturnArg;
 
 using namespace std;
 
-int ret;
-MMHandleType hradio;
+class MMRadioMockTest : public MMRadioMockBaseTest {
+public:
+       void SetUp() {
+               EXPECT_CALL(*_radioMock, _mmradio_create_radio(_))
+                               .Times(1)
+                               .WillOnce(Return(MM_ERROR_NONE));
+               ret = mm_radio_create(&radio);
+               ASSERT_EQ(ret, MM_ERROR_NONE);
+       }
 
-static int _message_callback(int message, void *pParam, void *user_param)
-{
-       MMMessageParamType* param = (MMMessageParamType*)pParam;
-
-       cout << "incoming message :" << message << endl;
-
-       switch(message)
-       {
-       case MM_MESSAGE_STATE_CHANGED:
-               cout << "MM_MESSAGE_STATE_CHANGED: current : " << param->state.current
-                       << "old : " << param->state.previous << endl;
-               break;
-       case MM_MESSAGE_RADIO_SCAN_START:
-               cout << "MM_MESSAGE_RADIO_SCAN_START" << endl;
-               break;
-       case MM_MESSAGE_RADIO_SCAN_INFO:
-               cout << "MM_MESSAGE_RADIO_SCAN_INFO : freq : " << param->radio_scan.frequency
-                       << endl;
-               break;
-       case MM_MESSAGE_RADIO_SCAN_STOP:
-               cout << "MM_MESSAGE_RADIO_SCAN_STOP" << endl;
-               break;
-       case MM_MESSAGE_RADIO_SCAN_FINISH:
-               cout << "MM_MESSAGE_RADIO_SCAN_FINISHED" << endl;
-               break;
-       case MM_MESSAGE_RADIO_SEEK_START:
-               cout << "MM_MESSAGE_RADIO_SEEK_START" << endl;
-               break;
-       case MM_MESSAGE_RADIO_SEEK_FINISH:
-               cout << "MM_MESSAGE_RADIO_SEEK_FINISHED : freq : " << param->radio_scan.frequency
-                       << endl;
-               break;
-       default:
-               cout << "ERROR : unknown message received!" << endl;
-               break;
+       void TearDown() {
+               if (radio) {
+                       EXPECT_CALL(*_radioMock, _mmradio_destroy(_))
+                               .Times(1)
+                               .WillOnce(Return(MM_ERROR_NONE));
+                       mm_radio_destroy(radio);
+               }
        }
+};
 
-       return 0;
+TEST_F(MMRadioMockTest, mm_radio_create_test_positive) {
+       EXPECT_CALL(*_radioMock, _mmradio_destroy(_))
+               .Times(1)
+               .WillOnce(Return(MM_ERROR_NONE));
+
+       EXPECT_CALL(*_radioMock, _mmradio_create_radio(_))
+               .Times(1)
+               .WillOnce(Return(MM_ERROR_NONE));
+
+       ret = mm_radio_destroy(radio);
+       ASSERT_EQ(ret, MM_ERROR_NONE);
+
+       ret = mm_radio_create(&radio);
+       ASSERT_EQ(ret, MM_ERROR_NONE);
 }
 
-class MMRadioTest : public ::testing::Test {
-       protected:
-               void SetUp() {
-                       ret = mm_radio_create(&hradio);
-                       ASSERT_EQ(ret, MM_ERROR_NONE) << "[FAILED] mm_radio_create";
+TEST_F(MMRadioMockTest, mm_radio_create_test_invalid_param) {
+       ret = mm_radio_create(NULL);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_NOT_INITIALIZED);
+}
 
-                       ret = mm_radio_set_message_callback(hradio, _message_callback, &hradio);
-                       ASSERT_EQ(ret, MM_ERROR_NONE) << "[FAILED] mm_radio_set_message_callback";
-               }
+TEST_F(MMRadioMockTest, mm_radio_create_test_mock_error) {
+       EXPECT_CALL(*_radioMock, _mmradio_destroy(_))
+               .Times(1)
+               .WillOnce(Return(MM_ERROR_NONE));
 
-               void TearDown() {
-                       ret = mm_radio_destroy(hradio);
-                       ASSERT_EQ(ret, MM_ERROR_NONE) << "[FAILED] mm_radio_destroy";
-                       return;
-               }
-};
+       EXPECT_CALL(*_radioMock, _mmradio_create_radio(_))
+               .Times(1)
+               .WillOnce(Return(MM_ERROR_RADIO_INTERNAL));
 
-TEST_F(MMRadioTest, mmradio_create_test)
-{
-       ASSERT_EQ(ret, MM_ERROR_NONE) << "[FAILED] mm_radio_create";
+       ret = mm_radio_destroy(radio);
+       ASSERT_EQ(ret, MM_ERROR_NONE);
+
+       ret = mm_radio_create(&radio);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_INTERNAL);
+       radio = nullptr;
+}
+
+TEST_F(MMRadioMockTest, mm_radio_destroy_test_positive) {
+       EXPECT_CALL(*_radioMock, _mmradio_destroy(_))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_NONE));
+
+       ret = mm_radio_destroy(radio);
+       ASSERT_EQ(ret, MM_ERROR_NONE);
+       radio = nullptr;
+}
+
+TEST_F(MMRadioMockTest, mm_radio_destroy_test_invalid_handle) {
+       ret = mm_radio_destroy(NULL);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_NOT_INITIALIZED);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_destroy_test_mock_error) {
+       EXPECT_CALL(*_radioMock, _mmradio_destroy(_))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_RADIO_INTERNAL));
+
+       ret = mm_radio_destroy(radio);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_INTERNAL);
+       radio = nullptr;
+}
+
+TEST_F(MMRadioMockTest, mm_radio_realize_test_positive) {
+       EXPECT_CALL(*_radioMock, _mmradio_realize(_))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_NONE));
+
+       int ret = mm_radio_realize(radio);
+       ASSERT_EQ(ret, MM_ERROR_NONE);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_realize_test_invalid_handle) {
+       ret = mm_radio_realize(NULL);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_NOT_INITIALIZED);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_realize_test_mock_error) {
+       EXPECT_CALL(*_radioMock, _mmradio_realize(_))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_RADIO_INTERNAL));
+
+       ret = mm_radio_realize(radio);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_INTERNAL);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_unrealize_test_positive) {
+       int state = (int)MM_RADIO_STATE_SCANNING;
+       EXPECT_CALL(*_radioMock, _mmradio_get_state(_, _))
+               .Times(1)
+               .WillOnce(::testing::DoAll(::testing::SetArgPointee<1>(state), ::testing::Return(MM_ERROR_NONE)));
+       EXPECT_CALL(*_radioMock, _mmradio_stop_scan(_))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_NONE));
+       EXPECT_CALL(*_radioMock, _mmradio_unrealize(_))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_NONE));
+
+       ret = mm_radio_unrealize(radio);
+       ASSERT_EQ(ret, MM_ERROR_NONE);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_unrealize_test_positive2) {
+       int state = (int)MM_RADIO_STATE_PLAYING;
+       EXPECT_CALL(*_radioMock, _mmradio_get_state(_, _))
+               .Times(1)
+               .WillOnce(::testing::DoAll(::testing::SetArgPointee<1>(state), ::testing::Return(MM_ERROR_NONE)));
+       EXPECT_CALL(*_radioMock, _mmradio_stop_scan(_))
+                       .Times(0);
+       EXPECT_CALL(*_radioMock, _mmradio_unrealize(_))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_NONE));
+
+       ret = mm_radio_unrealize(radio);
+       ASSERT_EQ(ret, MM_ERROR_NONE);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_unrealize_test_invalid_handle) {
+       ret = mm_radio_unrealize(NULL);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_NOT_INITIALIZED);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_unrealize_test_mock_error) {
+       EXPECT_CALL(*_radioMock, _mmradio_unrealize(_))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_RADIO_INTERNAL));
+
+       ret = mm_radio_unrealize(radio);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_INTERNAL);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_set_message_callback_test_positive) {
+       MMMessageCallback callback = [](int id, void* parm, void* user_param) { return 0; };
+       void *user_param = nullptr;
+
+       EXPECT_CALL(*_radioMock, _mmradio_set_message_callback(_, _, _))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_NONE));
+
+       ret = mm_radio_set_message_callback(radio, callback, user_param);
+       ASSERT_EQ(ret, MM_ERROR_NONE);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_set_message_callback_test_invalid_handle) {
+       MMMessageCallback callback = [](int id, void* parm, void* user_param) { return 0; };
+       void *user_param = nullptr;
+
+       EXPECT_CALL(*_radioMock, _mmradio_set_message_callback(_, _, _))
+                       .Times(0);
+
+       ret = mm_radio_set_message_callback(nullptr, callback, user_param);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_NOT_INITIALIZED);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_set_message_callback_test_mock_error) {
+       MMMessageCallback callback = [](int id, void* parm, void* user_param) { return 0; };
+       void *user_param = nullptr;
+
+       EXPECT_CALL(*_radioMock, _mmradio_set_message_callback(_, _, _))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_RADIO_INTERNAL));
+
+       ret = mm_radio_set_message_callback(radio, callback, user_param);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_INTERNAL);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_state_test_positive) {
+       int mock_state = (int)MM_RADIO_STATE_PLAYING;
+       MMRadioStateType state;
+
+       EXPECT_CALL(*_radioMock, _mmradio_get_state(_, _))
+                       .Times(1)
+                       .WillOnce(::testing::DoAll(::testing::SetArgPointee<1>(mock_state), ::testing::Return(MM_ERROR_NONE)));
+
+       ret = mm_radio_get_state(radio, &state);
+       ASSERT_EQ(ret, MM_ERROR_NONE);
+       ASSERT_EQ(state, MM_RADIO_STATE_PLAYING);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_state_test_invalid_handle) {
+       MMRadioStateType state;
+       EXPECT_CALL(*_radioMock, _mmradio_get_state(_, _))
+                       .Times(0);
+
+       ret = mm_radio_get_state(nullptr, &state);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_NOT_INITIALIZED);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_state_test_invalid_param) {
+       EXPECT_CALL(*_radioMock, _mmradio_get_state(_, _))
+                       .Times(0);
+
+       ret = mm_radio_get_state(radio, nullptr);
+       ASSERT_EQ(ret, MM_ERROR_COMMON_INVALID_ARGUMENT);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_state_test_mock_error) {
+       MMRadioStateType state;
+       EXPECT_CALL(*_radioMock, _mmradio_get_state(_, _))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_RADIO_INTERNAL));
+
+       ret = mm_radio_get_state(radio, &state);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_INTERNAL);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_start_test_positive) {
+       EXPECT_CALL(*_radioMock, _mmradio_start(_))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_NONE));
+
+       ret = mm_radio_start(radio);
+       ASSERT_EQ(ret, MM_ERROR_NONE);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_start_test_invalid_handle) {
+       EXPECT_CALL(*_radioMock, _mmradio_start(_))
+                       .Times(0);
+
+       ret = mm_radio_start(nullptr);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_NOT_INITIALIZED);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_start_test_mock_error) {
+       EXPECT_CALL(*_radioMock, _mmradio_start(_))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_RADIO_INTERNAL));
+
+       ret = mm_radio_start(radio);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_INTERNAL);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_stop_test_positive) {
+       EXPECT_CALL(*_radioMock, _mmradio_stop(_))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_NONE));
+
+       ret = mm_radio_stop(radio);
+       ASSERT_EQ(ret, MM_ERROR_NONE);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_stop_test_invalid_handle) {
+       EXPECT_CALL(*_radioMock, _mmradio_stop(_))
+                       .Times(0);
+
+       ret = mm_radio_stop(nullptr);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_NOT_INITIALIZED);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_stop_test_mock_error) {
+       EXPECT_CALL(*_radioMock, _mmradio_stop(_))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_RADIO_INTERNAL));
+
+       ret = mm_radio_stop(radio);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_INTERNAL);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_seek_test_positive) {
+       MMRadioSeekDirectionType direction = MM_RADIO_SEEK_UP;
+
+       EXPECT_CALL(*_radioMock, _mmradio_seek(_, _))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_NONE));
+
+       ret = mm_radio_seek(radio, direction);
+       ASSERT_EQ(ret, MM_ERROR_NONE);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_seek_test_invalid_handle) {
+       MMRadioSeekDirectionType direction = MM_RADIO_SEEK_UP;
+
+       EXPECT_CALL(*_radioMock, _mmradio_seek(_, _))
+                       .Times(0);
+
+       ret = mm_radio_seek(nullptr, direction);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_NOT_INITIALIZED);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_seek_test_invalid_param) {
+       MMRadioSeekDirectionType direction = (MMRadioSeekDirectionType)-1;
+
+       EXPECT_CALL(*_radioMock, _mmradio_seek(_, _))
+                       .Times(0);
+
+       ret = mm_radio_seek(radio, direction);
+       ASSERT_EQ(ret, MM_ERROR_INVALID_ARGUMENT);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_seek_test_mock_error) {
+       MMRadioSeekDirectionType direction = MM_RADIO_SEEK_UP;
+
+       EXPECT_CALL(*_radioMock, _mmradio_seek(_, _))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_RADIO_INTERNAL));
+
+       ret = mm_radio_seek(radio, direction);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_INTERNAL);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_set_frequency_test_positive) {
+       int freq = 87500;
+
+       EXPECT_CALL(*_radioMock, _mmradio_set_frequency(_, _))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_NONE));
+
+       ret = mm_radio_set_frequency(radio, freq);
+       ASSERT_EQ(ret, MM_ERROR_NONE);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_set_frequency_test_invalid_handle) {
+       int freq = 87500;
+
+       EXPECT_CALL(*_radioMock, _mmradio_set_frequency(_, _))
+                       .Times(0);
+
+       ret = mm_radio_set_frequency(nullptr, freq);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_NOT_INITIALIZED);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_set_frequency_test_mock_error) {
+       int freq = 87500;
+
+       EXPECT_CALL(*_radioMock, _mmradio_set_frequency(_, _))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_RADIO_INTERNAL));
+
+       ret = mm_radio_set_frequency(radio, freq);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_INTERNAL);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_frequency_test_positive) {
+       int mock_freq = 87500;
+       int freq = 0;
+
+       EXPECT_CALL(*_radioMock, _mmradio_get_frequency(_, _))
+                       .Times(1)
+                       .WillOnce(::testing::DoAll(::testing::SetArgPointee<1>(mock_freq), ::testing::Return(MM_ERROR_NONE)));
+
+       ret = mm_radio_get_frequency(radio, &freq);
+       ASSERT_EQ(ret, MM_ERROR_NONE);
+       ASSERT_EQ(freq, mock_freq);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_frequency_test_invalid_handle) {
+       int freq = 0;
+       EXPECT_CALL(*_radioMock, _mmradio_get_frequency(_, _))
+                       .Times(0);
+
+       ret = mm_radio_get_frequency(nullptr, &freq);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_NOT_INITIALIZED);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_frequency_test_invalid_param) {
+       EXPECT_CALL(*_radioMock, _mmradio_get_frequency(_, _))
+                       .Times(0);
+
+       ret = mm_radio_get_frequency(radio, nullptr);
+       ASSERT_EQ(ret, MM_ERROR_INVALID_ARGUMENT);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_frequency_test_mock_error) {
+       int freq = 0;
+       EXPECT_CALL(*_radioMock, _mmradio_get_frequency(_, _))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_RADIO_INTERNAL));
+
+       ret = mm_radio_get_frequency(radio, &freq);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_INTERNAL);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_scan_start_test_positive) {
+       EXPECT_CALL(*_radioMock, _mmradio_start_scan(_))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_NONE));
+
+       ret = mm_radio_scan_start(radio);
+       ASSERT_EQ(ret, MM_ERROR_NONE);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_scan_start_test_invalid_handle) {
+       EXPECT_CALL(*_radioMock, _mmradio_start_scan(_))
+                       .Times(0);
+
+       ret = mm_radio_scan_start(nullptr);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_NOT_INITIALIZED);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_scan_start_test_mock_error) {
+       EXPECT_CALL(*_radioMock, _mmradio_start_scan(_))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_RADIO_INTERNAL));
+
+       ret = mm_radio_scan_start(radio);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_INTERNAL);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_scan_stop_test_positive) {
+       EXPECT_CALL(*_radioMock, _mmradio_stop_scan(_))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_NONE));
+
+       ret = mm_radio_scan_stop(radio);
+       ASSERT_EQ(ret, MM_ERROR_NONE);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_scan_stop_test_invalid_handle) {
+       EXPECT_CALL(*_radioMock, _mmradio_stop_scan(_))
+                       .Times(0);
+
+       ret = mm_radio_scan_stop(nullptr);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_NOT_INITIALIZED);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_scan_stop_test_mock_error) {
+       EXPECT_CALL(*_radioMock, _mmradio_stop_scan(_))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_RADIO_INTERNAL));
+
+       ret = mm_radio_scan_stop(radio);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_INTERNAL);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_set_mute_test_positive_mute) {
+       bool muted = true;
+
+       EXPECT_CALL(*_radioMock, _mmradio_mute(_))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_NONE));
+
+       ret = mm_radio_set_mute(radio, muted);
+       ASSERT_EQ(ret, MM_ERROR_NONE);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_set_mute_test_positive_unmute) {
+       bool muted = false;
+
+       EXPECT_CALL(*_radioMock, _mmradio_unmute(_))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_NONE));
+
+       ret = mm_radio_set_mute(radio, muted);
+       ASSERT_EQ(ret, MM_ERROR_NONE);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_set_mute_test_invalid_handle) {
+       bool muted = true;
+
+       EXPECT_CALL(*_radioMock, _mmradio_mute(_))
+                       .Times(0);
+
+       ret = mm_radio_set_mute(nullptr, muted);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_NOT_INITIALIZED);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_set_mute_test_mock_error) {
+       bool muted = true;
+
+       EXPECT_CALL(*_radioMock, _mmradio_mute(_))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_RADIO_INTERNAL));
+
+       ret = mm_radio_set_mute(radio, muted);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_INTERNAL);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_signal_strength_test_positive) {
+       int mock_signal_strength = 50;
+       int signal_strength = -1;
+
+       EXPECT_CALL(*_radioMock, _mmradio_get_signal_strength(_, _))
+                       .Times(1)
+                       .WillOnce(::testing::DoAll(::testing::SetArgPointee<1>(mock_signal_strength), ::testing::Return(MM_ERROR_NONE)));
+
+       ret = mm_radio_get_signal_strength(radio, &signal_strength);
+       ASSERT_EQ(ret, MM_ERROR_NONE);
+       ASSERT_EQ(signal_strength, mock_signal_strength);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_signal_strength_test_invalid_handle) {
+       int signal_strength = -1;
+       EXPECT_CALL(*_radioMock, _mmradio_get_signal_strength(_, _))
+                       .Times(0);
+
+       ret = mm_radio_get_signal_strength(nullptr, &signal_strength);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_NOT_INITIALIZED);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_signal_strength_test_invalid_param) {
+       EXPECT_CALL(*_radioMock, _mmradio_get_signal_strength(_, _))
+                       .Times(0);
+
+       ret = mm_radio_get_signal_strength(radio, nullptr);
+       ASSERT_EQ(ret, MM_ERROR_INVALID_ARGUMENT);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_signal_strength_test_mock_error) {
+       int signal_strength = -1;
+       EXPECT_CALL(*_radioMock, _mmradio_get_signal_strength(_, _))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_RADIO_INTERNAL));
+
+       ret = mm_radio_get_signal_strength(radio, &signal_strength);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_INTERNAL);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_region_type_test_positive) {
+       MMRadioRegionType mock_region_type = MM_RADIO_REGION_GROUP_EUROPE;
+       MMRadioRegionType region_type = MM_RADIO_REGION_GROUP_NONE;
+
+       EXPECT_CALL(*_radioMock, _mmradio_get_region_type(_, _))
+                       .Times(1)
+                       .WillOnce(::testing::DoAll(::testing::SetArgPointee<1>(mock_region_type), ::testing::Return(MM_ERROR_NONE)));
+
+       ret = mm_radio_get_region_type(radio, &region_type);
+       ASSERT_EQ(ret, MM_ERROR_NONE);
+       ASSERT_EQ(region_type, mock_region_type);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_region_type_test_invalid_handle) {
+       MMRadioRegionType region_type = MM_RADIO_REGION_GROUP_NONE;
+       EXPECT_CALL(*_radioMock, _mmradio_get_region_type(_, _))
+                       .Times(0);
+
+       ret = mm_radio_get_region_type(nullptr, &region_type);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_NOT_INITIALIZED);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_region_type_test_invalid_param) {
+       EXPECT_CALL(*_radioMock, _mmradio_get_region_type(_, _))
+                       .Times(0);
+
+       ret = mm_radio_get_region_type(radio, nullptr);
+       ASSERT_EQ(ret, MM_ERROR_INVALID_ARGUMENT);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_region_type_test_mock_error) {
+       MMRadioRegionType region_type = MM_RADIO_REGION_GROUP_NONE;
+       EXPECT_CALL(*_radioMock, _mmradio_get_region_type(_, _))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_RADIO_INTERNAL));
+
+       ret = mm_radio_get_region_type(radio, &region_type);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_INTERNAL);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_region_frequency_range_test_positive) {
+       unsigned int mock_min_freq = 87500;
+       unsigned int mock_max_freq = 108000;
+       unsigned int min_freq = 0;
+       unsigned int max_freq = 0;
+
+       EXPECT_CALL(*_radioMock, _mmradio_get_region_frequency_range(_, _, _))
+                       .Times(1)
+                       .WillOnce(::testing::DoAll(::testing::SetArgPointee<1>(mock_min_freq), ::testing::SetArgPointee<2>(mock_max_freq), ::testing::Return(MM_ERROR_NONE)));
+
+       ret = mm_radio_get_region_frequency_range(radio, &min_freq, &max_freq);
+       ASSERT_EQ(ret, MM_ERROR_NONE);
+       ASSERT_EQ(min_freq, mock_min_freq);
+       ASSERT_EQ(max_freq, mock_max_freq);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_region_frequency_range_test_invalid_handle) {
+       unsigned int min_freq = 0;
+       unsigned int max_freq = 0;
+       EXPECT_CALL(*_radioMock, _mmradio_get_region_frequency_range(_, _, _))
+                       .Times(0);
+
+       ret = mm_radio_get_region_frequency_range(nullptr, &min_freq, &max_freq);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_NOT_INITIALIZED);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_region_frequency_range_test_invalid_param) {
+       unsigned int min_freq = 0;
+       unsigned int max_freq = 0;
+       EXPECT_CALL(*_radioMock, _mmradio_get_region_frequency_range(_, _, _))
+                       .Times(0);
+
+       ret = mm_radio_get_region_frequency_range(radio, nullptr, &max_freq);
+       ASSERT_EQ(ret, MM_ERROR_INVALID_ARGUMENT);
+
+       ret = mm_radio_get_region_frequency_range(radio, &min_freq, nullptr);
+       ASSERT_EQ(ret, MM_ERROR_INVALID_ARGUMENT);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_region_frequency_range_test_mock_error) {
+       unsigned int min_freq = 0;
+       unsigned int max_freq = 0;
+       EXPECT_CALL(*_radioMock, _mmradio_get_region_frequency_range(_, _, _))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_RADIO_INTERNAL));
+
+       ret = mm_radio_get_region_frequency_range(radio, &min_freq, &max_freq);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_INTERNAL);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_channel_spacing_test_positive) {
+       int mock_channel_spacing = 200;
+       int channel_spacing = 0;
+
+       EXPECT_CALL(*_radioMock, _mmradio_get_channel_spacing(_, _))
+                       .Times(1)
+                       .WillOnce(::testing::DoAll(::testing::SetArgPointee<1>(mock_channel_spacing), ::testing::Return(MM_ERROR_NONE)));
+
+       ret = mm_radio_get_channel_spacing(radio, &channel_spacing);
+       ASSERT_EQ(ret, MM_ERROR_NONE);
+       ASSERT_EQ(channel_spacing, mock_channel_spacing);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_channel_spacing_test_invalid_handle) {
+       int channel_spacing = 0;
+       EXPECT_CALL(*_radioMock, _mmradio_get_channel_spacing(_, _))
+                       .Times(0);
+
+       ret = mm_radio_get_channel_spacing(nullptr, &channel_spacing);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_NOT_INITIALIZED);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_channel_spacing_test_invalid_param) {
+       EXPECT_CALL(*_radioMock, _mmradio_get_channel_spacing(_, _))
+                       .Times(0);
+
+       ret = mm_radio_get_channel_spacing(radio, nullptr);
+       ASSERT_EQ(ret, MM_ERROR_INVALID_ARGUMENT);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_channel_spacing_test_mock_error) {
+       int channel_spacing = 0;
+       EXPECT_CALL(*_radioMock, _mmradio_get_channel_spacing(_, _))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_RADIO_INTERNAL));
+
+       ret = mm_radio_get_channel_spacing(radio, &channel_spacing);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_INTERNAL);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_set_volume_test_positive) {
+       float volume = 0.5f;
+
+       EXPECT_CALL(*_radioMock, _mmradio_set_volume(_, _))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_NONE));
+
+       ret = mm_radio_set_volume(radio, volume);
+       ASSERT_EQ(ret, MM_ERROR_NONE);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_set_volume_test_invalid_handle) {
+       float volume = 0.5f;
+
+       EXPECT_CALL(*_radioMock, _mmradio_set_volume(_, _))
+                       .Times(0);
+
+       ret = mm_radio_set_volume(nullptr, volume);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_NOT_INITIALIZED);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_set_volume_test_mock_error) {
+       float volume = 0.5f;
+
+       EXPECT_CALL(*_radioMock, _mmradio_set_volume(_, _))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_RADIO_INTERNAL));
+
+       ret = mm_radio_set_volume(radio, volume);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_INTERNAL);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_volume_test_positive) {
+       float mock_volume = 0.5f;
+       float volume = 0;
+
+       EXPECT_CALL(*_radioMock, _mmradio_get_volume(_, _))
+                       .Times(1)
+                       .WillOnce(::testing::DoAll(::testing::SetArgPointee<1>(mock_volume), ::testing::Return(MM_ERROR_NONE)));
+
+       ret = mm_radio_get_volume(radio, &volume);
+       ASSERT_EQ(ret, MM_ERROR_NONE);
+       ASSERT_FLOAT_EQ(volume, mock_volume);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_volume_test_invalid_handle) {
+       float volume = 0;
+       EXPECT_CALL(*_radioMock, _mmradio_get_volume(_, _))
+                       .Times(0);
+
+       ret = mm_radio_get_volume(nullptr, &volume);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_NOT_INITIALIZED);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_volume_test_invalid_param) {
+       EXPECT_CALL(*_radioMock, _mmradio_get_volume(_, _))
+                       .Times(0);
+
+       ret = mm_radio_get_volume(radio, nullptr);
+       ASSERT_EQ(ret, MM_ERROR_INVALID_ARGUMENT);
+}
+
+TEST_F(MMRadioMockTest, mm_radio_get_volume_test_mock_error) {
+       float volume = 0;
+       EXPECT_CALL(*_radioMock, _mmradio_get_volume(_, _))
+                       .Times(1)
+                       .WillOnce(Return(MM_ERROR_RADIO_INTERNAL));
+
+       ret = mm_radio_get_volume(radio, &volume);
+       ASSERT_EQ(ret, MM_ERROR_RADIO_INTERNAL);
 }
 
 int main(int argc, char **argv)
diff --git a/unittest/libmm-radio-mock.cpp b/unittest/libmm-radio-mock.cpp
new file mode 100644 (file)
index 0000000..da7b519
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * 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.
+ */
+
+#include "libmm-radio-mock.h"
+#include "ut_base.hpp"
+#include "../src/mm_radio.c"
+
+
+std::unique_ptr<RadioMock> MMRadioMockBaseTest::_radioMock;
+
+int _mmradio_create_radio(mm_radio_t *radio) {
+       return MMRadioMockBaseTest::_radioMock->_mmradio_create_radio(radio);
+}
+
+int _mmradio_destroy(mm_radio_t *radio) {
+       return MMRadioMockBaseTest::_radioMock->_mmradio_destroy(radio);
+}
+
+int _mmradio_realize(mm_radio_t *radio) {
+       return MMRadioMockBaseTest::_radioMock->_mmradio_realize(radio);
+}
+
+int _mmradio_unrealize(mm_radio_t *radio) {
+       return MMRadioMockBaseTest::_radioMock->_mmradio_unrealize(radio);
+}
+
+int _mmradio_set_message_callback(mm_radio_t *radio, MMMessageCallback callback, void *user_param) {
+       return MMRadioMockBaseTest::_radioMock->_mmradio_set_message_callback(radio, callback, user_param);
+}
+
+int _mmradio_get_state(mm_radio_t *radio, int *pState) {
+       return MMRadioMockBaseTest::_radioMock->_mmradio_get_state(radio, pState);
+}
+
+int _mmradio_set_frequency(mm_radio_t *radio, int freq) {
+       return MMRadioMockBaseTest::_radioMock->_mmradio_set_frequency(radio, freq);
+}
+
+int _mmradio_get_frequency(mm_radio_t *radio, int *pFreq) {
+       return MMRadioMockBaseTest::_radioMock->_mmradio_get_frequency(radio, pFreq);
+}
+
+int _mmradio_mute(mm_radio_t *radio) {
+       return MMRadioMockBaseTest::_radioMock->_mmradio_mute(radio);
+}
+
+int _mmradio_unmute(mm_radio_t *radio) {
+       return MMRadioMockBaseTest::_radioMock->_mmradio_unmute(radio);
+}
+
+int _mmradio_start(mm_radio_t *radio) {
+       return MMRadioMockBaseTest::_radioMock->_mmradio_start(radio);
+}
+
+int _mmradio_stop(mm_radio_t *radio) {
+       return MMRadioMockBaseTest::_radioMock->_mmradio_stop(radio);
+}
+
+int _mmradio_seek(mm_radio_t *radio, MMRadioSeekDirectionType direction) {
+       return MMRadioMockBaseTest::_radioMock->_mmradio_seek(radio, direction);
+}
+
+int _mmradio_start_scan(mm_radio_t *radio) {
+       return MMRadioMockBaseTest::_radioMock->_mmradio_start_scan(radio);
+}
+
+int _mmradio_stop_scan(mm_radio_t *radio) {
+       return MMRadioMockBaseTest::_radioMock->_mmradio_stop_scan(radio);
+}
+
+int _mmradio_get_signal_strength(mm_radio_t *radio, int *value) {
+       return MMRadioMockBaseTest::_radioMock->_mmradio_get_signal_strength(radio, value);
+}
+
+int _mmradio_apply_region(mm_radio_t*radio, MMRadioRegionType region, bool update) {
+       return MMRadioMockBaseTest::_radioMock->_mmradio_apply_region(radio, region, update);
+}
+
+int _mmradio_get_region_type(mm_radio_t*radio, MMRadioRegionType *type) {
+       return MMRadioMockBaseTest::_radioMock->_mmradio_get_region_type(radio, type);
+}
+
+int _mmradio_get_region_frequency_range(mm_radio_t *radio, unsigned int *min_freq, unsigned int *max_freq) {
+       return MMRadioMockBaseTest::_radioMock->_mmradio_get_region_frequency_range(radio, min_freq, max_freq);
+}
+
+int _mmradio_get_channel_spacing(mm_radio_t* radio, unsigned int *ch_spacing) {
+       return MMRadioMockBaseTest::_radioMock->_mmradio_get_channel_spacing(radio, ch_spacing);
+}
+
+int _mmradio_set_volume(mm_radio_t *radio, float volume) {
+       return MMRadioMockBaseTest::_radioMock->_mmradio_set_volume(radio, volume);
+}
+
+int _mmradio_get_volume(mm_radio_t *radio, float *pVolume) {
+       return MMRadioMockBaseTest::_radioMock->_mmradio_get_volume(radio, pVolume);
+}
diff --git a/unittest/libmm-radio-mock.h b/unittest/libmm-radio-mock.h
new file mode 100644 (file)
index 0000000..9bc3346
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * 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.
+ */
+
+#ifndef __LIB_MM_RADIO_MOCK_H__
+#define __LIB_MM_RADIO_MOCK_H__
+
+#include <gmock/gmock.h>
+
+#include "mm_radio.h"
+#ifdef TIZEN_FEATURE_RADIO_HAL
+#include "mm_radio_priv_hal.h"
+#else
+#include "mm_radio_priv_emul.h"
+#endif
+
+#undef LOG_TAG
+#define LOG_TAG                "GTEST_LIBMM_RADIO"
+
+class RadioInterface
+{
+public:
+       virtual ~RadioInterface() {};
+       virtual int _mmradio_create_radio(mm_radio_t *radio) = 0;
+       virtual int _mmradio_destroy(mm_radio_t *radio) = 0;
+       virtual int _mmradio_realize(mm_radio_t *radio) = 0;
+       virtual int _mmradio_unrealize(mm_radio_t *radio) = 0;
+       virtual int _mmradio_set_message_callback(mm_radio_t *radio, MMMessageCallback callback, void *user_param) = 0;
+       virtual int _mmradio_get_state(mm_radio_t *radio, int *pState) = 0;
+       virtual int _mmradio_set_frequency(mm_radio_t *radio, int freq) = 0;
+       virtual int _mmradio_get_frequency(mm_radio_t *radio, int *pFreq) = 0;
+       virtual int _mmradio_mute(mm_radio_t *radio) = 0;
+       virtual int _mmradio_unmute(mm_radio_t *radio) = 0;
+       virtual int _mmradio_start(mm_radio_t *radio) = 0;
+       virtual int _mmradio_stop(mm_radio_t *radio) = 0;
+       virtual int _mmradio_seek(mm_radio_t *radio, MMRadioSeekDirectionType direction) = 0;
+       virtual int _mmradio_start_scan(mm_radio_t *radio) = 0;
+       virtual int _mmradio_stop_scan(mm_radio_t *radio) = 0;
+       virtual int _mmradio_get_signal_strength(mm_radio_t *radio, int *value) = 0;
+       virtual int _mmradio_apply_region(mm_radio_t*radio, MMRadioRegionType region, bool update) = 0;
+       virtual int _mmradio_get_region_type(mm_radio_t*radio, MMRadioRegionType *type) = 0;
+       virtual int _mmradio_get_region_frequency_range(mm_radio_t *radio, unsigned int *min_freq, unsigned int *max_freq) = 0;
+       virtual int _mmradio_get_channel_spacing(mm_radio_t* radio, unsigned int *ch_spacing) = 0;
+       virtual int _mmradio_set_volume(mm_radio_t *radio, float volume) = 0;
+       virtual int _mmradio_get_volume(mm_radio_t *radio, float *pVolume) = 0;
+};
+
+class RadioMock : public RadioInterface
+{
+public:
+       virtual ~RadioMock() {}
+       MOCK_METHOD(int, _mmradio_create_radio, (mm_radio_t*));
+       MOCK_METHOD(int, _mmradio_destroy, (mm_radio_t*));
+       MOCK_METHOD(int, _mmradio_realize, (mm_radio_t*));
+       MOCK_METHOD(int, _mmradio_unrealize, (mm_radio_t*));
+       MOCK_METHOD(int, _mmradio_set_message_callback, (mm_radio_t*, MMMessageCallback, void*));
+       MOCK_METHOD(int, _mmradio_get_state, (mm_radio_t*, int*));
+       MOCK_METHOD(int, _mmradio_set_frequency, (mm_radio_t*, int));
+       MOCK_METHOD(int, _mmradio_get_frequency, (mm_radio_t*, int*));
+       MOCK_METHOD(int, _mmradio_mute, (mm_radio_t*));
+       MOCK_METHOD(int, _mmradio_unmute, (mm_radio_t*));
+       MOCK_METHOD(int, _mmradio_start, (mm_radio_t*));
+       MOCK_METHOD(int, _mmradio_stop, (mm_radio_t*));
+       MOCK_METHOD(int, _mmradio_seek, (mm_radio_t*, MMRadioSeekDirectionType));
+       MOCK_METHOD(int, _mmradio_start_scan, (mm_radio_t*));
+       MOCK_METHOD(int, _mmradio_stop_scan, (mm_radio_t*));
+       MOCK_METHOD(int, _mmradio_get_signal_strength, (mm_radio_t*, int*));
+       MOCK_METHOD(int, _mmradio_apply_region, (mm_radio_t*, MMRadioRegionType, bool));
+       MOCK_METHOD(int, _mmradio_get_region_type, (mm_radio_t*, MMRadioRegionType*));
+       MOCK_METHOD(int, _mmradio_get_region_frequency_range, (mm_radio_t*, unsigned int*, unsigned int*));
+       MOCK_METHOD(int, _mmradio_get_channel_spacing, (mm_radio_t*, unsigned int*));
+       MOCK_METHOD(int, _mmradio_set_volume, (mm_radio_t*, float));
+       MOCK_METHOD(int, _mmradio_get_volume, (mm_radio_t*, float*));
+};
+
+#endif /*__LIB_MM_RADIO_MOCK_H__*/
similarity index 55%
rename from unittest/gtest_libmm-radio.h
rename to unittest/ut_base.hpp
index 0d17f4e..8d986ae 100644 (file)
  * limitations under the License.
  */
 
-#ifndef __LIB_MM_RADIO_UNITTEST_H__
-#define __LIB_MM_RADIO_UNITTEST_H__
 
-#include <gmock/gmock.h>
 #include <gtest/gtest.h>
 
-#undef LOG_TAG
-#define LOG_TAG                "GTEST_LIBMM_RADIO"
+#include "mm_error.h"
+#include "libmm-radio-mock.h"
 
-#endif /*__LIB_MM_RADIO_UNITTEST_H__*/
+using ::testing::InitGoogleTest;
+using ::testing::Test;
+using ::testing::Return;
+using ::testing::TestCase;
+
+using namespace std;
+
+class MMRadioMockBaseTest : public ::testing::Test {
+public:
+       MMRadioMockBaseTest () {
+               _radioMock.reset(new ::testing::NiceMock<RadioMock> ());
+       }
+       ~MMRadioMockBaseTest () {
+               _radioMock.reset();
+       }
+
+       void SetUp() override {}
+
+       void TearDown() override {}
+
+       MMHandleType radio { nullptr };
+       static std::unique_ptr<RadioMock> _radioMock;
+       int ret = 0;
+};