else
return wildcard_match_icase(field->value.str, wanted_field->value.str);
case EVENT_FIELD_VALUE_TYPE_INTMAX:
- if (wanted_field->value.intmax > INT_MIN) {
+ if (wanted_field->value_type == EVENT_FIELD_VALUE_TYPE_INTMAX) {
/* compare against an integer */
switch (op) {
case EVENT_FILTER_OP_CMP_EQ:
i_unreached();
}
i_unreached();
+ } else if (op != EVENT_FILTER_OP_CMP_EQ) {
+ /* we only support string equality comparisons */
+ return FALSE;
+ } else if (use_strcmp) {
+ /* If the matched value was a number, it was already matched
+ in the previous branch. So here we have a non-wildcard
+ string, which can never be a match to a number. */
+ return FALSE;
} else {
- /* compare against an "integer" with wildcards */
- if (op != EVENT_FILTER_OP_CMP_EQ) {
- /* we only support string equality comparisons */
- return FALSE;
- }
char tmp[MAX_INT_STRLEN];
i_snprintf(tmp, sizeof(tmp), "%jd", field->value.intmax);
- if (use_strcmp)
- return strcasecmp(field->value.str, wanted_field->value.str) == 0;
- else
- return wildcard_match_icase(tmp, wanted_field->value.str);
+ return wildcard_match_icase(tmp, wanted_field->value.str);
}
case EVENT_FIELD_VALUE_TYPE_TIMEVAL:
/* there's no point to support matching exact timestamps */
test_end();
}
+static void test_event_filter_numbers(void)
+{
+ struct event_filter *filter;
+ const char *error;
+ const struct failure_context failure_ctx = {
+ .type = LOG_TYPE_DEBUG
+ };
+
+ test_begin("event filter: event numeric matching");
+
+ /* we check that we can actually match duration field */
+ filter = event_filter_create();
+ test_assert(event_filter_parse("number > 0", filter, &error) == 0);
+
+ struct event *e = event_create(NULL);
+ event_add_int(e, "number", 1);
+ test_assert(event_filter_match(filter, e, &failure_ctx));
+ event_add_int(e, "number", 0);
+ test_assert(!event_filter_match(filter, e, &failure_ctx));
+ event_add_int(e, "number", -1);
+ test_assert(!event_filter_match(filter, e, &failure_ctx));
+ event_filter_unref(&filter);
+
+ filter = event_filter_create();
+ test_assert(event_filter_parse("number < 0", filter, &error) == 0);
+ event_add_int(e, "number", 1);
+ test_assert(!event_filter_match(filter, e, &failure_ctx));
+ event_add_int(e, "number", 0);
+ test_assert(!event_filter_match(filter, e, &failure_ctx));
+ event_add_int(e, "number", -1);
+ test_assert(event_filter_match(filter, e, &failure_ctx));
+ event_filter_unref(&filter);
+
+ event_add_int(e, "number", 0);
+
+ filter = event_filter_create();
+ test_assert(event_filter_parse("number > *", filter, &error) == 0);
+ test_assert(!event_filter_match(filter, e, &failure_ctx));
+ event_filter_unref(&filter);
+
+ filter = event_filter_create();
+ test_assert(event_filter_parse("number=0", filter, &error) == 0);
+ test_assert(event_filter_match(filter, e, &failure_ctx));
+ event_filter_unref(&filter);
+
+ filter = event_filter_create();
+ test_assert(event_filter_parse("number=*", filter, &error) == 0);
+ test_assert(event_filter_match(filter, e, &failure_ctx));
+ event_filter_unref(&filter);
+
+ filter = event_filter_create();
+ test_assert(event_filter_parse("number=fish", filter, &error) == 0);
+ test_assert(!event_filter_match(filter, e, &failure_ctx));
+ event_filter_unref(&filter);
+
+ event_unref(&e);
+ test_end();
+}
+
void test_event_filter(void)
{
test_event_filter_override_parent_fields();
test_event_filter_named_or_str();
test_event_filter_named_separate_from_str();
test_event_filter_duration();
+ test_event_filter_numbers();
}