// Copyright 2018 The Chromium OS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include <stdio.h> #include <gtest/gtest.h> extern "C" { #include "cras_audio_thread_monitor.c" #include "cras_main_message.h" } // Function call counters static int cras_system_state_add_snapshot_called; static int audio_thread_dump_thread_info_called; // Stub data static enum CRAS_MAIN_MESSAGE_TYPE type_set; struct cras_audio_thread_event_message message; void ResetStubData() { cras_system_state_add_snapshot_called = 0; audio_thread_dump_thread_info_called = 0; type_set = (enum CRAS_MAIN_MESSAGE_TYPE) 999; message.event_type = (enum CRAS_AUDIO_THREAD_EVENT_TYPE)999; } namespace { class AudioThreadMonitorTestSuite: public testing::Test { protected: virtual void SetUp() { ResetStubData(); } virtual void TearDown() { } }; TEST_F(AudioThreadMonitorTestSuite, Init) { cras_audio_thread_monitor_init(); EXPECT_EQ(type_set, CRAS_MAIN_AUDIO_THREAD_EVENT); } TEST_F(AudioThreadMonitorTestSuite, Busyloop) { cras_audio_thread_busyloop(); EXPECT_EQ(message.event_type, AUDIO_THREAD_EVENT_BUSYLOOP); } TEST_F(AudioThreadMonitorTestSuite, Debug) { cras_audio_thread_debug(); EXPECT_EQ(message.event_type, AUDIO_THREAD_EVENT_DEBUG); } TEST_F(AudioThreadMonitorTestSuite, Underrun) { cras_audio_thread_underrun(); EXPECT_EQ(message.event_type, AUDIO_THREAD_EVENT_UNDERRUN); } TEST_F(AudioThreadMonitorTestSuite, SevereUnderrun) { cras_audio_thread_severe_underrun(); EXPECT_EQ(message.event_type, AUDIO_THREAD_EVENT_SEVERE_UNDERRUN); } TEST_F(AudioThreadMonitorTestSuite, TakeSnapshot) { take_snapshot(AUDIO_THREAD_EVENT_DEBUG); EXPECT_EQ(cras_system_state_add_snapshot_called, 1); EXPECT_EQ(audio_thread_dump_thread_info_called, 1); } TEST_F(AudioThreadMonitorTestSuite, EventHandlerDoubleCall) { struct cras_audio_thread_event_message msg; msg.event_type = AUDIO_THREAD_EVENT_DEBUG; handle_audio_thread_event_message((struct cras_main_message *)&msg, NULL); EXPECT_EQ(cras_system_state_add_snapshot_called, 1); EXPECT_EQ(audio_thread_dump_thread_info_called, 1); // take_snapshot shouldn't be called since the time interval is short handle_audio_thread_event_message((struct cras_main_message *)&msg, NULL); EXPECT_EQ(cras_system_state_add_snapshot_called, 1); EXPECT_EQ(audio_thread_dump_thread_info_called, 1); } TEST_F(AudioThreadMonitorTestSuite, EventHandlerIgnoreInvalidEvent) { struct cras_audio_thread_event_message msg; msg.event_type = (enum CRAS_AUDIO_THREAD_EVENT_TYPE)999; handle_audio_thread_event_message((struct cras_main_message *)&msg, NULL); EXPECT_EQ(cras_system_state_add_snapshot_called, 0); EXPECT_EQ(audio_thread_dump_thread_info_called, 0); } extern "C" { void cras_system_state_add_snapshot( struct cras_audio_thread_snapshot *snapshot) { cras_system_state_add_snapshot_called ++; } struct audio_thread* cras_iodev_list_get_audio_thread() { return reinterpret_cast <struct audio_thread*>(0xff); } int audio_thread_dump_thread_info(struct audio_thread *thread, struct audio_debug_info *info) { audio_thread_dump_thread_info_called ++; return 0; } int cras_main_message_add_handler(enum CRAS_MAIN_MESSAGE_TYPE type, cras_message_callback callback, void *callback_data) { type_set = type; return 0; } int cras_main_message_send(struct cras_main_message *msg) { message = *(struct cras_audio_thread_event_message*)msg; return 0; } } // extern "C" } // namespace int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); int rc = RUN_ALL_TESTS(); return rc; }