BSON: Improved exception-related tests and report location of U+0000 in the key-string as part of out_of_range.409
-message
This commit is contained in:
parent
5ba812d518
commit
ad11b6c35e
4 changed files with 32 additions and 15 deletions
|
@ -282,7 +282,7 @@ json.exception.out_of_range.405 | JSON pointer has no parent | The JSON Patch op
|
||||||
json.exception.out_of_range.406 | number overflow parsing '10E1000' | A parsed number could not be stored as without changing it to NaN or INF.
|
json.exception.out_of_range.406 | number overflow parsing '10E1000' | A parsed number could not be stored as without changing it to NaN or INF.
|
||||||
json.exception.out_of_range.407 | number overflow serializing '9223372036854775808' | UBJSON and BSON only support integer numbers up to 9223372036854775807. |
|
json.exception.out_of_range.407 | number overflow serializing '9223372036854775808' | UBJSON and BSON only support integer numbers up to 9223372036854775807. |
|
||||||
json.exception.out_of_range.408 | excessive array size: 8658170730974374167 | The size (following `#`) of an UBJSON array or object exceeds the maximal capacity. |
|
json.exception.out_of_range.408 | excessive array size: 8658170730974374167 | The size (following `#`) of an UBJSON array or object exceeds the maximal capacity. |
|
||||||
json.exception.out_of_range.409 | BSON key cannot contain code point U+0000 | Key identifiers to be serialized to BSON cannot contain code point U+0000, since the key is stored as zero-terminated c-string |
|
json.exception.out_of_range.409 | BSON key cannot contain code point U+0000 (at byte 2) | Key identifiers to be serialized to BSON cannot contain code point U+0000, since the key is stored as zero-terminated c-string |
|
||||||
|
|
||||||
@liveexample{The following code shows how an `out_of_range` exception can be
|
@liveexample{The following code shows how an `out_of_range` exception can be
|
||||||
caught.,out_of_range}
|
caught.,out_of_range}
|
||||||
|
|
|
@ -683,9 +683,11 @@ class binary_writer
|
||||||
*/
|
*/
|
||||||
static std::size_t calc_bson_entry_header_size(const typename BasicJsonType::string_t& name)
|
static std::size_t calc_bson_entry_header_size(const typename BasicJsonType::string_t& name)
|
||||||
{
|
{
|
||||||
if (name.find(static_cast<typename BasicJsonType::string_t::value_type>(0)) != BasicJsonType::string_t::npos)
|
const auto it = name.find(static_cast<typename BasicJsonType::string_t::value_type>(0));
|
||||||
|
if (it != BasicJsonType::string_t::npos)
|
||||||
{
|
{
|
||||||
JSON_THROW(out_of_range::create(409, "BSON key cannot contain code point U+0000"));
|
JSON_THROW(out_of_range::create(409,
|
||||||
|
"BSON key cannot contain code point U+0000 (at byte " + std::to_string(it) + ")"));
|
||||||
}
|
}
|
||||||
|
|
||||||
return /*id*/ 1ul + name.size() + /*zero-terminator*/1u;
|
return /*id*/ 1ul + name.size() + /*zero-terminator*/1u;
|
||||||
|
|
|
@ -923,7 +923,7 @@ json.exception.out_of_range.405 | JSON pointer has no parent | The JSON Patch op
|
||||||
json.exception.out_of_range.406 | number overflow parsing '10E1000' | A parsed number could not be stored as without changing it to NaN or INF.
|
json.exception.out_of_range.406 | number overflow parsing '10E1000' | A parsed number could not be stored as without changing it to NaN or INF.
|
||||||
json.exception.out_of_range.407 | number overflow serializing '9223372036854775808' | UBJSON and BSON only support integer numbers up to 9223372036854775807. |
|
json.exception.out_of_range.407 | number overflow serializing '9223372036854775808' | UBJSON and BSON only support integer numbers up to 9223372036854775807. |
|
||||||
json.exception.out_of_range.408 | excessive array size: 8658170730974374167 | The size (following `#`) of an UBJSON array or object exceeds the maximal capacity. |
|
json.exception.out_of_range.408 | excessive array size: 8658170730974374167 | The size (following `#`) of an UBJSON array or object exceeds the maximal capacity. |
|
||||||
json.exception.out_of_range.409 | BSON key cannot contain code point U+0000 | Key identifiers to be serialized to BSON cannot contain code point U+0000, since the key is stored as zero-terminated c-string |
|
json.exception.out_of_range.409 | BSON key cannot contain code point U+0000 (at byte 2) | Key identifiers to be serialized to BSON cannot contain code point U+0000, since the key is stored as zero-terminated c-string |
|
||||||
|
|
||||||
@liveexample{The following code shows how an `out_of_range` exception can be
|
@liveexample{The following code shows how an `out_of_range` exception can be
|
||||||
caught.,out_of_range}
|
caught.,out_of_range}
|
||||||
|
@ -8840,9 +8840,11 @@ class binary_writer
|
||||||
*/
|
*/
|
||||||
static std::size_t calc_bson_entry_header_size(const typename BasicJsonType::string_t& name)
|
static std::size_t calc_bson_entry_header_size(const typename BasicJsonType::string_t& name)
|
||||||
{
|
{
|
||||||
if (name.find(static_cast<typename BasicJsonType::string_t::value_type>(0)) != BasicJsonType::string_t::npos)
|
const auto it = name.find(static_cast<typename BasicJsonType::string_t::value_type>(0));
|
||||||
|
if (it != BasicJsonType::string_t::npos)
|
||||||
{
|
{
|
||||||
JSON_THROW(out_of_range::create(409, "BSON key cannot contain code point U+0000"));
|
JSON_THROW(out_of_range::create(409,
|
||||||
|
"BSON key cannot contain code point U+0000 (at byte " + std::to_string(it) + ")"));
|
||||||
}
|
}
|
||||||
|
|
||||||
return /*id*/ 1ul + name.size() + /*zero-terminator*/1u;
|
return /*id*/ 1ul + name.size() + /*zero-terminator*/1u;
|
||||||
|
|
|
@ -48,7 +48,8 @@ TEST_CASE("BSON")
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j = nullptr;
|
json j = nullptr;
|
||||||
REQUIRE_THROWS_AS(json::to_bson(j), json::type_error);
|
REQUIRE_THROWS_AS(json::to_bson(j), json::type_error&);
|
||||||
|
CHECK_THROWS_WITH(json::to_bson(j), "[json.exception.type_error.317] JSON value of type 0 cannot be serialized to requested format");
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("boolean")
|
SECTION("boolean")
|
||||||
|
@ -56,38 +57,44 @@ TEST_CASE("BSON")
|
||||||
SECTION("true")
|
SECTION("true")
|
||||||
{
|
{
|
||||||
json j = true;
|
json j = true;
|
||||||
REQUIRE_THROWS_AS(json::to_bson(j), json::type_error);
|
REQUIRE_THROWS_AS(json::to_bson(j), json::type_error&);
|
||||||
|
CHECK_THROWS_WITH(json::to_bson(j), "[json.exception.type_error.317] JSON value of type 4 cannot be serialized to requested format");
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("false")
|
SECTION("false")
|
||||||
{
|
{
|
||||||
json j = false;
|
json j = false;
|
||||||
REQUIRE_THROWS_AS(json::to_bson(j), json::type_error);
|
REQUIRE_THROWS_AS(json::to_bson(j), json::type_error&);
|
||||||
|
CHECK_THROWS_WITH(json::to_bson(j), "[json.exception.type_error.317] JSON value of type 4 cannot be serialized to requested format");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number")
|
SECTION("number")
|
||||||
{
|
{
|
||||||
json j = 42;
|
json j = 42;
|
||||||
REQUIRE_THROWS_AS(json::to_bson(j), json::type_error);
|
REQUIRE_THROWS_AS(json::to_bson(j), json::type_error&);
|
||||||
|
CHECK_THROWS_WITH(json::to_bson(j), "[json.exception.type_error.317] JSON value of type 5 cannot be serialized to requested format");
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("float")
|
SECTION("float")
|
||||||
{
|
{
|
||||||
json j = 4.2;
|
json j = 4.2;
|
||||||
REQUIRE_THROWS_AS(json::to_bson(j), json::type_error);
|
REQUIRE_THROWS_AS(json::to_bson(j), json::type_error&);
|
||||||
|
CHECK_THROWS_WITH(json::to_bson(j), "[json.exception.type_error.317] JSON value of type 7 cannot be serialized to requested format");
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("string")
|
SECTION("string")
|
||||||
{
|
{
|
||||||
json j = "not supported";
|
json j = "not supported";
|
||||||
REQUIRE_THROWS_AS(json::to_bson(j), json::type_error);
|
REQUIRE_THROWS_AS(json::to_bson(j), json::type_error&);
|
||||||
|
CHECK_THROWS_WITH(json::to_bson(j), "[json.exception.type_error.317] JSON value of type 3 cannot be serialized to requested format");
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j = std::vector<int> {1, 2, 3, 4, 5, 6, 7};
|
json j = std::vector<int> {1, 2, 3, 4, 5, 6, 7};
|
||||||
REQUIRE_THROWS_AS(json::to_bson(j), json::type_error);
|
REQUIRE_THROWS_AS(json::to_bson(j), json::type_error&);
|
||||||
|
CHECK_THROWS_WITH(json::to_bson(j), "[json.exception.type_error.317] JSON value of type 2 cannot be serialized to requested format");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,8 +104,8 @@ TEST_CASE("BSON")
|
||||||
{
|
{
|
||||||
{ std::string("en\0try", 6), true }
|
{ std::string("en\0try", 6), true }
|
||||||
};
|
};
|
||||||
REQUIRE_THROWS_AS(json::to_bson(j), json::out_of_range);
|
REQUIRE_THROWS_AS(json::to_bson(j), json::out_of_range&);
|
||||||
CHECK_THROWS_WITH(json::to_bson(j), "[json.exception.out_of_range.409] BSON key cannot contain code point U+0000");
|
CHECK_THROWS_WITH(json::to_bson(j), "[json.exception.out_of_range.409] BSON key cannot contain code point U+0000 (at byte 2)");
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("objects")
|
SECTION("objects")
|
||||||
|
@ -678,6 +685,7 @@ TEST_CASE("Incomplete BSON INPUT")
|
||||||
'e', 'n', 't' // unexpected EOF
|
'e', 'n', 't' // unexpected EOF
|
||||||
};
|
};
|
||||||
|
|
||||||
|
CHECK_THROWS_AS(json::from_bson(incomplete_bson), json::parse_error&);
|
||||||
CHECK_THROWS_WITH(json::from_bson(incomplete_bson),
|
CHECK_THROWS_WITH(json::from_bson(incomplete_bson),
|
||||||
"[json.exception.parse_error.110] parse error at byte 9: syntax error while parsing BSON cstring: unexpected end of input");
|
"[json.exception.parse_error.110] parse error at byte 9: syntax error while parsing BSON cstring: unexpected end of input");
|
||||||
|
|
||||||
|
@ -695,6 +703,7 @@ TEST_CASE("Incomplete BSON INPUT 2")
|
||||||
0x08, // entry: boolean, unexpected EOF
|
0x08, // entry: boolean, unexpected EOF
|
||||||
};
|
};
|
||||||
|
|
||||||
|
CHECK_THROWS_AS(json::from_bson(incomplete_bson), json::parse_error&);
|
||||||
CHECK_THROWS_WITH(json::from_bson(incomplete_bson),
|
CHECK_THROWS_WITH(json::from_bson(incomplete_bson),
|
||||||
"[json.exception.parse_error.110] parse error at byte 6: syntax error while parsing BSON cstring: unexpected end of input");
|
"[json.exception.parse_error.110] parse error at byte 6: syntax error while parsing BSON cstring: unexpected end of input");
|
||||||
CHECK(json::from_bson(incomplete_bson, true, false).is_discarded());
|
CHECK(json::from_bson(incomplete_bson, true, false).is_discarded());
|
||||||
|
@ -717,6 +726,8 @@ TEST_CASE("Incomplete BSON INPUT 3")
|
||||||
0x10, 0x00, 0x02, 0x00, 0x00, 0x00
|
0x10, 0x00, 0x02, 0x00, 0x00, 0x00
|
||||||
// missing input data...
|
// missing input data...
|
||||||
};
|
};
|
||||||
|
|
||||||
|
CHECK_THROWS_AS(json::from_bson(incomplete_bson), json::parse_error&);
|
||||||
CHECK_THROWS_WITH(json::from_bson(incomplete_bson),
|
CHECK_THROWS_WITH(json::from_bson(incomplete_bson),
|
||||||
"[json.exception.parse_error.110] parse error at byte 28: syntax error while parsing BSON element list: unexpected end of input");
|
"[json.exception.parse_error.110] parse error at byte 28: syntax error while parsing BSON element list: unexpected end of input");
|
||||||
CHECK(json::from_bson(incomplete_bson, true, false).is_discarded());
|
CHECK(json::from_bson(incomplete_bson, true, false).is_discarded());
|
||||||
|
@ -734,6 +745,7 @@ TEST_CASE("Incomplete BSON INPUT 4")
|
||||||
0x0D, 0x00, // size (incomplete), unexpected EOF
|
0x0D, 0x00, // size (incomplete), unexpected EOF
|
||||||
};
|
};
|
||||||
|
|
||||||
|
CHECK_THROWS_AS(json::from_bson(incomplete_bson), json::parse_error&);
|
||||||
CHECK_THROWS_WITH(json::from_bson(incomplete_bson),
|
CHECK_THROWS_WITH(json::from_bson(incomplete_bson),
|
||||||
"[json.exception.parse_error.110] parse error at byte 3: syntax error while parsing BSON number: unexpected end of input");
|
"[json.exception.parse_error.110] parse error at byte 3: syntax error while parsing BSON number: unexpected end of input");
|
||||||
CHECK(json::from_bson(incomplete_bson, true, false).is_discarded());
|
CHECK(json::from_bson(incomplete_bson, true, false).is_discarded());
|
||||||
|
@ -753,6 +765,7 @@ TEST_CASE("Unsupported BSON input")
|
||||||
0x00 // end marker
|
0x00 // end marker
|
||||||
};
|
};
|
||||||
|
|
||||||
|
CHECK_THROWS_AS(json::from_bson(bson), json::parse_error&);
|
||||||
CHECK_THROWS_WITH(json::from_bson(bson),
|
CHECK_THROWS_WITH(json::from_bson(bson),
|
||||||
"[json.exception.parse_error.114] parse error at byte 5: Unsupported BSON record type 0xFF");
|
"[json.exception.parse_error.114] parse error at byte 5: Unsupported BSON record type 0xFF");
|
||||||
CHECK(json::from_bson(bson, true, false).is_discarded());
|
CHECK(json::from_bson(bson, true, false).is_discarded());
|
||||||
|
|
Loading…
Reference in a new issue