summaryrefslogtreecommitdiff
path: root/testcase
diff options
context:
space:
mode:
Diffstat (limited to 'testcase')
-rw-r--r--testcase/Makefile.am3
-rw-r--r--testcase/audio/Makefile.am18
-rw-r--r--testcase/audio/audio_haltests.cpp870
-rw-r--r--testcase/audio/dtmf_16le_44100_2ch.rawbin0 -> 882000 bytes
4 files changed, 890 insertions, 1 deletions
diff --git a/testcase/Makefile.am b/testcase/Makefile.am
index 1d5c729..4c6082d 100644
--- a/testcase/Makefile.am
+++ b/testcase/Makefile.am
@@ -1,3 +1,4 @@
SUBDIRS = camera \
- radio
+ radio \
+ audio
diff --git a/testcase/audio/Makefile.am b/testcase/audio/Makefile.am
new file mode 100644
index 0000000..779de11
--- /dev/null
+++ b/testcase/audio/Makefile.am
@@ -0,0 +1,18 @@
+# with gtest
+bin_PROGRAMS = audio_haltests
+
+audio_haltests_SOURCES = \
+ audio_haltests.cpp
+
+audio_haltests_CPPFLAGS = \
+ $(DLOG_CFLAGS)\
+ $(SYSTEM_INFO_CFLAGS)\
+ -I$(srcdir)/../../include/audio
+
+audio_haltests_LDADD = \
+ -ldl\
+ -lgtest\
+ $(top_builddir)/src/audio/libaudio_hal_interface.la\
+ $(DLOG_LIBS)\
+ $(SYSTEM_INFO_LIBS)
+
diff --git a/testcase/audio/audio_haltests.cpp b/testcase/audio/audio_haltests.cpp
new file mode 100644
index 0000000..49fb907
--- /dev/null
+++ b/testcase/audio/audio_haltests.cpp
@@ -0,0 +1,870 @@
+/*
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Seungbae Shin <seungbae.shin@samsung.com>
+ *
+ * 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 <string.h>
+#include <unistd.h>
+#include <iostream>
+#include <array>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <gtest/gtest.h>
+
+#include <audio_hal_interface.h>
+#include <system_info.h>
+
+using namespace std;
+
+typedef enum audio_sample_format {
+ AUDIO_SAMPLE_U8,
+ AUDIO_SAMPLE_ALAW,
+ AUDIO_SAMPLE_ULAW,
+ AUDIO_SAMPLE_S16LE,
+ AUDIO_SAMPLE_S16BE,
+ AUDIO_SAMPLE_FLOAT32LE,
+ AUDIO_SAMPLE_FLOAT32BE,
+ AUDIO_SAMPLE_S32LE,
+ AUDIO_SAMPLE_S32BE,
+ AUDIO_SAMPLE_S24LE,
+ AUDIO_SAMPLE_S24BE,
+ AUDIO_SAMPLE_S24_32LE,
+ AUDIO_SAMPLE_S24_32BE,
+ AUDIO_SAMPLE_MAX,
+ AUDIO_SAMPLE_INVALID = -1
+} audio_sample_format_t;
+
+typedef struct {
+ audio_sample_format_t format;
+ uint32_t rate;
+ uint8_t channels;
+} audio_pcm_sample_spec_t;
+
+
+/*
+ * TestSuite Class
+ */
+class AudioHalTest : public testing::Test
+{
+ public:
+ virtual void SetUp();
+ virtual void TearDown();
+
+ protected:
+ void SetRouteToSpeaker();
+ int32_t WritePcmFromFile(pcm_handle pcm_h, audio_pcm_sample_spec_t *spec);
+ uint32_t BytesToFrames(uint32_t bytes, audio_pcm_sample_spec_t *spec);
+ uint32_t FramesToBytes(uint32_t frames, audio_pcm_sample_spec_t *spec);
+ static void HalMessageCallback(const char *name, int value, void *user_data);
+
+ audio_hal_interface *m_h;
+ const string default_card = "sprdphone";
+ const string default_device = "0";
+
+ private:
+};
+
+void AudioHalTest::SetUp()
+{
+ m_h = nullptr;
+
+ int32_t ret = audio_hal_interface_init(&m_h);
+ if (ret != AUDIO_HAL_SUCCESS)
+ cout << "audio hal init failed : " << ret << endl;
+}
+
+void AudioHalTest::TearDown()
+{
+ if (m_h == nullptr)
+ return;
+
+ int32_t ret = audio_hal_interface_deinit(m_h);
+ if (ret != AUDIO_HAL_SUCCESS)
+ cout << "audio hal deinit failed : " << ret << endl;
+
+ m_h = nullptr;
+}
+
+void AudioHalTest::SetRouteToSpeaker()
+{
+ hal_route_info info;
+ int32_t num_of_devices = 1;
+
+ memset(&info, 0, sizeof(hal_route_info));
+
+ info.role = "media";
+ info.device_infos = (hal_device_info*)malloc(sizeof(hal_device_info) * num_of_devices);
+ if (info.device_infos == nullptr) {
+ cout << "malloc error!!! : " << errno << endl;
+ return;
+ }
+ info.device_infos[0].direction = DIRECTION_OUT;
+ info.device_infos[0].type = "builtin-speaker";
+ info.device_infos[0].id = 100;
+ info.num_of_devices = num_of_devices;
+
+ int32_t ret = audio_hal_interface_update_route(m_h, &info);
+
+ cout << "update route : " << ret << endl;
+
+ free(info.device_infos);
+}
+
+int32_t AudioHalTest::WritePcmFromFile(pcm_handle pcm_h, audio_pcm_sample_spec_t *spec)
+{
+ int32_t ret = AUDIO_HAL_SUCCESS;
+ char buffer[65536];
+
+ const char res_path[] = "/usr/share/testcase/res/audio/dtmf_16le_44100_2ch.raw";
+
+ int fd = open(res_path, O_RDONLY);
+ cout << res_path << ", fd opened : " << fd << endl;
+
+ cout << "start to play dtmf sounds for 5 sec. " << endl;
+
+ while (fd != -1) {
+
+ uint32_t avail_frames = 0;
+ ret = audio_hal_interface_pcm_available(m_h, pcm_h, &avail_frames);
+
+ if (avail_frames == 0) {
+ usleep(20000); // 20ms
+ continue;
+ }
+
+ int bytes_read = read(fd, buffer, FramesToBytes(avail_frames, spec));
+ //cout << "avail frames : " << avail_frames << ", read_n : " << bytes_read << endl;
+
+ ret = audio_hal_interface_pcm_write(m_h, pcm_h, buffer, BytesToFrames(bytes_read, spec));
+ if (ret == AUDIO_HAL_ERROR)
+ break;
+
+ if (bytes_read < static_cast<int>(FramesToBytes(avail_frames, spec))) {
+ cout << "EOS!!!" << endl;
+ break;
+ }
+ }
+
+ cout << "Done!!!" << endl;
+
+ if (fd != -1)
+ close(fd);
+
+ return ret;
+}
+
+uint32_t AudioHalTest::BytesToFrames(uint32_t bytes, audio_pcm_sample_spec_t *spec)
+{
+ if (spec->format == AUDIO_SAMPLE_S16LE)
+ return bytes / spec->channels / 2;
+ else
+ return 0; // not supported yet.
+
+}
+
+uint32_t AudioHalTest::FramesToBytes(uint32_t frames, audio_pcm_sample_spec_t *spec)
+{
+ if (spec->format == AUDIO_SAMPLE_S16LE)
+ return frames * spec->channels * 2;
+ else
+ return 0; // not supported yet.
+}
+
+void AudioHalTest::HalMessageCallback(const char *name, int value, void *user_data)
+{
+ cout << name << "," << value << "," << user_data << endl;
+}
+
+/**
+ * @testcase InitP
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Positive, Initialize audio HAL handle
+ * @apicovered audio_init, audio_deinit
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST(AudioHalPreTest, InitP)
+{
+ audio_hal_interface *h = nullptr;
+
+ int32_t ret = audio_hal_interface_init(&h);
+ ASSERT_EQ(ret, AUDIO_HAL_SUCCESS);
+ ASSERT_NE(h, nullptr);
+
+ ret = audio_hal_interface_deinit(h);
+ EXPECT_EQ(ret, AUDIO_HAL_SUCCESS);
+}
+
+/**
+ * @testcase InitN
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Negative, Initialize audio HAL handle
+ * @apicovered audio_init
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST(AudioHalPreTest, InitN)
+{
+ int32_t ret = audio_hal_interface_init(nullptr);
+ ASSERT_EQ(ret, AUDIO_HAL_ERROR);
+}
+
+/**
+ * @testcase DeinitP
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Positive, Deinitialize audio HAL handle
+ * @apicovered audio_init, audio_deinit
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST(AudioHalPreTest, DeinitP)
+{
+ audio_hal_interface *h = nullptr;
+
+ int32_t ret = audio_hal_interface_init(&h);
+ ASSERT_EQ(ret, AUDIO_HAL_SUCCESS);
+ ASSERT_NE(h, nullptr);
+
+ ret = audio_hal_interface_deinit(h);
+ ASSERT_EQ(ret, AUDIO_HAL_SUCCESS);
+}
+
+/**
+ * @testcase GetVolumeLevelMaxP
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Positive, Get maximum volume level of each volume types
+ * @apicovered audio_get_volume_level_max
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST_F(AudioHalTest, GetVolumeLevelMaxP)
+{
+ uint32_t level_max;
+ const array<string, 8> vol_types = { "system", "notification", "alarm", "ringtone",
+ "media", "call", "voip", "voice" };
+
+ for (const auto& i : vol_types) {
+ int32_t ret = audio_hal_interface_get_volume_level_max(m_h, i.c_str(), DIRECTION_OUT, &level_max);
+ cout << i << " : " << level_max << endl;
+ EXPECT_EQ(ret, AUDIO_HAL_SUCCESS);
+ }
+}
+
+/**
+ * @testcase GetVolumeLevelMaxN
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Negative, Get maximum volume level of each volume types
+ * @apicovered audio_get_volume_level_max
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST_F(AudioHalTest, GetVolumeLevelMaxN)
+{
+ int32_t ret = audio_hal_interface_get_volume_level_max(m_h, "media", DIRECTION_OUT, nullptr);
+ EXPECT_EQ(ret, AUDIO_HAL_ERROR);
+}
+
+/**
+ * @testcase GetVolumeLevelP
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Positive, Get volume level of each volume types
+ * @apicovered audio_get_volume_level
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST_F(AudioHalTest, GetVolumeLevelP)
+{
+ uint32_t level;
+ const array<string, 8> vol_types = { "system", "notification", "alarm", "ringtone",
+ "media", "call", "voip", "voice" };
+
+ for (const auto& i : vol_types) {
+ int32_t ret = audio_hal_interface_get_volume_level(m_h, i.c_str(), DIRECTION_OUT, &level);
+ cout << i << " : " << level << endl;
+ EXPECT_EQ(ret, AUDIO_HAL_SUCCESS);
+ }
+}
+
+/**
+ * @testcase GetVolumeLevelN
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Negative, Get volume level of each volume types
+ * @apicovered audio_get_volume_level
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST_F(AudioHalTest, GetVolumeLevelN)
+{
+ int32_t ret = audio_hal_interface_get_volume_level(m_h, "media", DIRECTION_OUT, nullptr);
+ EXPECT_EQ(ret, AUDIO_HAL_ERROR);
+}
+
+/**
+ * @testcase SetVolumeLevelP
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Positive, Set volume level of each volume types
+ * @apicovered audio_set_volume_level
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST_F(AudioHalTest, SetVolumeLevelP)
+{
+ /* FIXME : need to revise */
+ int32_t ret = audio_hal_interface_set_volume_level(m_h, "media", DIRECTION_OUT, 15);
+ EXPECT_EQ(ret, AUDIO_HAL_SUCCESS);
+
+ ret = audio_hal_interface_set_volume_level(m_h, "media", DIRECTION_OUT, 7);
+ EXPECT_EQ(ret, AUDIO_HAL_SUCCESS);
+}
+
+
+/**
+ * @testcase SetVolumeLevelN
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Negative, Set volume level of each volume types
+ * @apicovered audio_set_volume_level
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST_F(AudioHalTest, SetVolumeLevelN)
+{
+ int32_t ret = audio_hal_interface_set_volume_level(m_h, "media", DIRECTION_OUT, 10000);
+ EXPECT_EQ(ret, AUDIO_HAL_ERROR);
+}
+
+
+/**
+ * @testcase GetVolumeValueP
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Positive, Get volume value of each volume types with given volume level
+ * @apicovered audio_get_volume_value
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST_F(AudioHalTest, GetVolumeValueP)
+{
+ double value;
+
+ int32_t ret = audio_hal_interface_get_volume_value(m_h, "media", nullptr, DIRECTION_OUT, 15, &value);
+ EXPECT_EQ(ret, AUDIO_HAL_SUCCESS);
+
+ cout << "media vol value : " << value << endl;
+}
+
+/**
+ * @testcase GetVolumeValueN
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Negative, Get volume value of each volume types with given volume level
+ * @apicovered audio_get_volume_value
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST_F(AudioHalTest, GetVolumeValueN)
+{
+ int32_t ret = audio_hal_interface_get_volume_value(m_h, "media", nullptr, DIRECTION_OUT, 15, nullptr);
+ EXPECT_EQ(ret, AUDIO_HAL_ERROR);
+}
+
+/**
+ * @testcase GetVolumeMuteP
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Positive, Get volume mute of each volume types.
+ * @apicovered audio_get_volume_mute
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST_F(AudioHalTest, GetVolumeMuteP)
+{
+ uint32_t mute;
+
+ int32_t ret = audio_hal_interface_get_volume_mute(m_h, "media", DIRECTION_OUT, &mute);
+ EXPECT_EQ(ret, AUDIO_HAL_SUCCESS);
+
+ cout << "mute : " << mute << endl;
+}
+
+/**
+ * @testcase GetVolumeMuteN
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Negative, Get volume mute of each volume types.
+ * @apicovered audio_get_volume_mute
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST_F(AudioHalTest, GetVolumeMuteN)
+{
+ int32_t ret = audio_hal_interface_get_volume_mute(m_h, "media", DIRECTION_OUT, nullptr);
+ EXPECT_EQ(ret, AUDIO_HAL_ERROR);
+}
+
+/**
+ * @testcase SetVolumeMuteP
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Positive, Set volume mute of each volume types.
+ * @apicovered audio_set_volume_mute
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST_F(AudioHalTest, SetVolumeMuteP)
+{
+ int32_t ret = audio_hal_interface_set_volume_mute(m_h, "media", DIRECTION_OUT, 1);
+ EXPECT_EQ(ret, AUDIO_HAL_SUCCESS);
+
+ ret = audio_hal_interface_set_volume_mute(m_h, "media", DIRECTION_OUT, 0);
+ EXPECT_EQ(ret, AUDIO_HAL_SUCCESS);
+}
+
+#if 0 // can't test because mute is not implemented yet...
+TEST_F(AudioHalTest, SetVolumeMuteN)
+{
+ int32_t ret = audio_hal_interface_set_volume_mute(m_h, "media", DIRECTION_OUT, 10000);
+ EXPECT_EQ(ret, AUDIO_HAL_ERROR);
+}
+#endif
+
+/**
+ * @testcase UpdateRouteP
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Positive, Update route
+ * @apicovered audio_update_route
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST_F(AudioHalTest, UpdateRouteP)
+{
+ hal_route_info info;
+ int32_t num_of_devices = 1;
+
+ memset(&info, 0, sizeof(hal_route_info));
+
+ info.role = "media";
+ info.device_infos = (hal_device_info*)malloc(sizeof(hal_device_info) * num_of_devices);
+ ASSERT_NE(info.device_infos, nullptr);
+ info.device_infos[0].direction = DIRECTION_OUT;
+ info.device_infos[0].type = "builtin-speaker";
+ info.device_infos[0].id = 100;
+ info.num_of_devices = num_of_devices;
+
+ int32_t ret = audio_hal_interface_update_route(m_h, &info);
+ EXPECT_EQ(ret, AUDIO_HAL_SUCCESS);
+
+ free(info.device_infos);
+}
+
+
+/**
+ * @testcase UpdateRouteN
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Negative, Update route
+ * @apicovered audio_update_route
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST_F(AudioHalTest, UpdateRouteN)
+{
+ int32_t ret = audio_hal_interface_update_route(m_h, nullptr);
+ EXPECT_EQ(ret, AUDIO_HAL_ERROR);
+
+ hal_route_info info;
+ memset(&info, 0, sizeof(hal_route_info));
+ info.role = nullptr;
+ ret = audio_hal_interface_update_route(m_h, &info);
+ EXPECT_EQ(ret, AUDIO_HAL_ERROR);
+}
+
+/**
+ * @testcase UpdateRouteOptionP
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Positive, Update route option
+ * @apicovered audio_update_route_option
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST_F(AudioHalTest, UpdateRouteOptionP)
+{
+ hal_route_option option;
+
+ int32_t ret = audio_hal_interface_update_route_option(m_h, &option);
+ EXPECT_EQ(ret, AUDIO_HAL_SUCCESS);
+}
+
+
+/**
+ * @testcase UpdateRouteOptionN
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Negative, Update route option
+ * @apicovered audio_update_route_option
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST_F(AudioHalTest, UpdateRouteOptionN)
+{
+ int32_t ret = audio_hal_interface_update_route_option(m_h, nullptr);
+ EXPECT_EQ(ret, AUDIO_HAL_ERROR);
+}
+
+/**
+ * @testcase NotifyStreamConnectionChangedP
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Positive, Notify stream connection changed
+ * @apicovered audio_notify_stream_connection_changed
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST_F(AudioHalTest, NotifyStreamConnectionChangedP)
+{
+ hal_stream_connection_info info;
+
+ memset(&info, 0, sizeof(hal_stream_connection_info));
+ info.role = "media";
+ info.direction = DIRECTION_OUT;
+ info.idx = 100;
+ info.is_connected = true;
+
+ int32_t ret = audio_hal_interface_notify_stream_connection_changed(m_h, &info);
+ EXPECT_EQ(ret, AUDIO_HAL_SUCCESS);
+}
+
+/**
+ * @testcase NotifyStreamConnectionChangedN
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Negative, Notify stream connection changed
+ * @apicovered audio_notify_stream_connection_changed
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST_F(AudioHalTest, NotifyStreamConnectionChangedN)
+{
+ // check for nullptr ptr
+ int32_t ret = audio_hal_interface_notify_stream_connection_changed(m_h, nullptr);
+ EXPECT_EQ(ret, AUDIO_HAL_ERROR);
+
+ // check for invalid role
+ hal_stream_connection_info info;
+ memset(&info, 0, sizeof(hal_stream_connection_info));
+ info.role = nullptr;
+ info.direction = DIRECTION_OUT;
+ info.idx = 100;
+ info.is_connected = true;
+
+ ret = audio_hal_interface_notify_stream_connection_changed(m_h, &info);
+ EXPECT_EQ(ret, AUDIO_HAL_ERROR);
+}
+
+/**
+ * @testcase MessageCallbackP
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Positive, add/remove message callback
+ * @apicovered audio_add_message_cb, audio_remove_message_cb
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST_F(AudioHalTest, MessageCallbackP)
+{
+ int32_t ret = audio_hal_interface_add_message_callback(m_h, HalMessageCallback, nullptr);
+ ASSERT_EQ(ret, AUDIO_HAL_SUCCESS);
+
+ ret = audio_hal_interface_remove_message_callback(m_h, HalMessageCallback);
+ EXPECT_EQ(ret, AUDIO_HAL_SUCCESS);
+}
+
+/**
+ * @testcase MessageCallbackN
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Negative, add/remove message callback
+ * @apicovered audio_add_message_cb, audio_remove_message_cb
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST_F(AudioHalTest, MessageCallbackN)
+{
+ int32_t ret = audio_hal_interface_add_message_callback(m_h, nullptr, nullptr);
+ EXPECT_EQ(ret, AUDIO_HAL_ERROR);
+
+ ret = audio_hal_interface_remove_message_callback(m_h, nullptr);
+ EXPECT_EQ(ret, AUDIO_HAL_ERROR);
+}
+
+
+/**
+ * @testcase PcmGetFdP
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Positive, get fd from the pcm handle
+ * @apicovered audio_pcm_get_fd, audio_pcm_open, audio_pcm_close
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST_F(AudioHalTest, PcmGetFdP)
+{
+ pcm_handle pcm_h = nullptr;
+
+ audio_pcm_sample_spec_t sample_spec;
+ sample_spec.format = AUDIO_SAMPLE_S16LE;
+ sample_spec.rate = 44100;
+ sample_spec.channels = 2;
+
+ SetRouteToSpeaker();
+
+ int32_t ret = audio_hal_interface_pcm_open(m_h, default_card.c_str(), default_device.c_str(), DIRECTION_OUT, &sample_spec,
+ BytesToFrames(6400, &sample_spec), 5, &pcm_h);
+ ASSERT_EQ(ret, AUDIO_HAL_SUCCESS);
+
+ int pcm_fd = 0;
+ ret = audio_hal_interface_pcm_get_fd(m_h, pcm_h, &pcm_fd);
+ EXPECT_EQ(ret, AUDIO_HAL_SUCCESS);
+ cout << "pcm fd : " << pcm_fd << endl;
+
+ ret = audio_hal_interface_pcm_close(m_h, pcm_h);
+ EXPECT_EQ(ret, AUDIO_HAL_SUCCESS);
+}
+
+/**
+ * @testcase PcmGetFdN
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Negative, get fd from the pcm handle
+ * @apicovered audio_pcm_get_fd, audio_pcm_open, audio_pcm_close
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST_F(AudioHalTest, PcmGetFdN)
+{
+ // check for pcm handle
+ int pcm_fd = 0;
+ int32_t ret = audio_hal_interface_pcm_get_fd(m_h, nullptr, &pcm_fd);
+ EXPECT_EQ(ret, AUDIO_HAL_ERROR);
+
+ // check for fd
+ pcm_handle pcm_h = nullptr;
+
+ audio_pcm_sample_spec_t sample_spec;
+ sample_spec.format = AUDIO_SAMPLE_S16LE;
+ sample_spec.rate = 44100;
+ sample_spec.channels = 2;
+
+ SetRouteToSpeaker();
+
+ ret = audio_hal_interface_pcm_open(m_h, default_card.c_str(), default_device.c_str(), DIRECTION_OUT, &sample_spec,
+ BytesToFrames(6400, &sample_spec), 5, &pcm_h);
+ ASSERT_EQ(ret, AUDIO_HAL_SUCCESS);
+
+ ret = audio_hal_interface_pcm_get_fd(m_h, pcm_h, nullptr);
+ EXPECT_EQ(ret, AUDIO_HAL_ERROR);
+
+ ret = audio_hal_interface_pcm_close(m_h, pcm_h);
+ EXPECT_EQ(ret, AUDIO_HAL_SUCCESS);
+}
+
+/**
+ * @testcase PcmOpenWriteCloseP
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Positive, open pcm handle, start pcm handle, write pcm buffers, stop pcm handle and close pcm_handle
+ * @apicovered audio_pcm_open, audio_pcm_start, audio_pcm_avail, audio_pcm_write, audio_pcm_stop, audio_pcm_close
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST_F(AudioHalTest, PcmOpenWriteCloseP)
+{
+ pcm_handle pcm_h = nullptr;
+
+ audio_pcm_sample_spec_t sample_spec;
+ sample_spec.format = AUDIO_SAMPLE_S16LE;
+ sample_spec.rate = 44100;
+ sample_spec.channels = 2;
+
+ SetRouteToSpeaker();
+
+ int32_t ret = audio_hal_interface_pcm_open(m_h, default_card.c_str(), default_device.c_str(), DIRECTION_OUT, &sample_spec,
+ BytesToFrames(6400, &sample_spec), 5, &pcm_h);
+ ASSERT_EQ(ret, AUDIO_HAL_SUCCESS);
+
+ ret = audio_hal_interface_pcm_start(m_h, pcm_h);
+ EXPECT_EQ(ret, AUDIO_HAL_SUCCESS);
+
+ ret = WritePcmFromFile(pcm_h, &sample_spec);
+ EXPECT_EQ(ret, AUDIO_HAL_SUCCESS);
+
+ ret = audio_hal_interface_pcm_stop(m_h, pcm_h);
+ EXPECT_EQ(ret, AUDIO_HAL_SUCCESS);
+
+ ret = audio_hal_interface_pcm_close(m_h, pcm_h);
+ EXPECT_EQ(ret, AUDIO_HAL_SUCCESS);
+}
+
+/**
+ * @testcase PcmRecoverN
+ * @sizen_tizen 4.0
+ * @author SR(seungbae.shin)
+ * @reviewer SR(sc11.lee)
+ * @type auto
+ * @description Negative, pcm recovery
+ * @apicovered audio_pcm_recover
+ * @passcase XXX
+ * @failcase YYY
+ * @precondition None
+ * @postcondition None
+ */
+TEST_F(AudioHalTest, PcmRecoverN)
+{
+ int32_t ret = audio_hal_interface_pcm_recover(m_h, nullptr, 0);
+ EXPECT_EQ(ret, AUDIO_HAL_ERROR);
+}
+
+/* // ToDo :
+int32_t audio_hal_interface_pcm_read(audio_hal_interface *h, pcm_handle pcm_h, void *buffer, uint32_t frames);
+*/
+
+/* This is not used */
+#if 0
+int32_t audio_hal_interface_pcm_get_params(audio_hal_interface *h, pcm_handle pcm_h, uint32_t direction, void **sample_spec,
+ uint32_t *period_size, uint32_t *periods);
+int32_t audio_hal_interface_pcm_set_params(audio_hal_interface *h, pcm_handle pcm_h, uint32_t direction, void *sample_spec,
+ uint32_t period_size, uint32_t periods);
+#endif
+
+int main(int argc, char **argv)
+{
+ testing::InitGoogleTest(&argc, argv);
+
+ return RUN_ALL_TESTS();
+}
diff --git a/testcase/audio/dtmf_16le_44100_2ch.raw b/testcase/audio/dtmf_16le_44100_2ch.raw
new file mode 100644
index 0000000..99a20f7
--- /dev/null
+++ b/testcase/audio/dtmf_16le_44100_2ch.raw
Binary files differ