Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(538)

Side by Side Diff: content/browser/renderer_host/media/audio_input_sync_writer_unittest.cc

Issue 1302423006: Ensure that data is not overwritten in the audio input shared memory ring buffer that sits on the b… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Tracking down compile errors. Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium 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 "base/memory/scoped_ptr.h"
6 #include "base/sync_socket.h"
7 #include "base/time/time.h"
8 #include "content/browser/renderer_host/media/audio_input_sync_writer.h"
9 #include "content/public/test/test_browser_thread_bundle.h"
10 #include "media/audio/audio_parameters.h"
11 #include "media/base/audio_bus.h"
12 #include "media/base/channel_layout.h"
13 #include "testing/gmock/include/gmock/gmock.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15
16 using ::testing::_;
17 using base::TimeDelta;
18 using media::AudioBus;
19 using media::AudioParameters;
20
21 namespace content {
22
23 // Mocked out sockets used for Send/ReceiveWithTimeout. Counts the number of
24 // outstanding reads, i.e. the diff between send and receive calls.
25 class MockCancelableSyncSocket : public base::CancelableSyncSocket {
26 public:
27 MockCancelableSyncSocket(int buffer_size)
28 : in_failure_mode_(false),
29 writes_(0),
30 reads_(0),
31 receives_(0),
32 buffer_size_(buffer_size),
33 read_buffer_index_(0) {}
34
35 size_t Send(const void* buffer, size_t length) override {
36 EXPECT_EQ(length, sizeof(uint32_t));
37
38 ++writes_;
39 EXPECT_LE(NumberOfBuffersFilled(), buffer_size_);
40 return length;
41 }
42
43 size_t Receive(void* buffer, size_t length) override {
44 EXPECT_EQ(0u, length % sizeof(uint32_t));
45
46 if (in_failure_mode_)
47 return 0;
48 if (receives_ == reads_)
49 return 0;
50
51 uint32_t* ptr = static_cast<uint32_t*>(buffer);
52 size_t received = 0;
53 for (; received < length / sizeof(uint32_t) && receives_ < reads_;
54 ++received, ++ptr) {
55 ++receives_;
56 EXPECT_LE(receives_, reads_);
57 *ptr = ++read_buffer_index_;
58 }
59 return received * sizeof(uint32_t);
60 }
61
62 size_t Peek() override {
63 return (reads_ - receives_) * sizeof(uint32_t);
64 }
65
66 // Simluates reading |buffers| number of buffers from the ring buffer.
67 void Read(int buffers) {
68 reads_ += buffers;
69 EXPECT_LE(reads_, writes_);
70 }
71
72 // When |in_failure_mode_| == true, the socket fails to receive.
73 void SetFailureMode(bool in_failure_mode) {
74 in_failure_mode_ = in_failure_mode;
75 }
76
77 int NumberOfBuffersFilled() { return writes_ - reads_; }
78
79 private:
80 bool in_failure_mode_;
81 int writes_;
82 int reads_;
83 int receives_;
84 int buffer_size_;
85 uint32_t read_buffer_index_;
86
87 DISALLOW_COPY_AND_ASSIGN(MockCancelableSyncSocket);
88 };
89
90 class AudioInputSyncWriterUnderTest : public AudioInputSyncWriter {
91 public:
92 AudioInputSyncWriterUnderTest(void* shared_memory,
93 size_t shared_memory_size,
94 int shared_memory_segment_count,
95 const media::AudioParameters& params,
96 base::CancelableSyncSocket* socket)
97 : AudioInputSyncWriter(shared_memory, shared_memory_size,
98 shared_memory_segment_count, params) {
99 socket_.reset(socket);
100 }
101
102 ~AudioInputSyncWriterUnderTest() override {}
103
104 MOCK_METHOD1(AddToNativeLog, void(const std::string& message));
105 };
106
107 class AudioInputSyncWriterTest : public testing::Test {
108 public:
109 AudioInputSyncWriterTest()
110 : socket_(nullptr) {
111 const media::ChannelLayout layout =
112 media::ChannelLayout::CHANNEL_LAYOUT_MONO;
113 const int channels = media::ChannelLayoutToChannelCount(layout);
114 const int sampling_frequency_hz = 16000;
115 const int frames = sampling_frequency_hz / 100; // 10 ms
116 const int bits_per_sample = 16;
117
118 AudioParameters audio_params(
119 AudioParameters::AUDIO_FAKE, layout, channels,
120 sampling_frequency_hz, bits_per_sample, frames);
121
122 const uint32 segment_size =
123 sizeof(media::AudioInputBufferParameters) +
124 AudioBus::CalculateMemorySize(audio_params);
125 size_t data_size = kSegments * segment_size;
126 data_.reset(new uint8[data_size]);
127
128 socket_ = new MockCancelableSyncSocket(kSegments);
129 writer_.reset(new AudioInputSyncWriterUnderTest(
130 data_.get(), data_size, kSegments, audio_params, socket_));
131 audio_bus_ = AudioBus::Create(audio_params);
132 }
133
134 ~AudioInputSyncWriterTest() override {
135 }
136
137 protected:
138 const int kSegments = 10;
139
140 scoped_ptr<AudioInputSyncWriterUnderTest> writer_;
141 MockCancelableSyncSocket* socket_;
142 scoped_ptr<AudioBus> audio_bus_;
143 scoped_ptr<uint8[]> data_;
144
145 private:
146 TestBrowserThreadBundle thread_bundle_;
147
148 DISALLOW_COPY_AND_ASSIGN(AudioInputSyncWriterTest);
149 };
150
151 TEST_F(AudioInputSyncWriterTest, SingleWriteAndRead) {
152 // We always expect one log call at first write.
153 EXPECT_CALL(*writer_.get(), AddToNativeLog(_));
154
155 writer_->Write(audio_bus_.get(), 0, false, 0);
156 EXPECT_EQ(1, socket_->NumberOfBuffersFilled());
157 EXPECT_EQ(0u, socket_->Peek());
158
159 socket_->Read(1);
160 EXPECT_EQ(0, socket_->NumberOfBuffersFilled());
161 EXPECT_EQ(sizeof(uint32_t), socket_->Peek());
162 }
163
164 TEST_F(AudioInputSyncWriterTest, MultipleWritesAndReads) {
165 EXPECT_CALL(*writer_.get(), AddToNativeLog(_));
166
167 for (int i = 1; i <= 2 * kSegments; ++i) {
168 writer_->Write(audio_bus_.get(), 0, false, 0);
169 EXPECT_EQ(1, socket_->NumberOfBuffersFilled());
170 EXPECT_EQ(0u, socket_->Peek());
171
172 socket_->Read(1);
173 EXPECT_EQ(0, socket_->NumberOfBuffersFilled());
174 EXPECT_EQ(sizeof(uint32_t), socket_->Peek());
175 }
176 }
177
178 TEST_F(AudioInputSyncWriterTest, MultipleWritesNoReads) {
179 EXPECT_CALL(*writer_.get(), AddToNativeLog(_)).Times(1 + kSegments);
180
181 for (int i = 1; i <= kSegments; ++i) {
182 writer_->Write(audio_bus_.get(), 0, false, 0);
183 EXPECT_EQ(i, socket_->NumberOfBuffersFilled());
184 EXPECT_EQ(0u, socket_->Peek());
185 }
186
187 // Now the ring buffer is full, do more writes. We should get an extra error
188 // log call for each write. See top EXPECT_CALL.
189 for (int i = 1; i <= kSegments; ++i) {
190 writer_->Write(audio_bus_.get(), 0, false, 0);
191 EXPECT_EQ(kSegments, socket_->NumberOfBuffersFilled());
192 EXPECT_EQ(0u, socket_->Peek());
193 }
194 }
195
196 TEST_F(AudioInputSyncWriterTest, FillAndEmptyRingBuffer) {
197 EXPECT_CALL(*writer_.get(), AddToNativeLog(_)).Times(2);
198
199 // Fill ring buffer.
200 for (int i = 1; i <= kSegments; ++i) {
201 writer_->Write(audio_bus_.get(), 0, false, 0);
202 }
203 EXPECT_EQ(kSegments, socket_->NumberOfBuffersFilled());
204 EXPECT_EQ(0u, socket_->Peek());
205
206 // Empty half of the ring buffer.
207 int buffers_to_read = kSegments / 2;
208 socket_->Read(buffers_to_read);
209 EXPECT_EQ(kSegments - buffers_to_read, socket_->NumberOfBuffersFilled());
210 EXPECT_EQ(buffers_to_read * sizeof(uint32_t), socket_->Peek());
211
212 // Fill up again. The first write should do receive until that queue is
213 // empty.
214 for (int i = kSegments - buffers_to_read + 1; i <= kSegments; ++i) {
215 writer_->Write(audio_bus_.get(), 0, false, 0);
216 EXPECT_EQ(i, socket_->NumberOfBuffersFilled());
217 EXPECT_EQ(0u, socket_->Peek());
218 }
219
220 // Another write, should render and extra error log call.
221 writer_->Write(audio_bus_.get(), 0, false, 0);
222 EXPECT_EQ(kSegments, socket_->NumberOfBuffersFilled());
223 EXPECT_EQ(0u, socket_->Peek());
224
225 // Empty the ring buffer.
226 socket_->Read(kSegments);
227 EXPECT_EQ(0, socket_->NumberOfBuffersFilled());
228 EXPECT_EQ(kSegments * sizeof(uint32_t), socket_->Peek());
229
230 // Another write, should do receive until that queue is empty.
231 writer_->Write(audio_bus_.get(), 0, false, 0);
232 EXPECT_EQ(1, socket_->NumberOfBuffersFilled());
233 EXPECT_EQ(0u, socket_->Peek());
234 }
235
236 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698