1 // Copyright 2017 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 <memory>
6 #include <stdint.h>
7 #include <stdio.h>
8 #include <time.h>
9
10 #include <gtest/gtest.h>
11
12 extern "C" {
13 #include "dev_io.h" // tested
14 #include "dev_stream.h" // tested
15 #include "cras_rstream.h" // stubbed
16 #include "cras_iodev.h" // stubbed
17 #include "cras_shm.h"
18 #include "cras_types.h"
19 #include "utlist.h"
20
21 struct audio_thread_event_log* atlog;
22 }
23
24 #include "dev_io_stubs.h"
25 #include "iodev_stub.h"
26 #include "rstream_stub.h"
27
28 namespace {
29
30
31 class DevIoSuite : public testing::Test{
32 protected:
SetUp()33 virtual void SetUp() {
34 atlog = static_cast<audio_thread_event_log*>(calloc(1, sizeof(*atlog)));
35 iodev_stub_reset();
36 rstream_stub_reset();
37 }
38
TearDown()39 virtual void TearDown() {
40 free(atlog);
41 }
42 };
43
TEST_F(DevIoSuite,SendCapturedFails)44 TEST_F(DevIoSuite, SendCapturedFails) {
45 const size_t cb_threshold = 480;
46
47 cras_audio_format format;
48 fill_audio_format(&format, 48000);
49
50 StreamPtr stream =
51 create_stream(1, 1, CRAS_STREAM_INPUT, cb_threshold, &format);
52 // rstream's next callback is now and there is enough data to fill.
53 struct timespec start;
54 clock_gettime(CLOCK_MONOTONIC_RAW, &start);
55 stream->rstream->next_cb_ts = start;
56 AddFakeDataToStream(stream.get(), 480);
57
58 struct open_dev* dev_list = NULL;
59 DevicePtr dev = create_device(CRAS_STREAM_INPUT, cb_threshold,
60 &format, CRAS_NODE_TYPE_MIC);
61 DL_APPEND(dev_list, dev->odev.get());
62 add_stream_to_dev(dev->dev, stream);
63
64 // Set failure response from frames_queued.
65 iodev_stub_frames_queued(dev->dev.get(), -3, start);
66
67 EXPECT_EQ(-3, dev_io_send_captured_samples(dev_list));
68 }
69
70 /* Stubs */
71 extern "C" {
72
cras_server_metrics_highest_hw_level(unsigned hw_level,enum CRAS_STREAM_DIRECTION direction)73 int cras_server_metrics_highest_hw_level(unsigned hw_level,
74 enum CRAS_STREAM_DIRECTION direction)
75 {
76 return 0;
77 }
78
cras_server_metrics_longest_fetch_delay(unsigned delay_msec)79 int cras_server_metrics_longest_fetch_delay(unsigned delay_msec)
80 {
81 return 0;
82 }
83
cras_server_metrics_num_underruns(unsigned num_underruns)84 int cras_server_metrics_num_underruns(unsigned num_underruns)
85 {
86 return 0;
87 }
88
input_data_get_for_stream(struct input_data * data,struct cras_rstream * stream,struct buffer_share * offsets,struct cras_audio_area ** area,unsigned int * offset)89 int input_data_get_for_stream(
90 struct input_data *data,
91 struct cras_rstream *stream,
92 struct buffer_share *offsets,
93 struct cras_audio_area **area,
94 unsigned int *offset)
95 {
96 return 0;
97 }
98
input_data_put_for_stream(struct input_data * data,struct cras_rstream * stream,struct buffer_share * offsets,unsigned int frames)99 int input_data_put_for_stream(struct input_data *data,
100 struct cras_rstream *stream,
101 struct buffer_share *offsets,
102 unsigned int frames)
103 {
104 return 0;
105 }
cras_rstream_post_processing_format(const struct cras_rstream * stream,void * dev_ptr)106 struct cras_audio_format *cras_rstream_post_processing_format(
107 const struct cras_rstream *stream, void *dev_ptr)
108 {
109 return NULL;
110 }
111 } // extern "C"
112
113 } // namespace
114
main(int argc,char ** argv)115 int main(int argc, char** argv) {
116 ::testing::InitGoogleTest(&argc, argv);
117 return RUN_ALL_TESTS();
118 }
119