Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2014 The Crashpad Authors. All rights reserved. | |
| 2 // | |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | |
| 4 // you may not use this file except in compliance with the License. | |
| 5 // You may obtain a copy of the License at | |
| 6 // | |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | |
| 8 // | |
| 9 // Unless required by applicable law or agreed to in writing, software | |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | |
| 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 12 // See the License for the specific language governing permissions and | |
| 13 // limitations under the License. | |
| 14 | |
| 15 #include "util/net/http_body.h" | |
| 16 | |
| 17 #include "gtest/gtest.h" | |
| 18 | |
| 19 namespace crashpad { | |
| 20 namespace test { | |
| 21 namespace { | |
| 22 | |
| 23 std::string ReadStreamToString(HTTPBodyStream* stream) { | |
|
Mark Mentovai
2014/10/23 19:31:04
I would move this down to above ReadASCIIFile, sin
Robert Sesek
2014/10/24 16:53:34
Done.
| |
| 24 uint8_t buf[32]; | |
| 25 std::string result; | |
| 26 | |
| 27 while (stream->HasBytesRemaining()) { | |
| 28 ssize_t bytes_read = stream->GetBytesBuffer(buf, sizeof(buf)); | |
| 29 if (bytes_read == 0) { | |
| 30 break; | |
| 31 } else if (bytes_read < 0) { | |
| 32 ADD_FAILURE() << "Failed to read from stream: " << bytes_read; | |
| 33 return std::string(); | |
| 34 } | |
| 35 | |
| 36 result.append(reinterpret_cast<char*>(buf), bytes_read); | |
| 37 } | |
| 38 | |
| 39 return result; | |
| 40 } | |
| 41 | |
| 42 void ExpectStringBuffer(const std::string& expected, | |
|
Mark Mentovai
2014/10/23 19:31:04
Ditto, above SmallString.
Robert Sesek
2014/10/24 16:53:33
Done.
| |
| 43 const uint8_t* actual, | |
| 44 size_t actual_len) { | |
| 45 for (size_t i = 0; i < actual_len; ++i) { | |
|
Mark Mentovai
2014/10/23 19:31:04
You could just do:
std::string actual_string(re
Robert Sesek
2014/10/24 16:53:33
Done.
| |
| 46 ASSERT_LT(i, expected.length()); | |
| 47 EXPECT_EQ(expected[i], actual[i]); | |
| 48 } | |
| 49 } | |
| 50 | |
| 51 TEST(StringHTTPBodyStreamTest, EmptyString) { | |
|
Mark Mentovai
2014/10/23 19:31:04
Except for death tests, the test class name never
Robert Sesek
2014/10/24 16:53:34
Done.
| |
| 52 uint8_t buf[32]; | |
| 53 memset(buf, '!', sizeof(buf)); | |
|
Mark Mentovai
2014/10/23 19:31:04
#include <string.h>
Robert Sesek
2014/10/24 16:53:34
Done.
| |
| 54 | |
| 55 std::string empty_string; | |
| 56 StringHTTPBodyStream stream(empty_string); | |
| 57 EXPECT_FALSE(stream.HasBytesRemaining()); | |
| 58 EXPECT_EQ(0, stream.GetBytesBuffer(buf, sizeof(buf))); | |
| 59 EXPECT_EQ('!', buf[0]); | |
|
Mark Mentovai
2014/10/23 19:31:04
Check the whole (remainder) of the buffer. Maybe y
Robert Sesek
2014/10/24 16:53:33
Done.
| |
| 60 EXPECT_FALSE(stream.HasBytesRemaining()); | |
| 61 } | |
| 62 | |
| 63 TEST(StringHTTPBodyStreamTest, SmallString) { | |
| 64 uint8_t buf[32]; | |
| 65 memset(buf, '!', sizeof(buf)); | |
| 66 | |
| 67 std::string string("Hello, world"); | |
| 68 StringHTTPBodyStream stream(string); | |
| 69 EXPECT_TRUE(stream.HasBytesRemaining()); | |
| 70 EXPECT_EQ(static_cast<ssize_t>(string.length()), | |
| 71 stream.GetBytesBuffer(buf, sizeof(buf))); | |
| 72 | |
| 73 EXPECT_EQ('!', buf[string.length()]); | |
| 74 ExpectStringBuffer(string, buf, string.length()); | |
| 75 | |
| 76 EXPECT_FALSE(stream.HasBytesRemaining()); | |
| 77 EXPECT_EQ(0, stream.GetBytesBuffer(buf, sizeof(buf))); | |
| 78 } | |
| 79 | |
| 80 TEST(StringHTTPBodyStreamTest, MultipleReads) { | |
| 81 uint8_t buf[2]; | |
| 82 memset(buf, '!', sizeof(buf)); | |
| 83 | |
| 84 { | |
| 85 std::string string("test"); | |
| 86 SCOPED_TRACE("aligned buffer boundary"); | |
| 87 | |
| 88 StringHTTPBodyStream stream(string); | |
| 89 EXPECT_TRUE(stream.HasBytesRemaining()); | |
| 90 EXPECT_EQ(2, stream.GetBytesBuffer(buf, sizeof(buf))); | |
| 91 EXPECT_EQ('t', buf[0]); | |
| 92 EXPECT_EQ('e', buf[1]); | |
| 93 EXPECT_TRUE(stream.HasBytesRemaining()); | |
| 94 EXPECT_EQ(2, stream.GetBytesBuffer(buf, sizeof(buf))); | |
| 95 EXPECT_EQ('s', buf[0]); | |
| 96 EXPECT_EQ('t', buf[1]); | |
| 97 EXPECT_FALSE(stream.HasBytesRemaining()); | |
| 98 EXPECT_EQ(0, stream.GetBytesBuffer(buf, sizeof(buf))); | |
| 99 EXPECT_EQ('s', buf[0]); | |
| 100 EXPECT_EQ('t', buf[1]); | |
| 101 } | |
| 102 | |
| 103 { | |
| 104 std::string string("abc"); | |
| 105 SCOPED_TRACE("unaligned buffer boundary"); | |
| 106 | |
| 107 StringHTTPBodyStream stream(string); | |
| 108 EXPECT_TRUE(stream.HasBytesRemaining()); | |
| 109 EXPECT_EQ(2, stream.GetBytesBuffer(buf, sizeof(buf))); | |
| 110 EXPECT_EQ('a', buf[0]); | |
| 111 EXPECT_EQ('b', buf[1]); | |
| 112 EXPECT_TRUE(stream.HasBytesRemaining()); | |
| 113 EXPECT_EQ(1, stream.GetBytesBuffer(buf, sizeof(buf))); | |
| 114 EXPECT_EQ('c', buf[0]); | |
| 115 EXPECT_EQ('b', buf[1]); // Unmodified from last read. | |
| 116 EXPECT_FALSE(stream.HasBytesRemaining()); | |
| 117 EXPECT_EQ(0, stream.GetBytesBuffer(buf, sizeof(buf))); | |
| 118 EXPECT_EQ('c', buf[0]); | |
| 119 EXPECT_EQ('b', buf[1]); | |
| 120 } | |
| 121 } | |
| 122 | |
| 123 TEST(FileHTTPBodyStreamTest, ReadASCIIFile) { | |
| 124 base::FilePath path = base::FilePath("util/net/testdata/ascii_http_body.txt"); | |
|
Mark Mentovai
2014/10/23 19:31:04
This is fine for now, but I filed bug 4 to do some
Robert Sesek
2014/10/24 16:53:34
Done.
| |
| 125 FileHTTPBodyStream stream(path); | |
| 126 EXPECT_TRUE(stream.HasBytesRemaining()); | |
| 127 std::string contents = ReadStreamToString(&stream); | |
| 128 EXPECT_EQ("This is a test.\n", contents); | |
| 129 EXPECT_FALSE(stream.HasBytesRemaining()); | |
| 130 } | |
| 131 | |
| 132 TEST(FileHTTPBodyStreamTest, ReadBinaryFile) { | |
| 133 // HEX contents of file: |FEEDFACE A11A15|. | |
| 134 base::FilePath path = | |
| 135 base::FilePath("util/net/testdata/binary_http_body.dat"); | |
| 136 uint8_t buf[4]; | |
|
Mark Mentovai
2014/10/23 19:31:04
Comment that the buffer size was intentionally cho
Robert Sesek
2014/10/24 16:53:34
Done.
| |
| 137 | |
| 138 FileHTTPBodyStream stream(path); | |
| 139 | |
| 140 EXPECT_TRUE(stream.HasBytesRemaining()); | |
| 141 memset(buf, '!', sizeof(buf)); | |
| 142 EXPECT_EQ(4, stream.GetBytesBuffer(buf, sizeof(buf))); | |
| 143 EXPECT_EQ(0xfe, buf[0]); | |
| 144 EXPECT_EQ(0xed, buf[1]); | |
| 145 EXPECT_EQ(0xfa, buf[2]); | |
| 146 EXPECT_EQ(0xce, buf[3]); | |
| 147 EXPECT_TRUE(stream.HasBytesRemaining()); | |
| 148 | |
| 149 memset(buf, '!', sizeof(buf)); | |
| 150 EXPECT_EQ(3, stream.GetBytesBuffer(buf, sizeof(buf))); | |
| 151 EXPECT_EQ(0xa1, buf[0]); | |
| 152 EXPECT_EQ(0x1a, buf[1]); | |
| 153 EXPECT_EQ(0x15, buf[2]); | |
| 154 EXPECT_EQ('!', buf[3]); | |
| 155 EXPECT_TRUE(stream.HasBytesRemaining()); | |
| 156 | |
| 157 memset(buf, '!', sizeof(buf)); | |
| 158 EXPECT_EQ(0, stream.GetBytesBuffer(buf, sizeof(buf))); | |
| 159 EXPECT_FALSE(stream.HasBytesRemaining()); | |
| 160 for (size_t i = 0; i < sizeof(buf); ++i) | |
|
Mark Mentovai
2014/10/23 19:31:04
If you had a !-untouched verifier helper, you coul
Robert Sesek
2014/10/24 16:53:34
Done.
| |
| 161 EXPECT_EQ('!', buf[i]) << i; | |
| 162 } | |
| 163 | |
| 164 TEST(FileHTTPBodyStreamTest, NonExistentFile) { | |
| 165 base::FilePath path = base::FilePath("/tmp/crashpad/util/net/http_body/null"); | |
|
Mark Mentovai
2014/10/23 19:31:04
/var/empty, not /tmp
Robert Sesek
2014/10/24 16:53:34
Done.
| |
| 166 FileHTTPBodyStream stream(path); | |
| 167 EXPECT_TRUE(stream.HasBytesRemaining()); | |
| 168 | |
| 169 uint8_t buf = 0xff; | |
| 170 EXPECT_LT(stream.GetBytesBuffer(&buf, 1), 0); | |
| 171 EXPECT_EQ(0xff, buf); | |
| 172 EXPECT_FALSE(stream.HasBytesRemaining()); | |
| 173 EXPECT_LT(stream.GetBytesBuffer(&buf, 1), 0); | |
| 174 EXPECT_EQ(0xff, buf); | |
| 175 EXPECT_FALSE(stream.HasBytesRemaining()); | |
| 176 } | |
| 177 | |
| 178 TEST(CompositeHTTPBodyStreamTest, TwoEmptyStrings) { | |
| 179 std::vector<HTTPBodyStream*> parts; | |
| 180 parts.push_back(new StringHTTPBodyStream(std::string())); | |
| 181 parts.push_back(new StringHTTPBodyStream(std::string())); | |
| 182 | |
| 183 CompositeHTTPBodyStream stream(parts); | |
| 184 EXPECT_FALSE(stream.HasBytesRemaining()); | |
|
Mark Mentovai
2014/10/23 19:31:04
All of your tests call HasBytesRemaining() before
Robert Sesek
2014/10/24 16:53:34
HasBytesRemaining() is now gone.
| |
| 185 | |
| 186 uint8_t buf[5]; | |
| 187 memset(buf, '!', sizeof(buf)); | |
| 188 EXPECT_EQ(0, stream.GetBytesBuffer(buf, sizeof(buf))); | |
| 189 for (size_t i = 0; i < sizeof(buf); ++i) | |
| 190 EXPECT_EQ('!', buf[i]) << i; | |
| 191 | |
| 192 EXPECT_FALSE(stream.HasBytesRemaining()); | |
| 193 } | |
| 194 | |
| 195 TEST(CompositeHTTPBodyStreamTest, ThreeStringParts) { | |
| 196 std::string string1("crashpad"); | |
| 197 std::string string2("test"); | |
| 198 std::string string3("foobar"); | |
| 199 const size_t all_strings_length = string1.length() + string2.length() + | |
| 200 string3.length(); | |
| 201 uint8_t buf[all_strings_length + 3]; | |
| 202 memset(buf, '!', sizeof(buf)); | |
| 203 | |
| 204 std::vector<HTTPBodyStream*> parts; | |
| 205 parts.push_back(new StringHTTPBodyStream(string1)); | |
| 206 parts.push_back(new StringHTTPBodyStream(string2)); | |
| 207 parts.push_back(new StringHTTPBodyStream(string3)); | |
| 208 | |
| 209 CompositeHTTPBodyStream stream(parts); | |
| 210 EXPECT_TRUE(stream.HasBytesRemaining()); | |
| 211 | |
| 212 std::string actual_string = ReadStreamToString(&stream); | |
| 213 EXPECT_EQ(string1 + string2 + string3, actual_string); | |
| 214 | |
| 215 EXPECT_EQ('!', buf[all_strings_length]); | |
| 216 EXPECT_EQ('!', buf[all_strings_length + 1]); | |
| 217 EXPECT_EQ('!', buf[all_strings_length + 2]); | |
| 218 | |
| 219 EXPECT_FALSE(stream.HasBytesRemaining()); | |
| 220 } | |
| 221 | |
| 222 TEST(CompositeHTTPBodyStreamTest, StringsAndFile) { | |
| 223 std::string string1("Hello! "); | |
| 224 std::string string2(" Goodbye :)"); | |
| 225 | |
| 226 std::vector<HTTPBodyStream*> parts; | |
| 227 parts.push_back(new StringHTTPBodyStream(string1)); | |
| 228 parts.push_back(new FileHTTPBodyStream( | |
| 229 base::FilePath("util/net/testdata/ascii_http_body.txt"))); | |
| 230 parts.push_back(new StringHTTPBodyStream(string2)); | |
| 231 | |
| 232 CompositeHTTPBodyStream stream(parts); | |
| 233 EXPECT_TRUE(stream.HasBytesRemaining()); | |
| 234 | |
| 235 std::string expected_string = string1 + "This is a test.\n" + string2; | |
| 236 std::string actual_string = ReadStreamToString(&stream); | |
|
Mark Mentovai
2014/10/23 19:31:04
ReadStreamToString will get the whole thing in thr
Robert Sesek
2014/10/24 16:53:34
Done. Now have a parameterized test for various bu
| |
| 237 EXPECT_EQ(expected_string, actual_string); | |
| 238 | |
| 239 EXPECT_FALSE(stream.HasBytesRemaining()); | |
| 240 } | |
| 241 | |
| 242 } // namespace | |
| 243 } // namespace test | |
| 244 } // namespace crashpad | |
| OLD | NEW |