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

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: Code review and rebase. Added unit test, and refactorings for that. 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 max_pending_reads)
28 : in_failure_mode_(false),
29 pending_reads_(0),
30 max_pending_reads_(max_pending_reads) {}
31
32 size_t Send(const void* buffer, size_t length) override {
33 ++pending_reads_;
34 EXPECT_LE(pending_reads_, max_pending_reads_);
35 return length;
36 }
37
38 size_t ReceiveWithTimeout(void* buffer, size_t length,
39 TimeDelta timeout) override {
40 if (in_failure_mode_)
41 return 0;
42
43 --pending_reads_;
44 EXPECT_GE(pending_reads_, 0);
45 return length;
46 }
47
48 // When |in_failure_mode_| == true, the socket fails to receive.
49 void SetFailureMode(bool in_failure_mode) {
50 in_failure_mode_ = in_failure_mode;
51 }
52
53 int get_pending_reads() { return pending_reads_; }
54
55 private:
56 bool in_failure_mode_;
57 int pending_reads_;
58 int max_pending_reads_;
59
60 DISALLOW_COPY_AND_ASSIGN(MockCancelableSyncSocket);
61 };
62
63 class AudioInputSyncWriterUnderTest : public AudioInputSyncWriter {
64 public:
65 AudioInputSyncWriterUnderTest(void* shared_memory,
66 size_t shared_memory_size,
67 int shared_memory_segment_count,
68 const media::AudioParameters& params,
69 base::CancelableSyncSocket* socket)
70 : AudioInputSyncWriter(shared_memory, shared_memory_size,
71 shared_memory_segment_count, params) {
72 socket_.reset(socket);
73 }
74
75 ~AudioInputSyncWriterUnderTest() override {}
76
77 MOCK_METHOD1(AddToNativeLog, void(const std::string& message));
78 };
79
80 class AudioInputSyncWriterTest : public testing::Test {
81 public:
82 AudioInputSyncWriterTest()
83 : socket_(nullptr) {
84 const media::ChannelLayout layout =
85 media::ChannelLayout::CHANNEL_LAYOUT_MONO;
86 const int channels = media::ChannelLayoutToChannelCount(layout);
87 const int sampling_frequency_hz = 16000;
88 const int frames = sampling_frequency_hz / 100; // 10 ms
89 const int bits_per_sample = 16;
90
91 AudioParameters audio_params(
92 AudioParameters::AUDIO_FAKE, layout, channels,
93 sampling_frequency_hz, bits_per_sample, frames);
94
95 const uint32 segment_size =
96 sizeof(media::AudioInputBufferParameters) +
97 AudioBus::CalculateMemorySize(audio_params);
98 size_t data_size = kSegments * segment_size;
99 data_.reset(new uint8[data_size]);
100
101 socket_ = new MockCancelableSyncSocket(kSegments);
102 writer_.reset(new AudioInputSyncWriterUnderTest(
103 data_.get(), data_size, kSegments, audio_params, socket_));
104 EXPECT_EQ(0, socket_->get_pending_reads());
105 audio_bus_ = AudioBus::Create(audio_params);
106 }
107
108 ~AudioInputSyncWriterTest() override {
109 }
110
111 protected:
112 const int kSegments = 10;
113
114 scoped_ptr<AudioInputSyncWriterUnderTest> writer_;
115 MockCancelableSyncSocket* socket_;
116 scoped_ptr<AudioBus> audio_bus_;
117 scoped_ptr<uint8[]> data_;
118
119 private:
120 TestBrowserThreadBundle thread_bundle_;
121
122 DISALLOW_COPY_AND_ASSIGN(AudioInputSyncWriterTest);
123 };
124
125 TEST_F(AudioInputSyncWriterTest, SingleWrite) {
126 EXPECT_CALL(*writer_.get(), AddToNativeLog(_));
127 writer_->Write(audio_bus_.get(), 0, false, 0);
128 EXPECT_EQ(1, socket_->get_pending_reads());
129 }
130
131 TEST_F(AudioInputSyncWriterTest, FillRingBufferOnce) {
132 // Write kSegments times. Pending reads should increase for each write.
133 EXPECT_CALL(*writer_.get(), AddToNativeLog(_));
134 for (int i = 1; i <= kSegments; ++i) {
135 writer_->Write(audio_bus_.get(), 0, false, 0);
136 EXPECT_EQ(i, socket_->get_pending_reads());
137 }
138 }
139
140 TEST_F(AudioInputSyncWriterTest, FillRingBufferOnceAndSingleWrite) {
141 EXPECT_CALL(*writer_.get(), AddToNativeLog(_));
142 for (int i = 1; i <= kSegments; ++i) {
143 writer_->Write(audio_bus_.get(), 0, false, 0);
144 }
145 EXPECT_EQ(kSegments, socket_->get_pending_reads());
146
147 // Next write should render in a receive and a send call on the socket,
148 // pending reads should remain constant after.
149 writer_->Write(audio_bus_.get(), 0, false, 0);
150 EXPECT_EQ(kSegments, socket_->get_pending_reads());
151 }
152
153 TEST_F(AudioInputSyncWriterTest, FillRingBufferOnceAndSingleWriteWithFailure) {
154 EXPECT_CALL(*writer_.get(), AddToNativeLog(_)).Times(2);
155 for (int i = 1; i <= kSegments; ++i) {
156 writer_->Write(audio_bus_.get(), 0, false, 0);
157 }
158 EXPECT_EQ(kSegments, socket_->get_pending_reads());
159
160 // Next write should render in a socket receive that fails, a log message and
161 // no socket send call on the socket, pending reads should remain constant
162 // after.
163 socket_->SetFailureMode(true);
164 writer_->Write(audio_bus_.get(), 0, false, 0);
165 EXPECT_EQ(kSegments, socket_->get_pending_reads());
166
167 socket_->SetFailureMode(false);
168 writer_->Write(audio_bus_.get(), 0, false, 0);
169 EXPECT_EQ(kSegments, socket_->get_pending_reads());
170 }
171
172 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698