mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-05 04:58:57 +00:00
Allow GenerateText() to indicate failure to encode flatbuffer to JSON (i.e., non-UTF-8 string data)
This commit is contained in:
@@ -410,7 +410,8 @@ void ParseAndGenerateTextTest() {
|
||||
// to ensure it is correct, we now generate text back from the binary,
|
||||
// and compare the two:
|
||||
std::string jsongen;
|
||||
GenerateText(parser, parser.builder_.GetBufferPointer(), &jsongen);
|
||||
auto result = GenerateText(parser, parser.builder_.GetBufferPointer(), &jsongen);
|
||||
TEST_EQ(result, true);
|
||||
|
||||
if (jsongen != jsonfile) {
|
||||
printf("%s----------------\n%s", jsongen.c_str(), jsonfile.c_str());
|
||||
@@ -827,7 +828,8 @@ void FuzzTest2() {
|
||||
|
||||
std::string jsongen;
|
||||
parser.opts.indent_step = 0;
|
||||
GenerateText(parser, parser.builder_.GetBufferPointer(), &jsongen);
|
||||
auto result = GenerateText(parser, parser.builder_.GetBufferPointer(), &jsongen);
|
||||
TEST_EQ(result, true);
|
||||
|
||||
if (jsongen != json) {
|
||||
// These strings are larger than a megabyte, so we show the bytes around
|
||||
@@ -987,7 +989,8 @@ void UnicodeTest() {
|
||||
true);
|
||||
std::string jsongen;
|
||||
parser.opts.indent_step = -1;
|
||||
GenerateText(parser, parser.builder_.GetBufferPointer(), &jsongen);
|
||||
auto result = GenerateText(parser, parser.builder_.GetBufferPointer(), &jsongen);
|
||||
TEST_EQ(result, true);
|
||||
TEST_EQ(jsongen,
|
||||
std::string(
|
||||
"{F: \"\\u20AC\\u00A2\\u30E6\\u30FC\\u30B6\\u30FC"
|
||||
@@ -1003,13 +1006,31 @@ void UnicodeTestAllowNonUTF8() {
|
||||
"\\u5225\\u30B5\\u30A4\\u30C8\\x01\\x80\\u0080\\uD83D\\uDE0E\" }"), true);
|
||||
std::string jsongen;
|
||||
parser.opts.indent_step = -1;
|
||||
GenerateText(parser, parser.builder_.GetBufferPointer(), &jsongen);
|
||||
auto result = GenerateText(parser, parser.builder_.GetBufferPointer(), &jsongen);
|
||||
TEST_EQ(result, true);
|
||||
TEST_EQ(jsongen,
|
||||
std::string(
|
||||
"{F: \"\\u20AC\\u00A2\\u30E6\\u30FC\\u30B6\\u30FC"
|
||||
"\\u5225\\u30B5\\u30A4\\u30C8\\u0001\\x80\\u0080\\uD83D\\uDE0E\"}"));
|
||||
}
|
||||
|
||||
void UnicodeTestGenerateTextFailsOnNonUTF8() {
|
||||
flatbuffers::Parser parser;
|
||||
// Allow non-UTF-8 initially to model what happens when we load a binary flatbuffer from disk
|
||||
// which contains non-UTF-8 strings.
|
||||
parser.opts.allow_non_utf8 = true;
|
||||
TEST_EQ(parser.Parse("table T { F:string; }"
|
||||
"root_type T;"
|
||||
"{ F:\"\\u20AC\\u00A2\\u30E6\\u30FC\\u30B6\\u30FC"
|
||||
"\\u5225\\u30B5\\u30A4\\u30C8\\x01\\x80\\u0080\\uD83D\\uDE0E\" }"), true);
|
||||
std::string jsongen;
|
||||
parser.opts.indent_step = -1;
|
||||
// Now, disallow non-UTF-8 (the default behavior) so GenerateText indicates failure.
|
||||
parser.opts.allow_non_utf8 = false;
|
||||
auto result = GenerateText(parser, parser.builder_.GetBufferPointer(), &jsongen);
|
||||
TEST_EQ(result, false);
|
||||
}
|
||||
|
||||
void UnicodeSurrogatesTest() {
|
||||
flatbuffers::Parser parser;
|
||||
|
||||
@@ -1157,7 +1178,8 @@ void UnknownFieldsTest() {
|
||||
|
||||
std::string jsongen;
|
||||
parser.opts.indent_step = -1;
|
||||
GenerateText(parser, parser.builder_.GetBufferPointer(), &jsongen);
|
||||
auto result = GenerateText(parser, parser.builder_.GetBufferPointer(), &jsongen);
|
||||
TEST_EQ(result, true);
|
||||
TEST_EQ(jsongen == "{str: \"test\",i: 10}", true);
|
||||
}
|
||||
|
||||
@@ -1222,6 +1244,7 @@ int main(int /*argc*/, const char * /*argv*/[]) {
|
||||
IntegerOutOfRangeTest();
|
||||
UnicodeTest();
|
||||
UnicodeTestAllowNonUTF8();
|
||||
UnicodeTestGenerateTextFailsOnNonUTF8();
|
||||
UnicodeSurrogatesTest();
|
||||
UnicodeInvalidSurrogatesTest();
|
||||
InvalidUTF8Test();
|
||||
|
||||
Reference in New Issue
Block a user