From 00a881a1adb6f656049939adecb9bf9edd29a658 Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Mon, 1 Dec 2014 11:47:16 +0800 Subject: discover/grub2: improve handling of word & delimiter tokens Currently, the delimiter token handling is a little fragile: we try to ignore non-inter-word delimiters in the lexer with a selective set of regexes on the possible delimiter characters. This means we don't need to handle potential delimiters in every grammar rule, but there are other situations (not regex-able) where we may see delimters, and this will cause a parse error. Instead of relying on the regex behaviour, we have an 'inter_word' flag, which is set when we see the first word token, and cleared when we see an end-of-line token. We only emit TOKEN_DELIM when this flag is set. This means that we only get the delim tokens when they're required - when we're looking for word separators (becuase WORD DELIM WORD is distinct from WORD WORD - eg "linux /vmlinux" and "x$var"). We add a few new tests for the "menuentry" and "if" syntax, with different delimiter configurations. Signed-off-by: Jeremy Kerr --- test/parser/Makefile.am | 3 +++ test/parser/test-grub2-if-formats.c | 40 +++++++++++++++++++++++++++++ test/parser/test-grub2-menuentry-formats.c | 41 ++++++++++++++++++++++++++++++ test/parser/test-grub2-noeol.c | 15 +++++++++++ 4 files changed, 99 insertions(+) create mode 100644 test/parser/test-grub2-if-formats.c create mode 100644 test/parser/test-grub2-menuentry-formats.c create mode 100644 test/parser/test-grub2-noeol.c (limited to 'test/parser') diff --git a/test/parser/Makefile.am b/test/parser/Makefile.am index eca4c0a..072eba6 100644 --- a/test/parser/Makefile.am +++ b/test/parser/Makefile.am @@ -16,6 +16,9 @@ parser_TESTS = \ test/parser/test-grub2-single \ test/parser/test-grub2-default \ test/parser/test-grub2-empty \ + test/parser/test-grub2-noeol \ + test/parser/test-grub2-menuentry-formats \ + test/parser/test-grub2-if-formats \ test/parser/test-grub2-default-index \ test/parser/test-grub2-default-multiword \ test/parser/test-grub2-multiple-resolve \ diff --git a/test/parser/test-grub2-if-formats.c b/test/parser/test-grub2-if-formats.c new file mode 100644 index 0000000..cbf1afb --- /dev/null +++ b/test/parser/test-grub2-if-formats.c @@ -0,0 +1,40 @@ + +#include "parser-test.h" + +#if 0 /* PARSER_EMBEDDED_CONFIG */ +if true;then t1=1;fi +if true ;then t2=2;fi +if true;then t3=3 ;fi +if true;then t4=4; ;fi +if true +then t5=5 +fi +if true +then t6=6; +fi +if true + then t7=7 +fi +if true +then t8=8; fi +if true +then +t9=9 + +fi + +menuentry $t1$t2$t3$t4$t5$t6$t7$t8$t9 {linux /vmlinux} +#endif + +void run_test(struct parser_test *test) +{ + struct discover_boot_option *opt; + + test_read_conf_embedded(test, "/grub2/grub.cfg"); + + test_run_parser(test, "grub2"); + + check_boot_option_count(test->ctx, 1); + opt = get_boot_option(test->ctx, 0); + check_name(opt, "123456789"); +} diff --git a/test/parser/test-grub2-menuentry-formats.c b/test/parser/test-grub2-menuentry-formats.c new file mode 100644 index 0000000..132ce8d --- /dev/null +++ b/test/parser/test-grub2-menuentry-formats.c @@ -0,0 +1,41 @@ + +#include "parser-test.h" + +#if 0 /* PARSER_EMBEDDED_CONFIG */ +menuentry "test.0" {linux /vmlinux;} +menuentry "test.1" {linux /vmlinux} +menuentry "test.2" {linux /vmlinux } +menuentry "test.3" { linux /vmlinux; } +menuentry "test.4" {linux /vmlinux ;} +menuentry "test.5" { +linux /vmlinux;} +menuentry "test.6" {linux /vmlinux +} +menuentry "test.7" { +linux /vmlinux +} +menuentry "test.8" { + linux /vmlinux +} +menuentry "test.9" { + linux /vmlinux + } +#endif + +void run_test(struct parser_test *test) +{ + struct discover_boot_option *opt; + char str[] = "test.0"; + int i; + + test_read_conf_embedded(test, "/grub2/grub.cfg"); + + test_run_parser(test, "grub2"); + + check_boot_option_count(test->ctx, 10); + for (i = 0; i < 8; i++) { + opt = get_boot_option(test->ctx, i); + str[5] = i + '0'; + check_name(opt, str); + } +} diff --git a/test/parser/test-grub2-noeol.c b/test/parser/test-grub2-noeol.c new file mode 100644 index 0000000..e2db85e --- /dev/null +++ b/test/parser/test-grub2-noeol.c @@ -0,0 +1,15 @@ + +#include "parser-test.h" + +void run_test(struct parser_test *test) +{ + const char data[] = "true"; + + test_add_file_data(test, test->ctx->device, "/boot/grub/grubenv", + data, sizeof(data)); + + __test_read_conf_data(test, test->ctx->device, + "/boot/grub/grub.cfg", data, sizeof(data)); + + test_run_parser(test, "grub2"); +} -- cgit v1.2.1