xref: /openbsd-src/regress/usr.bin/ssh/unittests/match/tests.c (revision a8c975d25b8973125837f3cd4c63b4a611f5c5f5)
1 /* 	$OpenBSD: tests.c,v 1.8 2021/12/14 21:25:27 deraadt Exp $ */
2 /*
3  * Regress test for matching functions
4  *
5  * Placed in the public domain
6  */
7 
8 #include <sys/types.h>
9 #include <stdio.h>
10 #include <stdint.h>
11 #include <stdlib.h>
12 #include <string.h>
13 
14 #include "test_helper.h"
15 
16 #include "match.h"
17 
18 void
tests(void)19 tests(void)
20 {
21 	TEST_START("match_pattern");
22 	ASSERT_INT_EQ(match_pattern("", ""), 1);
23 	ASSERT_INT_EQ(match_pattern("", "aaa"), 0);
24 	ASSERT_INT_EQ(match_pattern("aaa", ""), 0);
25 	ASSERT_INT_EQ(match_pattern("aaa", "aaaa"), 0);
26 	ASSERT_INT_EQ(match_pattern("aaaa", "aaa"), 0);
27 	TEST_DONE();
28 
29 	TEST_START("match_pattern wildcard");
30 	ASSERT_INT_EQ(match_pattern("", "*"), 1);
31 	ASSERT_INT_EQ(match_pattern("a", "?"), 1);
32 	ASSERT_INT_EQ(match_pattern("aa", "a?"), 1);
33 	ASSERT_INT_EQ(match_pattern("a", "*"), 1);
34 	ASSERT_INT_EQ(match_pattern("aa", "a*"), 1);
35 	ASSERT_INT_EQ(match_pattern("aa", "?*"), 1);
36 	ASSERT_INT_EQ(match_pattern("aa", "**"), 1);
37 	ASSERT_INT_EQ(match_pattern("aa", "?a"), 1);
38 	ASSERT_INT_EQ(match_pattern("aa", "*a"), 1);
39 	ASSERT_INT_EQ(match_pattern("ba", "a?"), 0);
40 	ASSERT_INT_EQ(match_pattern("ba", "a*"), 0);
41 	ASSERT_INT_EQ(match_pattern("ab", "?a"), 0);
42 	ASSERT_INT_EQ(match_pattern("ab", "*a"), 0);
43 	TEST_DONE();
44 
45 	TEST_START("match_pattern_list");
46 	ASSERT_INT_EQ(match_pattern_list("", "", 0), 0); /* no patterns */
47 	ASSERT_INT_EQ(match_pattern_list("", "*", 0), 1);
48 	ASSERT_INT_EQ(match_pattern_list("", "!*", 0), -1);
49 	ASSERT_INT_EQ(match_pattern_list("", "!a,*", 0), 1);
50 	ASSERT_INT_EQ(match_pattern_list("", "*,!a", 0), 1);
51 	ASSERT_INT_EQ(match_pattern_list("", "a,!*", 0), -1);
52 	ASSERT_INT_EQ(match_pattern_list("", "!*,a", 0), -1);
53 	ASSERT_INT_EQ(match_pattern_list("a", "", 0), 0);
54 	ASSERT_INT_EQ(match_pattern_list("a", "*", 0), 1);
55 	ASSERT_INT_EQ(match_pattern_list("a", "!*", 0), -1);
56 	ASSERT_INT_EQ(match_pattern_list("a", "!a", 0), -1);
57 	/* XXX negated ASSERT_INT_EQ(match_pattern_list("a", "!b", 0), 1); */
58 	ASSERT_INT_EQ(match_pattern_list("a", "!a,*", 0), -1);
59 	ASSERT_INT_EQ(match_pattern_list("b", "!a,*", 0), 1);
60 	ASSERT_INT_EQ(match_pattern_list("a", "*,!a", 0), -1);
61 	ASSERT_INT_EQ(match_pattern_list("b", "*,!a", 0), 1);
62 	ASSERT_INT_EQ(match_pattern_list("a", "a,!*", 0), -1);
63 	ASSERT_INT_EQ(match_pattern_list("b", "a,!*", 0), -1);
64 	ASSERT_INT_EQ(match_pattern_list("a", "a,!a", 0), -1);
65 	/* XXX negated ASSERT_INT_EQ(match_pattern_list("b", "a,!a", 0), 1); */
66 	ASSERT_INT_EQ(match_pattern_list("a", "!*,a", 0), -1);
67 	ASSERT_INT_EQ(match_pattern_list("b", "!*,a", 0), -1);
68 	TEST_DONE();
69 
70 	TEST_START("match_pattern_list lowercase");
71 	ASSERT_INT_EQ(match_pattern_list("abc", "ABC", 0), 0);
72 	ASSERT_INT_EQ(match_pattern_list("ABC", "abc", 0), 0);
73 	ASSERT_INT_EQ(match_pattern_list("abc", "ABC", 1), 1);
74 	ASSERT_INT_EQ(match_pattern_list("ABC", "abc", 1), 0);
75 	TEST_DONE();
76 
77 	TEST_START("addr_match_list");
78 	ASSERT_INT_EQ(addr_match_list("127.0.0.1", "127.0.0.1/44"), -2);
79 	ASSERT_INT_EQ(addr_match_list(NULL, "127.0.0.1/44"), -2);
80 	ASSERT_INT_EQ(addr_match_list("a", "*"), 0);
81 	ASSERT_INT_EQ(addr_match_list("127.0.0.1", "*"), 1);
82 	ASSERT_INT_EQ(addr_match_list(NULL, "*"), 0);
83 	ASSERT_INT_EQ(addr_match_list("127.0.0.1", "127.0.0.1"), 1);
84 	ASSERT_INT_EQ(addr_match_list("127.0.0.1", "127.0.0.2"), 0);
85 	ASSERT_INT_EQ(addr_match_list("127.0.0.1", "!127.0.0.1"), -1);
86 	/* XXX negated ASSERT_INT_EQ(addr_match_list("127.0.0.1", "!127.0.0.2"), 1); */
87 	ASSERT_INT_EQ(addr_match_list("127.0.0.255", "127.0.0.0/24"), 1);
88 	ASSERT_INT_EQ(addr_match_list("127.0.1.1", "127.0.0.0/24"), 0);
89 	ASSERT_INT_EQ(addr_match_list("127.0.0.1", "127.0.0.0/24"), 1);
90 	ASSERT_INT_EQ(addr_match_list("127.0.0.1", "127.0.1.0/24"), 0);
91 	ASSERT_INT_EQ(addr_match_list("127.0.0.1", "!127.0.0.0/24"), -1);
92 	/* XXX negated ASSERT_INT_EQ(addr_match_list("127.0.0.1", "!127.0.1.0/24"), 1); */
93 	ASSERT_INT_EQ(addr_match_list("127.0.0.1", "10.0.0.1,!127.0.0.1"), -1);
94 	ASSERT_INT_EQ(addr_match_list("127.0.0.1", "!127.0.0.1,10.0.0.1"), -1);
95 	ASSERT_INT_EQ(addr_match_list("127.0.0.1", "10.0.0.1,127.0.0.2"), 0);
96 	ASSERT_INT_EQ(addr_match_list("127.0.0.1", "127.0.0.2,10.0.0.1"), 0);
97 	/* XXX negated ASSERT_INT_EQ(addr_match_list("127.0.0.1", "10.0.0.1,!127.0.0.2"), 1); */
98 	/* XXX negated ASSERT_INT_EQ(addr_match_list("127.0.0.1", "!127.0.0.2,10.0.0.1"), 1); */
99 	TEST_DONE();
100 
101 #define CHECK_FILTER(string,filter,expected) \
102 	do { \
103 		char *result = match_filter_denylist((string), (filter)); \
104 		ASSERT_STRING_EQ(result, expected); \
105 		free(result); \
106 	} while (0)
107 
108 	TEST_START("match_filter_list");
109 	CHECK_FILTER("a,b,c", "", "a,b,c");
110 	CHECK_FILTER("a,b,c", "a", "b,c");
111 	CHECK_FILTER("a,b,c", "b", "a,c");
112 	CHECK_FILTER("a,b,c", "c", "a,b");
113 	CHECK_FILTER("a,b,c", "a,b", "c");
114 	CHECK_FILTER("a,b,c", "a,c", "b");
115 	CHECK_FILTER("a,b,c", "b,c", "a");
116 	CHECK_FILTER("a,b,c", "a,b,c", "");
117 	CHECK_FILTER("a,b,c", "b,c", "a");
118 	CHECK_FILTER("", "a,b,c", "");
119 	TEST_DONE();
120 /*
121  * XXX TODO
122  * int      match_host_and_ip(const char *, const char *, const char *);
123  * int      match_user(const char *, const char *, const char *, const char *);
124  * char    *match_list(const char *, const char *, u_int *);
125  * int      addr_match_cidr_list(const char *, const char *);
126  */
127 }
128