OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/common_audio/ring_buffer.h" | 11 #include "webrtc/modules/audio_processing/utility/ring_buffer.h" |
12 | 12 |
13 #include <stdlib.h> | 13 #include <stdlib.h> |
14 #include <time.h> | 14 #include <time.h> |
15 | 15 |
16 #include <algorithm> | 16 #include <algorithm> |
17 #include <memory> | 17 #include <memory> |
18 | 18 |
19 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
20 | 20 |
21 namespace webrtc { | 21 namespace webrtc { |
22 | 22 |
23 struct FreeBufferDeleter { | 23 struct FreeBufferDeleter { |
24 inline void operator()(void* ptr) const { | 24 inline void operator()(void* ptr) const { WebRtc_FreeBuffer(ptr); } |
25 WebRtc_FreeBuffer(ptr); | |
26 } | |
27 }; | 25 }; |
28 typedef std::unique_ptr<RingBuffer, FreeBufferDeleter> scoped_ring_buffer; | 26 typedef std::unique_ptr<RingBuffer, FreeBufferDeleter> scoped_ring_buffer; |
29 | 27 |
30 static void AssertElementEq(int expected, int actual) { | 28 static void AssertElementEq(int expected, int actual) { |
31 ASSERT_EQ(expected, actual); | 29 ASSERT_EQ(expected, actual); |
32 } | 30 } |
33 | 31 |
34 static int SetIncrementingData(int* data, int num_elements, | 32 static int SetIncrementingData(int* data, |
| 33 int num_elements, |
35 int starting_value) { | 34 int starting_value) { |
36 for (int i = 0; i < num_elements; i++) { | 35 for (int i = 0; i < num_elements; i++) { |
37 data[i] = starting_value++; | 36 data[i] = starting_value++; |
38 } | 37 } |
39 return starting_value; | 38 return starting_value; |
40 } | 39 } |
41 | 40 |
42 static int CheckIncrementingData(int* data, int num_elements, | 41 static int CheckIncrementingData(int* data, |
| 42 int num_elements, |
43 int starting_value) { | 43 int starting_value) { |
44 for (int i = 0; i < num_elements; i++) { | 44 for (int i = 0; i < num_elements; i++) { |
45 AssertElementEq(starting_value++, data[i]); | 45 AssertElementEq(starting_value++, data[i]); |
46 } | 46 } |
47 return starting_value; | 47 return starting_value; |
48 } | 48 } |
49 | 49 |
50 // We use ASSERTs in this test to avoid obscuring the seed in the case of a | 50 // We use ASSERTs in this test to avoid obscuring the seed in the case of a |
51 // failure. | 51 // failure. |
52 static void RandomStressTest(int** data_ptr) { | 52 static void RandomStressTest(int** data_ptr) { |
(...skipping 16 matching lines...) Expand all Loading... |
69 int read_element = 0; | 69 int read_element = 0; |
70 for (int j = 0; j < kNumOps; j++) { | 70 for (int j = 0; j < kNumOps; j++) { |
71 const bool write = rand() % 2 == 0 ? true : false; | 71 const bool write = rand() % 2 == 0 ? true : false; |
72 const int num_elements = rand() % buffer_size; | 72 const int num_elements = rand() % buffer_size; |
73 if (write) { | 73 if (write) { |
74 const int buffer_available = buffer_size - buffer_consumed; | 74 const int buffer_available = buffer_size - buffer_consumed; |
75 ASSERT_EQ(static_cast<size_t>(buffer_available), | 75 ASSERT_EQ(static_cast<size_t>(buffer_available), |
76 WebRtc_available_write(buffer.get())); | 76 WebRtc_available_write(buffer.get())); |
77 const int expected_elements = std::min(num_elements, buffer_available); | 77 const int expected_elements = std::min(num_elements, buffer_available); |
78 write_element = SetIncrementingData(write_data.get(), expected_elements, | 78 write_element = SetIncrementingData(write_data.get(), expected_elements, |
79 write_element); | 79 write_element); |
80 ASSERT_EQ(static_cast<size_t>(expected_elements), | 80 ASSERT_EQ( |
81 WebRtc_WriteBuffer(buffer.get(), write_data.get(), | 81 static_cast<size_t>(expected_elements), |
82 num_elements)); | 82 WebRtc_WriteBuffer(buffer.get(), write_data.get(), num_elements)); |
83 buffer_consumed = std::min(buffer_consumed + expected_elements, | 83 buffer_consumed = |
84 buffer_size); | 84 std::min(buffer_consumed + expected_elements, buffer_size); |
85 } else { | 85 } else { |
86 const int expected_elements = std::min(num_elements, | 86 const int expected_elements = std::min(num_elements, buffer_consumed); |
87 buffer_consumed); | |
88 ASSERT_EQ(static_cast<size_t>(buffer_consumed), | 87 ASSERT_EQ(static_cast<size_t>(buffer_consumed), |
89 WebRtc_available_read(buffer.get())); | 88 WebRtc_available_read(buffer.get())); |
90 ASSERT_EQ(static_cast<size_t>(expected_elements), | 89 ASSERT_EQ( |
91 WebRtc_ReadBuffer(buffer.get(), | 90 static_cast<size_t>(expected_elements), |
92 reinterpret_cast<void**>(data_ptr), | 91 WebRtc_ReadBuffer(buffer.get(), reinterpret_cast<void**>(data_ptr), |
93 read_data.get(), | 92 read_data.get(), num_elements)); |
94 num_elements)); | |
95 int* check_ptr = read_data.get(); | 93 int* check_ptr = read_data.get(); |
96 if (data_ptr) { | 94 if (data_ptr) { |
97 check_ptr = *data_ptr; | 95 check_ptr = *data_ptr; |
98 } | 96 } |
99 read_element = CheckIncrementingData(check_ptr, expected_elements, | 97 read_element = |
100 read_element); | 98 CheckIncrementingData(check_ptr, expected_elements, read_element); |
101 buffer_consumed = std::max(buffer_consumed - expected_elements, 0); | 99 buffer_consumed = std::max(buffer_consumed - expected_elements, 0); |
102 } | 100 } |
103 } | 101 } |
104 } | 102 } |
105 } | 103 } |
106 | 104 |
107 TEST(RingBufferTest, RandomStressTest) { | 105 TEST(RingBufferTest, RandomStressTest) { |
108 int* data_ptr = NULL; | 106 int* data_ptr = NULL; |
109 RandomStressTest(&data_ptr); | 107 RandomStressTest(&data_ptr); |
110 } | 108 } |
111 | 109 |
112 TEST(RingBufferTest, RandomStressTestWithNullPtr) { | 110 TEST(RingBufferTest, RandomStressTestWithNullPtr) { |
113 RandomStressTest(NULL); | 111 RandomStressTest(NULL); |
114 } | 112 } |
115 | 113 |
116 TEST(RingBufferTest, PassingNulltoReadBufferForcesMemcpy) { | 114 TEST(RingBufferTest, PassingNulltoReadBufferForcesMemcpy) { |
117 const size_t kDataSize = 2; | 115 const size_t kDataSize = 2; |
118 int write_data[kDataSize]; | 116 int write_data[kDataSize]; |
119 int read_data[kDataSize]; | 117 int read_data[kDataSize]; |
120 int* data_ptr; | 118 int* data_ptr; |
121 | 119 |
122 scoped_ring_buffer buffer(WebRtc_CreateBuffer(kDataSize, sizeof(int))); | 120 scoped_ring_buffer buffer(WebRtc_CreateBuffer(kDataSize, sizeof(int))); |
123 ASSERT_TRUE(buffer.get() != NULL); | 121 ASSERT_TRUE(buffer.get() != NULL); |
124 WebRtc_InitBuffer(buffer.get()); | 122 WebRtc_InitBuffer(buffer.get()); |
125 | 123 |
126 SetIncrementingData(write_data, kDataSize, 0); | 124 SetIncrementingData(write_data, kDataSize, 0); |
127 EXPECT_EQ(kDataSize, WebRtc_WriteBuffer(buffer.get(), write_data, kDataSize)); | 125 EXPECT_EQ(kDataSize, WebRtc_WriteBuffer(buffer.get(), write_data, kDataSize)); |
128 SetIncrementingData(read_data, kDataSize, kDataSize); | 126 SetIncrementingData(read_data, kDataSize, kDataSize); |
129 EXPECT_EQ(kDataSize, WebRtc_ReadBuffer(buffer.get(), | 127 EXPECT_EQ(kDataSize, |
130 reinterpret_cast<void**>(&data_ptr), read_data, kDataSize)); | 128 WebRtc_ReadBuffer(buffer.get(), reinterpret_cast<void**>(&data_ptr), |
| 129 read_data, kDataSize)); |
131 // Copying was not necessary, so |read_data| has not been updated. | 130 // Copying was not necessary, so |read_data| has not been updated. |
132 CheckIncrementingData(data_ptr, kDataSize, 0); | 131 CheckIncrementingData(data_ptr, kDataSize, 0); |
133 CheckIncrementingData(read_data, kDataSize, kDataSize); | 132 CheckIncrementingData(read_data, kDataSize, kDataSize); |
134 | 133 |
135 EXPECT_EQ(kDataSize, WebRtc_WriteBuffer(buffer.get(), write_data, kDataSize)); | 134 EXPECT_EQ(kDataSize, WebRtc_WriteBuffer(buffer.get(), write_data, kDataSize)); |
136 EXPECT_EQ(kDataSize, WebRtc_ReadBuffer(buffer.get(), NULL, read_data, | 135 EXPECT_EQ(kDataSize, |
137 kDataSize)); | 136 WebRtc_ReadBuffer(buffer.get(), NULL, read_data, kDataSize)); |
138 // Passing NULL forces a memcpy, so |read_data| is now updated. | 137 // Passing NULL forces a memcpy, so |read_data| is now updated. |
139 CheckIncrementingData(read_data, kDataSize, 0); | 138 CheckIncrementingData(read_data, kDataSize, 0); |
140 } | 139 } |
141 | 140 |
142 TEST(RingBufferTest, CreateHandlesErrors) { | 141 TEST(RingBufferTest, CreateHandlesErrors) { |
143 EXPECT_TRUE(WebRtc_CreateBuffer(0, 1) == NULL); | 142 EXPECT_TRUE(WebRtc_CreateBuffer(0, 1) == NULL); |
144 EXPECT_TRUE(WebRtc_CreateBuffer(1, 0) == NULL); | 143 EXPECT_TRUE(WebRtc_CreateBuffer(1, 0) == NULL); |
145 RingBuffer* buffer = WebRtc_CreateBuffer(1, 1); | 144 RingBuffer* buffer = WebRtc_CreateBuffer(1, 1); |
146 EXPECT_TRUE(buffer != NULL); | 145 EXPECT_TRUE(buffer != NULL); |
147 WebRtc_FreeBuffer(buffer); | 146 WebRtc_FreeBuffer(buffer); |
148 } | 147 } |
149 | 148 |
150 } // namespace webrtc | 149 } // namespace webrtc |
OLD | NEW |