Line data Source code
1 : /* Copyright (c) 2018-2021, The Tor Project, Inc. */
2 : /* See LICENSE for licensing information */
3 :
4 : #include "test/test.h"
5 :
6 : #include "lib/cc/torint.h"
7 : #include "lib/container/namemap.h"
8 : #include "lib/container/namemap_st.h"
9 : #include "lib/malloc/malloc.h"
10 :
11 : #include <stdio.h>
12 : #include <string.h>
13 :
14 : static void
15 1 : test_namemap_empty(void *arg)
16 : {
17 1 : (void)arg;
18 :
19 1 : namemap_t m;
20 1 : namemap_init(&m);
21 1 : namemap_t m2 = NAMEMAP_INIT();
22 :
23 1 : tt_uint_op(0, OP_EQ, namemap_get_size(&m));
24 1 : tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m, "hello"));
25 1 : tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m, "hello"));
26 1 : tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m, "hello128"));
27 1 : tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m, ""));
28 1 : tt_uint_op(0, OP_EQ, namemap_get_size(&m));
29 :
30 1 : tt_uint_op(0, OP_EQ, namemap_get_size(&m2));
31 1 : tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m2, "hello"));
32 1 : tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m2, "hello"));
33 1 : tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m2, "hello128"));
34 1 : tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m2, ""));
35 1 : tt_uint_op(0, OP_EQ, namemap_get_size(&m));
36 :
37 1 : done:
38 1 : namemap_clear(&m);
39 1 : namemap_clear(&m2);
40 1 : }
41 :
42 : static void
43 1 : test_namemap_toolong(void *arg)
44 : {
45 1 : (void)arg;
46 1 : namemap_t m;
47 1 : char *ok = NULL;
48 1 : char *toolong = NULL;
49 1 : namemap_init(&m);
50 :
51 1 : ok = tor_malloc_zero(MAX_NAMEMAP_NAME_LEN+1);
52 1 : memset(ok, 'x', MAX_NAMEMAP_NAME_LEN);
53 :
54 1 : toolong = tor_malloc_zero(MAX_NAMEMAP_NAME_LEN+2);
55 1 : memset(toolong, 'x', MAX_NAMEMAP_NAME_LEN+1);
56 :
57 1 : tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m, ok));
58 1 : tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m, toolong));
59 1 : unsigned u1 = namemap_get_or_create_id(&m, toolong);
60 1 : unsigned u2 = namemap_get_or_create_id(&m, ok);
61 1 : tt_uint_op(u1, OP_EQ, NAMEMAP_ERR);
62 1 : tt_uint_op(u2, OP_NE, NAMEMAP_ERR);
63 1 : tt_uint_op(u2, OP_EQ, namemap_get_id(&m, ok));
64 1 : tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m, toolong));
65 :
66 1 : tt_str_op(ok, OP_EQ, namemap_get_name(&m, u2));
67 1 : tt_ptr_op(NULL, OP_EQ, namemap_get_name(&m, u1));
68 :
69 1 : done:
70 1 : tor_free(ok);
71 1 : tor_free(toolong);
72 1 : namemap_clear(&m);
73 1 : }
74 :
75 : static void
76 1 : test_namemap_blackbox(void *arg)
77 : {
78 1 : (void)arg;
79 :
80 1 : namemap_t m1, m2;
81 1 : namemap_init(&m1);
82 1 : namemap_init(&m2);
83 :
84 1 : unsigned u1 = namemap_get_or_create_id(&m1, "hello");
85 1 : unsigned u2 = namemap_get_or_create_id(&m1, "world");
86 1 : tt_uint_op(u1, OP_NE, NAMEMAP_ERR);
87 1 : tt_uint_op(u2, OP_NE, NAMEMAP_ERR);
88 1 : tt_uint_op(u1, OP_NE, u2);
89 :
90 1 : tt_uint_op(u1, OP_EQ, namemap_get_id(&m1, "hello"));
91 1 : tt_uint_op(u1, OP_EQ, namemap_get_or_create_id(&m1, "hello"));
92 1 : tt_uint_op(u2, OP_EQ, namemap_get_id(&m1, "world"));
93 1 : tt_uint_op(u2, OP_EQ, namemap_get_or_create_id(&m1, "world"));
94 :
95 1 : tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m1, "HELLO"));
96 1 : tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m2, "hello"));
97 :
98 1 : unsigned u3 = namemap_get_or_create_id(&m2, "hola");
99 1 : tt_uint_op(u3, OP_NE, NAMEMAP_ERR);
100 1 : tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m1, "hola"));
101 1 : tt_uint_op(u3, OP_EQ, namemap_get_or_create_id(&m2, "hola"));
102 1 : tt_uint_op(u3, OP_EQ, namemap_get_id(&m2, "hola"));
103 :
104 1 : unsigned int u4 = namemap_get_or_create_id(&m1, "hola");
105 1 : tt_uint_op(u4, OP_NE, NAMEMAP_ERR);
106 1 : tt_uint_op(u4, OP_EQ, namemap_get_id(&m1, "hola"));
107 1 : tt_uint_op(u3, OP_EQ, namemap_get_id(&m2, "hola"));
108 :
109 1 : tt_str_op("hello", OP_EQ, namemap_get_name(&m1, u1));
110 1 : tt_str_op("world", OP_EQ, namemap_get_name(&m1, u2));
111 1 : tt_str_op("hola", OP_EQ, namemap_get_name(&m2, u3));
112 1 : tt_str_op("hola", OP_EQ, namemap_get_name(&m1, u4));
113 :
114 1 : tt_ptr_op(NULL, OP_EQ, namemap_get_name(&m2, u3 + 10));
115 :
116 1 : done:
117 1 : namemap_clear(&m1);
118 1 : namemap_clear(&m2);
119 1 : }
120 :
121 : static void
122 1 : test_namemap_internals(void *arg)
123 : {
124 1 : (void)arg;
125 : // This test actually assumes know something about the identity layout.
126 1 : namemap_t m;
127 1 : namemap_init(&m);
128 :
129 1 : tt_uint_op(0, OP_EQ, namemap_get_or_create_id(&m, "that"));
130 1 : tt_uint_op(0, OP_EQ, namemap_get_or_create_id(&m, "that"));
131 1 : tt_uint_op(1, OP_EQ, namemap_get_or_create_id(&m, "is"));
132 1 : tt_uint_op(1, OP_EQ, namemap_get_or_create_id(&m, "is"));
133 :
134 1 : tt_uint_op(0, OP_EQ, namemap_get_id(&m, "that"));
135 1 : tt_uint_op(0, OP_EQ, namemap_get_id(&m, "that"));
136 1 : tt_uint_op(1, OP_EQ, namemap_get_id(&m, "is"));
137 1 : tt_uint_op(2, OP_EQ, namemap_get_or_create_id(&m, "not"));
138 1 : tt_uint_op(1, OP_EQ, namemap_get_or_create_id(&m, "is"));
139 1 : tt_uint_op(2, OP_EQ, namemap_get_or_create_id(&m, "not"));
140 :
141 1 : done:
142 1 : namemap_clear(&m);
143 1 : }
144 :
145 : static void
146 1 : test_namemap_fmt(void *arg)
147 : {
148 1 : (void)arg;
149 1 : namemap_t m = NAMEMAP_INIT();
150 :
151 1 : unsigned a = namemap_get_or_create_id(&m, "greetings");
152 1 : unsigned b = namemap_get_or_create_id(&m, "earthlings");
153 :
154 1 : tt_str_op(namemap_fmt_name(&m, a), OP_EQ, "greetings");
155 1 : tt_str_op(namemap_fmt_name(&m, b), OP_EQ, "earthlings");
156 1 : tt_int_op(a, OP_NE, 100);
157 1 : tt_int_op(b, OP_NE, 100);
158 1 : tt_str_op(namemap_fmt_name(&m, 100), OP_EQ, "{100}");
159 :
160 1 : done:
161 1 : namemap_clear(&m);
162 1 : }
163 :
164 : #define T(name) \
165 : { #name, test_namemap_ ## name , 0, NULL, NULL }
166 :
167 : struct testcase_t namemap_tests[] = {
168 : T(empty),
169 : T(toolong),
170 : T(blackbox),
171 : T(internals),
172 : T(fmt),
173 : END_OF_TESTCASES
174 : };
|