From fa5f272e53b4b63e0bee48cafabf635e9bb8aae1 Mon Sep 17 00:00:00 2001 From: Falk Werner Date: Wed, 15 Jul 2020 23:35:06 +0200 Subject: [PATCH] added test of json reader --- lib/webfuse/impl/json/reader.c | 6 +- meson.build | 1 + test/webfuse/json/test_reader.cc | 207 +++++++++++++++++++++++++++++++ 3 files changed, 211 insertions(+), 3 deletions(-) create mode 100644 test/webfuse/json/test_reader.cc diff --git a/lib/webfuse/impl/json/reader.c b/lib/webfuse/impl/json/reader.c index 543b8e8..9d1cc4e 100644 --- a/lib/webfuse/impl/json/reader.c +++ b/lib/webfuse/impl/json/reader.c @@ -22,7 +22,7 @@ wf_impl_json_reader_skip_whitespace( struct wf_json_reader * reader) { char c = wf_impl_json_reader_peek(reader); - if ((' ' == c) || ('\n' == c) || ('\t' == c) || ('\r' == c)) + while ((' ' == c) || ('\n' == c) || ('\t' == c) || ('\r' == c)) { reader->pos++; c = wf_impl_json_reader_peek(reader); @@ -126,7 +126,7 @@ wf_impl_json_reader_read_string( size_t p = reader->pos; *value = &(reader->contents[p]); c = wf_impl_json_reader_get_char(reader); - while (('\"' != c) && ('\"' != c)) + while (('\"' != c) && ('\0' != c)) { if ('\\' != c) { @@ -135,7 +135,7 @@ wf_impl_json_reader_read_string( else { char unescaped = wf_impl_json_unescape(wf_impl_json_reader_get_char(reader)); - if ('\0' != c) + if ('\0' != unescaped) { reader->contents[p++] = unescaped; diff --git a/meson.build b/meson.build index 1641637..85fcc56 100644 --- a/meson.build +++ b/meson.build @@ -124,6 +124,7 @@ alltests = executable('alltests', 'test/webfuse/json/test_writer.cc', 'test/webfuse/json/test_doc.cc', 'test/webfuse/json/test_node.cc', + 'test/webfuse/json/test_reader.cc', 'test/webfuse/jsonrpc/mock_timer_callback.cc', 'test/webfuse/jsonrpc/mock_timer.cc', 'test/webfuse/jsonrpc/test_is_request.cc', diff --git a/test/webfuse/json/test_reader.cc b/test/webfuse/json/test_reader.cc new file mode 100644 index 0000000..bbdac9f --- /dev/null +++ b/test/webfuse/json/test_reader.cc @@ -0,0 +1,207 @@ +#include "webfuse/impl/json/reader.h" +#include +#include + +TEST(json_reader, skip_whitespace) +{ + char text[] = " \t\r\n*"; + wf_json_reader reader; + wf_impl_json_reader_init(&reader, text, 5); + char c = wf_impl_json_reader_skip_whitespace(&reader); + ASSERT_EQ('*', c); + ASSERT_STREQ("*", &reader.contents[reader.pos]); +} + +TEST(json_reader, skip_whitespace_eof) +{ + char text[] = " "; + wf_json_reader reader; + wf_impl_json_reader_init(&reader, text, 1); + char c = wf_impl_json_reader_skip_whitespace(&reader); + ASSERT_EQ('\0', c); +} + +TEST(json_reader, peek) +{ + char text[] = "*"; + wf_json_reader reader; + wf_impl_json_reader_init(&reader, text, 1); + char c = wf_impl_json_reader_peek(&reader); + ASSERT_EQ('*', c); +} + +TEST(json_reader, peek_eof) +{ + wf_json_reader reader; + wf_impl_json_reader_init(&reader, nullptr, 0); + char c = wf_impl_json_reader_peek(&reader); + ASSERT_EQ('\0', c); +} + +TEST(json_reader, get_char) +{ + char text[] = "*"; + wf_json_reader reader; + wf_impl_json_reader_init(&reader, text, 1); + ASSERT_EQ('*', wf_impl_json_reader_get_char(&reader)); + ASSERT_EQ('\0', wf_impl_json_reader_get_char(&reader)); + ASSERT_EQ('\0', wf_impl_json_reader_get_char(&reader)); +} + +TEST(json_reader, unget_char) +{ + char text[] = "*"; + wf_json_reader reader; + wf_impl_json_reader_init(&reader, text, 1); + + ASSERT_EQ('*', wf_impl_json_reader_get_char(&reader)); + wf_impl_json_reader_unget_char(&reader); + ASSERT_EQ('*', wf_impl_json_reader_get_char(&reader)); + + wf_impl_json_reader_unget_char(&reader); + wf_impl_json_reader_unget_char(&reader); + ASSERT_EQ('*', wf_impl_json_reader_get_char(&reader)); +} + +TEST(json_reader, read_const) +{ + char text[] = "value"; + wf_json_reader reader; + wf_impl_json_reader_init(&reader, text, 5); + + ASSERT_TRUE(wf_impl_json_reader_read_const(&reader, "value", 5)); +} + +TEST(json_reader, read_const_fail_out_of_bounds) +{ + char text[] = "value"; + wf_json_reader reader; + wf_impl_json_reader_init(&reader, text, 2); + + ASSERT_FALSE(wf_impl_json_reader_read_const(&reader, "value", 5)); +} + +TEST(json_reader, read_const_fail_no_match) +{ + char text[] = "hello"; + wf_json_reader reader; + wf_impl_json_reader_init(&reader, text, 5); + + ASSERT_FALSE(wf_impl_json_reader_read_const(&reader, "value", 5)); +} + +TEST(json_reader, read_positive_int) +{ + char text[] = "42"; + wf_json_reader reader; + wf_impl_json_reader_init(&reader, text, 5); + + int value; + ASSERT_TRUE(wf_impl_json_reader_read_int(&reader, &value)); + ASSERT_EQ(42, value); +} + +TEST(json_reader, read_negative_int) +{ + char text[] = "-1234"; + wf_json_reader reader; + wf_impl_json_reader_init(&reader, text, 5); + + int value; + ASSERT_TRUE(wf_impl_json_reader_read_int(&reader, &value)); + ASSERT_EQ(-1234, value); +} + +TEST(json_reader, read_int_max) +{ + std::string text = std::to_string(INT_MAX); + wf_json_reader reader; + wf_impl_json_reader_init(&reader, const_cast(text.data()), text.size()); + + int value; + ASSERT_TRUE(wf_impl_json_reader_read_int(&reader, &value)); + ASSERT_EQ(INT_MAX, value); +} + +TEST(json_reader, read_int_min) +{ + std::string text = std::to_string(INT_MIN); + wf_json_reader reader; + wf_impl_json_reader_init(&reader, const_cast(text.data()), text.size()); + + int value; + ASSERT_TRUE(wf_impl_json_reader_read_int(&reader, &value)); + ASSERT_EQ(INT_MIN, value); +} + +TEST(json_reader, read_int_fail_invalid) +{ + std::string text = "brummni"; + wf_json_reader reader; + wf_impl_json_reader_init(&reader, const_cast(text.data()), text.size()); + + int value; + ASSERT_FALSE(wf_impl_json_reader_read_int(&reader, &value)); +} + +TEST(json_reader, read_int_fail_sign_only) +{ + std::string text = "-"; + wf_json_reader reader; + wf_impl_json_reader_init(&reader, const_cast(text.data()), text.size()); + + int value; + ASSERT_FALSE(wf_impl_json_reader_read_int(&reader, &value)); +} + +TEST(json_reader, read_string) +{ + std::string text = "\"brummni\""; + wf_json_reader reader; + wf_impl_json_reader_init(&reader, const_cast(text.data()), text.size()); + + char * value; + ASSERT_TRUE(wf_impl_json_reader_read_string(&reader, &value)); + ASSERT_STREQ("brummni", value); +} + +TEST(json_reader, read_string_escaped) +{ + std::string text = "\"_\\\"_\\\\_\\/_\\b_\\f_\\n_\\r_\\t_\""; + wf_json_reader reader; + wf_impl_json_reader_init(&reader, const_cast(text.data()), text.size()); + + char * value; + ASSERT_TRUE(wf_impl_json_reader_read_string(&reader, &value)); + ASSERT_STREQ("_\"_\\_/_\b_\f_\n_\r_\t_", value); +} + +TEST(json_reader, read_string_fail_missig_start_quot) +{ + std::string text = "brummni\""; + wf_json_reader reader; + wf_impl_json_reader_init(&reader, const_cast(text.data()), text.size()); + + char * value; + ASSERT_FALSE(wf_impl_json_reader_read_string(&reader, &value)); +} + +TEST(json_reader, read_string_fail_missig_end_quot) +{ + std::string text = "\"brummni"; + wf_json_reader reader; + wf_impl_json_reader_init(&reader, const_cast(text.data()), text.size()); + + char * value; + ASSERT_FALSE(wf_impl_json_reader_read_string(&reader, &value)); +} + +TEST(json_reader, read_string_fail_invalid_escape_seq) +{ + std::string text = "\"\\i\""; + wf_json_reader reader; + wf_impl_json_reader_init(&reader, const_cast(text.data()), text.size()); + + char * value; + ASSERT_FALSE(wf_impl_json_reader_read_string(&reader, &value)); +}