Index: third_party/protobuf/src/google/protobuf/io/coded_stream_unittest.cc |
=================================================================== |
--- third_party/protobuf/src/google/protobuf/io/coded_stream_unittest.cc (revision 216642) |
+++ third_party/protobuf/src/google/protobuf/io/coded_stream_unittest.cc (working copy) |
@@ -44,7 +44,6 @@ |
#include <google/protobuf/testing/googletest.h> |
#include <gtest/gtest.h> |
#include <google/protobuf/io/zero_copy_stream_impl.h> |
-#include <google/protobuf/stubs/strutil.h> |
// This declares an unsigned long long integer literal in a portable way. |
@@ -125,6 +124,13 @@ |
class CodedStreamTest : public testing::Test { |
protected: |
+ // Helper method used by tests for bytes warning. See implementation comment |
+ // for further information. |
+ static void SetupTotalBytesLimitWarningTest( |
+ int total_bytes_limit, int warning_threshold, |
+ vector<string>* out_errors, vector<string>* out_warnings); |
+ |
+ // Buffer used during most of the tests. This assumes tests run sequentially. |
static const int kBufferSize = 1024 * 64; |
static uint8 buffer_[kBufferSize]; |
}; |
@@ -1022,7 +1028,60 @@ |
EXPECT_FALSE(coded_input.ConsumedEntireMessage()); |
} |
+// This method is used by the tests below. |
+// It constructs a CodedInputStream with the given limits and tries to read 2KiB |
+// of data from it. Then it returns the logged errors and warnings in the given |
+// vectors. |
+void CodedStreamTest::SetupTotalBytesLimitWarningTest( |
+ int total_bytes_limit, int warning_threshold, |
+ vector<string>* out_errors, vector<string>* out_warnings) { |
+ ArrayInputStream raw_input(buffer_, sizeof(buffer_), 128); |
+ ScopedMemoryLog scoped_log; |
+ { |
+ CodedInputStream input(&raw_input); |
+ input.SetTotalBytesLimit(total_bytes_limit, warning_threshold); |
+ string str; |
+ EXPECT_TRUE(input.ReadString(&str, 2048)); |
+ } |
+ |
+ *out_errors = scoped_log.GetMessages(ERROR); |
+ *out_warnings = scoped_log.GetMessages(WARNING); |
+} |
+ |
+TEST_F(CodedStreamTest, TotalBytesLimitWarning) { |
+ vector<string> errors; |
+ vector<string> warnings; |
+ SetupTotalBytesLimitWarningTest(10240, 1024, &errors, &warnings); |
+ |
+ EXPECT_EQ(0, errors.size()); |
+ |
+ ASSERT_EQ(2, warnings.size()); |
+ EXPECT_PRED_FORMAT2(testing::IsSubstring, |
+ "Reading dangerously large protocol message. If the message turns out to " |
+ "be larger than 10240 bytes, parsing will be halted for security reasons.", |
+ warnings[0]); |
+ EXPECT_PRED_FORMAT2(testing::IsSubstring, |
+ "The total number of bytes read was 2048", |
+ warnings[1]); |
+} |
+ |
+TEST_F(CodedStreamTest, TotalBytesLimitWarningDisabled) { |
+ vector<string> errors; |
+ vector<string> warnings; |
+ |
+ // Test with -1 |
+ SetupTotalBytesLimitWarningTest(10240, -1, &errors, &warnings); |
+ EXPECT_EQ(0, errors.size()); |
+ EXPECT_EQ(0, warnings.size()); |
+ |
+ // Test again with -2, expecting the same result |
+ SetupTotalBytesLimitWarningTest(10240, -2, &errors, &warnings); |
+ EXPECT_EQ(0, errors.size()); |
+ EXPECT_EQ(0, warnings.size()); |
+} |
+ |
+ |
TEST_F(CodedStreamTest, RecursionLimit) { |
ArrayInputStream input(buffer_, sizeof(buffer_)); |
CodedInputStream coded_input(&input); |
@@ -1060,6 +1119,7 @@ |
EXPECT_FALSE(coded_input.IncrementRecursionDepth()); // 7 |
} |
+ |
class ReallyBigInputStream : public ZeroCopyInputStream { |
public: |
ReallyBigInputStream() : backup_amount_(0), buffer_count_(0) {} |