blob: 258a144da56427f192a490cc4accdaa8e634ce67 [file] [log] [blame]
Jacob Erlbeckae15a2c2013-08-06 14:29:14 +02001/* (C) 2013 by Jacob Erlbeck <jerlbeck@sysmocom.de>
2 * All Rights Reserved
3 *
4 * This program is iree software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 *
18 */
19
20#include <stdio.h>
21#include <string.h>
22
Jacob Erlbeck0c987bd2013-09-06 16:52:00 +020023#include <sys/types.h>
24#include <sys/socket.h>
25#include <sys/un.h>
26
Holger Hans Peter Freyther6ef71b02013-09-10 11:17:46 +020027#include <osmocom/core/application.h>
Jacob Erlbeckae15a2c2013-08-06 14:29:14 +020028#include <osmocom/core/talloc.h>
29#include <osmocom/core/logging.h>
30#include <osmocom/core/utils.h>
Holger Hans Peter Freyther2c9168c2013-10-10 20:21:33 +020031#include <osmocom/core/signal.h>
Jacob Erlbeckae15a2c2013-08-06 14:29:14 +020032#include <osmocom/vty/misc.h>
Jacob Erlbeck0c987bd2013-09-06 16:52:00 +020033#include <osmocom/vty/vty.h>
34#include <osmocom/vty/command.h>
35#include <osmocom/vty/buffer.h>
Holger Hans Peter Freyther6ef71b02013-09-10 11:17:46 +020036#include <osmocom/vty/logging.h>
Jacob Erlbeck0c987bd2013-09-06 16:52:00 +020037
38static enum event last_vty_connection_event = -1;
Jacob Erlbeckae15a2c2013-08-06 14:29:14 +020039
40static void test_cmd_string_from_valstr(void)
41{
42 char *cmd;
43 const struct value_string printf_seq_vs[] = {
44 { .value = 42, .str = "[foo%s%s%s%s%s]"},
45 { .value = 43, .str = "[bar%s%s%s%s%s]"},
46 { .value = 0, .str = NULL}
47 };
48
49 printf("Going to test vty_cmd_string_from_valstr()\n");
50
51 /* check against character strings that could break printf */
52
53 cmd = vty_cmd_string_from_valstr (NULL, printf_seq_vs, "[prefix%s%s%s%s%s]", "[sep%s%s%s%s%s]", "[end%s%s%s%s%s]", 1);
54 printf ("Tested with %%s-strings, resulting cmd = '%s'\n", cmd);
55 talloc_free (cmd);
56}
57
Jacob Erlbeck0c987bd2013-09-06 16:52:00 +020058static int do_vty_command(struct vty *vty, const char *cmd)
59{
60 vector vline;
61 int ret;
62
63 printf("Going to execute '%s'\n", cmd);
64 vline = cmd_make_strvec(cmd);
65 ret = cmd_execute_command(vline, vty, NULL, 0);
66 cmd_free_strvec(vline);
67 printf("Returned: %d, Current node: %d '%s'\n", ret, vty->node, cmd_prompt(vty->node));
68 return ret;
69}
70
Holger Hans Peter Freyther2c9168c2013-10-10 20:21:33 +020071/* Handle the events from telnet_interface.c */
72static int vty_event_cb(unsigned int subsys, unsigned int signal,
73 void *handler_data, void *_signal_data)
Jacob Erlbeck0c987bd2013-09-06 16:52:00 +020074{
Holger Hans Peter Freyther2c9168c2013-10-10 20:21:33 +020075 struct vty_signal_data *signal_data;
Jacob Erlbeck0c987bd2013-09-06 16:52:00 +020076
Holger Hans Peter Freyther2c9168c2013-10-10 20:21:33 +020077 if (subsys != SS_L_VTY)
78 return 0;
79 if (signal != S_VTY_EVENT)
80 return 0;
81
82 signal_data = _signal_data;
83 last_vty_connection_event = signal_data->event;
84
85 fprintf(stderr, "Got VTY event: %d\n", signal_data->event);
86 return 0;
Jacob Erlbeck0c987bd2013-09-06 16:52:00 +020087}
88
Jacob Erlbeckca6602f2015-11-03 13:47:11 +010089struct vty_test {
90 int sock[2];
91};
92
93static struct vty* create_test_vty(struct vty_test *data)
94{
95 struct vty *vty;
96 /* Fake connection. */
97 socketpair(AF_UNIX, SOCK_STREAM, 0, data->sock);
98
99 vty = vty_create(data->sock[0], NULL);
100 OSMO_ASSERT(vty != NULL);
101 OSMO_ASSERT(vty->status != VTY_CLOSE);
102
103 return vty;
104}
105
106static void destroy_test_vty(struct vty_test *data, struct vty *vty)
107{
108 vty_close(vty);
109 OSMO_ASSERT(last_vty_connection_event == VTY_CLOSED);
110}
111
Jacob Erlbeck0c987bd2013-09-06 16:52:00 +0200112static void test_node_tree_structure(void)
113{
Jacob Erlbeckca6602f2015-11-03 13:47:11 +0100114 struct vty_test test;
Jacob Erlbeck0c987bd2013-09-06 16:52:00 +0200115 struct vty *vty;
Jacob Erlbeck0c987bd2013-09-06 16:52:00 +0200116
117 printf("Going to test VTY node tree structure\n");
Jacob Erlbeckca6602f2015-11-03 13:47:11 +0100118 vty = create_test_vty(&test);
Jacob Erlbeck0c987bd2013-09-06 16:52:00 +0200119
120 OSMO_ASSERT(do_vty_command(vty, "enable") == CMD_SUCCESS);
121 OSMO_ASSERT(vty->node == ENABLE_NODE);
122
123 OSMO_ASSERT(do_vty_command(vty, "configure terminal") == CMD_SUCCESS);
124 OSMO_ASSERT(vty->node == CONFIG_NODE);
125 OSMO_ASSERT(do_vty_command(vty, "exit") == CMD_SUCCESS);
126 OSMO_ASSERT(vty->node == ENABLE_NODE);
127
128 OSMO_ASSERT(do_vty_command(vty, "configure terminal") == CMD_SUCCESS);
129 OSMO_ASSERT(vty->node == CONFIG_NODE);
130 OSMO_ASSERT(do_vty_command(vty, "end") == CMD_SUCCESS);
131 OSMO_ASSERT(vty->node == ENABLE_NODE);
132
133 OSMO_ASSERT(do_vty_command(vty, "configure terminal") == CMD_SUCCESS);
134 OSMO_ASSERT(vty->node == CONFIG_NODE);
135 OSMO_ASSERT(do_vty_command(vty, "log stderr") == CMD_SUCCESS);
136 OSMO_ASSERT(vty->node == CFG_LOG_NODE);
137 OSMO_ASSERT(do_vty_command(vty, "exit") == CMD_SUCCESS);
138 OSMO_ASSERT(vty->node == CONFIG_NODE);
139 OSMO_ASSERT(do_vty_command(vty, "log stderr") == CMD_SUCCESS);
140 OSMO_ASSERT(vty->node == CFG_LOG_NODE);
141 OSMO_ASSERT(do_vty_command(vty, "end") == CMD_SUCCESS);
142 OSMO_ASSERT(vty->node == ENABLE_NODE);
143
144 OSMO_ASSERT(do_vty_command(vty, "configure terminal") == CMD_SUCCESS);
145 OSMO_ASSERT(vty->node == CONFIG_NODE);
146 OSMO_ASSERT(do_vty_command(vty, "line vty") == CMD_SUCCESS);
147 OSMO_ASSERT(vty->node == VTY_NODE);
148 OSMO_ASSERT(do_vty_command(vty, "exit") == CMD_SUCCESS);
149 OSMO_ASSERT(vty->node == CONFIG_NODE);
150 OSMO_ASSERT(do_vty_command(vty, "line vty") == CMD_SUCCESS);
151 OSMO_ASSERT(vty->node == VTY_NODE);
152 OSMO_ASSERT(do_vty_command(vty, "end") == CMD_SUCCESS);
153 OSMO_ASSERT(vty->node == ENABLE_NODE);
154
155
156 /* Check searching the parents nodes for matching commands. */
157 OSMO_ASSERT(do_vty_command(vty, "configure terminal") == CMD_SUCCESS);
158 OSMO_ASSERT(vty->node == CONFIG_NODE);
159 OSMO_ASSERT(do_vty_command(vty, "log stderr") == CMD_SUCCESS);
160 OSMO_ASSERT(vty->node == CFG_LOG_NODE);
161 OSMO_ASSERT(do_vty_command(vty, "line vty") == CMD_SUCCESS);
162 OSMO_ASSERT(vty->node == VTY_NODE);
163 OSMO_ASSERT(do_vty_command(vty, "log stderr") == CMD_SUCCESS);
164 OSMO_ASSERT(vty->node == CFG_LOG_NODE);
165 OSMO_ASSERT(do_vty_command(vty, "end") == CMD_SUCCESS);
166 OSMO_ASSERT(vty->node == ENABLE_NODE);
167
168 /* Check for final 'exit' (connection close). */
169 OSMO_ASSERT(do_vty_command(vty, "exit") == CMD_SUCCESS);
170 OSMO_ASSERT(vty->node == ENABLE_NODE);
171 OSMO_ASSERT(vty->status == VTY_CLOSE);
172
Jacob Erlbeckca6602f2015-11-03 13:47:11 +0100173 destroy_test_vty(&test, vty);
Jacob Erlbeck0c987bd2013-09-06 16:52:00 +0200174}
175
Jacob Erlbeckae15a2c2013-08-06 14:29:14 +0200176int main(int argc, char **argv)
177{
Jacob Erlbeckca6602f2015-11-03 13:47:11 +0100178 struct vty_app_info vty_info = {
179 .name = "VtyTest",
180 .version = 0,
181 .go_parent_cb = NULL,
182 .is_config_node = NULL,
183 };
184
185 const struct log_info_cat default_categories[] = {};
186
187 const struct log_info log_info = {
188 .cat = default_categories,
189 .num_cat = ARRAY_SIZE(default_categories),
190 };
Holger Hans Peter Freyther2c9168c2013-10-10 20:21:33 +0200191 osmo_signal_register_handler(SS_L_VTY, vty_event_cb, NULL);
192
Jacob Erlbeckca6602f2015-11-03 13:47:11 +0100193 /* Fake logging. */
194 osmo_init_logging(&log_info);
195
196 vty_init(&vty_info);
197
198 /* Setup VTY commands */
199 logging_vty_add_cmds(&log_info);
200
Jacob Erlbeckae15a2c2013-08-06 14:29:14 +0200201 test_cmd_string_from_valstr();
Jacob Erlbeck0c987bd2013-09-06 16:52:00 +0200202 test_node_tree_structure();
Jacob Erlbeckca6602f2015-11-03 13:47:11 +0100203
Jacob Erlbeckae15a2c2013-08-06 14:29:14 +0200204 printf("All tests passed\n");
205
206 return 0;
207}