blob: f2d68114bb8cbe6566f5071eb1a372d22a37b7a0 [file] [log] [blame]
Radek Krejcice24ab82015-10-08 15:37:02 +02001/**
2 * \file test_io.c
3 * \author Radek Krejci <rkrejci@cesnet.cz>
4 * \brief libnetconf2 tests - input/output functions
5 *
6 * Copyright (c) 2015 CESNET, z.s.p.o.
7 *
Radek Krejci9b81f5b2016-02-24 13:14:49 +01008 * This source code is licensed under BSD 3-Clause License (the "License").
9 * You may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
Michal Vaskoad1cc6a2016-02-26 15:06:06 +010011 *
Radek Krejci9b81f5b2016-02-24 13:14:49 +010012 * https://opensource.org/licenses/BSD-3-Clause
Radek Krejcice24ab82015-10-08 15:37:02 +020013 */
14
15#include <errno.h>
16#include <fcntl.h>
17#include <pthread.h>
18#include <setjmp.h>
19#include <stdarg.h>
20#include <stddef.h>
21#include <stdlib.h>
Michal Vasko3512e402016-01-28 16:22:34 +010022#include <unistd.h>
Radek Krejcice24ab82015-10-08 15:37:02 +020023#include <string.h>
24#include <sys/stat.h>
25#include <sys/types.h>
26
27#include <cmocka.h>
28#include <libyang/libyang.h>
29
Radek Krejci93e80222016-10-03 13:34:25 +020030#include <messages_p.h>
Radek Krejcice24ab82015-10-08 15:37:02 +020031#include <session_p.h>
Michal Vasko086311b2016-01-08 09:53:11 +010032#include <session_client.h>
Radek Krejcice24ab82015-10-08 15:37:02 +020033#include "config.h"
34
Radek Krejcia146f472015-10-19 15:00:05 +020035struct wr {
36 struct nc_session *session;
37 struct nc_rpc *rpc;
38};
39
40static int
41setup_write(void **state)
42{
43 (void) state; /* unused */
44 int fd;
Radek Krejcia146f472015-10-19 15:00:05 +020045 struct wr *w;
46
47 w = malloc(sizeof *w);
48 w->session = calloc(1, sizeof *w->session);
Radek Krejci695d4fa2015-10-22 13:23:54 +020049 w->session->ctx = ly_ctx_new(TESTS_DIR"../schemas");
50 w->session->ti_lock = malloc(sizeof *w->session->ti_lock);
51 pthread_mutex_init(w->session->ti_lock, NULL);
Radek Krejcia146f472015-10-19 15:00:05 +020052
53 /* ietf-netconf */
Radek Krejci695d4fa2015-10-22 13:23:54 +020054 fd = open(TESTS_DIR"../schemas/ietf-netconf.yin", O_RDONLY);
Radek Krejcia146f472015-10-19 15:00:05 +020055 if (fd == -1) {
Michal Vasko11d142a2016-01-19 15:58:24 +010056 free(w);
Radek Krejcia146f472015-10-19 15:00:05 +020057 return -1;
58 }
59
Michal Vasko608b52b2015-12-11 14:39:59 +010060 lys_parse_fd(w->session->ctx, fd, LYS_IN_YIN);
Radek Krejcia146f472015-10-19 15:00:05 +020061 close(fd);
62
Radek Krejci695d4fa2015-10-22 13:23:54 +020063 w->session->status = NC_STATUS_RUNNING;
Radek Krejcia146f472015-10-19 15:00:05 +020064 w->session->version = NC_VERSION_10;
Michal Vasko338f8472016-10-13 15:01:27 +020065 w->session->opts.client.msgid = 999;
Radek Krejcia146f472015-10-19 15:00:05 +020066 w->session->ti_type = NC_TI_FD;
Radek Krejci695d4fa2015-10-22 13:23:54 +020067 w->session->ti.fd.in = STDIN_FILENO;
68 w->session->ti.fd.out = STDOUT_FILENO;
Radek Krejcia146f472015-10-19 15:00:05 +020069
Radek Krejci695d4fa2015-10-22 13:23:54 +020070 /* get rpc to write */
71 w->rpc = nc_rpc_lock(NC_DATASTORE_RUNNING);
Radek Krejcia146f472015-10-19 15:00:05 +020072 assert_non_null(w->rpc);
73
Radek Krejcia146f472015-10-19 15:00:05 +020074 w->session->ti.fd.in = -1;
75
76 *state = w;
77
Radek Krejcice24ab82015-10-08 15:37:02 +020078 return 0;
79}
80
81static int
Radek Krejcia146f472015-10-19 15:00:05 +020082teardown_write(void **state)
Radek Krejcice24ab82015-10-08 15:37:02 +020083{
Radek Krejcia146f472015-10-19 15:00:05 +020084 struct wr *w = (struct wr *)*state;
Radek Krejcice24ab82015-10-08 15:37:02 +020085
Radek Krejcia53b3fe2015-10-19 17:25:04 +020086 nc_rpc_free(w->rpc);
Radek Krejci695d4fa2015-10-22 13:23:54 +020087 w->session->ti.fd.in = -1;
88 w->session->ti.fd.out = -1;
Michal Vaskoe1a64ec2016-03-01 12:21:58 +010089 nc_session_free(w->session, NULL);
Radek Krejcia146f472015-10-19 15:00:05 +020090 free(w);
91 *state = NULL;
Radek Krejcice24ab82015-10-08 15:37:02 +020092
93 return 0;
94}
95
96static void
Radek Krejcife0b3472015-10-12 13:43:42 +020097test_write_rpc(void **state)
98{
Radek Krejcia146f472015-10-19 15:00:05 +020099 struct wr *w = (struct wr *)*state;
Michal Vaskof44f2482015-12-11 14:40:30 +0100100 uint64_t msgid;
Radek Krejcife0b3472015-10-12 13:43:42 +0200101 NC_MSG_TYPE type;
102
Radek Krejci695d4fa2015-10-22 13:23:54 +0200103 w->session->side = NC_CLIENT;
Radek Krejcife0b3472015-10-12 13:43:42 +0200104
105 do {
Michal Vaskof44f2482015-12-11 14:40:30 +0100106 type = nc_send_rpc(w->session, w->rpc, 1000, &msgid);
Radek Krejcife0b3472015-10-12 13:43:42 +0200107 } while(type == NC_MSG_WOULDBLOCK);
108
109 assert_int_equal(type, NC_MSG_RPC);
110
Radek Krejcia146f472015-10-19 15:00:05 +0200111 write(w->session->ti.fd.out, "\n", 1);
Radek Krejcice24ab82015-10-08 15:37:02 +0200112}
113
Radek Krejcia146f472015-10-19 15:00:05 +0200114static void
115test_write_rpc_10(void **state)
116{
117 struct wr *w = (struct wr *)*state;
118
119 w->session->version = NC_VERSION_10;
120
121 return test_write_rpc(state);
122}
123
124static void
125test_write_rpc_11(void **state)
126{
127 struct wr *w = (struct wr *)*state;
128
129 w->session->version = NC_VERSION_11;
130
131 return test_write_rpc(state);
132}
133
134static void
135test_write_rpc_bad(void **state)
136{
137 struct wr *w = (struct wr *)*state;
Michal Vaskof44f2482015-12-11 14:40:30 +0100138 uint64_t msgid;
Radek Krejcia146f472015-10-19 15:00:05 +0200139 NC_MSG_TYPE type;
140
Radek Krejci695d4fa2015-10-22 13:23:54 +0200141 w->session->side = NC_SERVER;
Radek Krejcia146f472015-10-19 15:00:05 +0200142
143 do {
Michal Vaskof44f2482015-12-11 14:40:30 +0100144 type = nc_send_rpc(w->session, w->rpc, 1000, &msgid);
Radek Krejcia146f472015-10-19 15:00:05 +0200145 } while(type == NC_MSG_WOULDBLOCK);
146
147 assert_int_equal(type, NC_MSG_ERROR);
Radek Krejcia146f472015-10-19 15:00:05 +0200148}
149
150static void
151test_write_rpc_10_bad(void **state)
152{
153 struct wr *w = (struct wr *)*state;
154
155 w->session->version = NC_VERSION_10;
156
157 return test_write_rpc_bad(state);
158}
159
160static void
161test_write_rpc_11_bad(void **state)
162{
163 struct wr *w = (struct wr *)*state;
164
165 w->session->version = NC_VERSION_11;
166
167 return test_write_rpc_bad(state);
168}
Radek Krejcice24ab82015-10-08 15:37:02 +0200169int main(void)
170{
Radek Krejcife0b3472015-10-12 13:43:42 +0200171 const struct CMUnitTest io[] = {
Radek Krejcia146f472015-10-19 15:00:05 +0200172 cmocka_unit_test_setup_teardown(test_write_rpc_10, setup_write, teardown_write),
173 cmocka_unit_test_setup_teardown(test_write_rpc_10_bad, setup_write, teardown_write),
174 cmocka_unit_test_setup_teardown(test_write_rpc_11, setup_write, teardown_write),
175 cmocka_unit_test_setup_teardown(test_write_rpc_11_bad, setup_write, teardown_write)};
Radek Krejcice24ab82015-10-08 15:37:02 +0200176
177 return cmocka_run_group_tests(io, NULL, NULL);
178}