Tests: no setvbuf() buffer below 2 bytes on Windows
The Microsoft C runtime rejects a _IOFBF buffer size below 2 as an invalid parameter and ends the process (0xc0000409), which made test-file_input fail on all MSVC and clang-cl jobs. Signed-off-by: Niels Lohmann <mail@nlohmann.me>
This commit is contained in:
1 file changed
+14
-2
@@ -49,6 +49,14 @@ file_ptr open_with(const char* name, const std::string& content)
|
|||||||
return {std::fopen(name, "rb"), &std::fclose};
|
return {std::fopen(name, "rb"), &std::fclose};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the smallest size setvbuf() accepts for _IOFBF: the Microsoft C runtime
|
||||||
|
// rejects sizes below 2 as an invalid parameter, which ends the process
|
||||||
|
#if defined(_WIN32)
|
||||||
|
constexpr int min_full_buffer = 2;
|
||||||
|
#else
|
||||||
|
constexpr int min_full_buffer = 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
// The stdio lock is recursive, so whether parsing released it can only be
|
// The stdio lock is recursive, so whether parsing released it can only be
|
||||||
// seen from another thread: ftrylockfile() fails there while this thread
|
// seen from another thread: ftrylockfile() fails there while this thread
|
||||||
// holds the lock. ftrylockfile() is POSIX; elsewhere, the check is skipped.
|
// holds the lock. ftrylockfile() is POSIX; elsewhere, the check is skipped.
|
||||||
@@ -258,6 +266,10 @@ TEST_CASE("parsing from a FILE*")
|
|||||||
const bool expected_accept = json::accept(document);
|
const bool expected_accept = json::accept(document);
|
||||||
for (int size = 0; size <= 70; ++size)
|
for (int size = 0; size <= 70; ++size)
|
||||||
{
|
{
|
||||||
|
if (size != 0 && size < min_full_buffer)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
CAPTURE(document)
|
CAPTURE(document)
|
||||||
CAPTURE(size)
|
CAPTURE(size)
|
||||||
std::vector<char> buffer(static_cast<std::size_t>(size) + 1);
|
std::vector<char> buffer(static_cast<std::size_t>(size) + 1);
|
||||||
@@ -315,7 +327,7 @@ TEST_CASE("parsing from a FILE*")
|
|||||||
CHECK(json::sax_parse(f.get(), &sax));
|
CHECK(json::sax_parse(f.get(), &sax));
|
||||||
expected = sax.positions();
|
expected = sax.positions();
|
||||||
}
|
}
|
||||||
for (int size = 1; size <= 20; ++size)
|
for (int size = min_full_buffer; size <= 20; ++size)
|
||||||
{
|
{
|
||||||
CAPTURE(size)
|
CAPTURE(size)
|
||||||
std::vector<char> buffer(static_cast<std::size_t>(size));
|
std::vector<char> buffer(static_cast<std::size_t>(size));
|
||||||
@@ -333,7 +345,7 @@ TEST_CASE("parsing from a FILE*")
|
|||||||
{
|
{
|
||||||
const json value = {{"a string that is longer than the buffer of the file", "and a value that is longer, too"}, {"n", {1, 2}}};
|
const json value = {{"a string that is longer than the buffer of the file", "and a value that is longer, too"}, {"n", {1, 2}}};
|
||||||
const std::vector<std::uint8_t> cbor = json::to_cbor(value);
|
const std::vector<std::uint8_t> cbor = json::to_cbor(value);
|
||||||
for (int size = 1; size <= 20; ++size)
|
for (int size = min_full_buffer; size <= 20; ++size)
|
||||||
{
|
{
|
||||||
CAPTURE(size)
|
CAPTURE(size)
|
||||||
std::vector<char> buffer(static_cast<std::size_t>(size));
|
std::vector<char> buffer(static_cast<std::size_t>(size));
|
||||||
|
|||||||
Reference in new issue
Block a user