blob: 2a7347f852cd4e153f672dbb1d55890c063a55e7 [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
89static void test_node_tree_structure(void)
90{
91 struct vty_app_info vty_info = {
92 .name = "VtyTest",
93 .version = 0,
94 .go_parent_cb = NULL,
95 .is_config_node = NULL,
96 };
97
98 const struct log_info_cat default_categories[] = {};
99
100 const struct log_info log_info = {
101 .cat = default_categories,
102 .num_cat = ARRAY_SIZE(default_categories),
103 };
104
105 struct vty *vty;
Jacob Erlbeck0c987bd2013-09-06 16:52:00 +0200106 int sock[2];
107
108 printf("Going to test VTY node tree structure\n");
109
110 /* Fake logging. */
111 osmo_init_logging(&log_info);
112
113 vty_init(&vty_info);
114
115 logging_vty_add_cmds(&log_info);
116
117 /* Fake connection. */
118 socketpair(AF_UNIX, SOCK_STREAM, 0, sock);
119
120 vty = vty_create(sock[0], NULL);
121
122 OSMO_ASSERT(vty != NULL);
123
124 OSMO_ASSERT(do_vty_command(vty, "enable") == CMD_SUCCESS);
125 OSMO_ASSERT(vty->node == ENABLE_NODE);
126
127 OSMO_ASSERT(do_vty_command(vty, "configure terminal") == CMD_SUCCESS);
128 OSMO_ASSERT(vty->node == CONFIG_NODE);
129 OSMO_ASSERT(do_vty_command(vty, "exit") == CMD_SUCCESS);
130 OSMO_ASSERT(vty->node == ENABLE_NODE);
131
132 OSMO_ASSERT(do_vty_command(vty, "configure terminal") == CMD_SUCCESS);
133 OSMO_ASSERT(vty->node == CONFIG_NODE);
134 OSMO_ASSERT(do_vty_command(vty, "end") == CMD_SUCCESS);
135 OSMO_ASSERT(vty->node == ENABLE_NODE);
136
137 OSMO_ASSERT(do_vty_command(vty, "configure terminal") == 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, "exit") == CMD_SUCCESS);
142 OSMO_ASSERT(vty->node == CONFIG_NODE);
143 OSMO_ASSERT(do_vty_command(vty, "log stderr") == CMD_SUCCESS);
144 OSMO_ASSERT(vty->node == CFG_LOG_NODE);
145 OSMO_ASSERT(do_vty_command(vty, "end") == CMD_SUCCESS);
146 OSMO_ASSERT(vty->node == ENABLE_NODE);
147
148 OSMO_ASSERT(do_vty_command(vty, "configure terminal") == 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, "exit") == CMD_SUCCESS);
153 OSMO_ASSERT(vty->node == CONFIG_NODE);
154 OSMO_ASSERT(do_vty_command(vty, "line vty") == CMD_SUCCESS);
155 OSMO_ASSERT(vty->node == VTY_NODE);
156 OSMO_ASSERT(do_vty_command(vty, "end") == CMD_SUCCESS);
157 OSMO_ASSERT(vty->node == ENABLE_NODE);
158
159
160 /* Check searching the parents nodes for matching commands. */
161 OSMO_ASSERT(do_vty_command(vty, "configure terminal") == CMD_SUCCESS);
162 OSMO_ASSERT(vty->node == CONFIG_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, "line vty") == CMD_SUCCESS);
166 OSMO_ASSERT(vty->node == VTY_NODE);
167 OSMO_ASSERT(do_vty_command(vty, "log stderr") == CMD_SUCCESS);
168 OSMO_ASSERT(vty->node == CFG_LOG_NODE);
169 OSMO_ASSERT(do_vty_command(vty, "end") == CMD_SUCCESS);
170 OSMO_ASSERT(vty->node == ENABLE_NODE);
171
172 /* Check for final 'exit' (connection close). */
173 OSMO_ASSERT(do_vty_command(vty, "exit") == CMD_SUCCESS);
174 OSMO_ASSERT(vty->node == ENABLE_NODE);
175 OSMO_ASSERT(vty->status == VTY_CLOSE);
176
177 vty_close(vty);
178 OSMO_ASSERT(last_vty_connection_event == VTY_CLOSED);
179}
180
Jacob Erlbeckae15a2c2013-08-06 14:29:14 +0200181int main(int argc, char **argv)
182{
Holger Hans Peter Freyther2c9168c2013-10-10 20:21:33 +0200183 osmo_signal_register_handler(SS_L_VTY, vty_event_cb, NULL);
184
Jacob Erlbeckae15a2c2013-08-06 14:29:14 +0200185 test_cmd_string_from_valstr();
Jacob Erlbeck0c987bd2013-09-06 16:52:00 +0200186 test_node_tree_structure();
Jacob Erlbeckae15a2c2013-08-06 14:29:14 +0200187 printf("All tests passed\n");
188
189 return 0;
190}