syslog-ng source
test_kv_scanner.c File Reference
#include <criterion/criterion.h>
#include "libtest/stopwatch.h"
#include "scratch-buffers.h"
#include "apphook.h"
#include "kv-scanner.h"
#include <stdio.h>
Include dependency graph for test_kv_scanner.c:

Classes

struct  ScannerConfig
 
struct  KVQElement
 
struct  KVQContainer
 
struct  KVElement
 
struct  KVContainer
 
struct  Testcase
 

Macros

#define VARARG_STRUCT(VARARG_STRUCT_cont, VARARG_STRUCT_elem, ...)
 
#define INIT_KVQCONTAINER(...)   VARARG_STRUCT(KVQContainer, KVQElement, __VA_ARGS__)
 
#define _IMPL_EXPECT_KVQ(SCANNER_config, TEST_KV_SCAN_input, ...)
 
#define _EXPECT_KVQ_TRIPLETS(...)
 
#define INIT_KVCONTAINER(...)   VARARG_STRUCT(KVContainer, KVElement, __VA_ARGS__)
 
#define _IMPL_EXPECT_KV(TEST_KV_SCAN_config, TEST_KV_SCAN_input, ...)
 
#define _EXPECT_KV_PAIRS(...)
 
#define _EXPECT_KV_PAIRS_WITH_CONFIG(TEST_KV_SCAN_config, ...)
 
#define _EXPECT_KV_AND_STRAY_WORDS(INPUT, STRAY, ...)
 
#define ITERATION_NUMBER   100000
 

Functions

 Test (kv_scanner, incomplete_string_returns_no_pairs)
 
 Test (kv_scanner, name_equals_value_returns_a_pair)
 
 Test (kv_scanner, allowed_characters_in_a_key_are_letters_digits_dash_underscore_and_dot)
 
 Test (kv_scanner, initial_stray_words_are_ignored)
 
 Test (kv_scanner, non_initial_stray_words_are_added_to_the_last_value)
 
 Test (kv_scanner, empty_values_in_a_series_of_key_values)
 
 Test (kv_scanner, multiple_key_values_return_multiple_pairs)
 
 Test (kv_scanner, spaces_between_values_are_ignored)
 
 Test (kv_scanner, comma_separated_values)
 
 Test (kv_scanner, tab_is_not_considered_a_separator)
 
 Test (kv_scanner, quoted_values_are_unquoted_like_c_strings)
 
 Test (kv_scanner, quotes_embedded_in_an_unquoted_value_are_left_intact)
 
 Test (kv_scanner, separator_in_an_unquoted_value_is_taken_literally)
 
 Test (kv_scanner, keys_without_value_separator_are_ignored)
 
 Test (kv_scanner, quoted_values_are_considered_one_token_thus_space_based_concatenation_does_not_happen)
 
 Test (kv_scanner, transforms_values_if_transform_value_is_set)
 
 Test (kv_scanner, pair_separator_space_disables_space_related_heuristics)
 
 Test (kv_scanner, pair_separator_causes_values_to_be_split_at_that_character)
 
 Test (kv_scanner, quotation_is_stored_in_the_was_quoted_value_member)
 
 Test (kv_scanner, spaces_around_value_separator_are_ignored)
 
 Test (kv_scanner, value_separator_is_used_to_separate_key_from_value)
 
 Test (kv_scanner, invalid_value_encoding_is_copied_literally)
 
 Test (kv_scanner, separator_in_key)
 
 Test (kv_scanner, empty_keys)
 
 Test (kv_scanner, unclosed_quotes)
 
 Test (kv_scanner, comma_separator)
 
 Test (kv_scanner, multiple_separators)
 
 Test (kv_scanner, keys_only_use_a_restricted_set_of_characters)
 
 Test (kv_scanner, unquoted_values_can_have_embedded_control_characters)
 
 Test (kv_scanner, spaces_are_trimmed_between_key_and_separator)
 
 Test (kv_scanner, space_is_only_a_delimiter_if_a_key_follows)
 
 Test (kv_scanner, spaces_are_trimmed_from_key_names)
 
 Test (kv_scanner, initial_spaces_are_trimmed_from_values)
 
 Test (kv_scanner, stray_words_are_stored)
 
 Test (kv_scanner, key_buffer_underrun)
 
 Test (kv_scanner, performance_tests)
 
 TestSuite (kv_scanner,.init=setup,.fini=teardown)
 

Macro Definition Documentation

◆ _EXPECT_KV_AND_STRAY_WORDS

#define _EXPECT_KV_AND_STRAY_WORDS (   INPUT,
  STRAY,
  ... 
)
Value:
do { \
KVScanner *scanner = create_kv_scanner(&((ScannerConfig) { \
.kv_separator = '=', \
.extract_stray_words=TRUE})); \
gchar *error = NULL; \
\
kv_scanner_input(scanner, INPUT); \
if (!_expect_kv_pairs(scanner, INIT_KVCONTAINER(__VA_ARGS__), &error)) \
{ \
cr_expect(FALSE, "%s", error); \
g_free(error);\
} \
cr_expect_str_eq(kv_scanner_get_stray_words(scanner), STRAY, \
"Stray words mismatch, value=%s, expected=%s", \
kv_scanner_get_stray_words(scanner), STRAY); \
kv_scanner_free(scanner); \
} while (0)
Definition: test_kv_scanner.c:105
CSVScanner scanner
Definition: test_csv_scanner.c:31
#define INIT_KVCONTAINER(...)
Definition: test_kv_scanner.c:217

◆ _EXPECT_KV_PAIRS

#define _EXPECT_KV_PAIRS (   ...)
Value:
do { \
_IMPL_EXPECT_KV(((ScannerConfig) {'='}), __VA_ARGS__); \
} while (0)

◆ _EXPECT_KV_PAIRS_WITH_CONFIG

#define _EXPECT_KV_PAIRS_WITH_CONFIG (   TEST_KV_SCAN_config,
  ... 
)
Value:
do { \
_IMPL_EXPECT_KV(TEST_KV_SCAN_config, __VA_ARGS__); \
} while (0)

◆ _EXPECT_KVQ_TRIPLETS

#define _EXPECT_KVQ_TRIPLETS (   ...)
Value:
do { \
_IMPL_EXPECT_KVQ(((ScannerConfig) {'='}), __VA_ARGS__); \
} while(0)

◆ _IMPL_EXPECT_KV

#define _IMPL_EXPECT_KV (   TEST_KV_SCAN_config,
  TEST_KV_SCAN_input,
  ... 
)
Value:
do { \
KVScanner *scanner = create_kv_scanner(&TEST_KV_SCAN_config); \
gchar *error = NULL; \
\
kv_scanner_input(scanner, TEST_KV_SCAN_input); \
if (!_expect_kv_pairs(scanner, INIT_KVCONTAINER(__VA_ARGS__), &error)) \
{ \
cr_expect(FALSE, "%s", error); \
g_free(error);\
} \
cr_expect_eq(kv_scanner_get_stray_words(scanner), NULL, \
"stray words are not expected but still returned"); \
kv_scanner_free(scanner); \
} while (0)

◆ _IMPL_EXPECT_KVQ

#define _IMPL_EXPECT_KVQ (   SCANNER_config,
  TEST_KV_SCAN_input,
  ... 
)
Value:
do { \
KVScanner *scanner = create_kv_scanner(&SCANNER_config); \
gchar *error = NULL; \
\
kv_scanner_input(scanner, TEST_KV_SCAN_input); \
if (!_expect_kvq_triplets(scanner, INIT_KVQCONTAINER(__VA_ARGS__), &error)) \
{ \
cr_expect(FALSE, "%s", error); \
g_free(error);\
} \
kv_scanner_free(scanner); \
} while (0)
#define INIT_KVQCONTAINER(...)
Definition: test_kv_scanner.c:196

◆ INIT_KVCONTAINER

#define INIT_KVCONTAINER (   ...)    VARARG_STRUCT(KVContainer, KVElement, __VA_ARGS__)

◆ INIT_KVQCONTAINER

#define INIT_KVQCONTAINER (   ...)    VARARG_STRUCT(KVQContainer, KVQElement, __VA_ARGS__)

◆ ITERATION_NUMBER

#define ITERATION_NUMBER   100000

◆ VARARG_STRUCT

#define VARARG_STRUCT (   VARARG_STRUCT_cont,
  VARARG_STRUCT_elem,
  ... 
)
Value:
(const VARARG_STRUCT_cont) { \
.n = sizeof((const VARARG_STRUCT_elem[]) { __VA_ARGS__ }) / sizeof(VARARG_STRUCT_elem), \
.arg = {__VA_ARGS__}\
}

Function Documentation

◆ Test() [1/36]

Test ( kv_scanner  ,
allowed_characters_in_a_key_are_letters_digits_dash_underscore_and_dot   
)

◆ Test() [2/36]

Test ( kv_scanner  ,
comma_separated_values   
)

◆ Test() [3/36]

Test ( kv_scanner  ,
comma_separator   
)

◆ Test() [4/36]

Test ( kv_scanner  ,
empty_keys   
)

◆ Test() [5/36]

Test ( kv_scanner  ,
empty_values_in_a_series_of_key_values   
)

◆ Test() [6/36]

Test ( kv_scanner  ,
incomplete_string_returns_no_pairs   
)

◆ Test() [7/36]

Test ( kv_scanner  ,
initial_spaces_are_trimmed_from_values   
)

◆ Test() [8/36]

Test ( kv_scanner  ,
initial_stray_words_are_ignored   
)

◆ Test() [9/36]

Test ( kv_scanner  ,
invalid_value_encoding_is_copied_literally   
)

◆ Test() [10/36]

Test ( kv_scanner  ,
key_buffer_underrun   
)

◆ Test() [11/36]

Test ( kv_scanner  ,
keys_only_use_a_restricted_set_of_characters   
)

◆ Test() [12/36]

Test ( kv_scanner  ,
keys_without_value_separator_are_ignored   
)

◆ Test() [13/36]

Test ( kv_scanner  ,
multiple_key_values_return_multiple_pairs   
)

◆ Test() [14/36]

Test ( kv_scanner  ,
multiple_separators   
)

◆ Test() [15/36]

Test ( kv_scanner  ,
name_equals_value_returns_a_pair   
)

◆ Test() [16/36]

Test ( kv_scanner  ,
non_initial_stray_words_are_added_to_the_last_value   
)

◆ Test() [17/36]

Test ( kv_scanner  ,
pair_separator_causes_values_to_be_split_at_that_character   
)

◆ Test() [18/36]

Test ( kv_scanner  ,
pair_separator_space_disables_space_related_heuristics   
)

◆ Test() [19/36]

Test ( kv_scanner  ,
performance_tests   
)

◆ Test() [20/36]

Test ( kv_scanner  ,
quotation_is_stored_in_the_was_quoted_value_member   
)

◆ Test() [21/36]

Test ( kv_scanner  ,
quoted_values_are_considered_one_token_thus_space_based_concatenation_does_not_happen   
)

◆ Test() [22/36]

Test ( kv_scanner  ,
quoted_values_are_unquoted_like_c_strings   
)

◆ Test() [23/36]

Test ( kv_scanner  ,
quotes_embedded_in_an_unquoted_value_are_left_intact   
)

◆ Test() [24/36]

Test ( kv_scanner  ,
separator_in_an_unquoted_value_is_taken_literally   
)

◆ Test() [25/36]

Test ( kv_scanner  ,
separator_in_key   
)

◆ Test() [26/36]

Test ( kv_scanner  ,
space_is_only_a_delimiter_if_a_key_follows   
)

◆ Test() [27/36]

Test ( kv_scanner  ,
spaces_are_trimmed_between_key_and_separator   
)

◆ Test() [28/36]

Test ( kv_scanner  ,
spaces_are_trimmed_from_key_names   
)

◆ Test() [29/36]

Test ( kv_scanner  ,
spaces_around_value_separator_are_ignored   
)

◆ Test() [30/36]

Test ( kv_scanner  ,
spaces_between_values_are_ignored   
)

◆ Test() [31/36]

Test ( kv_scanner  ,
stray_words_are_stored   
)

◆ Test() [32/36]

Test ( kv_scanner  ,
tab_is_not_considered_a_separator   
)

◆ Test() [33/36]

Test ( kv_scanner  ,
transforms_values_if_transform_value_is_set   
)

◆ Test() [34/36]

Test ( kv_scanner  ,
unclosed_quotes   
)

◆ Test() [35/36]

Test ( kv_scanner  ,
unquoted_values_can_have_embedded_control_characters   
)

◆ Test() [36/36]

Test ( kv_scanner  ,
value_separator_is_used_to_separate_key_from_value   
)

◆ TestSuite()

TestSuite ( kv_scanner  ,
init = setup,
fini = teardown 
)