From be1c7e50e1e8809ea56f2c9d472eccd8ffd73a97 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 04:57:58 +0200 Subject: Adding upstream version 1.44.3. Signed-off-by: Daniel Baumann --- web/server/h2o/libh2o/deps/yoml/test-yoml.c | 278 ++++++++++++++++++++++++++++ 1 file changed, 278 insertions(+) create mode 100644 web/server/h2o/libh2o/deps/yoml/test-yoml.c (limited to 'web/server/h2o/libh2o/deps/yoml/test-yoml.c') diff --git a/web/server/h2o/libh2o/deps/yoml/test-yoml.c b/web/server/h2o/libh2o/deps/yoml/test-yoml.c new file mode 100644 index 00000000..d154138c --- /dev/null +++ b/web/server/h2o/libh2o/deps/yoml/test-yoml.c @@ -0,0 +1,278 @@ +/* + * Copyright (c) 2014 DeNA Co., Ltd. + * + * 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. + */ +#include +#include "yoml.h" +#include "yoml-parser.h" + +#include "picotest.h" + +static yoml_t *parse(const char *fn, const char *s) +{ + yaml_parser_t parser; + yoml_t *doc; + + yaml_parser_initialize(&parser); + yaml_parser_set_input_string(&parser, (yaml_char_t*)s, strlen(s)); + doc = yoml_parse_document(&parser, NULL, NULL, fn); + yaml_parser_delete(&parser); + + return doc; +} + +static yoml_t *get_value(yoml_t *mapping, const char *key) +{ + size_t i; + for (i = 0; i != mapping->data.mapping.size; ++i) + if (mapping->data.mapping.elements[i].key->type == YOML_TYPE_SCALAR && + strcmp(mapping->data.mapping.elements[i].key->data.scalar, key) == 0) + return mapping->data.mapping.elements[i].value; + return NULL; +} + +int main(int argc, char **argv) +{ + yoml_t *doc, *t; + size_t i; + + doc = parse("foo.yaml", "abc"); + ok(doc != NULL); + ok(strcmp(doc->filename, "foo.yaml") == 0); + ok(doc->type == YOML_TYPE_SCALAR); + ok(strcmp(doc->data.scalar, "abc") == 0); + yoml_free(doc, NULL); + + doc = parse( + "foo.yaml", + "---\n" + "a: b\n" + "c: d\n" + "---\n" + "e: f\n"); + ok(doc != NULL); + ok(strcmp(doc->filename, "foo.yaml") == 0); + ok(doc->type == YOML_TYPE_MAPPING); + ok(doc->data.mapping.size == 2); + t = doc->data.mapping.elements[0].key; + ok(strcmp(t->filename, "foo.yaml") == 0); + ok(t->type == YOML_TYPE_SCALAR); + ok(strcmp(t->data.scalar, "a") == 0); + t = doc->data.mapping.elements[0].value; + ok(strcmp(t->filename, "foo.yaml") == 0); + ok(t->type == YOML_TYPE_SCALAR); + ok(strcmp(t->data.scalar, "b") == 0); + t = doc->data.mapping.elements[1].key; + ok(strcmp(t->filename, "foo.yaml") == 0); + ok(t->type == YOML_TYPE_SCALAR); + ok(strcmp(t->data.scalar, "c") == 0); + t = doc->data.mapping.elements[1].value; + ok(strcmp(t->filename, "foo.yaml") == 0); + ok(t->type == YOML_TYPE_SCALAR); + ok(strcmp(t->data.scalar, "d") == 0); + yoml_free(doc, NULL); + + doc = parse( + "bar.yaml", + "- a: b\n" + " c: d\n" + "- e\n"); + ok(doc != NULL); + ok(strcmp(doc->filename, "bar.yaml") == 0); + ok(doc->type == YOML_TYPE_SEQUENCE); + ok(doc->data.sequence.size == 2); + t = doc->data.sequence.elements[0]; + ok(strcmp(doc->filename, "bar.yaml") == 0); + ok(t->type == YOML_TYPE_MAPPING); + ok(t->data.mapping.size == 2); + t = doc->data.sequence.elements[0]->data.mapping.elements[0].key; + ok(strcmp(doc->filename, "bar.yaml") == 0); + ok(t->type == YOML_TYPE_SCALAR); + ok(strcmp(t->data.scalar, "a") == 0); + t = doc->data.sequence.elements[0]->data.mapping.elements[0].value; + ok(strcmp(doc->filename, "bar.yaml") == 0); + ok(t->type == YOML_TYPE_SCALAR); + ok(strcmp(t->data.scalar, "b") == 0); + t = doc->data.sequence.elements[0]->data.mapping.elements[1].key; + ok(strcmp(doc->filename, "bar.yaml") == 0); + ok(t->type == YOML_TYPE_SCALAR); + ok(strcmp(t->data.scalar, "c") == 0); + t = doc->data.sequence.elements[0]->data.mapping.elements[1].value; + ok(strcmp(doc->filename, "bar.yaml") == 0); + ok(t->type == YOML_TYPE_SCALAR); + ok(strcmp(t->data.scalar, "d") == 0); + t = doc->data.sequence.elements[1]; + ok(strcmp(doc->filename, "bar.yaml") == 0); + ok(t->type == YOML_TYPE_SCALAR); + ok(strcmp(t->data.scalar, "e") == 0); + yoml_free(doc, NULL); + + doc = parse( + "baz.yaml", + "- &abc\n" + " - 1\n" + " - 2\n" + "- *abc\n"); + ok(doc != NULL); + ok(strcmp(doc->filename, "baz.yaml") == 0); + ok(doc->type == YOML_TYPE_SEQUENCE); + ok(doc->data.sequence.size == 2); + ok(doc->data.sequence.elements[0] == doc->data.sequence.elements[1]); + t = doc->data.sequence.elements[0]; + ok(strcmp(t->filename, "baz.yaml") == 0); + ok(t->_refcnt == 2); + ok(t->type == YOML_TYPE_SEQUENCE); + ok(t->data.sequence.size == 2); + t = doc->data.sequence.elements[0]->data.sequence.elements[0]; + ok(strcmp(t->filename, "baz.yaml") == 0); + ok(t->type == YOML_TYPE_SCALAR); + ok(strcmp(t->data.scalar, "1") == 0); + t = doc->data.sequence.elements[0]->data.sequence.elements[1]; + ok(strcmp(t->filename, "baz.yaml") == 0); + ok(t->type == YOML_TYPE_SCALAR); + ok(strcmp(t->data.scalar, "2") == 0); + + doc = parse( + "foo.yaml", + "- &link\n" + " x: 1\n" + " y: 2\n" + "- <<: *link\n" + " y: 3\n"); + ok(doc != NULL); + ok(doc->type == YOML_TYPE_SEQUENCE); + ok(doc->data.sequence.size == 2); + ok(doc->data.sequence.elements[0]->type == YOML_TYPE_MAPPING); + ok(doc->data.sequence.elements[0]->data.mapping.size == 2); + ok(doc->data.sequence.elements[0]->data.mapping.elements[0].key->type == YOML_TYPE_SCALAR); + ok(strcmp(doc->data.sequence.elements[0]->data.mapping.elements[0].key->data.scalar, "x") == 0); + ok(doc->data.sequence.elements[0]->data.mapping.elements[0].value->type == YOML_TYPE_SCALAR); + ok(strcmp(doc->data.sequence.elements[0]->data.mapping.elements[0].value->data.scalar, "1") == 0); + ok(doc->data.sequence.elements[0]->data.mapping.elements[1].key->type == YOML_TYPE_SCALAR); + ok(strcmp(doc->data.sequence.elements[0]->data.mapping.elements[1].key->data.scalar, "y") == 0); + ok(doc->data.sequence.elements[0]->data.mapping.elements[1].value->type == YOML_TYPE_SCALAR); + ok(strcmp(doc->data.sequence.elements[0]->data.mapping.elements[1].value->data.scalar, "2") == 0); + ok(doc->data.sequence.elements[1]->data.mapping.elements[0].key->type == YOML_TYPE_SCALAR); + ok(strcmp(doc->data.sequence.elements[1]->data.mapping.elements[0].key->data.scalar, "x") == 0); + ok(doc->data.sequence.elements[1]->data.mapping.elements[0].value->type == YOML_TYPE_SCALAR); + ok(strcmp(doc->data.sequence.elements[1]->data.mapping.elements[0].value->data.scalar, "1") == 0); + ok(doc->data.sequence.elements[1]->data.mapping.elements[1].key->type == YOML_TYPE_SCALAR); + ok(strcmp(doc->data.sequence.elements[1]->data.mapping.elements[1].key->data.scalar, "y") == 0); + ok(doc->data.sequence.elements[1]->data.mapping.elements[1].value->type == YOML_TYPE_SCALAR); + ok(strcmp(doc->data.sequence.elements[1]->data.mapping.elements[1].value->data.scalar, "3") == 0); + + doc = parse( + "foo.yaml", + "- &CENTER { x: 1, y: 2 }\n" + "- &LEFT { x: 0, y: 2 }\n" + "- &BIG { r: 10 }\n" + "- &SMALL { r: 1 }\n" + "- # Explicit keys\n" + " x: 1\n" + " y: 2\n" + " r: 10\n" + "- # Merge one map\n" + " << : *CENTER\n" + " r: 10\n" + "- # Merge multiple maps\n" + " << : [ *CENTER, *BIG ]\n" + "- # Override\n" + " << : [ *BIG, *LEFT, *SMALL ]\n" + " x: 1\n"); + ok(doc != NULL); + ok(doc->type == YOML_TYPE_SEQUENCE); + for (i = 4; i <= 7; ++i) { + ok(doc->data.sequence.elements[i]->type == YOML_TYPE_MAPPING); + ok(doc->data.sequence.elements[i]->data.mapping.size == 3); + t = get_value(doc->data.sequence.elements[i], "x"); + ok(t != NULL); + ok(t->type == YOML_TYPE_SCALAR); + ok(strcmp(t->data.scalar, "1") == 0); + t = get_value(doc->data.sequence.elements[i], "y"); + ok(t != NULL); + ok(t->type == YOML_TYPE_SCALAR); + ok(strcmp(t->data.scalar, "2") == 0); + t = get_value(doc->data.sequence.elements[i], "r"); + ok(t != NULL); + ok(t->type == YOML_TYPE_SCALAR); + ok(strcmp(t->data.scalar, "10") == 0); + } + + doc = parse( + "foo.yaml", + "- &link\n" + " x: 1\n" + " x: 2\n" + "-\n" + " x: 3\n" + " <<: *link\n"); + ok(doc != NULL); + ok(doc->type == YOML_TYPE_SEQUENCE); + ok(doc->data.sequence.size == 2); + ok(doc->data.sequence.elements[0]->type == YOML_TYPE_MAPPING); + ok(doc->data.sequence.elements[0]->data.mapping.size == 2); + ok(doc->data.sequence.elements[0]->data.mapping.elements[0].key->type == YOML_TYPE_SCALAR); + ok(strcmp(doc->data.sequence.elements[0]->data.mapping.elements[0].key->data.scalar, "x") == 0); + ok(doc->data.sequence.elements[0]->data.mapping.elements[0].value->type == YOML_TYPE_SCALAR); + ok(strcmp(doc->data.sequence.elements[0]->data.mapping.elements[0].value->data.scalar, "1") == 0); + ok(doc->data.sequence.elements[0]->data.mapping.elements[1].key->type == YOML_TYPE_SCALAR); + ok(strcmp(doc->data.sequence.elements[0]->data.mapping.elements[1].key->data.scalar, "x") == 0); + ok(doc->data.sequence.elements[0]->data.mapping.elements[1].value->type == YOML_TYPE_SCALAR); + ok(strcmp(doc->data.sequence.elements[0]->data.mapping.elements[1].value->data.scalar, "2") == 0); + ok(doc->data.sequence.elements[1]->data.mapping.size == 3); + ok(doc->data.sequence.elements[1]->data.mapping.elements[0].key->type == YOML_TYPE_SCALAR); + ok(strcmp(doc->data.sequence.elements[1]->data.mapping.elements[0].key->data.scalar, "x") == 0); + ok(doc->data.sequence.elements[1]->data.mapping.elements[0].value->type == YOML_TYPE_SCALAR); + ok(strcmp(doc->data.sequence.elements[1]->data.mapping.elements[0].value->data.scalar, "3") == 0); + ok(doc->data.sequence.elements[1]->data.mapping.elements[1].key->type == YOML_TYPE_SCALAR); + ok(strcmp(doc->data.sequence.elements[1]->data.mapping.elements[1].key->data.scalar, "x") == 0); + ok(doc->data.sequence.elements[1]->data.mapping.elements[1].value->type == YOML_TYPE_SCALAR); + ok(strcmp(doc->data.sequence.elements[1]->data.mapping.elements[1].value->data.scalar, "1") == 0); + ok(doc->data.sequence.elements[1]->data.mapping.elements[2].key->type == YOML_TYPE_SCALAR); + ok(strcmp(doc->data.sequence.elements[1]->data.mapping.elements[2].key->data.scalar, "x") == 0); + ok(doc->data.sequence.elements[1]->data.mapping.elements[2].value->type == YOML_TYPE_SCALAR); + ok(strcmp(doc->data.sequence.elements[1]->data.mapping.elements[2].value->data.scalar, "2") == 0); + + doc = parse( + "foo.yaml", + "a: &link1\n" + " x: 1\n" + "b: &link2\n" + " <<: *link1\n" + " y: 2\n" + "c:\n" + " <<: *link2\n" + ); + ok(doc != NULL); + ok(doc->type == YOML_TYPE_MAPPING); + ok(doc->data.mapping.size == 3); + ok(doc->data.mapping.elements[2].value->type == YOML_TYPE_MAPPING); + ok(doc->data.mapping.elements[2].value->data.mapping.size == 2); + ok(doc->data.mapping.elements[2].value->data.mapping.elements[0].key->type == YOML_TYPE_SCALAR); + ok(strcmp(doc->data.mapping.elements[2].value->data.mapping.elements[0].key->data.scalar, "x") == 0); + ok(doc->data.mapping.elements[2].value->data.mapping.elements[0].value->type == YOML_TYPE_SCALAR); + ok(strcmp(doc->data.mapping.elements[2].value->data.mapping.elements[0].value->data.scalar, "1") == 0); + ok(doc->data.mapping.elements[2].value->data.mapping.elements[1].key->type == YOML_TYPE_SCALAR); + ok(strcmp(doc->data.mapping.elements[2].value->data.mapping.elements[1].key->data.scalar, "y") == 0); + ok(doc->data.mapping.elements[2].value->data.mapping.elements[1].value->type == YOML_TYPE_SCALAR); + ok(strcmp(doc->data.mapping.elements[2].value->data.mapping.elements[1].value->data.scalar, "2") == 0); + + return done_testing(); +} -- cgit v1.2.3