Example #1
0
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);

    return done_testing();
}
Example #2
0
File: main.c Project: Debug-Orz/h2o
int main(int argc, char **argv)
{
    static struct option longopts[] = {
        { "conf", required_argument, NULL, 'c' },
        { "help", no_argument, NULL, 'h' },
        { NULL, 0, NULL, 0 }
    };

    static struct config_t config = {
        {}, /* global_config */
        NULL, /* listeners */
        0, /* num_listeners */
        1024, /* max_connections */
        1, /* num_threads */
        NULL, /* thread_ids */
        {}, /* state */
    };

    const char *config_file = "h2o.conf";
    int opt_ch;
    yoml_t *config_yoml;

    h2o_config_init(&config.global_config);
    config.global_config.close_cb = on_close;

    {
        h2o_configurator_t *c = h2o_config_create_configurator(&config.global_config, sizeof(*c));
        c->exit = on_config_listen_exit;
        h2o_config_define_command(
            c, "listen", H2O_CONFIGURATOR_FLAG_GLOBAL,
            on_config_listen,
            "port at which the server should listen for incoming requests (mandatory)",
            " - if the value is a scalar, it is treated as the port number (or as the",
            "   service name)",
            " - if the value is a mapping, following properties are recognized:",
            "     port: incoming port number or service name (mandatory)",
            "     host: incoming address (default: any address)",
            "     ssl:  if using SSL (default: none)",
            "       certificate-file: path of the certificate file",
            "       key-file:         path of the key file");
        h2o_config_define_command(
            c, "max-connections", H2O_CONFIGURATOR_FLAG_GLOBAL,
            on_config_max_connections,
            "max connections (default: 1024)");
        h2o_config_define_command(
            c, "num-threads", H2O_CONFIGURATOR_FLAG_GLOBAL,
            on_config_num_threads,
            "number of worker threads (default: 1)");
    }

    h2o_access_log_register_configurator(&config.global_config);
    h2o_file_register_configurator(&config.global_config);
    h2o_proxy_register_configurator(&config.global_config);

    /* parse options */
    while ((opt_ch = getopt_long(argc, argv, "c:h", longopts, NULL)) != -1) {
        switch (opt_ch) {
        case 'c':
            config_file = optarg;
            break;
        case 'h':
            usage(&config.global_config);
            exit(0);
            break;
        default:
            assert(0);
            break;
        }
    }
    argc -= optind;
    argv += optind;

    /* configure */
    if ((config_yoml = load_config(config_file)) == NULL)
        exit(EX_CONFIG);
    if (h2o_config_configure(&config.global_config, config_file, config_yoml) != 0)
        exit(EX_CONFIG);
    yoml_free(config_yoml);

    setup_signal_handlers();

    if (config.num_threads <= 1) {
        run_loop(&config);
    } else {
        config.thread_ids = alloca(sizeof(pthread_t) * config.num_threads);
        unsigned i;
        for (i = 0; i != config.num_threads; ++i) {
            pthread_create(config.thread_ids + i, NULL, run_loop, &config);
        }
        for (i = 0; i < config.num_threads; ++i) {
            pthread_join(config.thread_ids[i], NULL);
        }
    }

    return 0;
}
Example #3
0
File: main.c Project: Gwill/h2o
int main(int argc, char **argv)
{
    static struct option longopts[] = {
        { "conf", required_argument, NULL, 'c' },
        { "help", no_argument, NULL, 'h' },
        { NULL, 0, NULL, 0 }
    };
    static struct port_configurator_t port_configurator = {
        { {}, "port", NULL, on_config_port, on_config_port_complete, on_config_port_context_create },
        0
    };
    static struct num_threads_configurator_t num_threads_configurator = {
        { {}, "num-threads", NULL, on_config_num_threads, NULL, NULL },
        1 /* default number of threads is 1 */
    };

    const char *config_file = "h2o.conf";
    int opt_ch;
    yoml_t *config_yoml;
    h2o_global_configuration_t config;

    /* parse options */
    while ((opt_ch = getopt_long(argc, argv, "c:h", longopts, NULL)) != -1) {
        switch (opt_ch) {
        case 'c':
            config_file = optarg;
            break;
        case 'h':
            usage();
            exit(0);
            break;
        default:
            assert(0);
            break;
        }
    }
    argc -= optind;
    argv += optind;

    /* configure */
    h2o_config_init(&config);
    h2o_linklist_insert(&config.global_configurators, &port_configurator.super._link);
    h2o_linklist_insert(&config.global_configurators, &num_threads_configurator.super._link);
    if ((config_yoml = load_config(config_file)) == NULL)
        exit(EX_CONFIG);
    if (h2o_config_configure(&config, config_file, config_yoml) != 0)
        exit(EX_CONFIG);
    yoml_free(config_yoml);

    if (num_threads_configurator.num_threads <= 1) {
        run_loop(&config);
    } else {
        pthread_t *tids = alloca(sizeof(pthread_t) * num_threads_configurator.num_threads);
        unsigned i;
        for (i = 0; i != num_threads_configurator.num_threads; ++i) {
            pthread_create(tids + i, NULL, run_loop, &config);
        }
        for (i = 0; i < num_threads_configurator.num_threads; ++i) {
            pthread_join(tids[i], NULL);
        }
    }

    return 0;
}