From abda03c6e4e8d492e77c92614da1f8b357744fc8 Mon Sep 17 00:00:00 2001 From: Ji-hoon Lee Date: Fri, 24 Sep 2021 19:36:13 +0900 Subject: [PATCH] Add more tests for verifying the behavior of CAudioManager class Previously, only a single test was available for CAudioManager class, which definitely is not an adequate number to verify its behavior. For this reason, added more tests to verify the current implementation of CAudioManager class and also to guarantee the future modification will not cause any unexpected results. [==========] Running 11 tests from 1 test suite. [----------] Global test environment set-up. [----------] 11 tests from DefaultFixture [ RUN ] DefaultFixture.StreamsAllDataFed [ OK ] DefaultFixture.StreamsAllDataFed (1 ms) [ RUN ] DefaultFixture.StreamsAllDataFedAfterClear [ OK ] DefaultFixture.StreamsAllDataFedAfterClear (0 ms) [ RUN ] DefaultFixture.OnRecordingAudioDataCallbackProperlyCalled [ OK ] DefaultFixture.OnRecordingAudioDataCallbackProperlyCalled (1 ms) [ RUN ] DefaultFixture.OnRecordingAudioDataCallbackProperlyCalledAfterFinalizing [ OK ] DefaultFixture.OnRecordingAudioDataCallbackProperlyCalledAfterFinalizing (0 ms) [ RUN ] DefaultFixture.RecordingStartsWhenRequestedWithSoundFocus [ OK ] DefaultFixture.RecordingStartsWhenRequestedWithSoundFocus (0 ms) [ RUN ] DefaultFixture.RecordingDoesNotStartWhenRequestedWithSoundFocus [ OK ] DefaultFixture.RecordingDoesNotStartWhenRequestedWithSoundFocus (0 ms) [ RUN ] DefaultFixture.RecordingStopsWhenRequested [ OK ] DefaultFixture.RecordingStopsWhenRequested (0 ms) [ RUN ] DefaultFixture.RecordingStopsWhenSoundFocusLost [ OK ] DefaultFixture.RecordingStopsWhenSoundFocusLost (0 ms) [ RUN ] DefaultFixture.RecordingStartsWhenSoundFocusAcquiredAgain [ OK ] DefaultFixture.RecordingStartsWhenSoundFocusAcquiredAgain (0 ms) [ RUN ] DefaultFixture.RecordingStartsWhenSoundFocusAcquiredLater [ OK ] DefaultFixture.RecordingStartsWhenSoundFocusAcquiredLater (0 ms) [ RUN ] DefaultFixture.RecordingDoesNotStartWhenSoundFocusAcquiredAgainIfStopped [ OK ] DefaultFixture.RecordingDoesNotStartWhenSoundFocusAcquiredAgainIfStopped (0 ms) [----------] 11 tests from DefaultFixture (2 ms total) [----------] Global test environment tear-down [==========] 11 tests from 1 test suite ran. (2 ms total) [ PASSED ] 11 tests. Change-Id: I50939d259e0b4f1072c6f7e1e2948ea1856eae38 --- tests/utc/audio-manager/CMakeLists.txt | 98 +++++++---- tests/utc/audio-manager/test_audio_manager.cpp | 216 +++++++++++++++++++++++-- tests/utc/audio-manager/ttpo.xml | 16 ++ 3 files changed, 279 insertions(+), 51 deletions(-) create mode 100644 tests/utc/audio-manager/ttpo.xml diff --git a/tests/utc/audio-manager/CMakeLists.txt b/tests/utc/audio-manager/CMakeLists.txt index a523148..3b599b3 100644 --- a/tests/utc/audio-manager/CMakeLists.txt +++ b/tests/utc/audio-manager/CMakeLists.txt @@ -1,54 +1,84 @@ +# THIS FILE WAS GENERATED BY THE TIZEN TDD-PROJECT OUTLINER. +# IT IS NOT RECOMMENDED TO MODIFY THIS FILE SINCE THE +# MODIFICATION CAN BE OVERWRITTEN BY THE GENERATION TOOL. + +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(ttpo-project CXX C) + LINK_DIRECTORIES(${CMAKE_BINARY_DIR}) -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR} - ${CMAKE_SOURCE_DIR}/plugins/wakeup-manager/inc - ) - -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}") +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}) + +SET(TTPO_SRCS + test_audio_manager.cpp + ../../../plugins/wakeup-manager/src/wakeup_audio_manager.cpp + ../../../plugins/wakeup-manager/src/heap_tracer.cpp +) + +SET(TTPO_PKGS + gmock + capi-appfw-application + glib-2.0 + dlog + ecore + vconf + capi-media-audio-io +) + +SET(TTPO_INCLUDES + ../../../inc/ + ../../../plugins/wakeup-manager/inc/ +) + +SET(TTPO_CFLAGS +) -ADD_DEFINITIONS("-DFULLVER=\"${FULLVER}\"") +SET(TTPO_WRAPPERS + "-Wl,\ +--wrap=sound_manager_get_current_recording_focus" +) -SET(TEST_SOURCES - test_audio_manager.cpp - ${CMAKE_SOURCE_DIR}/plugins/wakeup-manager/src/wakeup_audio_manager.cpp - ${CMAKE_SOURCE_DIR}/plugins/wakeup-manager/src/dependency_resolver.cpp - ${CMAKE_SOURCE_DIR}/plugins/wakeup-manager/src/heap_tracer.cpp +SET(TTPO_LDFLAGS ) +SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -std=c++14") +SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -g") +SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -O0") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS}") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TTPO_CFLAGS}") +SET(EXTRA_LDFLAGS "${TTPO_LDFLAGS}") + # Find Packages INCLUDE(FindPkgConfig) pkg_check_modules(pkgs REQUIRED - capi-appfw-application - capi-appfw-preference - multi-assistant - dlog - libxml-2.0 - capi-media-audio-io - vconf - ecore + ${TTPO_PKGS} ) +INCLUDE_DIRECTORIES(${TTPO_INCLUDES}) + FOREACH(flag ${pkgs_CFLAGS}) - SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") ENDFOREACH(flag) FIND_PACKAGE(GTest REQUIRED) INCLUDE_DIRECTORIES(${GTEST_INCLUDE_DIRS}) LINK_DIRECTORIES(${GTEST_LIBRARY_DIRS}) -SET(TEST_AUDIO_MANAGER test-audio-manager) -ADD_EXECUTABLE(${TEST_AUDIO_MANAGER} - ${TEST_SOURCES} - ) +SET(TTPO_EXECUTABLE test-audio-manager) +ADD_EXECUTABLE( + ${TTPO_EXECUTABLE} + ${TTPO_SRCS} +) -TARGET_LINK_LIBRARIES(${TEST_AUDIO_MANAGER} -ldl ${GTEST_LIBRARIES} pthread - ${EXTRA_LDFLAGS} ${pkgs_LDFLAGS}) +TARGET_LINK_LIBRARIES(${TTPO_EXECUTABLE} ${pkgs_LDFLAGS}) +if(NOT "${EXTRA_LDFLAGS}" STREQUAL " ") + TARGET_LINK_LIBRARIES(${TTPO_EXECUTABLE} ${EXTRA_LDFLAGS}) +endif() +TARGET_LINK_LIBRARIES(${TTPO_EXECUTABLE} ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES}) -INSTALL(TARGETS ${TEST_AUDIO_MANAGER} DESTINATION bin) +SET_TARGET_PROPERTIES(${TTPO_EXECUTABLE} PROPERTIES + COMPILE_FLAGS "-fPIE" + LINK_FLAGS "${TTPO_WRAPPERS}") +ADD_TEST(NAME ${TTPO_EXECUTABLE} COMMAND ${TTPO_EXECUTABLE}) -ADD_TEST(NAME ${TEST_AUDIO_MANAGER} COMMAND ${TEST_AUDIO_MANAGER}) +# REPLACE THE TARGET INSTALL DESTINATION AS NEEDED (default : bin) +INSTALL(TARGETS ${TTPO_EXECUTABLE} DESTINATION bin) \ No newline at end of file diff --git a/tests/utc/audio-manager/test_audio_manager.cpp b/tests/utc/audio-manager/test_audio_manager.cpp index 72b78b4..456ceaa 100644 --- a/tests/utc/audio-manager/test_audio_manager.cpp +++ b/tests/utc/audio-manager/test_audio_manager.cpp @@ -14,27 +14,60 @@ * limitations under the License. */ -#include +#define TEST_TYPE GTEST -#include "wakeup_audio_manager.h" +#include +#include #include #include +#include "sound_manager.h" + +#include "wakeup_audio_manager.h" + +static bool gRecordingState; +static bool gHasSoundFocus; + +extern "C" { +int dependency_resolver_initialize(mas_dependency_plugin_proxy_interface interface) { return 0; } +int dependency_resolver_deinitialize(void) { return 0; } +int dependency_resolver_set_error_callback(mas_error_cb callback, void* user_data) { return 0; } +int dependency_resolver_start_recording() { gRecordingState = true; return 0; } +int dependency_resolver_stop_recording() { gRecordingState = false; return 0; } +int dependency_resolver_set_recording_session(unsigned int) { return 0; } +int dependency_resolver_set_background_volume(double ratio) { return 0; } +int dependency_resolver_get_audio_format(int* rate, int* channel, int* audio_type) { return 0; } +int dependency_resolver_get_audio_source_type(char** type); +int dependency_resolver_process_wakeup_engine_command(const char* engine, const char* command) { return 0; } +int dependency_resolver_process_wakeup_candidate(mas_wakeup_event_info* info) { return 0; } +int dependency_resolver_set_voice_key_tap_duration(float duration) { return 0; } +int dependency_resolver_unset_voice_key_tap_duration() { return 0; } + +int __wrap_sound_manager_get_current_recording_focus + (sound_stream_focus_change_reason_e *acquired_by, int *sound_behavior, char **extra_info) + { return (gHasSoundFocus ? SOUND_MANAGER_ERROR_NO_DATA : SOUND_MANAGER_ERROR_NONE); } +} + class CAudioEventObserver : public multiassistant::wakeup::IAudioEventObserver { public: - bool on_recording_audio_data(long time, void* data, int len) override - { - return true; - } - bool on_streaming_audio_data( - mas_speech_streaming_event_e event, void* buffer, unsigned int len) override - { - std::string data = std::string{reinterpret_cast(buffer), len}; - mStreamingData.push_back(data); - return true; + CAudioEventObserver() { + ON_CALL(*this, on_recording_audio_data).WillByDefault( + [this](long time, void* data, int len) { + return true; + }); + ON_CALL(*this, on_streaming_audio_data).WillByDefault( + [this](mas_speech_streaming_event_e event, void* buffer, unsigned int len) { + std::string data = std::string{reinterpret_cast(buffer), len}; + mStreamingData.push_back(data); + return true; + }); } + MOCK_METHOD(bool, on_recording_audio_data, (long time, void* data, int len), (override)); + MOCK_METHOD(bool, on_streaming_audio_data, + (mas_speech_streaming_event_e event, void* buffer, unsigned int len), (override)); + std::vector mStreamingData; }; @@ -49,23 +82,23 @@ public: } void TearDown() override { } - CAudioEventObserver mAudioEventObserver; - multiassistant::wakeup::CAudioManager audio_manager{&mAudioEventObserver}; + testing::NiceMock mAudioEventObserver; + multiassistant::wakeup::CAudioManager mAudioManager{&mAudioEventObserver}; }; TEST_F(DefaultFixture, StreamsAllDataFed) { std::string arbitrary_data{"arbitrary_data"}; - size_t data_feed_num = 10; + const size_t data_feed_num = 10; for (int loop = 0;loop < data_feed_num;loop++) { /* CONTINUE by default */ mas_speech_streaming_event_e event = MAS_SPEECH_STREAMING_EVENT_CONTINUE; if (0 == loop) event = MAS_SPEECH_STREAMING_EVENT_START; else if (data_feed_num - 1 == loop) event = MAS_SPEECH_STREAMING_EVENT_FINISH; - audio_manager.feed_audio_data(event, + mAudioManager.feed_audio_data(event, (void*)(arbitrary_data.c_str()), arbitrary_data.size()); } - audio_manager.streaming_audio_data_thread_func(std::numeric_limits::min()); + mAudioManager.streaming_audio_data_thread_func(std::numeric_limits::min()); int count = 0; for (std::string data : mAudioEventObserver.mStreamingData) { @@ -76,6 +109,155 @@ TEST_F(DefaultFixture, StreamsAllDataFed) { ASSERT_EQ(count, data_feed_num); } +TEST_F(DefaultFixture, StreamsDataFedAfterClearOnly) { + std::string arbitrary_data{"arbitrary_data"}; + const size_t data_feed_num = 10; + for (int loop = 0;loop < data_feed_num * 2;loop++) { + if (loop == data_feed_num) { + mAudioManager.clear_audio_data(); + } + /* CONTINUE by default */ + mas_speech_streaming_event_e event = MAS_SPEECH_STREAMING_EVENT_CONTINUE; + if (0 == loop) event = MAS_SPEECH_STREAMING_EVENT_START; + else if ((data_feed_num * 2) - 1 == loop) event = MAS_SPEECH_STREAMING_EVENT_FINISH; + mAudioManager.feed_audio_data(event, + (void*)(arbitrary_data.c_str()), arbitrary_data.size()); + } + + mAudioManager.streaming_audio_data_thread_func(std::numeric_limits::min()); + + int count = 0; + for (std::string data : mAudioEventObserver.mStreamingData) { + if (0 == data.compare(arbitrary_data)) { + count++; + } + } + ASSERT_EQ(count, data_feed_num); +} + +TEST_F(DefaultFixture, OnRecordingAudioDataCallbackProperlyCalled) { + const size_t data_feed_num = 10; + std::string arbitrary_data{"arbitrary_data"}; + + EXPECT_CALL(mAudioEventObserver, on_recording_audio_data(testing::_, testing::_, testing::_)) + .Times(testing::Exactly(data_feed_num)); + + for (int loop = 0;loop < data_feed_num;loop++) { + /* CONTINUE by default */ + mas_speech_streaming_event_e event = MAS_SPEECH_STREAMING_EVENT_CONTINUE; + if (0 == loop) event = MAS_SPEECH_STREAMING_EVENT_START; + else if (data_feed_num - 1 == loop) event = MAS_SPEECH_STREAMING_EVENT_FINISH; + mAudioManager.feed_audio_data(event, + (void*)(arbitrary_data.c_str()), arbitrary_data.size()); + } +} + +TEST_F(DefaultFixture, OnRecordingAudioDataCallbackProperlyCalledAfterFinalizing) { + const size_t data_feed_num = 10; + std::string arbitrary_data{"arbitrary_data"}; + + EXPECT_CALL(mAudioEventObserver, on_recording_audio_data(testing::_, testing::_, testing::_)) + .Times(testing::Exactly(data_feed_num + 1)); + + for (int loop = 0;loop < data_feed_num;loop++) { + /* CONTINUE by default */ + mas_speech_streaming_event_e event = MAS_SPEECH_STREAMING_EVENT_CONTINUE; + if (0 == loop) event = MAS_SPEECH_STREAMING_EVENT_START; + mAudioManager.feed_audio_data(event, + (void*)(arbitrary_data.c_str()), arbitrary_data.size()); + } + mAudioManager.finalize_audio_data(); +} + +TEST_F(DefaultFixture, RecordingStartsWhenRequestedWithSoundFocus) { + gHasSoundFocus = true; + gRecordingState = false; + + mAudioManager.start_recording(true); + + ASSERT_TRUE(gRecordingState); +} + +TEST_F(DefaultFixture, RecordingDoesNotStartWhenRequestedWithSoundFocus) { + gHasSoundFocus = false; + gRecordingState = false; + + mAudioManager.start_recording(true); + + ASSERT_FALSE(gRecordingState); +} + +TEST_F(DefaultFixture, RecordingStopsWhenRequested) { + gHasSoundFocus = true; + gRecordingState = false; + + mAudioManager.start_recording(true); + ASSERT_TRUE(gRecordingState); + + mAudioManager.stop_recording(true); + ASSERT_FALSE(gRecordingState); +} + +TEST_F(DefaultFixture, RecordingStopsWhenSoundFocusLost) { + gHasSoundFocus = true; + gRecordingState = false; + + mAudioManager.start_recording(true); + ASSERT_TRUE(gRecordingState); + + gHasSoundFocus = false; + mAudioManager.sound_focus_changed(); + ASSERT_FALSE(gRecordingState); +} + +TEST_F(DefaultFixture, RecordingStartsWhenSoundFocusAcquiredAgain) { + gHasSoundFocus = true; + gRecordingState = false; + + mAudioManager.start_recording(true); + ASSERT_TRUE(gRecordingState); + + gHasSoundFocus = false; + mAudioManager.sound_focus_changed(); + ASSERT_FALSE(gRecordingState); + + gHasSoundFocus = true; + mAudioManager.sound_focus_changed(); + ASSERT_TRUE(gRecordingState); +} + +TEST_F(DefaultFixture, RecordingStartsWhenSoundFocusAcquiredLater) { + gHasSoundFocus = false; + gRecordingState = false; + + mAudioManager.start_recording(true); + + ASSERT_FALSE(gRecordingState); + + gHasSoundFocus = true; + mAudioManager.sound_focus_changed(); + ASSERT_TRUE(gRecordingState); +} + +TEST_F(DefaultFixture, RecordingDoesNotStartWhenSoundFocusAcquiredAgainIfStopped) { + gHasSoundFocus = true; + gRecordingState = false; + + mAudioManager.start_recording(true); + ASSERT_TRUE(gRecordingState); + + mAudioManager.stop_recording(true); + ASSERT_FALSE(gRecordingState); + + gHasSoundFocus = false; + mAudioManager.sound_focus_changed(); + ASSERT_FALSE(gRecordingState); + + gHasSoundFocus = true; + mAudioManager.sound_focus_changed(); + ASSERT_FALSE(gRecordingState); +} + int main(int argc, char** argv) { testing::InitGoogleTest(&argc, argv); int ret = RUN_ALL_TESTS(); diff --git a/tests/utc/audio-manager/ttpo.xml b/tests/utc/audio-manager/ttpo.xml new file mode 100644 index 0000000..1826328 --- /dev/null +++ b/tests/utc/audio-manager/ttpo.xml @@ -0,0 +1,16 @@ + + + test_audio_manager.cpp + ../../../plugins/wakeup-manager/src/wakeup_audio_manager.cpp + ../../../plugins/wakeup-manager/src/heap_tracer.cpp + ../../../inc + ../../../plugins/wakeup-manager/inc + gmock + capi-appfw-application + glib-2.0 + dlog + ecore + vconf + capi-media-audio-io + sound_manager_get_current_recording_focus + -- 2.7.4