+# 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
* limitations under the License.
*/
-#include <gtest/gtest.h>
+#define TEST_TYPE GTEST
-#include "wakeup_audio_manager.h"
+#include <gtest/gtest.h>
+#include <gmock/gmock.h>
#include <string>
#include <iostream>
+#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<const char*>(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<const char*>(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<std::string> mStreamingData;
};
}
void TearDown() override {
}
- CAudioEventObserver mAudioEventObserver;
- multiassistant::wakeup::CAudioManager audio_manager{&mAudioEventObserver};
+ testing::NiceMock<CAudioEventObserver> 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<long>::min());
+ mAudioManager.streaming_audio_data_thread_func(std::numeric_limits<long>::min());
int count = 0;
for (std::string data : mAudioEventObserver.mStreamingData) {
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<long>::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();