diff options
Diffstat (limited to 'src/tests/map')
-rw-r--r-- | src/tests/map/all.mk | 1 | ||||
-rw-r--r-- | src/tests/map/base | 6 | ||||
-rw-r--r-- | src/tests/map/base.out | 5 | ||||
-rw-r--r-- | src/tests/map/count-error | 6 | ||||
-rw-r--r-- | src/tests/map/count-list-error | 6 | ||||
-rw-r--r-- | src/tests/map/map_tests.mk | 50 | ||||
-rw-r--r-- | src/tests/map/map_unit.c | 219 | ||||
-rw-r--r-- | src/tests/map/map_unit.mk | 5 |
8 files changed, 298 insertions, 0 deletions
diff --git a/src/tests/map/all.mk b/src/tests/map/all.mk new file mode 100644 index 0000000..fedd29d --- /dev/null +++ b/src/tests/map/all.mk @@ -0,0 +1 @@ +SUBMAKEFILES := map_unit.mk map_tests.mk diff --git a/src/tests/map/base b/src/tests/map/base new file mode 100644 index 0000000..633c32a --- /dev/null +++ b/src/tests/map/base @@ -0,0 +1,6 @@ +update request { + Filter-Id := "filter" + User-Name := "blah" + + &reply:Filter-Id += &request:Filter-Id[*] +} diff --git a/src/tests/map/base.out b/src/tests/map/base.out new file mode 100644 index 0000000..34c519b --- /dev/null +++ b/src/tests/map/base.out @@ -0,0 +1,5 @@ +update request { + &Filter-Id := "filter" + &User-Name := "blah" + &reply:Filter-Id += &Filter-Id[*] +} diff --git a/src/tests/map/count-error b/src/tests/map/count-error new file mode 100644 index 0000000..925360d --- /dev/null +++ b/src/tests/map/count-error @@ -0,0 +1,6 @@ +# +# This should be an xlat, not a direct assignment +# +update request { + Tmp-Integer-0 := &Filter-Id[#] # ERROR +}
\ No newline at end of file diff --git a/src/tests/map/count-list-error b/src/tests/map/count-list-error new file mode 100644 index 0000000..a7beae1 --- /dev/null +++ b/src/tests/map/count-list-error @@ -0,0 +1,6 @@ +# +# Updating lists isn't allowed +# +update { + &request:Filter-Id := &Filter-Id[#] # ERROR +} diff --git a/src/tests/map/map_tests.mk b/src/tests/map/map_tests.mk new file mode 100644 index 0000000..7474489 --- /dev/null +++ b/src/tests/map/map_tests.mk @@ -0,0 +1,50 @@ +MAP_TESTS := $(patsubst $(top_srcdir)/src/tests/map/%,%,$(filter-out %.conf %.md %.attrs %.c %.mk %~ %.rej %.out,$(wildcard $(top_srcdir)/src/tests/map/*))) +MAP_OUTPUT := $(addsuffix .out,$(addprefix $(BUILD_DIR)/tests/map/,$(MAP_TESTS))) +MAP_UNIT_BIN := $(BUILD_DIR)/bin/local/map_unit +MAP_UNIT := ./build/make/jlibtool --silent --mode=execute $(MAP_UNIT_BIN) + +.PHONY: $(BUILD_DIR)/tests/map/ +$(BUILD_DIR)/tests/map/: + @mkdir -p $@ + +# +# Re-run the tests if the test program changes +# +# Create the output directory before the files +# +$(MAP_OUTPUT): $(MAP_UNIT_BIN) | $(BUILD_DIR)/tests/map/ + +# +# Re-run the tests if the input file changes +# +$(BUILD_DIR)/tests/map/%.out: $(top_srcdir)/src/tests/map/% + @echo MAP_TEST $(notdir $<) + @if ! $(MAP_UNIT) -d $(top_srcdir)/raddb -D $(top_srcdir)/share $< > $@ 2>&1; then \ + if ! grep ERROR $< 2>&1 > /dev/null; then \ + cat $@; \ + echo "# $@"; \ + echo FAILED: "$(MAP_UNIT) -d $(top_srcdir)/raddb -D $(top_srcdir)/share $<"; \ + exit 1; \ + fi; \ + FOUND=$$(grep $< $@ | head -1 | sed 's,^.*$(top_srcdir),,;s/:.*//;s/.*\[//;s/\].*//'); \ + EXPECTED=$$(grep -n ERROR $< | sed 's/:.*//'); \ + if [ "$$EXPECTED" != "$$FOUND" ]; then \ + cat $@; \ + echo "# $@"; \ + echo "E $$EXPECTED F $$FOUND"; \ + echo UNEXPECTED ERROR: "$(MAP_UNIT) -d $(top_srcdir)/raddb -D $(top_srcdir)/share $<"; \ + exit 1; \ + fi; \ + else \ + if ! diff $<.out $@; then \ + echo FAILED: " diff $<.out $@"; \ + echo FAILED: "$(MAP_UNIT) -d $(top_srcdir)/raddb -D $(top_srcdir)/share $<"; \ + exit 1; \ + fi; \ + fi + +TESTS.MAP_FILES := $(MAP_OUTPUT) + +$(TESTS.MAP_FILES): $(TESTS.UNIT_FILES) + +tests.map: $(MAP_OUTPUT) diff --git a/src/tests/map/map_unit.c b/src/tests/map/map_unit.c new file mode 100644 index 0000000..af6d016 --- /dev/null +++ b/src/tests/map/map_unit.c @@ -0,0 +1,219 @@ +/* + * radattr.c Map debugging tool. + * + * Version: $Id$ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Copyright 2015 Alan DeKok <aland@freeradius.org> + */ + +RCSID("$Id$") + +#include <freeradius-devel/libradius.h> + +#include <freeradius-devel/conf.h> +#include <freeradius-devel/modpriv.h> +#include <freeradius-devel/modcall.h> + +#include <ctype.h> + +#ifdef HAVE_GETOPT_H +# include <getopt.h> +#endif + +#include <assert.h> + +#include <freeradius-devel/log.h> + +#include <sys/wait.h> + +/* Linker hacks */ + +#ifdef HAVE_PTHREAD_H +pid_t rad_fork(void) +{ + return fork(); +} + +pid_t rad_waitpid(pid_t pid, int *status) +{ + return waitpid(pid, status, 0); +} +#endif + +rlm_rcode_t indexed_modcall(UNUSED rlm_components_t comp, UNUSED int idx, UNUSED REQUEST *request) +{ + return RLM_MODULE_OK; +} + +char const *get_radius_dir(void) +{ + return NULL; +} + +module_instance_t *module_instantiate(UNUSED CONF_SECTION *modules, UNUSED char const *askedname) +{ + return NULL; +} + +module_instance_t *module_instantiate_method(UNUSED CONF_SECTION *modules, UNUSED char const *name, UNUSED rlm_components_t *method) +{ + return NULL; +} + +/* Linker hacks */ + +static void NEVER_RETURNS usage(void) +{ + fprintf(stderr, "usage: map_unit [OPTS] filename ...\n"); + fprintf(stderr, " -d <raddb> Set user dictionary directory (defaults to " RADDBDIR ").\n"); + fprintf(stderr, " -D <dictdir> Set main dictionary directory (defaults to " DICTDIR ").\n"); + fprintf(stderr, " -O <output_dir> Set output directory\n"); + fprintf(stderr, " -x Debugging mode.\n"); + fprintf(stderr, " -M Show program version information.\n"); + + exit(1); +} + +static int process_file(char const *filename) +{ + int rcode; + char const *name1, *name2; + CONF_SECTION *cs, *main_cs; + vp_map_t *head, *map; + char buffer[8192]; + + main_cs = cf_section_alloc(NULL, "main", NULL); + if (cf_file_read(main_cs, filename) < 0) { + fprintf(stderr, "map_unit: Failed parsing %s\n", + filename); + exit(1); + } + + /* + * Always has to be an "update" section. + */ + cs = cf_section_sub_find(main_cs, "update"); + if (!cs) { + talloc_free(main_cs); + return -1; + } + + /* + * Convert the update section to a list of maps. + */ + rcode = map_afrom_cs(&head, cs, PAIR_LIST_REQUEST, PAIR_LIST_REQUEST, modcall_fixup_update, NULL, 128); + if (rcode < 0) return -1; /* message already printed */ + if (!head) { + cf_log_err_cs(cs, "'update' sections cannot be empty"); + return -1; + } + + buffer[0] = '\t'; + + name1 = cf_section_name1(cs); + name2 = cf_section_name2(cs); + + /* + * And print it all out. + */ + if (!name2) { + printf("%s {\n", name1); + } else { + printf("%s %s {\n", name1, name2); + } + + for (map = head; map != NULL; map = map->next) { + map_prints(buffer + 1, sizeof(buffer) - 1, map); + puts(buffer); + } + printf("}\n"); + + talloc_free(main_cs); + return 0; +} + +int main(int argc, char *argv[]) +{ + int c, rcode = 0; + bool report = false; + char const *radius_dir = RADDBDIR; + char const *dict_dir = DICTDIR; + + cf_new_escape = true; /* fix the tests */ + +#ifndef NDEBUG + if (fr_fault_setup(getenv("PANIC_ACTION"), argv[0]) < 0) { + fr_perror("radattr"); + exit(EXIT_FAILURE); + } +#endif + + while ((c = getopt(argc, argv, "d:D:xMh")) != EOF) switch (c) { + case 'd': + radius_dir = optarg; + break; + case 'D': + dict_dir = optarg; + break; + case 'x': + fr_debug_lvl++; + rad_debug_lvl = fr_debug_lvl; + break; + case 'M': + report = true; + break; + case 'h': + default: + usage(); + } + argc -= (optind - 1); + argv += (optind - 1); + + /* + * Mismatch between the binary and the libraries it depends on + */ + if (fr_check_lib_magic(RADIUSD_MAGIC_NUMBER) < 0) { + fr_perror("radattr"); + return 1; + } + + if (dict_init(dict_dir, RADIUS_DICTIONARY) < 0) { + fr_perror("radattr"); + return 1; + } + + if (dict_read(radius_dir, RADIUS_DICTIONARY) == -1) { + fr_perror("radattr"); + return 1; + } + + if (argc < 2) { + rcode = process_file("-"); + + } else { + rcode = process_file(argv[1]); + } + + if (report) { + dict_free(); + fr_log_talloc_report(NULL); + } + + if (rcode < 0) rcode = 1; /* internal to Unix process return code */ + + return rcode; +} diff --git a/src/tests/map/map_unit.mk b/src/tests/map/map_unit.mk new file mode 100644 index 0000000..88d319b --- /dev/null +++ b/src/tests/map/map_unit.mk @@ -0,0 +1,5 @@ +TARGET := map_unit +SOURCES := map_unit.c ${top_srcdir}/src/main/modcall.c + +TGT_PREREQS := libfreeradius-server.a libfreeradius-radius.a +TGT_LDLIBS := $(LIBS) |