diff options
Diffstat (limited to 'cras/src/tests/rstream_unittest.cc')
-rw-r--r-- | cras/src/tests/rstream_unittest.cc | 437 |
1 files changed, 0 insertions, 437 deletions
diff --git a/cras/src/tests/rstream_unittest.cc b/cras/src/tests/rstream_unittest.cc deleted file mode 100644 index d8dae24c..00000000 --- a/cras/src/tests/rstream_unittest.cc +++ /dev/null @@ -1,437 +0,0 @@ -// Copyright (c) 2012 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 <fcntl.h> -#include <gtest/gtest.h> -#include <stdio.h> -#include <sys/mman.h> -#include <sys/socket.h> -#include <sys/types.h> - -extern "C" { -#include "cras_audio_area.h" -#include "cras_messages.h" -#include "cras_rstream.h" -#include "cras_shm.h" -} - -#include "metrics_stub.h" - -namespace { - -class RstreamTestSuite : public testing::Test { - protected: - virtual void SetUp() { - int rc; - int sock[2] = {-1, -1}; - - fmt_.format = SND_PCM_FORMAT_S16_LE; - fmt_.frame_rate = 48000; - fmt_.num_channels = 2; - - config_.stream_id = 555; - config_.stream_type = CRAS_STREAM_TYPE_DEFAULT; - config_.client_type = CRAS_CLIENT_TYPE_UNKNOWN; - config_.direction = CRAS_STREAM_OUTPUT; - config_.dev_idx = NO_DEVICE; - config_.flags = 0; - config_.format = &fmt_; - config_.buffer_frames = 4096; - config_.cb_threshold = 2048; - config_.client_shm_size = 0; - config_.client_shm_fd = -1; - - // Create a socket pair because it will be used in rstream. - rc = socketpair(AF_UNIX, SOCK_STREAM, 0, sock); - ASSERT_EQ(0, rc); - config_.audio_fd = sock[1]; - client_fd_ = sock[0]; - - config_.client = NULL; - } - - virtual void TearDown() { - close(config_.audio_fd); - close(client_fd_); - } - - static bool format_equal(cras_audio_format* fmt1, cras_audio_format* fmt2) { - return fmt1->format == fmt2->format && - fmt1->frame_rate == fmt2->frame_rate && - fmt1->num_channels == fmt2->num_channels; - } - - void stub_client_reply(enum CRAS_AUDIO_MESSAGE_ID id, int frames, int err) { - int rc; - struct audio_message aud_msg; - // Create a message. - aud_msg.id = id; - aud_msg.frames = frames; - aud_msg.error = err; - - // Use socket fd to stub message from client. - rc = write(client_fd_, &aud_msg, sizeof(aud_msg)); - EXPECT_EQ(sizeof(aud_msg), rc); - return; - } - - struct cras_audio_format fmt_; - struct cras_rstream_config config_; - int client_fd_; -}; - -TEST_F(RstreamTestSuite, InvalidDirection) { - struct cras_rstream* s; - int rc; - - config_.direction = (enum CRAS_STREAM_DIRECTION)66; - rc = cras_rstream_create(&config_, &s); - EXPECT_NE(0, rc); -} - -TEST_F(RstreamTestSuite, InvalidStreamType) { - struct cras_rstream* s; - int rc; - - config_.stream_type = (enum CRAS_STREAM_TYPE)7; - rc = cras_rstream_create(&config_, &s); - EXPECT_NE(0, rc); -} - -TEST_F(RstreamTestSuite, InvalidBufferSize) { - struct cras_rstream* s; - int rc; - - config_.buffer_frames = 3; - rc = cras_rstream_create(&config_, &s); - EXPECT_NE(0, rc); -} - -TEST_F(RstreamTestSuite, InvalidCallbackThreshold) { - struct cras_rstream* s; - int rc; - - config_.cb_threshold = 3; - rc = cras_rstream_create(&config_, &s); - EXPECT_NE(0, rc); -} - -TEST_F(RstreamTestSuite, InvalidStreamPointer) { - int rc; - - rc = cras_rstream_create(&config_, NULL); - EXPECT_NE(0, rc); -} - -TEST_F(RstreamTestSuite, CreateOutput) { - struct cras_rstream* s; - struct cras_audio_format fmt_ret; - struct cras_audio_shm* shm_ret; - struct cras_audio_shm shm_mapped; - int rc, header_fd = -1, samples_fd = -1; - size_t shm_size; - - rc = cras_rstream_create(&config_, &s); - EXPECT_EQ(0, rc); - EXPECT_NE((void*)NULL, s); - EXPECT_EQ(4096, cras_rstream_get_buffer_frames(s)); - EXPECT_EQ(2048, cras_rstream_get_cb_threshold(s)); - EXPECT_EQ(CRAS_STREAM_TYPE_DEFAULT, cras_rstream_get_type(s)); - EXPECT_EQ(CRAS_STREAM_OUTPUT, cras_rstream_get_direction(s)); - EXPECT_NE((void*)NULL, cras_rstream_shm(s)); - rc = cras_rstream_get_format(s, &fmt_ret); - EXPECT_EQ(0, rc); - EXPECT_TRUE(format_equal(&fmt_ret, &fmt_)); - - // Check if shm is really set up. - shm_ret = cras_rstream_shm(s); - ASSERT_NE((void*)NULL, shm_ret); - cras_rstream_get_shm_fds(s, &header_fd, &samples_fd); - shm_size = cras_shm_samples_size(shm_ret); - EXPECT_EQ(shm_size, 32768); - shm_mapped.header = (struct cras_audio_shm_header*)mmap( - NULL, cras_shm_header_size(), PROT_READ | PROT_WRITE, MAP_SHARED, - header_fd, 0); - EXPECT_NE((void*)NULL, shm_mapped.header); - cras_shm_copy_shared_config(&shm_mapped); - EXPECT_EQ(cras_shm_used_size(&shm_mapped), cras_shm_used_size(shm_ret)); - munmap(shm_mapped.header, cras_shm_header_size()); - - cras_rstream_destroy(s); -} - -TEST_F(RstreamTestSuite, CreateInput) { - struct cras_rstream* s; - struct cras_audio_format fmt_ret; - struct cras_audio_shm* shm_ret; - struct cras_audio_shm shm_mapped; - int rc, header_fd = -1, samples_fd = -1; - size_t shm_size; - - config_.direction = CRAS_STREAM_INPUT; - rc = cras_rstream_create(&config_, &s); - EXPECT_EQ(0, rc); - EXPECT_NE((void*)NULL, s); - EXPECT_EQ(4096, cras_rstream_get_buffer_frames(s)); - EXPECT_EQ(2048, cras_rstream_get_cb_threshold(s)); - EXPECT_EQ(CRAS_STREAM_TYPE_DEFAULT, cras_rstream_get_type(s)); - EXPECT_EQ(CRAS_STREAM_INPUT, cras_rstream_get_direction(s)); - EXPECT_NE((void*)NULL, cras_rstream_shm(s)); - rc = cras_rstream_get_format(s, &fmt_ret); - EXPECT_EQ(0, rc); - EXPECT_TRUE(format_equal(&fmt_ret, &fmt_)); - - // Check if shm is really set up. - shm_ret = cras_rstream_shm(s); - ASSERT_NE((void*)NULL, shm_ret); - cras_rstream_get_shm_fds(s, &header_fd, &samples_fd); - shm_size = cras_shm_samples_size(shm_ret); - EXPECT_EQ(shm_size, 32768); - shm_mapped.header = (struct cras_audio_shm_header*)mmap( - NULL, cras_shm_header_size(), PROT_READ | PROT_WRITE, MAP_SHARED, - header_fd, 0); - EXPECT_NE((void*)NULL, shm_mapped.header); - cras_shm_copy_shared_config(&shm_mapped); - EXPECT_EQ(cras_shm_used_size(&shm_mapped), cras_shm_used_size(shm_ret)); - munmap(shm_mapped.header, cras_shm_header_size()); - - cras_rstream_destroy(s); -} - -TEST_F(RstreamTestSuite, VerifyStreamTypes) { - struct cras_rstream* s; - int rc; - - config_.stream_type = CRAS_STREAM_TYPE_DEFAULT; - rc = cras_rstream_create(&config_, &s); - EXPECT_EQ(0, rc); - EXPECT_EQ(CRAS_STREAM_TYPE_DEFAULT, cras_rstream_get_type(s)); - EXPECT_NE(CRAS_STREAM_TYPE_MULTIMEDIA, cras_rstream_get_type(s)); - cras_rstream_destroy(s); - - config_.stream_type = CRAS_STREAM_TYPE_VOICE_COMMUNICATION; - rc = cras_rstream_create(&config_, &s); - EXPECT_EQ(0, rc); - EXPECT_EQ(CRAS_STREAM_TYPE_VOICE_COMMUNICATION, cras_rstream_get_type(s)); - cras_rstream_destroy(s); - - config_.direction = CRAS_STREAM_INPUT; - config_.stream_type = CRAS_STREAM_TYPE_SPEECH_RECOGNITION; - rc = cras_rstream_create(&config_, &s); - EXPECT_EQ(0, rc); - EXPECT_EQ(CRAS_STREAM_TYPE_SPEECH_RECOGNITION, cras_rstream_get_type(s)); - cras_rstream_destroy(s); - - config_.stream_type = CRAS_STREAM_TYPE_PRO_AUDIO; - rc = cras_rstream_create(&config_, &s); - EXPECT_EQ(0, rc); - EXPECT_EQ(CRAS_STREAM_TYPE_PRO_AUDIO, cras_rstream_get_type(s)); - cras_rstream_destroy(s); -} - -TEST_F(RstreamTestSuite, OutputStreamIsPendingReply) { - struct cras_rstream* s; - int rc; - struct timespec ts; - - rc = cras_rstream_create(&config_, &s); - EXPECT_EQ(0, rc); - - // Not pending reply. - rc = cras_rstream_is_pending_reply(s); - EXPECT_EQ(0, rc); - - // Request some data from client. - rc = cras_rstream_request_audio(s, &ts); - EXPECT_GT(rc, 0); - - // Pending reply. - rc = cras_rstream_is_pending_reply(s); - EXPECT_EQ(1, rc); - - cras_rstream_destroy(s); -} - -TEST_F(RstreamTestSuite, OutputStreamFlushMessages) { - struct cras_rstream* s; - int rc; - struct timespec ts; - - rc = cras_rstream_create(&config_, &s); - EXPECT_EQ(0, rc); - - // Not pending reply. - rc = cras_rstream_is_pending_reply(s); - EXPECT_EQ(0, rc); - - // Request some data from client. - rc = cras_rstream_request_audio(s, &ts); - EXPECT_GT(rc, 0); - - // Pending reply. - rc = cras_rstream_is_pending_reply(s); - EXPECT_EQ(1, rc); - - // Client replies that data is ready. - stub_client_reply(AUDIO_MESSAGE_DATA_READY, 10, 0); - - // Read messages. - cras_rstream_flush_old_audio_messages(s); - - // NOT Pending reply. - rc = cras_rstream_is_pending_reply(s); - EXPECT_EQ(0, rc); - - cras_rstream_destroy(s); -} - -TEST_F(RstreamTestSuite, InputStreamIsPendingReply) { - struct cras_rstream* s; - int rc; - - config_.direction = CRAS_STREAM_INPUT; - - rc = cras_rstream_create(&config_, &s); - EXPECT_EQ(0, rc); - - // Not pending reply. - rc = cras_rstream_is_pending_reply(s); - EXPECT_EQ(0, rc); - - // Some data is ready. Sends it to client. - rc = cras_rstream_audio_ready(s, 10); - EXPECT_GT(rc, 0); - - // Pending reply. - rc = cras_rstream_is_pending_reply(s); - EXPECT_EQ(1, rc); - - cras_rstream_destroy(s); -} - -TEST_F(RstreamTestSuite, InputStreamFlushMessages) { - struct cras_rstream* s; - int rc; - - config_.direction = CRAS_STREAM_INPUT; - - rc = cras_rstream_create(&config_, &s); - EXPECT_EQ(0, rc); - - // Not pending reply. - rc = cras_rstream_is_pending_reply(s); - EXPECT_EQ(0, rc); - - // Some data is ready. Sends it to client. - rc = cras_rstream_audio_ready(s, 10); - EXPECT_GT(rc, 0); - - // Pending reply. - rc = cras_rstream_is_pending_reply(s); - EXPECT_EQ(1, rc); - - // Client replies that data is captured. - stub_client_reply(AUDIO_MESSAGE_DATA_CAPTURED, 10, 0); - - // Read messages. - cras_rstream_flush_old_audio_messages(s); - - // NOT Pending reply. - rc = cras_rstream_is_pending_reply(s); - EXPECT_EQ(0, rc); - - cras_rstream_destroy(s); -} - -} // namespace - -int main(int argc, char** argv) { - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} - -/* stubs */ -extern "C" { - -struct cras_audio_area* cras_audio_area_create(int num_channels) { - return NULL; -} - -void cras_audio_area_destroy(struct cras_audio_area* area) {} - -void cras_audio_area_config_channels(struct cras_audio_area* area, - const struct cras_audio_format* fmt) {} - -struct buffer_share* buffer_share_create(unsigned int buf_sz) { - return NULL; -} - -void buffer_share_destroy(struct buffer_share* mix) {} - -int buffer_share_offset_update(struct buffer_share* mix, - unsigned int id, - unsigned int frames) { - return 0; -} - -unsigned int buffer_share_get_new_write_point(struct buffer_share* mix) { - return 0; -} - -int buffer_share_add_id(struct buffer_share* mix, unsigned int id, void* data) { - return 0; -} - -int buffer_share_rm_id(struct buffer_share* mix, unsigned int id) { - return 0; -} - -unsigned int buffer_share_id_offset(const struct buffer_share* mix, - unsigned int id) { - return 0; -} -void ewma_power_init(struct ewma_power* ewma, unsigned int rate) {} - -void ewma_power_calculate(struct ewma_power* ewma, - const int16_t* buf, - unsigned int channels, - unsigned int size) {} - -void cras_system_state_stream_added(enum CRAS_STREAM_DIRECTION direction, - enum CRAS_CLIENT_TYPE client_type) {} - -void cras_system_state_stream_removed(enum CRAS_STREAM_DIRECTION direction, - enum CRAS_CLIENT_TYPE client_type) {} - -int cras_server_metrics_stream_create( - const struct cras_rstream_config* config) { - return 0; -} - -int cras_server_metrics_stream_destroy(const struct cras_rstream* stream) { - return 0; -} - -#ifdef HAVE_WEBRTC_APM -#define FAKE_CRAS_APM_PTR reinterpret_cast<struct cras_apm*>(0x99) -struct cras_apm_list* cras_apm_list_create(void* stream_ptr, uint64_t effects) { - return NULL; -} -struct cras_apm* cras_apm_list_get_active_apm(void* stream_ptr, void* dev_ptr) { - return FAKE_CRAS_APM_PTR; -} -int cras_apm_list_destroy(struct cras_apm_list* list) { - return 0; -} -uint64_t cras_apm_list_get_effects(struct cras_apm_list* list) { - return APM_ECHO_CANCELLATION; -} -struct cras_apm* cras_apm_list_get(struct cras_apm_list* list, void* dev_ptr) { - return NULL; -} -struct cras_audio_format* cras_apm_list_get_format(struct cras_apm* apm) { - return NULL; -} -#endif -} |