void csv_scanner_options_copy(CSVScannerOptions *dst, CSVScannerOptions *src) { csv_scanner_options_set_delimiters(dst, src->delimiters); csv_scanner_options_set_quotes_start_and_end(dst, src->quotes_start, src->quotes_end); csv_scanner_options_set_null_value(dst, src->null_value); csv_scanner_options_set_string_delimiters(dst, string_list_clone(src->string_delimiters)); csv_scanner_options_set_columns(dst, string_list_clone(src->columns)); dst->dialect = src->dialect; dst->flags = src->flags; }
CSVScannerOptions * _default_options(const gchar *columns[]) { csv_scanner_options_clean(&options); csv_scanner_options_set_delimiters(&options, ","); csv_scanner_options_set_quote_pairs(&options, "\"\"''"); csv_scanner_options_set_flags(&options, CSV_SCANNER_STRIP_WHITESPACE); csv_scanner_options_set_dialect(&options, CSV_SCANNER_ESCAPE_DOUBLE_CHAR); csv_scanner_options_set_columns(&options, string_array_to_list(columns)); return &options; }
LogParser * _construct_parser(gint max_columns, gint dialect, gchar *delimiters, gchar *quotes, gchar *null_value, const gchar *string_delims[]) { LogParser *p; const gchar *column_array[] = { "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "C10", "C11", "C12", "C13", "C14", "C15", "C16", "C17", "C18", "C19", "C20", "C21", "C22", "C23", "C24", "C25", "C26", "C27", "C28", "C29", "C30", NULL }; if (max_columns != -1) { g_assert(max_columns < (sizeof(column_array) / sizeof(column_array[0]))); column_array[max_columns] = NULL; } p = csv_parser_new(NULL); csv_scanner_options_set_dialect(csv_parser_get_scanner_options(p), dialect); csv_scanner_options_set_columns(csv_parser_get_scanner_options(p), string_array_to_list(column_array)); if (delimiters) csv_scanner_options_set_delimiters(csv_parser_get_scanner_options(p), delimiters); if (quotes) csv_scanner_options_set_quote_pairs(csv_parser_get_scanner_options(p), quotes); if (null_value) csv_scanner_options_set_null_value(csv_parser_get_scanner_options(p), null_value); if (string_delims) csv_scanner_options_set_string_delimiters(csv_parser_get_scanner_options(p), string_array_to_list(string_delims)); return p; }
int testcase(gchar *msg, guint parse_flags, gint max_columns, gint dialect, guint32 flags, gchar *delimiters, gchar *quotes, gchar *null_value, const gchar *string_delims[], gchar *first_value, ...) { LogMessage *logmsg; LogParser *p, *pclone; gchar *expected_value; gint i; va_list va; NVTable *nvtable; const gchar *column_array[] = { "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "C10", "C11", "C12", "C13", "C14", "C15", "C16", "C17", "C18", "C19", "C20", "C21", "C22", "C23", "C24", "C25", "C26", "C27", "C28", "C29", "C30", NULL }; gboolean success; if (max_columns != -1) { g_assert(max_columns < (sizeof(column_array) / sizeof(column_array[0]))); column_array[max_columns] = NULL; } parse_options.flags = parse_flags; logmsg = log_msg_new(msg, strlen(msg), NULL, &parse_options); p = csv_parser_new(NULL); csv_scanner_options_set_flags(csv_parser_get_scanner_options(p), flags); csv_scanner_options_set_dialect(csv_parser_get_scanner_options(p), dialect); csv_scanner_options_set_columns(csv_parser_get_scanner_options(p), string_array_to_list(column_array)); if (delimiters) csv_scanner_options_set_delimiters(csv_parser_get_scanner_options(p), delimiters); if (quotes) csv_scanner_options_set_quote_pairs(csv_parser_get_scanner_options(p), quotes); if (null_value) csv_scanner_options_set_null_value(csv_parser_get_scanner_options(p), null_value); if (string_delims) csv_scanner_options_set_string_delimiters(csv_parser_get_scanner_options(p), string_array_to_list(string_delims)); pclone = (LogParser *) log_pipe_clone(&p->super); log_pipe_unref(&p->super); nvtable = nv_table_ref(logmsg->payload); success = log_parser_process(pclone, &logmsg, NULL, log_msg_get_value(logmsg, LM_V_MESSAGE, NULL), -1); nv_table_unref(nvtable); if (success && !first_value) { fprintf(stderr, "unexpected match; msg=%s\n", msg); exit(1); } if (!success && first_value) { fprintf(stderr, "unexpected non-match; msg=%s\n", msg); exit(1); } log_pipe_unref(&pclone->super); va_start(va, first_value); expected_value = first_value; i = 0; while (expected_value && column_array[i]) { const gchar *value; gssize value_len; value = log_msg_get_value_by_name(logmsg, column_array[i], &value_len); if (expected_value && expected_value[0]) { TEST_ASSERT(value && value[0], "expected value set, but no actual value"); TEST_ASSERT(strlen(expected_value) == value_len, "value length doesn't match actual length"); TEST_ASSERT(strncmp(value, expected_value, value_len) == 0, "value does not match expected value"); } else { TEST_ASSERT(!(value && value[0]), "expected unset, but actual value present"); } expected_value = va_arg(va, char *); i++; } log_msg_unref(logmsg); return 1; }