| Index: third_party/protobuf/src/google/protobuf/message_unittest.cc
|
| diff --git a/third_party/protobuf/src/google/protobuf/message_unittest.cc b/third_party/protobuf/src/google/protobuf/message_unittest.cc
|
| index de39fff82e3e6eb25cd78dde28a2b22d46b6640b..d668a1a6bb62e76d372502c8c693fcab48ebdbc6 100644
|
| --- a/third_party/protobuf/src/google/protobuf/message_unittest.cc
|
| +++ b/third_party/protobuf/src/google/protobuf/message_unittest.cc
|
| @@ -48,7 +48,6 @@
|
| #include <google/protobuf/test_util.h>
|
| #include <google/protobuf/unittest.pb.h>
|
| #include <google/protobuf/io/coded_stream.h>
|
| -#include <google/protobuf/io/zero_copy_stream.h>
|
| #include <google/protobuf/io/zero_copy_stream_impl.h>
|
| #include <google/protobuf/descriptor.pb.h>
|
| #include <google/protobuf/descriptor.h>
|
| @@ -183,7 +182,7 @@ TEST(MessageTest, ParseHelpers) {
|
|
|
| TEST(MessageTest, ParseFailsIfNotInitialized) {
|
| unittest::TestRequired message;
|
| - std::vector<string> errors;
|
| + vector<string> errors;
|
|
|
| {
|
| ScopedMemoryLog log;
|
| @@ -266,117 +265,25 @@ TEST(MessageTest, CheckOverflow) {
|
| EXPECT_FALSE(message.AppendToCord(&serialized));
|
| }
|
|
|
| -TEST(MessageTest, CheckBigOverflow) {
|
| - unittest::TestAllTypes message;
|
| - // Create a message with size just over 4GB. We should be able to detect this
|
| - // too, even though it will make a plain "int" wrap back to a positive number.
|
| - const string data(1024, 'x');
|
| - Cord one_megabyte;
|
| - for (int i = 0; i < 1024; i++) {
|
| - one_megabyte.Append(data);
|
| - }
|
| -
|
| - for (int i = 0; i < 4 * 1024 + 1; ++i) {
|
| - message.add_repeated_cord()->CopyFrom(one_megabyte);
|
| - }
|
| -
|
| - Cord serialized;
|
| - EXPECT_FALSE(message.AppendToCord(&serialized));
|
| -}
|
| -
|
| #endif // PROTOBUF_HAS_DEATH_TEST
|
|
|
| namespace {
|
| -// An input stream that repeats a string's content for a number of times. It
|
| -// helps us create a really large input without consuming too much memory. Used
|
| -// to test the parsing behavior when the input size exceeds 2G or close to it.
|
| -class RepeatedInputStream : public io::ZeroCopyInputStream {
|
| - public:
|
| - RepeatedInputStream(const string& data, size_t count)
|
| - : data_(data), count_(count), position_(0), total_byte_count_(0) {}
|
| -
|
| - virtual bool Next(const void** data, int* size) {
|
| - if (position_ == data_.size()) {
|
| - if (--count_ == 0) {
|
| - return false;
|
| - }
|
| - position_ = 0;
|
| - }
|
| - *data = &data_[position_];
|
| - *size = static_cast<int>(data_.size() - position_);
|
| - position_ = data_.size();
|
| - total_byte_count_ += *size;
|
| - return true;
|
| - }
|
| -
|
| - virtual void BackUp(int count) {
|
| - position_ -= static_cast<size_t>(count);
|
| - total_byte_count_ -= count;
|
| - }
|
|
|
| - virtual bool Skip(int count) {
|
| - while (count > 0) {
|
| - const void* data;
|
| - int size;
|
| - if (!Next(&data, &size)) {
|
| - break;
|
| - }
|
| - if (size >= count) {
|
| - BackUp(size - count);
|
| - return true;
|
| - } else {
|
| - count -= size;
|
| - }
|
| - }
|
| - return false;
|
| - }
|
| -
|
| - virtual int64 ByteCount() const { return total_byte_count_; }
|
| -
|
| - private:
|
| - string data_;
|
| - size_t count_; // The number of strings that haven't been consuemd.
|
| - size_t position_; // Position in the string for the next read.
|
| - int64 total_byte_count_;
|
| +class NegativeByteSize : public unittest::TestRequired {
|
| + public:
|
| + virtual int ByteSize() const { return -1; }
|
| };
|
| -} // namespace
|
| -
|
| -TEST(MessageTest, TestParseMessagesCloseTo2G) {
|
| - // Create a message with a large string field.
|
| - string value = string(64 * 1024 * 1024, 'x');
|
| - protobuf_unittest::TestAllTypes message;
|
| - message.set_optional_string(value);
|
| -
|
| - // Repeat this message in the input stream to make the total input size
|
| - // close to 2G.
|
| - string data = message.SerializeAsString();
|
| - size_t count = static_cast<size_t>(kint32max) / data.size();
|
| - RepeatedInputStream input(data, count);
|
| -
|
| - // The parsing should succeed.
|
| - protobuf_unittest::TestAllTypes result;
|
| - EXPECT_TRUE(result.ParseFromZeroCopyStream(&input));
|
|
|
| - // When there are multiple occurences of a singulr field, the last one
|
| - // should win.
|
| - EXPECT_EQ(value, result.optional_string());
|
| -}
|
| -
|
| -TEST(MessageTest, TestParseMessagesOver2G) {
|
| - // Create a message with a large string field.
|
| - string value = string(64 * 1024 * 1024, 'x');
|
| - protobuf_unittest::TestAllTypes message;
|
| - message.set_optional_string(value);
|
| +} // namespace
|
|
|
| - // Repeat this message in the input stream to make the total input size
|
| - // larger than 2G.
|
| - string data = message.SerializeAsString();
|
| - size_t count = static_cast<size_t>(kint32max) / data.size() + 1;
|
| - RepeatedInputStream input(data, count);
|
| +TEST(MessageTest, SerializationFailsOnNegativeByteSize) {
|
| + NegativeByteSize message;
|
| + string string_output;
|
| + EXPECT_FALSE(message.AppendPartialToString(&string_output));
|
|
|
| - // The parsing should fail.
|
| - protobuf_unittest::TestAllTypes result;
|
| - EXPECT_FALSE(result.ParseFromZeroCopyStream(&input));
|
| + io::ArrayOutputStream coded_raw_output(NULL, 100);
|
| + io::CodedOutputStream coded_output(&coded_raw_output);
|
| + EXPECT_FALSE(message.SerializePartialToCodedStream(&coded_output));
|
| }
|
|
|
| TEST(MessageTest, BypassInitializationCheckOnSerialize) {
|
| @@ -388,7 +295,7 @@ TEST(MessageTest, BypassInitializationCheckOnSerialize) {
|
|
|
| TEST(MessageTest, FindInitializationErrors) {
|
| unittest::TestRequired message;
|
| - std::vector<string> errors;
|
| + vector<string> errors;
|
| message.FindInitializationErrors(&errors);
|
| ASSERT_EQ(3, errors.size());
|
| EXPECT_EQ("a", errors[0]);
|
| @@ -412,18 +319,6 @@ TEST(MessageTest, ParseFailsOnInvalidMessageEnd) {
|
| EXPECT_FALSE(message.ParseFromArray("\014", 1));
|
| }
|
|
|
| -// Regression test for b/23630858
|
| -TEST(MessageTest, MessageIsStillValidAfterParseFails) {
|
| - unittest::TestAllTypes message;
|
| -
|
| - // 9 0xFFs for the "optional_uint64" field.
|
| - string invalid_data = "\x20\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF";
|
| -
|
| - EXPECT_FALSE(message.ParseFromString(invalid_data));
|
| - message.Clear();
|
| - EXPECT_EQ(0, message.optional_uint64());
|
| -}
|
| -
|
| namespace {
|
|
|
| void ExpectMessageMerged(const unittest::TestAllTypes& message) {
|
|
|