|
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 |
}
|