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