[master] 98be9d5 Run Nicolas Seriot's JSON test-cases.
Poul-Henning Kamp
phk at FreeBSD.org
Wed May 24 08:11:05 CEST 2017
commit 98be9d5e6652e65b48a3dcd81e57639dc03adff2
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Wed May 24 06:08:59 2017 +0000
Run Nicolas Seriot's JSON test-cases.
diff --git a/lib/libvarnishapi/Makefile.am b/lib/libvarnishapi/Makefile.am
index 60a7661..ab85776 100644
--- a/lib/libvarnishapi/Makefile.am
+++ b/lib/libvarnishapi/Makefile.am
@@ -104,3 +104,11 @@ vsl_glob_test_SOURCES = \
vsl_glob_test_LDADD = @PCRE_LIBS@ ${RT_LIBS} ${LIBM} libvarnishapi.la
vsl_glob_test_CFLAGS = -I$(top_srcdir)/include
+
+TESTS = vjsn_test
+
+noinst_PROGRAMS += ${TESTS}
+
+vjsn_test_SOURCES = vjsn.c
+vjsn_test_CFLAGS = -DVJSN_TEST
+vjsn_test_LDADD = libvarnishapi.la
diff --git a/lib/libvarnishapi/flint.lnt b/lib/libvarnishapi/flint.lnt
index 2d2538e..40439a5 100644
--- a/lib/libvarnishapi/flint.lnt
+++ b/lib/libvarnishapi/flint.lnt
@@ -2,6 +2,9 @@
-esym(759, VJSN_*) // could be moved hdr->mod
-esym(765, VJSN_*) // could be made static
+-esym(759, vjsn_dump) // could be moved hdr->mod
+-esym(765, vjsn_dump) // could be made static
+-esym(714, vjsn_dump) // not ref
-esym(788, vex_rhs_e::*)
-esym(788, VSL_transaction_e::*)
-esym(769, vex_rhs_e::VEX__UNSET)
diff --git a/lib/libvarnishapi/vjsn.c b/lib/libvarnishapi/vjsn.c
index 4a8b001..6c0b1b7 100644
--- a/lib/libvarnishapi/vjsn.c
+++ b/lib/libvarnishapi/vjsn.c
@@ -26,6 +26,8 @@
* SUCH DAMAGE.
*/
+#include "config.h"
+
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
@@ -455,106 +457,446 @@ vjsn_dump(const struct vjsn *js, FILE *fo)
#ifdef VJSN_TEST
-static struct vjsn *
-vjsn_file(const char *fn, const char **err)
+/*
+ * Test-cases by Nicolas Seriot
+ *
+ * See: http://seriot.ch/parsing_json.php
+ *
+ * MIT License
+ *
+ * Copyright (c) 2016 Nicolas Seriot
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * We skip tests containing NUL, because we're lazy (The code will actually
+ * pass these tests if you provide for a way to pass the true length of the
+ * input to it, and we skip really huge tests, because we are only limited
+ * by available memory.
+ *
+ * To produce the C-data-structures:
+ *
+ * Clone https://github.com/nst/JSONTestSuite.git
+ *
+ * And run this python in test_parsing:
+
+ import glob
+
+ def emit(fin):
+ if fin in skip:
+ return
+ x = bytearray(open(fin).read())
+ if 0 in x:
+ return
+ if len(x) > 1000:
+ return
+ t = '\t"'
+ for i in x:
+ t += "\\x%02x" % i
+ if len(t) > 64:
+ print(t + '"')
+ t = '\t"'
+ print(t + '",')
+
+ print("const char *good[] = {")
+ for f in glob.glob("y_*"):
+ emit(f)
+ print("\tNULL")
+ print("};")
+
+ print("const char *bad[] = {")
+ for f in glob.glob("n_*"):
+ emit(f)
+ print("\tNULL")
+ print("};")
+
+*/
+
+const char *good[] = {
+ "\x5b\x31\x32\x33\x65\x36\x35\x5d",
+ "\x5b\x5b\x5d\x20\x20\x20\x5d",
+ "\x5b\x22\x22\x5d",
+ "\x5b\x5d",
+ "\x5b\x22\x61\x22\x5d",
+ "\x5b\x66\x61\x6c\x73\x65\x5d",
+ "\x5b\x6e\x75\x6c\x6c\x2c\x20\x31\x2c\x20\x22\x31\x22\x2c\x20\x7b"
+ "\x7d\x5d",
+ "\x5b\x6e\x75\x6c\x6c\x5d",
+ "\x5b\x31\x0a\x5d",
+ "\x20\x5b\x31\x5d",
+ "\x5b\x31\x2c\x6e\x75\x6c\x6c\x2c\x6e\x75\x6c\x6c\x2c\x6e\x75\x6c"
+ "\x6c\x2c\x32\x5d",
+ "\x5b\x32\x5d\x20",
+ "\x5b\x30\x65\x2b\x31\x5d",
+ "\x5b\x30\x65\x31\x5d",
+ "\x5b\x20\x34\x5d",
+ "\x5b\x2d\x30\x2e\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30"
+ "\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30"
+ "\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30"
+ "\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30"
+ "\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30"
+ "\x30\x31\x5d\x0a",
+ "\x5b\x32\x30\x65\x31\x5d",
+ "\x5b\x2d\x30\x5d",
+ "\x5b\x2d\x31\x32\x33\x5d",
+ "\x5b\x2d\x31\x5d",
+ "\x5b\x2d\x30\x5d",
+ "\x5b\x31\x45\x32\x32\x5d",
+ "\x5b\x31\x45\x2d\x32\x5d",
+ "\x5b\x31\x45\x2b\x32\x5d",
+ "\x5b\x31\x32\x33\x65\x34\x35\x5d",
+ "\x5b\x31\x32\x33\x2e\x34\x35\x36\x65\x37\x38\x5d",
+ "\x5b\x31\x65\x2d\x32\x5d",
+ "\x5b\x31\x65\x2b\x32\x5d",
+ "\x5b\x31\x32\x33\x5d",
+ "\x5b\x31\x32\x33\x2e\x34\x35\x36\x37\x38\x39\x5d",
+ "\x7b\x22\x61\x73\x64\x22\x3a\x22\x73\x64\x66\x22\x2c\x20\x22\x64"
+ "\x66\x67\x22\x3a\x22\x66\x67\x68\x22\x7d",
+ "\x7b\x22\x61\x73\x64\x22\x3a\x22\x73\x64\x66\x22\x7d",
+ "\x7b\x22\x61\x22\x3a\x22\x62\x22\x2c\x22\x61\x22\x3a\x22\x63\x22"
+ "\x7d",
+ "\x7b\x22\x61\x22\x3a\x22\x62\x22\x2c\x22\x61\x22\x3a\x22\x62\x22"
+ "\x7d",
+ "\x7b\x7d",
+ "\x7b\x22\x22\x3a\x30\x7d",
+ "\x7b\x22\x66\x6f\x6f\x5c\x75\x30\x30\x30\x30\x62\x61\x72\x22\x3a"
+ "\x20\x34\x32\x7d",
+ "\x7b\x20\x22\x6d\x69\x6e\x22\x3a\x20\x2d\x31\x2e\x30\x65\x2b\x32"
+ "\x38\x2c\x20\x22\x6d\x61\x78\x22\x3a\x20\x31\x2e\x30\x65\x2b\x32"
+ "\x38\x20\x7d",
+ "\x7b\x22\x78\x22\x3a\x5b\x7b\x22\x69\x64\x22\x3a\x20\x22\x78\x78"
+ "\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78"
+ "\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78"
+ "\x78\x78\x78\x78\x78\x78\x22\x7d\x5d\x2c\x20\x22\x69\x64\x22\x3a"
+ "\x20\x22\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78"
+ "\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78"
+ "\x78\x78\x78\x78\x78\x78\x78\x78\x78\x78\x22\x7d",
+ "\x7b\x22\x61\x22\x3a\x5b\x5d\x7d",
+ "\x7b\x22\x74\x69\x74\x6c\x65\x22\x3a\x22\x5c\x75\x30\x34\x31\x66"
+ "\x5c\x75\x30\x34\x33\x65\x5c\x75\x30\x34\x33\x62\x5c\x75\x30\x34"
+ "\x34\x32\x5c\x75\x30\x34\x33\x65\x5c\x75\x30\x34\x34\x30\x5c\x75"
+ "\x30\x34\x33\x30\x20\x5c\x75\x30\x34\x31\x37\x5c\x75\x30\x34\x33"
+ "\x35\x5c\x75\x30\x34\x33\x63\x5c\x75\x30\x34\x33\x62\x5c\x75\x30"
+ "\x34\x33\x35\x5c\x75\x30\x34\x33\x61\x5c\x75\x30\x34\x33\x65\x5c"
+ "\x75\x30\x34\x33\x66\x5c\x75\x30\x34\x33\x30\x22\x20\x7d",
+ "\x7b\x0a\x22\x61\x22\x3a\x20\x22\x62\x22\x0a\x7d",
+ "\x5b\x22\x5c\x75\x44\x38\x30\x31\x5c\x75\x64\x63\x33\x37\x22\x5d"
+ "",
+ "\x5b\x22\x5c\x75\x30\x30\x36\x30\x5c\x75\x30\x31\x32\x61\x5c\x75"
+ "\x31\x32\x41\x42\x22\x5d",
+ "\x5b\x22\x5c\x75\x64\x38\x33\x64\x5c\x75\x64\x65\x33\x39\x5c\x75"
+ "\x64\x38\x33\x64\x5c\x75\x64\x63\x38\x64\x22\x5d",
+ "\x5b\x22\x5c\x22\x5c\x5c\x5c\x2f\x5c\x62\x5c\x66\x5c\x6e\x5c\x72"
+ "\x5c\x74\x22\x5d",
+ "\x5b\x22\x5c\x5c\x75\x30\x30\x30\x30\x22\x5d",
+ "\x5b\x22\x5c\x22\x22\x5d",
+ "\x5b\x22\x61\x2f\x2a\x62\x2a\x2f\x63\x2f\x2a\x64\x2f\x2f\x65\x22"
+ "\x5d",
+ "\x5b\x22\x5c\x5c\x61\x22\x5d",
+ "\x5b\x22\x5c\x5c\x6e\x22\x5d",
+ "\x5b\x22\x5c\x75\x30\x30\x31\x32\x22\x5d",
+ "\x5b\x22\x5c\x75\x46\x46\x46\x46\x22\x5d",
+ "\x5b\x22\x61\x73\x64\x22\x5d",
+ "\x5b\x22\x6e\x65\x77\x5c\x75\x30\x30\x41\x30\x6c\x69\x6e\x65\x22"
+ "\x5d",
+ "\x5b\x20\x22\x61\x73\x64\x22\x5d",
+ "\x5b\x22\x5c\x75\x44\x42\x46\x46\x5c\x75\x44\x46\x46\x46\x22\x5d"
+ "",
+ "\x5b\x22\xf4\x8f\xbf\xbf\x22\x5d",
+ "\x5b\x22\xf0\x9b\xbf\xbf\x22\x5d",
+ "\x5b\x22\xef\xbf\xbf\x22\x5d",
+ "\x5b\x22\x5c\x75\x30\x30\x30\x30\x22\x5d",
+ "\x5b\x22\x5c\x75\x30\x30\x32\x63\x22\x5d",
+ "\x5b\x22\xcf\x80\x22\x5d",
+ "\x5b\x22\x61\x73\x64\x20\x22\x5d",
+ "\x22\x20\x22",
+ "\x5b\x22\x5c\x75\x44\x38\x33\x34\x5c\x75\x44\x64\x31\x65\x22\x5d"
+ "",
+ "\x5b\x22\x5c\x75\x30\x38\x32\x31\x22\x5d",
+ "\x5b\x22\x5c\x75\x30\x31\x32\x33\x22\x5d",
+ "\x5b\x22\xe2\x80\xa8\x22\x5d",
+ "\x5b\x22\xe2\x80\xa9\x22\x5d",
+ "\x5b\x22\x5c\x75\x30\x30\x36\x31\x5c\x75\x33\x30\x61\x66\x5c\x75"
+ "\x33\x30\x45\x41\x5c\x75\x33\x30\x62\x39\x22\x5d",
+ "\x5b\x22\x6e\x65\x77\x5c\x75\x30\x30\x30\x41\x6c\x69\x6e\x65\x22"
+ "\x5d",
+ "\x5b\x22\x7f\x22\x5d",
+ "\x5b\x22\x5c\x75\x41\x36\x36\x44\x22\x5d",
+ "\x5b\x22\x5c\x75\x30\x30\x35\x43\x22\x5d",
+ "\x5b\x22\xe2\x8d\x82\xe3\x88\xb4\xe2\x8d\x82\x22\x5d",
+ "\x5b\x22\x5c\x75\x44\x42\x46\x46\x5c\x75\x44\x46\x46\x45\x22\x5d"
+ "",
+ "\x5b\x22\x5c\x75\x44\x38\x33\x46\x5c\x75\x44\x46\x46\x45\x22\x5d"
+ "",
+ "\x5b\x22\xe2\x82\xac\xf0\x9d\x84\x9e\x22\x5d",
+ "\x5b\x22\x5c\x75\x32\x30\x30\x42\x22\x5d",
+ "\x5b\x22\x5c\x75\x32\x30\x36\x34\x22\x5d",
+ "\x5b\x22\x5c\x75\x46\x44\x44\x30\x22\x5d",
+ "\x5b\x22\x5c\x75\x46\x46\x46\x45\x22\x5d",
+ "\x5b\x22\x5c\x75\x30\x30\x32\x32\x22\x5d",
+ "\x5b\x22\x61\x7f\x61\x22\x5d",
+ "\x66\x61\x6c\x73\x65",
+ "\x34\x32",
+ "\x2d\x30\x2e\x31",
+ "\x6e\x75\x6c\x6c",
+ "\x22\x61\x73\x64\x22",
+ "\x74\x72\x75\x65",
+ "\x22\x22",
+ "\x5b\x22\x61\x22\x5d\x0a",
+ "\x5b\x74\x72\x75\x65\x5d",
+ "\x20\x5b\x5d\x20",
+ NULL
+};
+const char *bad[] = {
+ "\x5b\x31\x20\x74\x72\x75\x65\x5d",
+ "\x5b\x61\xe5\x5d",
+ "\x5b\x22\x22\x3a\x20\x31\x5d",
+ "\x5b\x22\x22\x5d\x2c",
+ "\x5b\x2c\x31\x5d",
+ "\x5b\x31\x2c\x2c\x32\x5d",
+ "\x5b\x22\x78\x22\x2c\x2c\x5d",
+ "\x5b\x22\x78\x22\x5d\x5d",
+ "\x5b\x22\x22\x2c\x5d",
+ "\x5b\x22\x78\x22",
+ "\x5b\xff\x5d",
+ "\x5b\x78",
+ "\x5b\x33\x5b\x34\x5d\x5d",
+ "\x5b\x31\x3a\x32\x5d",
+ "\x5b\x2c\x5d",
+ "\x5b\x2d\x5d",
+ "\x5b\x20\x20\x20\x2c\x20\x22\x22\x5d",
+ "\x5b\x22\x61\x22\x2c\x0a\x34\x0a\x2c\x31\x2c",
+ "\x5b\x31\x2c\x5d",
+ "\x5b\x31\x2c\x2c\x5d",
+ "\x5b\x22\x0b\x61\x22\x5c\x66\x5d",
+ "\x5b\x2a\x5d",
+ "\x5b\x22\x22",
+ "\x5b\x31\x2c",
+ "\x5b\x31\x2c\x0a\x31\x0a\x2c\x31",
+ "\x5b\x7b\x7d",
+ "\x5b\x66\x61\x6c\x73\x5d",
+ "\x5b\x6e\x75\x6c\x5d",
+ "\x5b\x74\x72\x75\x5d",
+ "\x5b\x2b\x2b\x31\x32\x33\x34\x5d",
+ "\x5b\x2b\x31\x5d",
+ "\x5b\x2b\x49\x6e\x66\x5d",
+ "\x5b\x2d\x30\x31\x5d",
+ "\x5b\x2d\x31\x2e\x30\x2e\x5d",
+ "\x5b\x2d\x32\x2e\x5d",
+ "\x5b\x2d\x4e\x61\x4e\x5d",
+ "\x5b\x2e\x2d\x31\x5d",
+ "\x5b\x2e\x32\x65\x2d\x33\x5d",
+ "\x5b\x30\x2e\x31\x2e\x32\x5d",
+ "\x5b\x30\x2e\x33\x65\x2b\x5d",
+ "\x5b\x30\x2e\x33\x65\x5d",
+ "\x5b\x30\x2e\x65\x31\x5d",
+ "\x5b\x30\x45\x2b\x5d",
+ "\x5b\x30\x45\x5d",
+ "\x5b\x30\x65\x2b\x5d",
+ "\x5b\x30\x65\x5d",
+ "\x5b\x31\x2e\x30\x65\x2b\x5d",
+ "\x5b\x31\x2e\x30\x65\x2d\x5d",
+ "\x5b\x31\x2e\x30\x65\x5d",
+ "\x5b\x31\x20\x30\x30\x30\x2e\x30\x5d",
+ "\x5b\x31\x65\x45\x32\x5d",
+ "\x5b\x32\x2e\x65\x2b\x33\x5d",
+ "\x5b\x32\x2e\x65\x2d\x33\x5d",
+ "\x5b\x32\x2e\x65\x33\x5d",
+ "\x5b\x39\x2e\x65\x2b\x5d",
+ "\x5b\x49\x6e\x66\x5d",
+ "\x5b\x4e\x61\x4e\x5d",
+ "\x5b\xef\xbc\x91\x5d",
+ "\x5b\x31\x2b\x32\x5d",
+ "\x5b\x30\x78\x31\x5d",
+ "\x5b\x30\x78\x34\x32\x5d",
+ "\x5b\x49\x6e\x66\x69\x6e\x69\x74\x79\x5d",
+ "\x5b\x30\x65\x2b\x2d\x31\x5d",
+ "\x5b\x2d\x31\x32\x33\x2e\x31\x32\x33\x66\x6f\x6f\x5d",
+ "\x5b\x31\x32\x33\xe5\x5d",
+ "\x5b\x31\x65\x31\xe5\x5d",
+ "\x5b\x30\xe5\x5d\x0a",
+ "\x5b\x2d\x49\x6e\x66\x69\x6e\x69\x74\x79\x5d",
+ "\x5b\x2d\x66\x6f\x6f\x5d",
+ "\x5b\x2d\x20\x31\x5d",
+ "\x5b\x2d\x30\x31\x32\x5d",
+ "\x5b\x2d\x2e\x31\x32\x33\x5d",
+ "\x5b\x2d\x31\x78\x5d",
+ "\x5b\x31\x65\x61\x5d",
+ "\x5b\x31\x65\xe5\x5d",
+ "\x5b\x31\x2e\x5d",
+ "\x5b\x2e\x31\x32\x33\x5d",
+ "\x5b\x31\x2e\x32\x61\x2d\x33\x5d",
+ "\x5b\x31\x2e\x38\x30\x31\x31\x36\x37\x30\x30\x33\x33\x33\x37\x36"
+ "\x35\x31\x34\x48\x2d\x33\x30\x38\x5d",
+ "\x5b\x30\x31\x32\x5d",
+ "\x5b\x22\x78\x22\x2c\x20\x74\x72\x75\x74\x68\x5d",
+ "\x7b\x5b\x3a\x20\x22\x78\x22\x7d\x0a",
+ "\x7b\x22\x78\x22\x2c\x20\x6e\x75\x6c\x6c\x7d",
+ "\x7b\x22\x78\x22\x3a\x3a\x22\x62\x22\x7d",
+ "\x7b\xf0\x9f\x87\xa8\xf0\x9f\x87\xad\x7d",
+ "\x7b\x22\x61\x22\x3a\x22\x61\x22\x20\x31\x32\x33\x7d",
+ "\x7b\x6b\x65\x79\x3a\x20\x27\x76\x61\x6c\x75\x65\x27\x7d",
+ "\x7b\x22\x61\x22\x20\x62\x7d",
+ "\x7b\x3a\x22\x62\x22\x7d",
+ "\x7b\x22\x61\x22\x20\x22\x62\x22\x7d",
+ "\x7b\x22\x61\x22\x3a",
+ "\x7b\x22\x61\x22",
+ "\x7b\x31\x3a\x31\x7d",
+ "\x7b\x39\x39\x39\x39\x45\x39\x39\x39\x39\x3a\x31\x7d",
+ "\x7b\x22\xb9\x22\x3a\x22\x30\x22\x2c\x7d",
+ "\x7b\x6e\x75\x6c\x6c\x3a\x6e\x75\x6c\x6c\x2c\x6e\x75\x6c\x6c\x3a"
+ "\x6e\x75\x6c\x6c\x7d",
+ "\x7b\x22\x69\x64\x22\x3a\x30\x2c\x2c\x2c\x2c\x2c\x7d",
+ "\x7b\x27\x61\x27\x3a\x30\x7d",
+ "\x7b\x22\x69\x64\x22\x3a\x30\x2c\x7d",
+ "\x7b\x22\x61\x22\x3a\x22\x62\x22\x7d\x2f\x2a\x2a\x2f",
+ "\x7b\x22\x61\x22\x3a\x22\x62\x22\x7d\x2f\x2a\x2a\x2f\x2f",
+ "\x7b\x22\x61\x22\x3a\x22\x62\x22\x7d\x2f\x2f",
+ "\x7b\x22\x61\x22\x3a\x22\x62\x22\x7d\x2f",
+ "\x7b\x22\x61\x22\x3a\x22\x62\x22\x2c\x2c\x22\x63\x22\x3a\x22\x64"
+ "\x22\x7d",
+ "\x7b\x61\x3a\x20\x22\x62\x22\x7d",
+ "\x7b\x22\x61\x22\x3a\x22\x61",
+ "\x7b\x20\x22\x66\x6f\x6f\x22\x20\x3a\x20\x22\x62\x61\x72\x22\x2c"
+ "\x20\x22\x61\x22\x20\x7d",
+ "\x7b\x22\x61\x22\x3a\x22\x62\x22\x7d\x23",
+ "\x20",
+ "\x5b\x22\x5c\x75\x44\x38\x30\x30\x5c\x22\x5d",
+ "\x5b\x22\x5c\x75\x44\x38\x30\x30\x5c\x75\x22\x5d",
+ "\x5b\x22\x5c\x75\x44\x38\x30\x30\x5c\x75\x31\x22\x5d",
+ "\x5b\x22\x5c\x75\x44\x38\x30\x30\x5c\x75\x31\x78\x22\x5d",
+ "\x5b\xc3\xa9\x5d",
+ "\x5b\x22\x5c\x78\x30\x30\x22\x5d",
+ "\x5b\x22\x5c\x5c\x5c\x22\x5d",
+ "\x5b\x22\x5c\x09\x22\x5d",
+ "\x5b\x22\x5c\xf0\x9f\x8c\x80\x22\x5d",
+ "\x5b\x22\x5c\x22\x5d",
+ "\x5b\x22\x5c\x75\x30\x30\x41\x22\x5d",
+ "\x5b\x22\x5c\x75\x44\x38\x33\x34\x5c\x75\x44\x64\x22\x5d",
+ "\x5b\x22\x5c\x75\x44\x38\x30\x30\x5c\x75\x44\x38\x30\x30\x5c\x78"
+ "\x22\x5d",
+ "\x5b\x22\x5c\x75\xe5\x22\x5d",
+ "\x5b\x22\x5c\x61\x22\x5d",
+ "\x5b\x22\x5c\x75\x71\x71\x71\x71\x22\x5d",
+ "\x5b\x22\x5c\xe5\x22\x5d",
+ "\x5b\x5c\x75\x30\x30\x32\x30\x22\x61\x73\x64\x22\x5d",
+ "\x5b\x5c\x6e\x5d",
+ "\x22",
+ "\x5b\x27\x73\x69\x6e\x67\x6c\x65\x20\x71\x75\x6f\x74\x65\x27\x5d"
+ "",
+ "\x61\x62\x63",
+ "\x5b\x22\x5c",
+ "\x5b\x22\x6e\x65\x77\x0a\x6c\x69\x6e\x65\x22\x5d",
+ "\x5b\x22\x09\x22\x5d",
+ "\x22\x5c\x55\x41\x36\x36\x44\x22",
+ "\x22\x22\x78",
+ "\x5b\xe2\x81\xa0\x5d",
+ "\xef\xbb\xbf",
+ "\x3c\x2e\x3e",
+ "\x5b\x3c\x6e\x75\x6c\x6c\x3e\x5d",
+ "\x5b\x31\x5d\x78",
+ "\x5b\x31\x5d\x5d",
+ "\x5b\x22\x61\x73\x64\x5d",
+ "\x61\xc3\xa5",
+ "\x5b\x54\x72\x75\x65\x5d",
+ "\x31\x5d",
+ "\x7b\x22\x78\x22\x3a\x20\x74\x72\x75\x65\x2c",
+ "\x5b\x5d\x5b\x5d",
+ "\x5d",
+ "\xef\xbb\x7b\x7d",
+ "\xe5",
+ "\x5b",
+ "",
+ "\x32\x40",
+ "\x7b\x7d\x7d",
+ "\x7b\x22\x22\x3a",
+ "\x7b\x22\x61\x22\x3a\x2f\x2a\x63\x6f\x6d\x6d\x65\x6e\x74\x2a\x2f"
+ "\x22\x62\x22\x7d",
+ "\x7b\x22\x61\x22\x3a\x20\x74\x72\x75\x65\x7d\x20\x22\x78\x22",
+ "\x5b\x27",
+ "\x5b\x2c",
+ "\x5b\x7b",
+ "\x5b\x22\x61",
+ "\x5b\x22\x61\x22",
+ "\x7b",
+ "\x7b\x5d",
+ "\x7b\x2c",
+ "\x7b\x5b",
+ "\x7b\x22\x61",
+ "\x7b\x27\x61\x27",
+ "\x5b\x22\x5c\x7b\x5b\x22\x5c\x7b\x5b\x22\x5c\x7b\x5b\x22\x5c\x7b"
+ "",
+ "\xe9",
+ "\x2a",
+ "\x7b\x22\x61\x22\x3a\x22\x62\x22\x7d\x23\x7b\x7d",
+ "\x5b\x5c\x75\x30\x30\x30\x41\x22\x22\x5d",
+ "\x5b\x31",
+ "\x5b\x20\x66\x61\x6c\x73\x65\x2c\x20\x6e\x75\x6c",
+ "\x5b\x20\x74\x72\x75\x65\x2c\x20\x66\x61\x6c\x73",
+ "\x5b\x20\x66\x61\x6c\x73\x65\x2c\x20\x74\x72\x75",
+ "\x7b\x22\x61\x73\x64\x22\x3a\x22\x61\x73\x64\x22",
+ "\xc3\xa5",
+ "\x5b\xe2\x81\xa0\x5d",
+ "\x5b\x0c\x5d",
+ NULL
+};
+
+static void
+test_good(const char *j)
{
- int fd;
- struct stat st;
- char *p, *e;
- ssize_t sz;
struct vjsn *js;
+ const char *err;
- AN(fn);
- AN(err);
- *err = NULL;
- fd = open(fn, O_RDONLY);
- if (fd < 0) {
- *err = strerror(errno);
- return (NULL);
- }
- AZ(fstat(fd, &st));
- if (!S_ISREG(st.st_mode)) {
- AZ(close(fd));
- *err = "Not a regular file";
- return (NULL);
- }
-
- if (st.st_size == 0) {
- AZ(close(fd));
- *err = "Empty file";
- return (NULL);
- }
-
- p = malloc(st.st_size + 1);
- AN(p);
-
- sz = read(fd, p, st.st_size + 1);
- if (sz < 0) {
- *err = strerror(errno);
- AZ(close(fd));
- free(p);
- return (NULL);
- }
- AZ(close(fd));
-
- if (sz < st.st_size) {
- free(p);
- *err = "Short read";
- return (NULL);
+ js = vjsn_parse(j, &err);
+ if (js == NULL || err != NULL) {
+ fprintf(stderr, "Parse error: %s\n%s\n", err, j);
+ exit(1);
}
+ printf("GOOD: %s\n", j);
+ vjsn_dump(js, stdout);
+ vjsn_delete(&js);
+}
- if (sz > st.st_size) {
- free(p);
- *err = "Long read";
- return (NULL);
- }
-
- p[sz] = '\0';
- e = p + sz;
-
- ALLOC_OBJ(js, VJSN_MAGIC);
- AN(js);
- js->raw = p;
- js->ptr = p;
-
- js->value = vjsn_value(js);
- if (js->err != NULL) {
- *err = js->err;
- vjsn_delete(&js);
- return (NULL);
- }
+static void
+test_bad(const char *j)
+{
+ struct vjsn *js;
+ const char *err;
- vjsn_skip_ws(js);
- if (js->ptr != e) {
- *err = "Garbage after value";
- vjsn_delete(&js);
- return (NULL);
+ js = vjsn_parse(j, &err);
+ if (js != NULL || err == NULL) {
+ fprintf(stderr, "Parse succeeded %s\n", j);
+ exit(1);
}
- return (js);
+ printf("BAD: %s %s\n", err, j);
}
-
-static const char * const fnx = "tst.vjsn";
-
int
main(int argc, char **argv)
{
- struct vjsn *js;
- const char *err;
-
- if (argc == 1)
- js = vjsn_file(fnx, &err);
- else
- js = vjsn_file(argv[1], &err);
- if (err != NULL) {
- fprintf(stderr, "ERROR: %s\n", err);
- AZ(js);
- return (1);
- } else {
- if (0)
- vjsn_dump(js, stdout);
- vjsn_delete(&js);
- }
+ const char **s;
+
+ (void)argc;
+ (void)argv;
+ for(s = good; *s != NULL; s++)
+ test_good(*s);
+ for(s = bad; *s != NULL; s++)
+ test_bad(*s);
return (0);
}
More information about the varnish-commit
mailing list