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

Side by Side Diff: net/http/ntlm_buffer_writer_unittest.cc

Issue 2879353002: Add a buffer reader/writer for NTLM. (Closed)
Patch Set: Add a buffer reader/writer for NTLM. Created 3 years, 6 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 (c) 2017 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 "net/http/ntlm_buffer_writer.h"
6
7 #include "base/macros.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10
11 #if defined(ARCH_CPU_LITTLE_ENDIAN)
12 #define IS_LITTLE_ENDIAN 1
13 #undef IS_BIG_ENDIAN
14 #elif defined(ARCH_CPU_BIG_ENDIAN)
15 #define IS_BIG_ENDIAN 1
16 #undef IS_LITTLE_ENDIAN
17 #else
18 #error "Unknown endianness"
19 #endif
20
21 namespace net {
22
23 namespace {
24
25 // Helper method to hide all the ugly casting.
26 const uint8_t* GetBufferPtr(const NtlmBufferWriter& writer) {
27 return reinterpret_cast<const uint8_t*>(writer.GetBuffer().data());
28 }
29
30 // Helper method to get a byte at a specific index in the buffer.
31 uint8_t GetByteFromBuffer(const NtlmBufferWriter& writer, size_t index) {
32 base::StringPiece piece(writer.GetBuffer());
33 EXPECT_TRUE(index < piece.length());
34 return static_cast<uint8_t>(piece.data()[index]);
35 }
36
37 } // namespace
38
39 TEST(NtlmBufferWriterTest, Initialization) {
40 NtlmBufferWriter writer(1);
41
42 EXPECT_EQ(1u, writer.GetLength());
43 EXPECT_EQ(1u, writer.GetBuffer().length());
44 EXPECT_EQ(0u, writer.GetCursor());
45 EXPECT_FALSE(writer.IsEndOfBuffer());
46 EXPECT_TRUE(writer.CanWrite(1));
47 EXPECT_FALSE(writer.CanWrite(2));
48 }
49
50 TEST(NtlmBufferWriterTest, Write16) {
51 const uint16_t expected = 0x1122;
52
53 NtlmBufferWriter writer(sizeof(uint16_t));
54
55 EXPECT_TRUE(writer.WriteUInt16(expected));
56 EXPECT_EQ(expected & 0xff, GetByteFromBuffer(writer, 0));
57 EXPECT_EQ(expected >> 8, GetByteFromBuffer(writer, 1));
58 EXPECT_TRUE(writer.IsEndOfBuffer());
59 EXPECT_FALSE(writer.WriteUInt16(expected));
60 }
61
62 TEST(NtlmBufferWriterTest, Write16PastEob) {
63 NtlmBufferWriter writer(sizeof(uint16_t) - 1);
64
65 EXPECT_FALSE(writer.WriteUInt16(0));
66 EXPECT_EQ(0u, writer.GetCursor());
67 }
68
69 TEST(NtlmBufferWriterTest, Write32) {
70 const uint32_t expected = 0x11223344;
71
72 NtlmBufferWriter writer(sizeof(uint32_t));
73
74 EXPECT_TRUE(writer.WriteUInt32(expected));
75 EXPECT_EQ(expected & 0xff, GetByteFromBuffer(writer, 0));
asanka 2017/06/08 19:40:10 As mentioned elsewhere, use literal buffers instea
zentaro 2017/06/12 23:12:08 Done.
76 EXPECT_EQ((expected & 0xff00) >> 8, GetByteFromBuffer(writer, 1));
77 EXPECT_EQ((expected & 0xff0000) >> 16, GetByteFromBuffer(writer, 2));
78 EXPECT_EQ(expected >> 24, GetByteFromBuffer(writer, 3));
79 EXPECT_TRUE(writer.IsEndOfBuffer());
80 EXPECT_FALSE(writer.WriteUInt32(expected));
81 }
82
83 TEST(NtlmBufferWriterTest, Write32PastEob) {
84 NtlmBufferWriter writer(sizeof(uint32_t) - 1);
85
86 EXPECT_FALSE(writer.WriteUInt32(0));
87 EXPECT_EQ(0u, writer.GetCursor());
88 }
89
90 TEST(NtlmBufferWriterTest, Write64) {
91 const uint64_t expected = 0x1122334455667788;
92
93 NtlmBufferWriter writer(sizeof(uint64_t));
94
95 EXPECT_TRUE(writer.WriteUInt64(expected));
96 EXPECT_EQ(expected & 0xff, GetByteFromBuffer(writer, 0));
97 EXPECT_EQ((expected & 0xff00) >> 8, GetByteFromBuffer(writer, 1));
98 EXPECT_EQ((expected & 0xff0000) >> 16, GetByteFromBuffer(writer, 2));
99 EXPECT_EQ((expected & 0xff000000) >> 24, GetByteFromBuffer(writer, 3));
100 EXPECT_EQ((expected & 0xff00000000) >> 32, GetByteFromBuffer(writer, 4));
101 EXPECT_EQ((expected & 0xff0000000000) >> 40, GetByteFromBuffer(writer, 5));
102 EXPECT_EQ((expected & 0xff000000000000) >> 48, GetByteFromBuffer(writer, 6));
103 EXPECT_EQ(expected >> 56, GetByteFromBuffer(writer, 7));
104 EXPECT_TRUE(writer.IsEndOfBuffer());
105 EXPECT_FALSE(writer.WriteUInt64(expected));
106 }
107
108 TEST(NtlmBufferWriterTest, Write64PastEob) {
109 NtlmBufferWriter writer(sizeof(uint64_t) - 1);
110
111 EXPECT_FALSE(writer.WriteUInt64(0));
112 EXPECT_EQ(0u, writer.GetCursor());
113 }
114
115 TEST(NtlmBufferWriterTest, WriteBytes) {
116 uint8_t expected[8];
117
118 expected[0] = 0x11;
119 expected[1] = 0x22;
120 expected[2] = 0x33;
121 expected[3] = 0x44;
122 expected[4] = 0x55;
123 expected[5] = 0x66;
124 expected[6] = 0x77;
125 expected[7] = 0x88;
126
127 NtlmBufferWriter writer(arraysize(expected));
128
129 EXPECT_TRUE(writer.WriteBytes(expected, arraysize(expected)));
130 EXPECT_EQ(0, memcmp(GetBufferPtr(writer), expected, arraysize(expected)));
131 EXPECT_TRUE(writer.IsEndOfBuffer());
132 EXPECT_FALSE(writer.WriteBytes(expected, 1));
133 }
134
135 TEST(NtlmBufferWriterTest, WriteBytesPastEob) {
136 uint8_t buffer[8];
137
138 NtlmBufferWriter writer(arraysize(buffer) - 1);
139
140 EXPECT_FALSE(writer.WriteBytes(buffer, arraysize(buffer)));
141 EXPECT_EQ(0u, writer.GetCursor());
142 }
143
144 TEST(NtlmBufferWriterTest, WriteSecurityBuffer) {
145 uint16_t length = 0x1122;
146 uint32_t offset = 0x55667788;
147
148 NtlmBufferWriter writer(ntlm::SECURITY_BUFFER_LEN);
149
150 EXPECT_TRUE(writer.WriteSecurityBuffer(ntlm::SecurityBuffer(offset, length)));
151 EXPECT_EQ(length & 0xff, GetByteFromBuffer(writer, 0));
152 EXPECT_EQ(length >> 8, GetByteFromBuffer(writer, 1));
153
154 // The second 16 bit field repeats the length.
155 EXPECT_EQ(length & 0xff, GetByteFromBuffer(writer, 2));
156 EXPECT_EQ(length >> 8, GetByteFromBuffer(writer, 3));
157 EXPECT_EQ(offset & 0xff, GetByteFromBuffer(writer, 4));
158 EXPECT_EQ((offset & 0xff00) >> 8, GetByteFromBuffer(writer, 5));
159 EXPECT_EQ((offset & 0xff0000) >> 16, GetByteFromBuffer(writer, 6));
160 EXPECT_EQ((offset & 0xff000000) >> 24, GetByteFromBuffer(writer, 7));
161 EXPECT_TRUE(writer.IsEndOfBuffer());
162 EXPECT_FALSE(
163 writer.WriteSecurityBuffer(ntlm::SecurityBuffer(offset, length)));
164 }
165
166 TEST(NtlmBufferWriterTest, WriteSecurityBufferPastEob) {
167 ntlm::SecurityBuffer sec_buf;
168 NtlmBufferWriter writer(ntlm::SECURITY_BUFFER_LEN - 1);
169
170 EXPECT_FALSE(writer.WriteSecurityBuffer(sec_buf));
171 EXPECT_EQ(0u, writer.GetCursor());
172 }
173
174 TEST(NtlmBufferWriterTest, WriteNarrowString) {
175 std::string expected("12345678");
176
177 NtlmBufferWriter writer(expected.size());
178
179 EXPECT_TRUE(writer.WriteNarrowString(expected));
180 EXPECT_EQ(0, memcmp(expected.c_str(), GetBufferPtr(writer), expected.size()));
181 EXPECT_TRUE(writer.IsEndOfBuffer());
182 EXPECT_FALSE(writer.WriteNarrowString(expected));
183 }
184
185 TEST(NtlmBufferWriterTest, WriteAsciiStringPastEob) {
186 std::string str("12345678");
187 NtlmBufferWriter writer(str.length() - 1);
188
189 EXPECT_FALSE(writer.WriteNarrowString(str));
190 EXPECT_EQ(0u, writer.GetCursor());
191 }
192
193 TEST(NtlmBufferWriterTest, WriteUnicodeString) {
194 base::string16 expected = base::ASCIIToUTF16("12345678");
195
196 NtlmBufferWriter writer(expected.size() * 2);
197
198 EXPECT_TRUE(writer.WriteUnicodeString(expected));
199 #if IS_BIG_ENDIAN
200 uint8_t* ptr =
201 const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(expected.c_str()));
202 for (size_t i = 0; i < expected.size() * 2; i += 2) {
203 std::swap(ptr[i], ptr[i + 1]);
204 }
205 #endif
206 EXPECT_EQ(
207 0, memcmp(expected.c_str(), GetBufferPtr(writer), expected.size() * 2));
208
209 EXPECT_TRUE(writer.IsEndOfBuffer());
210 EXPECT_FALSE(writer.WriteUnicodeString(expected));
211 }
212
213 TEST(NtlmBufferWriterTest, WriteUnicodeStringPastEob) {
214 base::string16 str = base::ASCIIToUTF16("12345678");
215 NtlmBufferWriter writer(str.length() - 1);
216
217 EXPECT_FALSE(writer.WriteUnicodeString(str));
218 EXPECT_EQ(0u, writer.GetCursor());
219 }
220
221 TEST(NtlmBufferWriterTest, WriteAsciiStringAsUnicode) {
222 std::string input = "12345678";
223 base::string16 expected;
224 expected.assign(input.begin(), input.end());
225
226 NtlmBufferWriter writer(input.size() * 2);
227
228 EXPECT_TRUE(writer.WriteNarrowStringAsString16(input));
229 #if IS_BIG_ENDIAN
230 uint8_t* ptr =
231 const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(expected.c_str()));
232 for (size_t i = 0; i < expected.size() * 2; i += 2) {
233 std::swap(ptr[i], ptr[i + 1]);
234 }
235 #endif
236 EXPECT_EQ(
237 0, memcmp(expected.c_str(), GetBufferPtr(writer), expected.size() * 2));
238
239 EXPECT_TRUE(writer.IsEndOfBuffer());
240 EXPECT_FALSE(writer.WriteNarrowStringAsString16(input));
241 }
242
243 TEST(NtlmBufferWriterTest, WriteSignature) {
244 NtlmBufferWriter writer(ntlm::SIGNATURE_LEN);
245
246 EXPECT_TRUE(writer.WriteSignature());
247 EXPECT_EQ(0,
248 memcmp(ntlm::SIGNATURE, GetBufferPtr(writer), ntlm::SIGNATURE_LEN));
249 EXPECT_TRUE(writer.IsEndOfBuffer());
250 }
251
252 TEST(NtlmBufferWriterTest, WriteSignaturePastEob) {
253 NtlmBufferWriter writer(1);
254
255 EXPECT_FALSE(writer.WriteSignature());
256 EXPECT_FALSE(writer.IsEndOfBuffer());
257 EXPECT_TRUE(writer.CanWrite(1));
258 }
259
260 TEST(NtlmBufferWriterTest, WriteMessageType) {
261 NtlmBufferWriter writer(4);
262
263 EXPECT_TRUE(writer.WriteMessageType(ntlm::MESSAGE_NEGOTIATE));
264 EXPECT_EQ(ntlm::MESSAGE_NEGOTIATE, GetByteFromBuffer(writer, 0));
265 EXPECT_TRUE(writer.IsEndOfBuffer());
266 }
267
268 TEST(NtlmBufferWriterTest, WriteMessageTypePastEob) {
269 NtlmBufferWriter writer(sizeof(uint32_t) - 1);
270
271 EXPECT_FALSE(writer.WriteMessageType(ntlm::MESSAGE_NEGOTIATE));
272 EXPECT_EQ(0u, writer.GetCursor());
273 }
274
275 TEST(NtlmBufferWriterTest, ReleaseBufferPtr) {
276 size_t buf_len = 4;
277 NtlmBufferWriter writer(buf_len);
278
279 EXPECT_TRUE(writer.CanWrite(buf_len));
280 EXPECT_TRUE(GetBufferPtr(writer) != nullptr);
281 EXPECT_EQ(buf_len, writer.GetLength());
282 EXPECT_EQ(0u, writer.GetCursor());
283
284 // Write soemthing so that the cursor moves.
285 EXPECT_TRUE(writer.WriteUInt16(23));
286 EXPECT_EQ(sizeof(uint16_t), writer.GetCursor());
287 EXPECT_TRUE(writer.CanWrite(buf_len - sizeof(uint16_t)));
288
289 // Release the buffer from the writer.
290 std::unique_ptr<uint8_t[]> buf(writer.ReleaseBufferPtr());
291
292 // Expect that the writer behaves empty now.
293 EXPECT_TRUE(writer.IsEndOfBuffer());
294 EXPECT_FALSE(writer.CanWrite(buf_len - sizeof(uint16_t)));
295 EXPECT_EQ(0u, writer.GetCursor());
296 EXPECT_EQ(0u, writer.GetLength());
297 EXPECT_EQ(nullptr, GetBufferPtr(writer));
298 }
299
300 } // namespace net
OLDNEW
« net/http/ntlm_buffer_writer.cc ('K') | « net/http/ntlm_buffer_writer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698