root/regress/usr.bin/ssh/unittests/match/tests.c
/*      $OpenBSD: tests.c,v 1.9 2025/04/15 04:00:42 djm Exp $ */
/*
 * Regress test for matching functions
 *
 * Placed in the public domain
 */

#include <sys/types.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

#include "test_helper.h"

#include "match.h"

void
tests(void)
{
        TEST_START("match_pattern");
        ASSERT_INT_EQ(match_pattern("", ""), 1);
        ASSERT_INT_EQ(match_pattern("", "aaa"), 0);
        ASSERT_INT_EQ(match_pattern("aaa", ""), 0);
        ASSERT_INT_EQ(match_pattern("aaa", "aaaa"), 0);
        ASSERT_INT_EQ(match_pattern("aaaa", "aaa"), 0);
        TEST_DONE();

        TEST_START("match_pattern wildcard");
        ASSERT_INT_EQ(match_pattern("", "*"), 1);
        ASSERT_INT_EQ(match_pattern("a", "?"), 1);
        ASSERT_INT_EQ(match_pattern("aa", "a?"), 1);
        ASSERT_INT_EQ(match_pattern("a", "*"), 1);
        ASSERT_INT_EQ(match_pattern("aa", "a*"), 1);
        ASSERT_INT_EQ(match_pattern("aa", "?*"), 1);
        ASSERT_INT_EQ(match_pattern("aa", "**"), 1);
        ASSERT_INT_EQ(match_pattern("aa", "?a"), 1);
        ASSERT_INT_EQ(match_pattern("aa", "*a"), 1);
        ASSERT_INT_EQ(match_pattern("ba", "a?"), 0);
        ASSERT_INT_EQ(match_pattern("ba", "a*"), 0);
        ASSERT_INT_EQ(match_pattern("ab", "?a"), 0);
        ASSERT_INT_EQ(match_pattern("ab", "*a"), 0);
        TEST_DONE();

        TEST_START("match_pattern_list");
        ASSERT_INT_EQ(match_pattern_list("", "", 0), 0); /* no patterns */
        ASSERT_INT_EQ(match_pattern_list("", "*", 0), 1);
        ASSERT_INT_EQ(match_pattern_list("", "!*", 0), -1);
        ASSERT_INT_EQ(match_pattern_list("", "!a,*", 0), 1);
        ASSERT_INT_EQ(match_pattern_list("", "*,!a", 0), 1);
        ASSERT_INT_EQ(match_pattern_list("", "a,!*", 0), -1);
        ASSERT_INT_EQ(match_pattern_list("", "!*,a", 0), -1);
        ASSERT_INT_EQ(match_pattern_list("a", "", 0), 0);
        ASSERT_INT_EQ(match_pattern_list("a", "*", 0), 1);
        ASSERT_INT_EQ(match_pattern_list("a", "!*", 0), -1);
        ASSERT_INT_EQ(match_pattern_list("a", "!a", 0), -1);
        /* XXX negated ASSERT_INT_EQ(match_pattern_list("a", "!b", 0), 1); */
        ASSERT_INT_EQ(match_pattern_list("a", "!a,*", 0), -1);
        ASSERT_INT_EQ(match_pattern_list("b", "!a,*", 0), 1);
        ASSERT_INT_EQ(match_pattern_list("a", "*,!a", 0), -1);
        ASSERT_INT_EQ(match_pattern_list("b", "*,!a", 0), 1);
        ASSERT_INT_EQ(match_pattern_list("a", "a,!*", 0), -1);
        ASSERT_INT_EQ(match_pattern_list("b", "a,!*", 0), -1);
        ASSERT_INT_EQ(match_pattern_list("a", "a,!a", 0), -1);
        /* XXX negated ASSERT_INT_EQ(match_pattern_list("b", "a,!a", 0), 1); */
        ASSERT_INT_EQ(match_pattern_list("a", "!*,a", 0), -1);
        ASSERT_INT_EQ(match_pattern_list("b", "!*,a", 0), -1);
        TEST_DONE();

        TEST_START("match_pattern_list lowercase");
        ASSERT_INT_EQ(match_pattern_list("abc", "ABC", 0), 0);
        ASSERT_INT_EQ(match_pattern_list("ABC", "abc", 0), 0);
        ASSERT_INT_EQ(match_pattern_list("abc", "ABC", 1), 1);
        ASSERT_INT_EQ(match_pattern_list("ABC", "abc", 1), 0);
        TEST_DONE();

        TEST_START("addr_match_list");
        ASSERT_INT_EQ(addr_match_list("127.0.0.1", "127.0.0.1/44"), -2);
        ASSERT_INT_EQ(addr_match_list(NULL, "127.0.0.1/44"), -2);
        ASSERT_INT_EQ(addr_match_list("a", "*"), 0);
        ASSERT_INT_EQ(addr_match_list("127.0.0.1", "*"), 1);
        ASSERT_INT_EQ(addr_match_list(NULL, "*"), 0);
        ASSERT_INT_EQ(addr_match_list("127.0.0.1", "127.0.0.1"), 1);
        ASSERT_INT_EQ(addr_match_list("127.0.0.1", "127.0.0.2"), 0);
        ASSERT_INT_EQ(addr_match_list("127.0.0.1", "!127.0.0.1"), -1);
        /* XXX negated ASSERT_INT_EQ(addr_match_list("127.0.0.1", "!127.0.0.2"), 1); */
        ASSERT_INT_EQ(addr_match_list("127.0.0.255", "127.0.0.0/24"), 1);
        ASSERT_INT_EQ(addr_match_list("127.0.1.1", "127.0.0.0/24"), 0);
        ASSERT_INT_EQ(addr_match_list("127.0.0.1", "127.0.0.0/24"), 1);
        ASSERT_INT_EQ(addr_match_list("127.0.0.1", "127.0.1.0/24"), 0);
        ASSERT_INT_EQ(addr_match_list("127.0.0.1", "!127.0.0.0/24"), -1);
        /* XXX negated ASSERT_INT_EQ(addr_match_list("127.0.0.1", "!127.0.1.0/24"), 1); */
        ASSERT_INT_EQ(addr_match_list("127.0.0.1", "10.0.0.1,!127.0.0.1"), -1);
        ASSERT_INT_EQ(addr_match_list("127.0.0.1", "!127.0.0.1,10.0.0.1"), -1);
        ASSERT_INT_EQ(addr_match_list("127.0.0.1", "10.0.0.1,127.0.0.2"), 0);
        ASSERT_INT_EQ(addr_match_list("127.0.0.1", "127.0.0.2,10.0.0.1"), 0);
        /* XXX negated ASSERT_INT_EQ(addr_match_list("127.0.0.1", "10.0.0.1,!127.0.0.2"), 1); */
        /* XXX negated ASSERT_INT_EQ(addr_match_list("127.0.0.1", "!127.0.0.2,10.0.0.1"), 1); */
        TEST_DONE();

#define CHECK_FILTER(string,filter,expected) \
        do { \
                char *result = match_filter_denylist((string), (filter)); \
                ASSERT_STRING_EQ(result, expected); \
                free(result); \
        } while (0)

        TEST_START("match_filter_list");
        CHECK_FILTER("a,b,c", "", "a,b,c");
        CHECK_FILTER("a,b,c", "a", "b,c");
        CHECK_FILTER("a,b,c", "b", "a,c");
        CHECK_FILTER("a,b,c", "c", "a,b");
        CHECK_FILTER("a,b,c", "a,b", "c");
        CHECK_FILTER("a,b,c", "a,c", "b");
        CHECK_FILTER("a,b,c", "b,c", "a");
        CHECK_FILTER("a,b,c", "a,b,c", "");
        CHECK_FILTER("a,b,c", "b,c", "a");
        CHECK_FILTER("", "a,b,c", "");
        TEST_DONE();
/*
 * XXX TODO
 * int      match_host_and_ip(const char *, const char *, const char *);
 * int      match_user(const char *, const char *, const char *, const char *);
 * char    *match_list(const char *, const char *, u_int *);
 * int      addr_match_cidr_list(const char *, const char *);
 */
}

void
benchmarks(void)
{
        printf("no benchmarks\n");
}