rstream_unittest.cc revision 1ae0e348e987bcd17cd27e96b8e72936e9297890
1// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <fcntl.h>
6#include <stdio.h>
7#include <sys/mman.h>
8#include <sys/types.h>
9#include <gtest/gtest.h>
10
11extern "C" {
12#include "cras_audio_area.h"
13#include "cras_messages.h"
14#include "cras_rstream.h"
15#include "cras_shm.h"
16}
17
18namespace {
19
20class RstreamTestSuite : public testing::Test {
21  protected:
22    virtual void SetUp() {
23      fmt_.format = SND_PCM_FORMAT_S16_LE;
24      fmt_.frame_rate = 48000;
25      fmt_.num_channels = 2;
26
27      config_.stream_id = 555;
28      config_.stream_type = CRAS_STREAM_TYPE_DEFAULT;
29      config_.direction = CRAS_STREAM_OUTPUT;
30      config_.dev_idx = NO_DEVICE;
31      config_.flags = 0;
32      config_.format = &fmt_;
33      config_.buffer_frames = 4096;
34      config_.cb_threshold = 2048;
35      config_.audio_fd = 1;
36      config_.client = NULL;
37    }
38
39    static bool format_equal(cras_audio_format *fmt1, cras_audio_format *fmt2) {
40      return fmt1->format == fmt2->format &&
41          fmt1->frame_rate == fmt2->frame_rate &&
42          fmt1->num_channels == fmt2->num_channels;
43    }
44
45    struct cras_audio_format fmt_;
46    struct cras_rstream_config config_;
47};
48
49TEST_F(RstreamTestSuite, InvalidDirection) {
50  struct cras_rstream *s;
51  int rc;
52
53  config_.direction = (enum CRAS_STREAM_DIRECTION)66;
54  rc = cras_rstream_create(&config_, &s);
55  EXPECT_NE(0, rc);
56}
57
58TEST_F(RstreamTestSuite, InvalidStreamType) {
59  struct cras_rstream *s;
60  int rc;
61
62  config_.stream_type = (enum CRAS_STREAM_TYPE)7;
63  rc = cras_rstream_create(&config_, &s);
64  EXPECT_NE(0, rc);
65}
66
67TEST_F(RstreamTestSuite, InvalidBufferSize) {
68  struct cras_rstream *s;
69  int rc;
70
71  config_.buffer_frames = 3;
72  rc = cras_rstream_create(&config_, &s);
73  EXPECT_NE(0, rc);
74}
75
76TEST_F(RstreamTestSuite, InvalidCallbackThreshold) {
77  struct cras_rstream *s;
78  int rc;
79
80  config_.cb_threshold = 3;
81  rc = cras_rstream_create(&config_, &s);
82  EXPECT_NE(0, rc);
83}
84
85TEST_F(RstreamTestSuite, InvalidStreamPointer) {
86  int rc;
87
88  rc = cras_rstream_create(&config_, NULL);
89  EXPECT_NE(0, rc);
90}
91
92TEST_F(RstreamTestSuite, CreateOutput) {
93  struct cras_rstream *s;
94  struct cras_audio_format fmt_ret;
95  struct cras_audio_shm *shm_ret;
96  struct cras_audio_shm shm_mapped;
97  int rc, fd_ret;
98  size_t shm_size;
99
100  rc = cras_rstream_create(&config_, &s);
101  EXPECT_EQ(0, rc);
102  EXPECT_NE((void *)NULL, s);
103  EXPECT_EQ(4096, cras_rstream_get_buffer_frames(s));
104  EXPECT_EQ(2048, cras_rstream_get_cb_threshold(s));
105  EXPECT_EQ(CRAS_STREAM_TYPE_DEFAULT, cras_rstream_get_type(s));
106  EXPECT_EQ(CRAS_STREAM_OUTPUT, cras_rstream_get_direction(s));
107  EXPECT_NE((void *)NULL, cras_rstream_output_shm(s));
108  rc = cras_rstream_get_format(s, &fmt_ret);
109  EXPECT_EQ(0, rc);
110  EXPECT_TRUE(format_equal(&fmt_ret, &fmt_));
111
112  // Check if shm is really set up.
113  shm_ret = cras_rstream_output_shm(s);
114  ASSERT_NE((void *)NULL, shm_ret);
115  fd_ret = cras_rstream_output_shm_fd(s);
116  shm_size = cras_rstream_get_total_shm_size(s);
117  EXPECT_GT(shm_size, 4096);
118  shm_mapped.area = (struct cras_audio_shm_area *)mmap(
119      NULL, shm_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_ret, 0);
120  EXPECT_NE((void *)NULL, shm_mapped.area);
121  cras_shm_copy_shared_config(&shm_mapped);
122  EXPECT_EQ(cras_shm_used_size(&shm_mapped), cras_shm_used_size(shm_ret));
123  munmap(shm_mapped.area, shm_size);
124
125  cras_rstream_destroy(s);
126}
127
128TEST_F(RstreamTestSuite, CreateInput) {
129  struct cras_rstream *s;
130  struct cras_audio_format fmt_ret;
131  struct cras_audio_shm *shm_ret;
132  struct cras_audio_shm shm_mapped;
133  int rc, fd_ret;
134  size_t shm_size;
135
136  config_.direction = CRAS_STREAM_INPUT;
137  rc = cras_rstream_create(&config_, &s);
138  EXPECT_EQ(0, rc);
139  EXPECT_NE((void *)NULL, s);
140  EXPECT_EQ(4096, cras_rstream_get_buffer_frames(s));
141  EXPECT_EQ(2048, cras_rstream_get_cb_threshold(s));
142  EXPECT_EQ(CRAS_STREAM_TYPE_DEFAULT, cras_rstream_get_type(s));
143  EXPECT_EQ(CRAS_STREAM_INPUT, cras_rstream_get_direction(s));
144  EXPECT_NE((void *)NULL, cras_rstream_input_shm(s));
145  rc = cras_rstream_get_format(s, &fmt_ret);
146  EXPECT_EQ(0, rc);
147  EXPECT_TRUE(format_equal(&fmt_ret, &fmt_));
148
149  // Check if shm is really set up.
150  shm_ret = cras_rstream_input_shm(s);
151  ASSERT_NE((void *)NULL, shm_ret);
152  fd_ret = cras_rstream_input_shm_fd(s);
153  shm_size = cras_rstream_get_total_shm_size(s);
154  EXPECT_GT(shm_size, 4096);
155  shm_mapped.area = (struct cras_audio_shm_area *)mmap(
156      NULL, shm_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_ret, 0);
157  EXPECT_NE((void *)NULL, shm_mapped.area);
158  cras_shm_copy_shared_config(&shm_mapped);
159  EXPECT_EQ(cras_shm_used_size(&shm_mapped), cras_shm_used_size(shm_ret));
160  munmap(shm_mapped.area, shm_size);
161
162  cras_rstream_destroy(s);
163}
164
165TEST_F(RstreamTestSuite, VerifyStreamTypes) {
166  struct cras_rstream *s;
167  int rc;
168
169  config_.stream_type = CRAS_STREAM_TYPE_DEFAULT;
170  rc = cras_rstream_create(&config_, &s);
171  EXPECT_EQ(0, rc);
172  EXPECT_EQ(CRAS_STREAM_TYPE_DEFAULT, cras_rstream_get_type(s));
173  EXPECT_NE(CRAS_STREAM_TYPE_MULTIMEDIA, cras_rstream_get_type(s));
174  cras_rstream_destroy(s);
175
176  config_.stream_type = CRAS_STREAM_TYPE_VOICE_COMMUNICATION;
177  rc = cras_rstream_create(&config_, &s);
178  EXPECT_EQ(0, rc);
179  EXPECT_EQ(CRAS_STREAM_TYPE_VOICE_COMMUNICATION, cras_rstream_get_type(s));
180  cras_rstream_destroy(s);
181
182  config_.direction = CRAS_STREAM_INPUT;
183  config_.stream_type = CRAS_STREAM_TYPE_SPEECH_RECOGNITION;
184  rc = cras_rstream_create(&config_, &s);
185  EXPECT_EQ(0, rc);
186  EXPECT_EQ(CRAS_STREAM_TYPE_SPEECH_RECOGNITION, cras_rstream_get_type(s));
187  cras_rstream_destroy(s);
188
189  config_.stream_type = CRAS_STREAM_TYPE_PRO_AUDIO;
190  rc = cras_rstream_create(&config_, &s);
191  EXPECT_EQ(0, rc);
192  EXPECT_EQ(CRAS_STREAM_TYPE_PRO_AUDIO, cras_rstream_get_type(s));
193  cras_rstream_destroy(s);
194}
195
196}  //  namespace
197
198int main(int argc, char **argv) {
199  ::testing::InitGoogleTest(&argc, argv);
200  return RUN_ALL_TESTS();
201}
202
203/* stubs */
204extern "C" {
205
206struct cras_audio_area *cras_audio_area_create(int num_channels) {
207  return NULL;
208}
209
210void cras_audio_area_destroy(struct cras_audio_area *area) {
211}
212
213void cras_audio_area_config_channels(struct cras_audio_area *area,
214                                     const struct cras_audio_format *fmt) {
215}
216
217struct buffer_share *buffer_share_create(unsigned int buf_sz) {
218  return NULL;
219}
220
221void buffer_share_destroy(struct buffer_share *mix) {
222}
223
224int buffer_share_offset_update(struct buffer_share *mix, unsigned int id,
225                               unsigned int frames) {
226  return 0;
227}
228
229unsigned int buffer_share_get_new_write_point(struct buffer_share *mix) {
230  return 0;
231}
232
233int buffer_share_add_id(struct buffer_share *mix, unsigned int id) {
234  return 0;
235}
236
237int buffer_share_rm_id(struct buffer_share *mix, unsigned int id) {
238  return 0;
239}
240
241unsigned int buffer_share_id_offset(const struct buffer_share *mix,
242                                    unsigned int id)
243{
244  return 0;
245}
246
247void cras_system_state_stream_added(enum CRAS_STREAM_DIRECTION direction) {
248}
249
250void cras_system_state_stream_removed(enum CRAS_STREAM_DIRECTION direction) {
251}
252
253}
254