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

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

Issue 2879353002: Add a buffer reader/writer for NTLM. (Closed)
Patch Set: Rebase 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 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 uint8_t expected[2] = {0x22, 0x11};
52 const uint16_t value = 0x1122;
53
54 NtlmBufferWriter writer(sizeof(uint16_t));
55
56 EXPECT_TRUE(writer.WriteUInt16(value));
57 EXPECT_TRUE(writer.IsEndOfBuffer());
58 EXPECT_EQ(arraysize(expected), writer.GetLength());
59 EXPECT_FALSE(writer.WriteUInt16(value));
60
61 std::unique_ptr<uint8_t[]> actual(writer.ReleaseBufferPtr());
62 EXPECT_EQ(0, memcmp(expected, actual.get(), arraysize(expected)));
63 }
64
65 TEST(NtlmBufferWriterTest, Write16PastEob) {
66 NtlmBufferWriter writer(sizeof(uint16_t) - 1);
67
68 EXPECT_FALSE(writer.WriteUInt16(0));
69 EXPECT_EQ(0u, writer.GetCursor());
70 }
71
72 TEST(NtlmBufferWriterTest, Write32) {
73 uint8_t expected[4] = {0x44, 0x33, 0x22, 0x11};
74 const uint32_t value = 0x11223344;
75
76 NtlmBufferWriter writer(sizeof(uint32_t));
77
78 EXPECT_TRUE(writer.WriteUInt32(value));
79 EXPECT_TRUE(writer.IsEndOfBuffer());
80 EXPECT_FALSE(writer.WriteUInt32(value));
81
82 EXPECT_EQ(0, memcmp(expected, GetBufferPtr(writer), arraysize(expected)));
83 }
84
85 TEST(NtlmBufferWriterTest, Write32PastEob) {
86 NtlmBufferWriter writer(sizeof(uint32_t) - 1);
87
88 EXPECT_FALSE(writer.WriteUInt32(0));
89 EXPECT_EQ(0u, writer.GetCursor());
90 }
91
92 TEST(NtlmBufferWriterTest, Write64) {
93 uint8_t expected[8] = {0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11};
94 const uint64_t value = 0x1122334455667788;
95
96 NtlmBufferWriter writer(sizeof(uint64_t));
97
98 EXPECT_TRUE(writer.WriteUInt64(value));
99 EXPECT_TRUE(writer.IsEndOfBuffer());
100 EXPECT_FALSE(writer.WriteUInt64(value));
101
102 EXPECT_EQ(0, memcmp(expected, GetBufferPtr(writer), arraysize(expected)));
103 }
104
105 TEST(NtlmBufferWriterTest, Write64PastEob) {
106 NtlmBufferWriter writer(sizeof(uint64_t) - 1);
107
108 EXPECT_FALSE(writer.WriteUInt64(0));
109 EXPECT_EQ(0u, writer.GetCursor());
110 }
111
112 TEST(NtlmBufferWriterTest, WriteBytes) {
113 uint8_t expected[8] = {0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11};
114
115 NtlmBufferWriter writer(arraysize(expected));
116
117 EXPECT_TRUE(writer.WriteBytes(expected, arraysize(expected)));
118 EXPECT_EQ(0, memcmp(GetBufferPtr(writer), expected, arraysize(expected)));
119 EXPECT_TRUE(writer.IsEndOfBuffer());
120 EXPECT_FALSE(writer.WriteBytes(expected, 1));
121
122 EXPECT_EQ(0, memcmp(expected, GetBufferPtr(writer), arraysize(expected)));
123 }
124
125 TEST(NtlmBufferWriterTest, WriteBytesPastEob) {
126 uint8_t buffer[8];
127
128 NtlmBufferWriter writer(arraysize(buffer) - 1);
129
130 EXPECT_FALSE(writer.WriteBytes(buffer, arraysize(buffer)));
131 EXPECT_EQ(0u, writer.GetCursor());
132 }
133
134 TEST(NtlmBufferWriterTest, WriteSecurityBuffer) {
135 uint8_t expected[8] = {0x22, 0x11, 0x22, 0x11, 0x88, 0x77, 0x66, 0x55};
136 uint16_t length = 0x1122;
137 uint32_t offset = 0x55667788;
138
139 NtlmBufferWriter writer(ntlm::SECURITY_BUFFER_LEN);
140
141 EXPECT_TRUE(writer.WriteSecurityBuffer(ntlm::SecurityBuffer(offset, length)));
142 EXPECT_TRUE(writer.IsEndOfBuffer());
143 EXPECT_FALSE(
144 writer.WriteSecurityBuffer(ntlm::SecurityBuffer(offset, length)));
145
146 EXPECT_EQ(0, memcmp(expected, GetBufferPtr(writer), arraysize(expected)));
147 }
148
149 TEST(NtlmBufferWriterTest, WriteSecurityBufferPastEob) {
150 ntlm::SecurityBuffer sec_buf;
151 NtlmBufferWriter writer(ntlm::SECURITY_BUFFER_LEN - 1);
152
153 EXPECT_FALSE(writer.WriteSecurityBuffer(sec_buf));
154 EXPECT_EQ(0u, writer.GetCursor());
155 }
156
157 TEST(NtlmBufferWriterTest, WriteNarrowString) {
158 uint8_t expected[8] = {'1', '2', '3', '4', '5', '6', '7', '8'};
159 std::string value("12345678");
160
161 NtlmBufferWriter writer(value.size());
162
163 EXPECT_TRUE(writer.WriteUtf8String(value));
164 EXPECT_TRUE(writer.IsEndOfBuffer());
165 EXPECT_FALSE(writer.WriteUtf8String(value));
166
167 EXPECT_EQ(0, memcmp(expected, GetBufferPtr(writer), arraysize(expected)));
168 }
169
170 TEST(NtlmBufferWriterTest, WriteAsciiStringPastEob) {
171 std::string str("12345678");
172 NtlmBufferWriter writer(str.length() - 1);
173
174 EXPECT_FALSE(writer.WriteUtf8String(str));
175 EXPECT_EQ(0u, writer.GetCursor());
176 }
177
178 TEST(NtlmBufferWriterTest, WriteUtf16String) {
179 uint8_t expected[16] = {'1', 0, '2', 0, '3', 0, '4', 0,
180 '5', 0, '6', 0, '7', 0, '8', 0};
181 base::string16 value = base::ASCIIToUTF16("12345678");
182
183 NtlmBufferWriter writer(value.size() * 2);
184
185 EXPECT_TRUE(writer.WriteUtf16String(value));
186 EXPECT_TRUE(writer.IsEndOfBuffer());
187 EXPECT_FALSE(writer.WriteUtf16String(value));
188
189 EXPECT_EQ(0, memcmp(expected, GetBufferPtr(writer), arraysize(expected)));
190 }
191
192 TEST(NtlmBufferWriterTest, WriteUtf16StringPastEob) {
193 base::string16 str = base::ASCIIToUTF16("12345678");
194 NtlmBufferWriter writer((str.length() * 2) - 1);
195
196 EXPECT_FALSE(writer.WriteUtf16String(str));
197 EXPECT_EQ(0u, writer.GetCursor());
198 }
199
200 TEST(NtlmBufferWriterTest, WriteUtf8AsUtf16String) {
201 uint8_t expected[16] = {'1', 0, '2', 0, '3', 0, '4', 0,
202 '5', 0, '6', 0, '7', 0, '8', 0};
203 std::string input = "12345678";
204
205 NtlmBufferWriter writer(input.size() * 2);
206
207 EXPECT_TRUE(writer.WriteUtf8AsUtf16String(input));
208 EXPECT_TRUE(writer.IsEndOfBuffer());
209 EXPECT_FALSE(writer.WriteUtf8AsUtf16String(input));
210
211 EXPECT_EQ(0, memcmp(expected, GetBufferPtr(writer), arraysize(expected)));
212 }
213
214 TEST(NtlmBufferWriterTest, WriteSignature) {
215 uint8_t expected[8] = {'N', 'T', 'L', 'M', 'S', 'S', 'P', 0};
216 NtlmBufferWriter writer(ntlm::SIGNATURE_LEN);
217
218 EXPECT_TRUE(writer.WriteSignature());
219 EXPECT_TRUE(writer.IsEndOfBuffer());
220
221 EXPECT_EQ(0, memcmp(expected, GetBufferPtr(writer), arraysize(expected)));
222 }
223
224 TEST(NtlmBufferWriterTest, WriteSignaturePastEob) {
225 NtlmBufferWriter writer(1);
226
227 EXPECT_FALSE(writer.WriteSignature());
228 EXPECT_FALSE(writer.IsEndOfBuffer());
229 EXPECT_EQ(0u, writer.GetCursor());
230 EXPECT_TRUE(writer.CanWrite(1));
231 }
232
233 TEST(NtlmBufferWriterTest, WriteMessageType) {
234 NtlmBufferWriter writer(4);
235
236 EXPECT_TRUE(writer.WriteMessageType(ntlm::MessageType::NEGOTIATE));
237 EXPECT_TRUE(writer.IsEndOfBuffer());
238 EXPECT_EQ(static_cast<uint32_t>(ntlm::MessageType::NEGOTIATE),
239 GetByteFromBuffer(writer, 0));
240 EXPECT_EQ(0, GetByteFromBuffer(writer, 1));
241 EXPECT_EQ(0, GetByteFromBuffer(writer, 2));
242 EXPECT_EQ(0, GetByteFromBuffer(writer, 3));
243 }
244
245 TEST(NtlmBufferWriterTest, WriteMessageTypePastEob) {
246 NtlmBufferWriter writer(sizeof(uint32_t) - 1);
247
248 EXPECT_FALSE(writer.WriteMessageType(ntlm::MessageType::NEGOTIATE));
249 EXPECT_EQ(0u, writer.GetCursor());
250 }
251
252 TEST(NtlmBufferWriterTest, ReleaseBufferPtr) {
253 size_t buf_len = 4;
254 NtlmBufferWriter writer(buf_len);
255
256 EXPECT_TRUE(writer.CanWrite(buf_len));
257 EXPECT_TRUE(GetBufferPtr(writer) != nullptr);
258 EXPECT_EQ(buf_len, writer.GetLength());
259 EXPECT_EQ(0u, writer.GetCursor());
260
261 // Write soemthing so that the cursor moves.
262 EXPECT_TRUE(writer.WriteUInt16(23));
263 EXPECT_EQ(sizeof(uint16_t), writer.GetCursor());
264 EXPECT_TRUE(writer.CanWrite(buf_len - sizeof(uint16_t)));
265
266 // Release the buffer from the writer.
267 std::unique_ptr<uint8_t[]> buf(writer.ReleaseBufferPtr());
268
269 // Expect that the writer behaves empty now.
270 EXPECT_TRUE(writer.IsEndOfBuffer());
271 EXPECT_FALSE(writer.CanWrite(buf_len - sizeof(uint16_t)));
272 EXPECT_EQ(0u, writer.GetCursor());
273 EXPECT_EQ(0u, writer.GetLength());
274 EXPECT_EQ(nullptr, GetBufferPtr(writer));
275 }
276
277 } // namespace net
OLDNEW
« net/http/ntlm_buffer_writer.h ('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