Blame tests/api/test_dict.c

Packit 8fb591
/*
Packit 8fb591
 * @file test_dict.c
Packit 8fb591
 * @author: Mislav Novakovic <mislav.novakovic@sartura.hr>
Packit 8fb591
 * @brief unit tests for functions from dict.h header
Packit 8fb591
 *
Packit 8fb591
 * Copyright (C) 2016 Deutsche Telekom AG.
Packit 8fb591
 *
Packit 8fb591
 * Author: Mislav Novakovic <mislav.novakovic@sartura.hr>
Packit 8fb591
 *
Packit 8fb591
 * This source code is licensed under BSD 3-Clause License (the "License").
Packit 8fb591
 * You may not use this file except in compliance with the License.
Packit 8fb591
 * You may obtain a copy of the License at
Packit 8fb591
 *
Packit 8fb591
 *     https://opensource.org/licenses/BSD-3-Clause
Packit 8fb591
 */
Packit 8fb591
Packit 8fb591
#include <stdarg.h>
Packit 8fb591
#include <stddef.h>
Packit 8fb591
#include <setjmp.h>
Packit 8fb591
#include <cmocka.h>
Packit 8fb591
#include <stdio.h>
Packit 8fb591
#include <stdlib.h>
Packit 8fb591
#include <sys/types.h>
Packit 8fb591
#include <sys/stat.h>
Packit 8fb591
#include <fcntl.h>
Packit 8fb591
#include <sys/mman.h>
Packit 8fb591
#include <unistd.h>
Packit 8fb591
#include <string.h>
Packit 8fb591
Packit 8fb591
#include "tests/config.h"
Packit 8fb591
#include "libyang.h"
Packit 8fb591
Packit 8fb591
struct ly_ctx *ctx = NULL;
Packit 8fb591
Packit 8fb591
const char *a_data_xml = "\
Packit 8fb591
<x xmlns=\"urn:a\">\n\
Packit 8fb591
  <bubba>test</bubba>\n\
Packit 8fb591
  </x>\n";
Packit 8fb591
Packit 8fb591
int
Packit 8fb591
generic_init(char *yang_file, char *yang_folder)
Packit 8fb591
{
Packit 8fb591
    LYS_INFORMAT yang_format;
Packit 8fb591
    char *schema = NULL;
Packit 8fb591
    struct stat sb_schema;
Packit 8fb591
    int fd = -1;
Packit 8fb591
Packit 8fb591
    if (!yang_file || !yang_folder) {
Packit 8fb591
        goto error;
Packit 8fb591
    }
Packit 8fb591
Packit 8fb591
    yang_format = LYS_IN_YIN;
Packit 8fb591
Packit 8fb591
    ctx = ly_ctx_new(yang_folder, 0);
Packit 8fb591
    if (!ctx) {
Packit 8fb591
        goto error;
Packit 8fb591
    }
Packit 8fb591
Packit 8fb591
    fd = open(yang_file, O_RDONLY);
Packit 8fb591
    if (fd == -1 || fstat(fd, &sb_schema) == -1 || !S_ISREG(sb_schema.st_mode)) {
Packit 8fb591
        goto error;
Packit 8fb591
    }
Packit 8fb591
Packit 8fb591
    schema = mmap(NULL, sb_schema.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
Packit 8fb591
    close(fd);
Packit 8fb591
Packit 8fb591
    if (!lys_parse_mem(ctx, schema, yang_format)) {
Packit 8fb591
        goto error;
Packit 8fb591
    }
Packit 8fb591
Packit 8fb591
    /* cleanup */
Packit 8fb591
    munmap(schema, sb_schema.st_size);
Packit 8fb591
Packit 8fb591
    return 0;
Packit 8fb591
Packit 8fb591
error:
Packit 8fb591
    if (schema) {
Packit 8fb591
        munmap(schema, sb_schema.st_size);
Packit 8fb591
    }
Packit 8fb591
    if (fd != -1) {
Packit 8fb591
        close(fd);
Packit 8fb591
    }
Packit 8fb591
Packit 8fb591
    return -1;
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static int
Packit 8fb591
setup_f(void **state)
Packit 8fb591
{
Packit 8fb591
    (void) state; /* unused */
Packit 8fb591
    char *yang_file = TESTS_DIR"/api/files/a.yin";
Packit 8fb591
    char *yang_folder = TESTS_DIR"/api/files";
Packit 8fb591
    int rc;
Packit 8fb591
Packit 8fb591
    rc = generic_init(yang_file, yang_folder);
Packit 8fb591
Packit 8fb591
    if (rc) {
Packit 8fb591
        return -1;
Packit 8fb591
    }
Packit 8fb591
Packit 8fb591
    return 0;
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static int
Packit 8fb591
teardown_f(void **state)
Packit 8fb591
{
Packit 8fb591
    (void) state; /* unused */
Packit 8fb591
    if (ctx)
Packit 8fb591
        ly_ctx_destroy(ctx, NULL);
Packit 8fb591
Packit 8fb591
    return 0;
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static void
Packit 8fb591
test_lydict_insert(void **state)
Packit 8fb591
{
Packit 8fb591
    (void) state; /* unused */
Packit 8fb591
    const char *value = "x";
Packit 8fb591
    const char *string;
Packit 8fb591
    size_t len = 1;
Packit 8fb591
Packit 8fb591
    string = lydict_insert(ctx, value, len);
Packit 8fb591
    if (!string) {
Packit 8fb591
        fail();
Packit 8fb591
    }
Packit 8fb591
Packit 8fb591
    assert_string_equal(value, string);
Packit 8fb591
    value = "bubba";
Packit 8fb591
    len = 5;
Packit 8fb591
Packit 8fb591
    string = lydict_insert(ctx, value, len);
Packit 8fb591
    if (!string) {
Packit 8fb591
        fail();
Packit 8fb591
    }
Packit 8fb591
Packit 8fb591
    assert_string_equal(value, string);
Packit 8fb591
    lydict_remove(ctx, "bubba");
Packit 8fb591
    lydict_remove(ctx, "x");
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static void
Packit 8fb591
test_lydict_insert_zc(void **state)
Packit 8fb591
{
Packit 8fb591
    (void) state; /* unused */
Packit 8fb591
    char *value = NULL;
Packit 8fb591
Packit 8fb591
    value = strdup("x");
Packit 8fb591
    if (!value) {
Packit 8fb591
        fail();
Packit 8fb591
    }
Packit 8fb591
    const char *string;
Packit 8fb591
    string = lydict_insert_zc(ctx, value);
Packit 8fb591
    if (!string) {
Packit 8fb591
        free(value);
Packit 8fb591
        fail();
Packit 8fb591
    }
Packit 8fb591
Packit 8fb591
    assert_string_equal("x", string);
Packit 8fb591
Packit 8fb591
    value = strdup("bubba");
Packit 8fb591
    if (!value) {
Packit 8fb591
        free(value);
Packit 8fb591
        fail();
Packit 8fb591
    }
Packit 8fb591
Packit 8fb591
    string = lydict_insert_zc(ctx, value);
Packit 8fb591
    if (!string) {
Packit 8fb591
        fail();
Packit 8fb591
    }
Packit 8fb591
Packit 8fb591
    assert_string_equal("bubba", string);
Packit 8fb591
    lydict_remove(ctx, "bubba");
Packit 8fb591
    lydict_remove(ctx, "x");
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static void
Packit 8fb591
test_lydict_remove(void **state)
Packit 8fb591
{
Packit 8fb591
    (void) state; /* unused */
Packit 8fb591
    char *value = NULL, *value2;
Packit 8fb591
    const char *str;
Packit 8fb591
Packit 8fb591
    value = strdup("new_name");
Packit 8fb591
    if (!value) {
Packit 8fb591
        fail();
Packit 8fb591
    }
Packit 8fb591
    value2 = strdup("new_name");
Packit 8fb591
    if (!value2) {
Packit 8fb591
        fail();
Packit 8fb591
    }
Packit 8fb591
Packit 8fb591
    const char *string;
Packit 8fb591
    string = lydict_insert_zc(ctx, value); /* 1st instance */
Packit 8fb591
    if (!string) {
Packit 8fb591
        free(value);
Packit 8fb591
        fail();
Packit 8fb591
    }
Packit 8fb591
Packit 8fb591
    assert_string_equal("new_name", string);
Packit 8fb591
    str = lydict_insert(ctx, "new_name", 0); /* 2nd instance */
Packit 8fb591
    assert_ptr_equal(str, string);
Packit 8fb591
    lydict_remove(ctx, string); /* remove 2nd instance */
Packit 8fb591
    lydict_remove(ctx, string); /* remove 1st instance */
Packit 8fb591
    /* string content is supposed to be invalid since now! */
Packit 8fb591
    str = lydict_insert_zc(ctx, value2);
Packit 8fb591
    assert_ptr_not_equal(str, NULL);
Packit 8fb591
    assert_ptr_not_equal(str, string);
Packit 8fb591
    lydict_remove(ctx, str);
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
static void
Packit 8fb591
test_similar_strings(void **state) {
Packit 8fb591
    (void) state; /* unused */
Packit 8fb591
Packit 8fb591
    const char *ret = NULL;
Packit 8fb591
Packit 8fb591
    ret = lydict_insert(ctx, "aaab", 4);
Packit 8fb591
    if (!ret) {
Packit 8fb591
        fail();
Packit 8fb591
    }
Packit 8fb591
    assert_string_equal(ret, "aaab");
Packit 8fb591
Packit 8fb591
    ret = lydict_insert(ctx, "aaa", 3);
Packit 8fb591
    if (!ret) {
Packit 8fb591
        fail();
Packit 8fb591
    }
Packit 8fb591
    assert_string_equal(ret, "aaa");
Packit 8fb591
Packit 8fb591
    ret = lydict_insert(ctx, "bbb", 3);
Packit 8fb591
    if (!ret) {
Packit 8fb591
        fail();
Packit 8fb591
    }
Packit 8fb591
    assert_string_equal(ret, "bbb");
Packit 8fb591
Packit 8fb591
    ret = lydict_insert(ctx, "bbba", 4);
Packit 8fb591
    if (!ret) {
Packit 8fb591
        fail();
Packit 8fb591
    }
Packit 8fb591
    assert_string_equal(ret, "bbba");
Packit 8fb591
Packit 8fb591
    lydict_remove(ctx, "aaa");
Packit 8fb591
    lydict_remove(ctx, "aaab");
Packit 8fb591
    lydict_remove(ctx, "bbb");
Packit 8fb591
    lydict_remove(ctx, "bbba");
Packit 8fb591
}
Packit 8fb591
Packit 8fb591
int main(void)
Packit 8fb591
{
Packit 8fb591
    const struct CMUnitTest tests[] = {
Packit 8fb591
        cmocka_unit_test_setup_teardown(test_lydict_insert, setup_f, teardown_f),
Packit 8fb591
        cmocka_unit_test_setup_teardown(test_lydict_insert_zc, setup_f, teardown_f),
Packit 8fb591
        cmocka_unit_test_setup_teardown(test_lydict_remove, setup_f, teardown_f),
Packit 8fb591
        cmocka_unit_test_setup_teardown(test_similar_strings, setup_f, teardown_f),
Packit 8fb591
    };
Packit 8fb591
Packit 8fb591
    return cmocka_run_group_tests(tests, NULL, NULL);
Packit 8fb591
}