The FreeRADIUS server $Id: 15bac2a4c627c01d1aa2047687b3418955ac7f00 $
Loading...
Searching...
No Matches
pair_legacy_tests.c
Go to the documentation of this file.
1/*
2 * This library is free software; you can redistribute it and/or
3 * modify it under the terms of the GNU Lesser General Public
4 * License as published by the Free Software Foundation; either
5 * version 2.1 of the License, or (at your option) any later version.
6 *
7 * This library is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10 * Lesser General Public License for more details.
11 *
12 * You should have received a copy of the GNU Lesser General Public
13 * License along with this library; if not, write to the Free Software
14 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
15 */
16
17/** Tests for a AVP manipulation and search API.
18 *
19 * @file src/lib/util/test//pair_legacy_tests.c
20 * @author Jorge Pereira <jpereira@freeradius.org>
21 * @copyright 2020 Network RADIUS SAS (legal@networkradius.com)
22 */
23
24/**
25 * The 'TEST_INIT' macro provided by 'acutest.h' allowing to register a function to be called
26 * before call the unit tests. Therefore, It calls the function ALL THE TIME causing an overhead.
27 * That is why we are initializing pair_tests_init() by "__attribute__((constructor));" reducing the
28 * test execution by 50% of the time.
29 */
30#define USE_CONSTRUCTOR
31
32/*
33 * It should be declared before include the "acutest.h"
34 */
35#ifdef USE_CONSTRUCTOR
36static void test_init(void) __attribute__((constructor));
37#else
38static void test_init(void);
39# define TEST_INIT test_init()
40#endif
41
42#include "acutest.h"
43#include "acutest_helpers.h"
44#include "pair_test_helpers.h"
45
46#include <freeradius-devel/util/conf.h>
47#include <freeradius-devel/util/dict.h>
48#include <freeradius-devel/util/pair_legacy.h>
49
50static TALLOC_CTX *autofree;
52static fr_dict_t *test_dict;
53
54
55/** Global initialisation
56 */
57static void test_init(void)
58{
60 if (!autofree) {
61 error:
62 fr_perror("pair_tests");
63 fr_exit_now(EXIT_FAILURE);
64 }
65
66 /*
67 * Mismatch between the binary and the libraries it depends on
68 */
69 if (fr_check_lib_magic(RADIUSD_MAGIC_NUMBER) < 0) goto error;
70
71 if (fr_dict_test_init(autofree, &test_dict, NULL) < 0) goto error;
72
73 /* Initialize the "test_pairs" list */
75
76 if (fr_pair_test_list_alloc(autofree, &test_pairs, NULL) < 0) goto error;
77}
78
80{
82 ssize_t len;
83 fr_pair_list_t list;
84 char const *buffer = "Test-Uint32-0 = 123, Test-String-0 = \"Testing123\"";
85 fr_pair_parse_t root, relative;
86
87 root = (fr_pair_parse_t) {
88 .ctx = autofree,
90 .list = &list,
91 .dict = test_dict,
92 .internal = fr_dict_internal(),
93 };
94 relative = (fr_pair_parse_t) { };
95
96 fr_pair_list_init(&list);
97 len = strlen(buffer);
98
99 TEST_CASE("Create 'vp' using fr_pair_list_afrom_substr()");
100 TEST_CHECK(fr_pair_list_afrom_substr(&root, &relative, &FR_SBUFF_IN(buffer, len)) == len);
101
102 TEST_CASE("Looking for Test-Uint32-0");
103 TEST_CHECK((vp = fr_pair_find_by_da(&list, NULL, fr_dict_attr_test_uint32)) != NULL);
104
105 TEST_CASE("Validating PAIR_VERIFY()");
107
108 TEST_CASE("Checking if (Test-Uint32-0 == 123)");
109 TEST_CHECK(vp && vp->vp_uint32 == 123);
110
111 TEST_CASE("Looking for Test-String-0");
112 TEST_CHECK((vp = fr_pair_find_by_da(&list, NULL, fr_dict_attr_test_string)) != NULL);
113
114 TEST_CASE("Validating PAIR_VERIFY()");
116
117 TEST_CASE("Checking if (Test-String-0 == 'Testing123')");
118 TEST_CHECK(vp && strcmp(vp->vp_strvalue, "Testing123") == 0);
119
120 fr_pair_list_free(&list);
121}
122
123
125{
126 fr_pair_t *vp;
127 ssize_t len;
128 fr_pair_list_t list;
129 ssize_t slen;
130 char const *buffer = "Test-Uint32-0 = 123, Test-String-0 = `echo \"Testing321\"`";
131 char const *buffer_multi = "Test-String-0 = `echo \"Testing321\"`, Test-String-0 += 'Testing123'";
132 fr_pair_parse_t root, relative;
133
134 root = (fr_pair_parse_t) {
135 .ctx = autofree,
136 .da = fr_dict_root(test_dict),
137 .list = &list,
138 .dict = test_dict,
139 .internal = fr_dict_internal(),
140 .allow_exec = true
141 };
142 relative = (fr_pair_parse_t) { };
143
144 fr_pair_list_init(&list);
145 len = strlen(buffer);
146
147 TEST_CASE("Create 'vp' using fr_pair_list_afrom_substr()");
148 slen = fr_pair_list_afrom_substr(&root, &relative, &FR_SBUFF_IN(buffer, len));
149 TEST_CHECK_SLEN(slen, (ssize_t)len);
150 TEST_MSG_FAIL("fr_pair_list_afrom_substr(): %s", fr_strerror());
151
152 TEST_CASE("Looking for Test-Uint32-0");
153 TEST_CHECK((vp = fr_pair_find_by_da(&list, NULL, fr_dict_attr_test_uint32)) != NULL);
154
155 TEST_CASE("Validating PAIR_VERIFY()");
157
158 TEST_CASE("Checking if (Test-Uint32-0 == 123)");
159 TEST_CHECK(vp && vp->vp_uint32 == 123);
160
161 TEST_CASE("Looking for Test-String-0");
162 TEST_CHECK((vp = fr_pair_find_by_da(&list, NULL, fr_dict_attr_test_string)) != NULL);
163
164 TEST_CASE("Validating PAIR_VERIFY()");
166
167 TEST_MSG_FAIL("Pair value was: %s", vp->vp_strvalue);
168 TEST_CASE("Checking if (Test-String-0 == 'Testing321')");
169 TEST_CHECK(vp && strcmp(vp->vp_strvalue, "Testing321") == 0);
170
171 fr_pair_list_free(&list);
172
173 len = strlen(buffer_multi);
174 TEST_CASE("Create 'vp' using fr_pair_list_afrom_substr()");
175 slen = fr_pair_list_afrom_substr(&root, &relative, &FR_SBUFF_IN(buffer_multi, len));
176 TEST_CHECK_SLEN(slen, (ssize_t)len);
177 TEST_MSG_FAIL("fr_pair_list_afrom_substr(): %s", fr_strerror());
178
179 TEST_CASE("Looking for Test-String-0");
180 TEST_CHECK((vp = fr_pair_find_by_da(&list, NULL, fr_dict_attr_test_string)) != NULL);
181
182 TEST_CASE("Validating PAIR_VERIFY()");
184
185 TEST_MSG_FAIL("Pair value was: %s", vp->vp_strvalue);
186 TEST_CASE("Checking if (Test-String-0 == 'Testing321')");
187 TEST_CHECK(vp && strcmp(vp->vp_strvalue, "Testing321") == 0);
188
189 TEST_CASE("Looking for Test-String-0");
191
192 TEST_CASE("Validating PAIR_VERIFY()");
194
195 TEST_MSG_FAIL("Pair value was: %s", vp->vp_strvalue);
196 TEST_CASE("Checking if (Test-String-0 == 'Testing123')");
197 TEST_CHECK(vp && strcmp(vp->vp_strvalue, "Testing123") == 0);
198
199 fr_pair_list_free(&list);
200}
201
202static FILE *open_buffer_as_file(uint8_t const *buffer, size_t buffer_len)
203{
204 FILE *fp;
205 uint8_t *our_buffer = UNCONST(uint8_t *, buffer);
206
207 TEST_CHECK((fp = fmemopen(our_buffer, buffer_len, "r")) != NULL);
208
209 fflush (fp);
210
211 return fp;
212}
213
215{
216 fr_pair_t *vp;
217 fr_pair_list_t list;
218 char const *buffer = "Test-Uint32-0 = 123\nTest-String-0 = \"Testing123\"\n";
219 FILE *fp = open_buffer_as_file((uint8_t const *)buffer, strlen(buffer) + 1);
220 bool pfiledone;
221
222 fr_pair_list_init(&list);
223
224 TEST_CASE("Create 'vp' using fr_pair_list_afrom_file()");
225 TEST_CHECK(fr_pair_list_afrom_file(autofree, test_dict, &list, fp, &pfiledone, false) == 0);
226
227 TEST_CASE("Looking for Test-Uint32-0");
228 TEST_CHECK((vp = fr_pair_find_by_da(&list, NULL, fr_dict_attr_test_uint32)) != NULL);
229
230 TEST_CASE("Validating PAIR_VERIFY()");
232
233 TEST_CASE("Checking if (Test-Uint32-0 == 123)");
234 TEST_CHECK(vp && vp->vp_uint32 == 123);
235
236 TEST_CASE("Looking for Test-String-0");
237 TEST_CHECK((vp = fr_pair_find_by_da(&list, NULL, fr_dict_attr_test_string)) != NULL);
238
239 TEST_CASE("Validating PAIR_VERIFY()");
241
242 TEST_CASE("Checking if (Test-String-0 == 'Testing123')");
243 TEST_CHECK(vp && strcmp(vp->vp_strvalue, "Testing123") == 0);
244
245 fr_pair_list_free(&list);
246
247 fclose(fp);
248}
249
251{
252 fr_pair_t *vp;
253 fr_pair_list_t old_list, new_list;
254 bool pfiledone;
255 char const *fake_file = "Test-Uint32-0 = 123\nTest-String-0 = \"Testing123\"\n";
256 FILE *fp = open_buffer_as_file((uint8_t const *)fake_file, strlen(fake_file) + 1);
257
258 fr_pair_list_init(&old_list);
259 fr_pair_list_init(&new_list);
260
261 TEST_CASE("Create 'vp' using fr_pair_list_afrom_file()");
262 TEST_CHECK(fr_pair_list_afrom_file(autofree, test_dict, &old_list, fp, &pfiledone, false) == 0);
263 TEST_CHECK(pfiledone == true);
264
265 TEST_CASE("Move pair from 'old_list' to 'new_list' using fr_pair_list_move_op()");
266 fr_pair_list_move_op(&new_list, &old_list, T_OP_ADD_EQ);
267
268 TEST_CASE("Looking for Test-Uint32-0");
269 TEST_CHECK((vp = fr_pair_find_by_da(&new_list, NULL, fr_dict_attr_test_uint32)) != NULL);
270
271 TEST_CASE("Validating PAIR_VERIFY()");
273
274 TEST_CHECK(vp != NULL);
275
276 TEST_CASE("Checking if (Test-Uint32-0 == 123)");
277 TEST_CHECK(vp && vp->vp_uint32 == 123);
278
279 TEST_CASE("Looking for Test-String-0");
280 TEST_CHECK((vp = fr_pair_find_by_da(&new_list, NULL, fr_dict_attr_test_string)) != NULL);
281
282 TEST_CASE("Validating PAIR_VERIFY()");
284
285 TEST_CHECK(vp != NULL);
286
287 TEST_CASE("Checking if (Test-String-0 == 'Testing123')");
288 TEST_CHECK(vp && strcmp(vp->vp_strvalue, "Testing123") == 0);
289
290 fr_pair_list_free(&new_list);
291
292 fclose(fp);
293}
294
296 /*
297 * Legacy calls
298 */
299 { "fr_pair_list_afrom_substr", test_fr_pair_list_afrom_substr },
300 { "fr_pair_list_afrom_substr_exec", test_fr_pair_list_afrom_substr_exec },
301 { "fr_pair_list_afrom_file", test_fr_pair_list_afrom_file },
302 { "fr_pair_list_move_op", test_fr_pair_list_move_op },
303
305};
static int const char char buffer[256]
Definition acutest.h:576
#define TEST_CHECK(cond)
Definition acutest.h:87
#define TEST_MSG_FAIL(...)
Definition acutest.h:218
#define TEST_CASE(name)
Definition acutest.h:186
#define TEST_TERMINATOR
Definition acutest.h:64
#define TEST_CHECK_SLEN(_got, _exp)
#define UNCONST(_type, _ptr)
Remove const qualification from a pointer.
Definition build.h:186
TALLOC_CTX * autofree
Definition common.c:29
#define fr_exit_now(_x)
Exit without calling atexit() handlers, producing a log message in debug builds.
Definition debug.h:226
fr_dict_attr_t const * fr_dict_root(fr_dict_t const *dict)
Return the root attribute of a dictionary.
Definition dict_util.c:2639
fr_dict_t const * fr_dict_internal(void)
Definition dict_util.c:4905
fr_dict_attr_t const * fr_dict_attr_test_uint32
Definition dict_test.c:47
fr_dict_attr_t const * fr_dict_attr_test_string
Definition dict_test.c:30
int fr_dict_test_init(TALLOC_CTX *ctx, fr_dict_t **dict_p, fr_dict_test_attr_t const *test_defs)
Initialise a test dictionary and add our test_defs to it.
Definition dict_test.c:248
long int ssize_t
unsigned char uint8_t
fr_pair_t * fr_pair_find_by_da(fr_pair_list_t const *list, fr_pair_t const *prev, fr_dict_attr_t const *da)
Find the first pair with a matching da.
Definition pair.c:707
void fr_pair_list_init(fr_pair_list_t *list)
Initialise a pair list header.
Definition pair.c:46
fr_slen_t fr_pair_list_afrom_substr(fr_pair_parse_t const *root, fr_pair_parse_t *relative, fr_sbuff_t *in)
Parse a fr_pair_list_t from a substring.
int fr_pair_list_afrom_file(TALLOC_CTX *ctx, fr_dict_t const *dict, fr_pair_list_t *out, FILE *fp, bool *pfiledone, bool allow_exec)
Read valuepairs from the fp up to End-Of-File.
void fr_pair_list_move_op(fr_pair_list_t *to, fr_pair_list_t *from, fr_token_t op)
Move pairs from source list to destination list respecting operator.
TALLOC_CTX * ctx
Definition pair_legacy.h:43
static void test_fr_pair_list_afrom_file(void)
static void test_fr_pair_list_move_op(void)
static FILE * open_buffer_as_file(uint8_t const *buffer, size_t buffer_len)
static void test_fr_pair_list_afrom_substr(void)
static void test_init(void)
Global initialisation.
static void test_fr_pair_list_afrom_substr_exec(void)
static fr_pair_list_t test_pairs
static fr_dict_t * test_dict
Helper functions for pair tests.
static int fr_pair_test_list_alloc(TALLOC_CTX *ctx, fr_pair_list_t *out, fr_dict_test_attr_t const *test_defs)
#define FR_SBUFF_IN(_start, _len_or_end)
fr_pair_t * vp
Stores an attribute, a value and various bits of other data.
Definition pair.h:68
#define talloc_autofree_context
The original function is deprecated, so replace it with our version.
Definition talloc.h:55
@ T_OP_ADD_EQ
Definition token.h:67
#define PAIR_VERIFY(_x)
Definition pair.h:204
void fr_pair_list_free(fr_pair_list_t *list)
Free memory used by a valuepair list.
char const * fr_strerror(void)
Get the last library error.
Definition strerror.c:558
void fr_perror(char const *fmt,...)
Print the current error to stderr with a prefix.
Definition strerror.c:737
int fr_check_lib_magic(uint64_t magic)
Check if the application linking to the library has the correct magic number.
Definition version.c:40
#define RADIUSD_MAGIC_NUMBER
Definition version.h:81