OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/quic/iovector.h" | 5 #include "net/quic/iovector.h" |
6 | 6 |
7 #include <string.h> | 7 #include <string.h> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
11 | 11 |
12 using std::string; | 12 using std::string; |
13 | 13 |
14 namespace net { | 14 namespace net { |
15 namespace test { | 15 namespace test { |
16 namespace { | 16 namespace { |
17 | 17 |
18 const char* const test_data[] = { | 18 const char* const test_data[] = { |
19 "test string 1, a medium size one.", | 19 "test string 1, a medium size one.", |
20 "test string2", | 20 "test string2", |
21 "test string 3, a looooooooooooong loooooooooooooooong string" | 21 "test string 3, a looooooooooooong loooooooooooooooong string" |
22 }; | 22 }; |
23 | 23 |
24 TEST(IOVectorTest, CopyConstructor) { | 24 TEST(IOVectorTest, CopyConstructor) { |
25 IOVector iov1; | 25 IOVector iov1; |
26 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { | 26 for (size_t i = 0; i < arraysize(test_data); ++i) { |
27 iov1.Append(const_cast<char*>(test_data[i]), strlen(test_data[i])); | 27 iov1.Append(const_cast<char*>(test_data[i]), strlen(test_data[i])); |
28 } | 28 } |
29 IOVector iov2 = iov1; | 29 IOVector iov2 = iov1; |
30 EXPECT_EQ(iov2.Size(), iov1.Size()); | 30 EXPECT_EQ(iov2.Size(), iov1.Size()); |
31 for (size_t i = 0; i < iov2.Size(); ++i) { | 31 for (size_t i = 0; i < iov2.Size(); ++i) { |
32 EXPECT_TRUE(iov2.iovec()[i].iov_base == iov1.iovec()[i].iov_base); | 32 EXPECT_TRUE(iov2.iovec()[i].iov_base == iov1.iovec()[i].iov_base); |
33 EXPECT_EQ(iov2.iovec()[i].iov_len, iov1.iovec()[i].iov_len); | 33 EXPECT_EQ(iov2.iovec()[i].iov_len, iov1.iovec()[i].iov_len); |
34 } | 34 } |
35 EXPECT_EQ(iov2.TotalBufferSize(), iov1.TotalBufferSize()); | 35 EXPECT_EQ(iov2.TotalBufferSize(), iov1.TotalBufferSize()); |
36 } | 36 } |
37 | 37 |
38 TEST(IOVectorTest, AssignmentOperator) { | 38 TEST(IOVectorTest, AssignmentOperator) { |
39 IOVector iov1; | 39 IOVector iov1; |
40 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { | 40 for (size_t i = 0; i < arraysize(test_data); ++i) { |
41 iov1.Append(const_cast<char*>(test_data[i]), strlen(test_data[i])); | 41 iov1.Append(const_cast<char*>(test_data[i]), strlen(test_data[i])); |
42 } | 42 } |
43 IOVector iov2; | 43 IOVector iov2; |
44 iov2.Append(const_cast<char*>("ephemeral string"), 16); | 44 iov2.Append(const_cast<char*>("ephemeral string"), 16); |
45 // The following assignment results in a shallow copy; | 45 // The following assignment results in a shallow copy; |
46 // both IOVectors point to the same underlying data. | 46 // both IOVectors point to the same underlying data. |
47 iov2 = iov1; | 47 iov2 = iov1; |
48 EXPECT_EQ(iov2.Size(), iov1.Size()); | 48 EXPECT_EQ(iov2.Size(), iov1.Size()); |
49 for (size_t i = 0; i < iov2.Size(); ++i) { | 49 for (size_t i = 0; i < iov2.Size(); ++i) { |
50 EXPECT_TRUE(iov2.iovec()[i].iov_base == iov1.iovec()[i].iov_base); | 50 EXPECT_TRUE(iov2.iovec()[i].iov_base == iov1.iovec()[i].iov_base); |
51 EXPECT_EQ(iov2.iovec()[i].iov_len, iov1.iovec()[i].iov_len); | 51 EXPECT_EQ(iov2.iovec()[i].iov_len, iov1.iovec()[i].iov_len); |
52 } | 52 } |
53 EXPECT_EQ(iov2.TotalBufferSize(), iov1.TotalBufferSize()); | 53 EXPECT_EQ(iov2.TotalBufferSize(), iov1.TotalBufferSize()); |
54 } | 54 } |
55 | 55 |
56 TEST(IOVectorTest, Append) { | 56 TEST(IOVectorTest, Append) { |
57 IOVector iov; | 57 IOVector iov; |
58 int length = 0; | 58 int length = 0; |
59 const struct iovec* iov2 = iov.iovec(); | 59 const struct iovec* iov2 = iov.iovec(); |
60 | 60 |
61 ASSERT_EQ(0u, iov.Size()); | 61 ASSERT_EQ(0u, iov.Size()); |
62 ASSERT_TRUE(iov2 == nullptr); | 62 ASSERT_TRUE(iov2 == nullptr); |
63 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { | 63 for (size_t i = 0; i < arraysize(test_data); ++i) { |
64 const int str_len = strlen(test_data[i]); | 64 const int str_len = strlen(test_data[i]); |
65 const int append_len = str_len / 2; | 65 const int append_len = str_len / 2; |
66 // This should append a new block | 66 // This should append a new block |
67 iov.Append(const_cast<char*>(test_data[i]), append_len); | 67 iov.Append(const_cast<char*>(test_data[i]), append_len); |
68 length += append_len; | 68 length += append_len; |
69 ASSERT_EQ(i + 1, static_cast<size_t>(iov.Size())); | 69 ASSERT_EQ(i + 1, static_cast<size_t>(iov.Size())); |
70 ASSERT_TRUE(iov.LastBlockEnd() == test_data[i] + append_len); | 70 ASSERT_TRUE(iov.LastBlockEnd() == test_data[i] + append_len); |
71 // This should just lengthen the existing block. | 71 // This should just lengthen the existing block. |
72 iov.Append(const_cast<char*>(test_data[i] + append_len), | 72 iov.Append(const_cast<char*>(test_data[i] + append_len), |
73 str_len - append_len); | 73 str_len - append_len); |
(...skipping 10 matching lines...) Expand all Loading... |
84 } | 84 } |
85 } | 85 } |
86 | 86 |
87 TEST(IOVectorTest, AppendIovec) { | 87 TEST(IOVectorTest, AppendIovec) { |
88 IOVector iov; | 88 IOVector iov; |
89 const struct iovec test_iov[] = { | 89 const struct iovec test_iov[] = { |
90 {const_cast<char*>("foo"), 3}, | 90 {const_cast<char*>("foo"), 3}, |
91 {const_cast<char*>("bar"), 3}, | 91 {const_cast<char*>("bar"), 3}, |
92 {const_cast<char*>("buzzzz"), 6} | 92 {const_cast<char*>("buzzzz"), 6} |
93 }; | 93 }; |
94 iov.AppendIovec(test_iov, ARRAYSIZE_UNSAFE(test_iov)); | 94 iov.AppendIovec(test_iov, arraysize(test_iov)); |
95 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_iov); ++i) { | 95 for (size_t i = 0; i < arraysize(test_iov); ++i) { |
96 EXPECT_EQ(test_iov[i].iov_base, iov.iovec()[i].iov_base); | 96 EXPECT_EQ(test_iov[i].iov_base, iov.iovec()[i].iov_base); |
97 EXPECT_EQ(test_iov[i].iov_len, iov.iovec()[i].iov_len); | 97 EXPECT_EQ(test_iov[i].iov_len, iov.iovec()[i].iov_len); |
98 } | 98 } |
99 | 99 |
100 // Test AppendIovecAtMostBytes. | 100 // Test AppendIovecAtMostBytes. |
101 iov.Clear(); | 101 iov.Clear(); |
102 // Stop in the middle of a block. | 102 // Stop in the middle of a block. |
103 EXPECT_EQ(5u, iov.AppendIovecAtMostBytes(test_iov, ARRAYSIZE_UNSAFE(test_iov), | 103 EXPECT_EQ(5u, iov.AppendIovecAtMostBytes(test_iov, arraysize(test_iov), 5)); |
104 5)); | |
105 EXPECT_EQ(5u, iov.TotalBufferSize()); | 104 EXPECT_EQ(5u, iov.TotalBufferSize()); |
106 iov.Append(static_cast<char*>(test_iov[1].iov_base) + 2, 1); | 105 iov.Append(static_cast<char*>(test_iov[1].iov_base) + 2, 1); |
107 // Make sure the boundary case, where max_bytes == size of block also works. | 106 // Make sure the boundary case, where max_bytes == size of block also works. |
108 EXPECT_EQ(6u, iov.AppendIovecAtMostBytes(&test_iov[2], 1, 6)); | 107 EXPECT_EQ(6u, iov.AppendIovecAtMostBytes(&test_iov[2], 1, 6)); |
109 ASSERT_LE(ARRAYSIZE_UNSAFE(test_iov), static_cast<size_t>(iov.Size())); | 108 ASSERT_LE(arraysize(test_iov), static_cast<size_t>(iov.Size())); |
110 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_iov); ++i) { | 109 for (size_t i = 0; i < arraysize(test_iov); ++i) { |
111 EXPECT_EQ(test_iov[i].iov_base, iov.iovec()[i].iov_base); | 110 EXPECT_EQ(test_iov[i].iov_base, iov.iovec()[i].iov_base); |
112 EXPECT_EQ(test_iov[i].iov_len, iov.iovec()[i].iov_len); | 111 EXPECT_EQ(test_iov[i].iov_len, iov.iovec()[i].iov_len); |
113 } | 112 } |
114 } | 113 } |
115 | 114 |
116 TEST(IOVectorTest, ConsumeHalfBlocks) { | 115 TEST(IOVectorTest, ConsumeHalfBlocks) { |
117 IOVector iov; | 116 IOVector iov; |
118 int length = 0; | 117 int length = 0; |
119 | 118 |
120 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { | 119 for (size_t i = 0; i < arraysize(test_data); ++i) { |
121 const int str_len = strlen(test_data[i]); | 120 const int str_len = strlen(test_data[i]); |
122 iov.Append(const_cast<char*>(test_data[i]), str_len); | 121 iov.Append(const_cast<char*>(test_data[i]), str_len); |
123 length += str_len; | 122 length += str_len; |
124 } | 123 } |
125 const char* endp = iov.LastBlockEnd(); | 124 const char* endp = iov.LastBlockEnd(); |
126 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { | 125 for (size_t i = 0; i < arraysize(test_data); ++i) { |
127 const struct iovec* iov2 = iov.iovec(); | 126 const struct iovec* iov2 = iov.iovec(); |
128 const size_t str_len = strlen(test_data[i]); | 127 const size_t str_len = strlen(test_data[i]); |
129 size_t tmp = str_len / 2; | 128 size_t tmp = str_len / 2; |
130 | 129 |
131 ASSERT_TRUE(iov2 != nullptr); | 130 ASSERT_TRUE(iov2 != nullptr); |
132 ASSERT_TRUE(iov2[0].iov_base == test_data[i]); | 131 ASSERT_TRUE(iov2[0].iov_base == test_data[i]); |
133 ASSERT_EQ(str_len, iov2[0].iov_len); | 132 ASSERT_EQ(str_len, iov2[0].iov_len); |
134 | 133 |
135 // Consume half of the first block. | 134 // Consume half of the first block. |
136 size_t consumed = iov.Consume(tmp); | 135 size_t consumed = iov.Consume(tmp); |
137 ASSERT_EQ(tmp, consumed); | 136 ASSERT_EQ(tmp, consumed); |
138 ASSERT_EQ(ARRAYSIZE_UNSAFE(test_data) - i, static_cast<size_t>(iov.Size())); | 137 ASSERT_EQ(arraysize(test_data) - i, static_cast<size_t>(iov.Size())); |
139 iov2 = iov.iovec(); | 138 iov2 = iov.iovec(); |
140 ASSERT_TRUE(iov2 != nullptr); | 139 ASSERT_TRUE(iov2 != nullptr); |
141 ASSERT_TRUE(iov2[0].iov_base == test_data[i] + tmp); | 140 ASSERT_TRUE(iov2[0].iov_base == test_data[i] + tmp); |
142 ASSERT_EQ(iov2[0].iov_len, str_len - tmp); | 141 ASSERT_EQ(iov2[0].iov_len, str_len - tmp); |
143 | 142 |
144 // Consume the rest of the first block | 143 // Consume the rest of the first block |
145 consumed = iov.Consume(str_len - tmp); | 144 consumed = iov.Consume(str_len - tmp); |
146 ASSERT_EQ(str_len - tmp, consumed); | 145 ASSERT_EQ(str_len - tmp, consumed); |
147 ASSERT_EQ(ARRAYSIZE_UNSAFE(test_data) - i - 1, | 146 ASSERT_EQ(arraysize(test_data) - i - 1, static_cast<size_t>(iov.Size())); |
148 static_cast<size_t>(iov.Size())); | |
149 iov2 = iov.iovec(); | 147 iov2 = iov.iovec(); |
150 if (iov.Size() > 0) { | 148 if (iov.Size() > 0) { |
151 ASSERT_TRUE(iov2 != nullptr); | 149 ASSERT_TRUE(iov2 != nullptr); |
152 ASSERT_TRUE(iov.LastBlockEnd() == endp); | 150 ASSERT_TRUE(iov.LastBlockEnd() == endp); |
153 } else { | 151 } else { |
154 ASSERT_TRUE(iov2 == nullptr); | 152 ASSERT_TRUE(iov2 == nullptr); |
155 ASSERT_TRUE(iov.LastBlockEnd() == nullptr); | 153 ASSERT_TRUE(iov.LastBlockEnd() == nullptr); |
156 } | 154 } |
157 } | 155 } |
158 } | 156 } |
159 | 157 |
160 TEST(IOVectorTest, ConsumeTwoAndHalfBlocks) { | 158 TEST(IOVectorTest, ConsumeTwoAndHalfBlocks) { |
161 IOVector iov; | 159 IOVector iov; |
162 int length = 0; | 160 int length = 0; |
163 | 161 |
164 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { | 162 for (size_t i = 0; i < arraysize(test_data); ++i) { |
165 const int str_len = strlen(test_data[i]); | 163 const int str_len = strlen(test_data[i]); |
166 iov.Append(const_cast<char*>(test_data[i]), str_len); | 164 iov.Append(const_cast<char*>(test_data[i]), str_len); |
167 length += str_len; | 165 length += str_len; |
168 } | 166 } |
169 const size_t last_len = strlen(test_data[ARRAYSIZE_UNSAFE(test_data) - 1]); | 167 const size_t last_len = strlen(test_data[arraysize(test_data) - 1]); |
170 const size_t half_len = last_len / 2; | 168 const size_t half_len = last_len / 2; |
171 | 169 |
172 const char* endp = iov.LastBlockEnd(); | 170 const char* endp = iov.LastBlockEnd(); |
173 size_t consumed = iov.Consume(length - half_len); | 171 size_t consumed = iov.Consume(length - half_len); |
174 ASSERT_EQ(length - half_len, consumed); | 172 ASSERT_EQ(length - half_len, consumed); |
175 const struct iovec* iov2 = iov.iovec(); | 173 const struct iovec* iov2 = iov.iovec(); |
176 ASSERT_TRUE(iov2 != nullptr); | 174 ASSERT_TRUE(iov2 != nullptr); |
177 ASSERT_EQ(1u, iov.Size()); | 175 ASSERT_EQ(1u, iov.Size()); |
178 ASSERT_TRUE(iov2[0].iov_base == | 176 ASSERT_TRUE(iov2[0].iov_base == |
179 test_data[ARRAYSIZE_UNSAFE(test_data) - 1] + last_len - half_len); | 177 test_data[arraysize(test_data) - 1] + last_len - half_len); |
180 ASSERT_EQ(half_len, iov2[0].iov_len); | 178 ASSERT_EQ(half_len, iov2[0].iov_len); |
181 ASSERT_TRUE(iov.LastBlockEnd() == endp); | 179 ASSERT_TRUE(iov.LastBlockEnd() == endp); |
182 | 180 |
183 consumed = iov.Consume(half_len); | 181 consumed = iov.Consume(half_len); |
184 ASSERT_EQ(half_len, consumed); | 182 ASSERT_EQ(half_len, consumed); |
185 iov2 = iov.iovec(); | 183 iov2 = iov.iovec(); |
186 ASSERT_EQ(0u, iov.Size()); | 184 ASSERT_EQ(0u, iov.Size()); |
187 ASSERT_TRUE(iov2 == nullptr); | 185 ASSERT_TRUE(iov2 == nullptr); |
188 ASSERT_TRUE(iov.LastBlockEnd() == nullptr); | 186 ASSERT_TRUE(iov.LastBlockEnd() == nullptr); |
189 } | 187 } |
190 | 188 |
191 TEST(IOVectorTest, ConsumeTooMuch) { | 189 TEST(IOVectorTest, ConsumeTooMuch) { |
192 IOVector iov; | 190 IOVector iov; |
193 int length = 0; | 191 int length = 0; |
194 | 192 |
195 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { | 193 for (size_t i = 0; i < arraysize(test_data); ++i) { |
196 const int str_len = strlen(test_data[i]); | 194 const int str_len = strlen(test_data[i]); |
197 iov.Append(const_cast<char*>(test_data[i]), str_len); | 195 iov.Append(const_cast<char*>(test_data[i]), str_len); |
198 length += str_len; | 196 length += str_len; |
199 } | 197 } |
200 | 198 |
201 int consumed = 0; | 199 int consumed = 0; |
202 consumed = iov.Consume(length); | 200 consumed = iov.Consume(length); |
203 // TODO(rtenneti): enable when chromium supports EXPECT_DFATAL. | 201 // TODO(rtenneti): enable when chromium supports EXPECT_DFATAL. |
204 /* | 202 /* |
205 EXPECT_DFATAL( | 203 EXPECT_DFATAL( |
206 {consumed = iov.Consume(length + 1);}, | 204 {consumed = iov.Consume(length + 1);}, |
207 "Attempting to consume 1 non-existent bytes."); | 205 "Attempting to consume 1 non-existent bytes."); |
208 */ | 206 */ |
209 ASSERT_EQ(length, consumed); | 207 ASSERT_EQ(length, consumed); |
210 const struct iovec* iov2 = iov.iovec(); | 208 const struct iovec* iov2 = iov.iovec(); |
211 ASSERT_EQ(0u, iov.Size()); | 209 ASSERT_EQ(0u, iov.Size()); |
212 ASSERT_TRUE(iov2 == nullptr); | 210 ASSERT_TRUE(iov2 == nullptr); |
213 ASSERT_TRUE(iov.LastBlockEnd() == nullptr); | 211 ASSERT_TRUE(iov.LastBlockEnd() == nullptr); |
214 } | 212 } |
215 | 213 |
216 TEST(IOVectorTest, Clear) { | 214 TEST(IOVectorTest, Clear) { |
217 IOVector iov; | 215 IOVector iov; |
218 int length = 0; | 216 int length = 0; |
219 | 217 |
220 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { | 218 for (size_t i = 0; i < arraysize(test_data); ++i) { |
221 const int str_len = strlen(test_data[i]); | 219 const int str_len = strlen(test_data[i]); |
222 iov.Append(const_cast<char*>(test_data[i]), str_len); | 220 iov.Append(const_cast<char*>(test_data[i]), str_len); |
223 length += str_len; | 221 length += str_len; |
224 } | 222 } |
225 const struct iovec* iov2 = iov.iovec(); | 223 const struct iovec* iov2 = iov.iovec(); |
226 ASSERT_TRUE(iov2 != nullptr); | 224 ASSERT_TRUE(iov2 != nullptr); |
227 ASSERT_EQ(ARRAYSIZE_UNSAFE(test_data), static_cast<size_t>(iov.Size())); | 225 ASSERT_EQ(arraysize(test_data), static_cast<size_t>(iov.Size())); |
228 | 226 |
229 iov.Clear(); | 227 iov.Clear(); |
230 iov2 = iov.iovec(); | 228 iov2 = iov.iovec(); |
231 ASSERT_EQ(0u, iov.Size()); | 229 ASSERT_EQ(0u, iov.Size()); |
232 ASSERT_TRUE(iov2 == nullptr); | 230 ASSERT_TRUE(iov2 == nullptr); |
233 } | 231 } |
234 | 232 |
235 TEST(IOVectorTest, Capacity) { | 233 TEST(IOVectorTest, Capacity) { |
236 IOVector iov; | 234 IOVector iov; |
237 // Note: IOVector merges adjacent Appends() into a single iov. | 235 // Note: IOVector merges adjacent Appends() into a single iov. |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
274 ASSERT_EQ(2u, iov2.Size()); | 272 ASSERT_EQ(2u, iov2.Size()); |
275 EXPECT_EQ(&a[0], iov2.iovec()[0].iov_base); | 273 EXPECT_EQ(&a[0], iov2.iovec()[0].iov_base); |
276 EXPECT_EQ(1u, iov2.iovec()[0].iov_len); | 274 EXPECT_EQ(1u, iov2.iovec()[0].iov_len); |
277 EXPECT_EQ(&b[0], iov2.iovec()[1].iov_base); | 275 EXPECT_EQ(&b[0], iov2.iovec()[1].iov_base); |
278 EXPECT_EQ(1u, iov2.iovec()[1].iov_len); | 276 EXPECT_EQ(1u, iov2.iovec()[1].iov_len); |
279 } | 277 } |
280 | 278 |
281 } // namespace | 279 } // namespace |
282 } // namespace test | 280 } // namespace test |
283 } // namespace net | 281 } // namespace net |
OLD | NEW |