pacemaker 2.1.4-dc6eb4362e
Scalable High-Availability cluster resource manager
pcmk__cmdline_preproc_test.c
Go to the documentation of this file.
1/*
2 * Copyright 2020-2022 the Pacemaker project contributors
3 *
4 * The version control history for this file may have further details.
5 *
6 * This source code is licensed under the GNU Lesser General Public License
7 * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY.
8 */
9
10#include <crm_internal.h>
12
13#include <stdarg.h>
14#include <stddef.h>
15#include <stdint.h>
16#include <setjmp.h>
17#include <cmocka.h>
18#include <glib.h>
19
20#define LISTS_EQ(a, b) { \
21 assert_int_equal(g_strv_length((gchar **) (a)), g_strv_length((gchar **) (b))); \
22 for (int i = 0; i < g_strv_length((a)); i++) { \
23 assert_string_equal((a)[i], (b)[i]); \
24 } \
25}
26
27static void
28empty_input(void **state) {
29 assert_null(pcmk__cmdline_preproc(NULL, ""));
30}
31
32static void
33no_specials(void **state) {
34 const char *argv[] = { "-a", "-b", "-c", "-d", "-1", NULL };
35 const gchar *expected[] = { "-a", "-b", "-c", "-d", "-1", NULL };
36
37 gchar **processed = pcmk__cmdline_preproc((char **) argv, NULL);
38 LISTS_EQ(processed, expected);
39 g_strfreev(processed);
40
41 processed = pcmk__cmdline_preproc((char **) argv, "");
42 LISTS_EQ(processed, expected);
43 g_strfreev(processed);
44}
45
46static void
47single_dash(void **state) {
48 const char *argv[] = { "-", NULL };
49 const gchar *expected[] = { "-", NULL };
50
51 gchar **processed = pcmk__cmdline_preproc((char **) argv, NULL);
52 LISTS_EQ(processed, expected);
53 g_strfreev(processed);
54}
55
56static void
57double_dash(void **state) {
58 const char *argv[] = { "-a", "--", "-bc", NULL };
59 const gchar *expected[] = { "-a", "--", "-bc", NULL };
60
61 gchar **processed = pcmk__cmdline_preproc((char **) argv, NULL);
62 LISTS_EQ(processed, expected);
63 g_strfreev(processed);
64}
65
66static void
67special_args(void **state) {
68 const char *argv[] = { "-aX", "-Fval", NULL };
69 const gchar *expected[] = { "-a", "X", "-F", "val", NULL };
70
71 gchar **processed = pcmk__cmdline_preproc((char **) argv, "aF");
72 LISTS_EQ(processed, expected);
73 g_strfreev(processed);
74}
75
76static void
77special_arg_at_end(void **state) {
78 const char *argv[] = { "-a", NULL };
79 const gchar *expected[] = { "-a", NULL };
80
81 gchar **processed = pcmk__cmdline_preproc((char **) argv, "a");
82 LISTS_EQ(processed, expected);
83 g_strfreev(processed);
84}
85
86static void
87long_arg(void **state) {
88 const char *argv[] = { "--blah=foo", NULL };
89 const gchar *expected[] = { "--blah=foo", NULL };
90
91 gchar **processed = pcmk__cmdline_preproc((char **) argv, NULL);
92 LISTS_EQ(processed, expected);
93 g_strfreev(processed);
94}
95
96static void
97negative_score(void **state) {
98 const char *argv[] = { "-v", "-1000", NULL };
99 const gchar *expected[] = { "-v", "-1000", NULL };
100
101 gchar **processed = pcmk__cmdline_preproc((char **) argv, "v");
102 LISTS_EQ(processed, expected);
103 g_strfreev(processed);
104}
105
106static void
107negative_score_2(void **state) {
108 const char *argv[] = { "-1i3", NULL };
109 const gchar *expected[] = { "-1", "-i", "-3", NULL };
110
111 gchar **processed = pcmk__cmdline_preproc((char **) argv, NULL);
112 LISTS_EQ(processed, expected);
113 g_strfreev(processed);
114}
115
116static void
117string_arg_with_dash(void **state) {
118 const char *argv[] = { "-n", "crm_mon_options", "-v", "--opt1 --opt2", NULL };
119 const gchar *expected[] = { "-n", "crm_mon_options", "-v", "--opt1 --opt2", NULL };
120
121 gchar **processed = pcmk__cmdline_preproc((char **) argv, "v");
122 LISTS_EQ(processed, expected);
123 g_strfreev(processed);
124}
125
126static void
127string_arg_with_dash_2(void **state) {
128 const char *argv[] = { "-n", "crm_mon_options", "-v", "-1i3", NULL };
129 const gchar *expected[] = { "-n", "crm_mon_options", "-v", "-1i3", NULL };
130
131 gchar **processed = pcmk__cmdline_preproc((char **) argv, "v");
132 LISTS_EQ(processed, expected);
133 g_strfreev(processed);
134}
135
136static void
137string_arg_with_dash_3(void **state) {
138 const char *argv[] = { "-abc", "-1i3", NULL };
139 const gchar *expected[] = { "-a", "-b", "-c", "-1i3", NULL };
140
141 gchar **processed = pcmk__cmdline_preproc((char **) argv, "c");
142 LISTS_EQ(processed, expected);
143 g_strfreev(processed);
144}
145
146int
147main(int argc, char **argv)
148{
149 const struct CMUnitTest tests[] = {
150 cmocka_unit_test(empty_input),
151 cmocka_unit_test(no_specials),
152 cmocka_unit_test(single_dash),
153 cmocka_unit_test(double_dash),
154 cmocka_unit_test(special_args),
155 cmocka_unit_test(special_arg_at_end),
156 cmocka_unit_test(long_arg),
157 cmocka_unit_test(negative_score),
158 cmocka_unit_test(negative_score_2),
159 cmocka_unit_test(string_arg_with_dash),
160 cmocka_unit_test(string_arg_with_dash_2),
161 cmocka_unit_test(string_arg_with_dash_3),
162 };
163
164 cmocka_set_message_output(CM_OUTPUT_TAP);
165 return cmocka_run_group_tests(tests, NULL, NULL);
166}
gchar ** pcmk__cmdline_preproc(char **argv, const char *special)
Definition: cmdline.c:148
#define LISTS_EQ(a, b)
int main(int argc, char **argv)