pacemaker 2.1.5-a3f44794f94
Scalable High-Availability cluster resource manager
pcmk__register_messages_test.c
Go to the documentation of this file.
1/*
2 * Copyright 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>
11
14
15static int
16null_message_fn(pcmk__output_t *out, va_list args) {
17 return pcmk_rc_ok;
18}
19
20static int
21null_message_fn_2(pcmk__output_t *out, va_list args) {
22 return pcmk_rc_ok;
23}
24
25static bool
26fake_text_init(pcmk__output_t *out) {
27 return true;
28}
29
30static void
31fake_text_free_priv(pcmk__output_t *out) {
32 /* This function intentionally left blank */
33}
34
35static pcmk__output_t *
36mk_fake_text_output(char **argv) {
37 pcmk__output_t *retval = calloc(1, sizeof(pcmk__output_t));
38
39 if (retval == NULL) {
40 return NULL;
41 }
42
43 retval->fmt_name = "text";
44 retval->init = fake_text_init;
45 retval->free_priv = fake_text_free_priv;
46
49
50 return retval;
51}
52
53static int
54setup(void **state) {
55 pcmk__register_format(NULL, "text", mk_fake_text_output, NULL);
56 return 0;
57}
58
59static int
60teardown(void **state) {
62 return 0;
63}
64
65static void
66invalid_entries(void **state) {
67 pcmk__output_t *out = NULL;
68
69 pcmk__message_entry_t entries[] = {
70 /* We can't test a NULL message_id here because that's the marker for
71 * the end of the table.
72 */
73 { "", "", null_message_fn },
74 { "", NULL, null_message_fn },
75 { "", "text", NULL },
76 { NULL },
77 };
78
79 pcmk__output_new(&out, "text", NULL, NULL);
80
82 assert_int_equal(g_hash_table_size(out->messages), 0);
83
85}
86
87static void
88valid_entries(void **state) {
89 pcmk__output_t *out = NULL;
90
91 pcmk__message_entry_t entries[] = {
92 { "msg1", "text", null_message_fn },
93 { "msg2", "text", null_message_fn_2 },
94 { NULL },
95 };
96
97 pcmk__output_new(&out, "text", NULL, NULL);
98
99 pcmk__register_messages(out, entries);
100 assert_int_equal(g_hash_table_size(out->messages), 2);
101 assert_ptr_equal(g_hash_table_lookup(out->messages, "msg1"), null_message_fn);
102 assert_ptr_equal(g_hash_table_lookup(out->messages, "msg2"), null_message_fn_2);
103
105}
106
107static void
108duplicate_message_ids(void **state) {
109 pcmk__output_t *out = NULL;
110
111 pcmk__message_entry_t entries[] = {
112 { "msg1", "text", null_message_fn },
113 { "msg1", "text", null_message_fn_2 },
114 { NULL },
115 };
116
117 pcmk__output_new(&out, "text", NULL, NULL);
118
119 pcmk__register_messages(out, entries);
120 assert_int_equal(g_hash_table_size(out->messages), 1);
121 assert_ptr_equal(g_hash_table_lookup(out->messages, "msg1"), null_message_fn_2);
122
124}
125
126static void
127duplicate_functions(void **state) {
128 pcmk__output_t *out = NULL;
129
130 pcmk__message_entry_t entries[] = {
131 { "msg1", "text", null_message_fn },
132 { "msg2", "text", null_message_fn },
133 { NULL },
134 };
135
136 pcmk__output_new(&out, "text", NULL, NULL);
137
138 pcmk__register_messages(out, entries);
139 assert_int_equal(g_hash_table_size(out->messages), 2);
140 assert_ptr_equal(g_hash_table_lookup(out->messages, "msg1"), null_message_fn);
141 assert_ptr_equal(g_hash_table_lookup(out->messages, "msg2"), null_message_fn);
142
144}
145
146static void
147default_handler(void **state) {
148 pcmk__output_t *out = NULL;
149
150 pcmk__message_entry_t entries[] = {
151 { "msg1", "default", null_message_fn },
152 { NULL },
153 };
154
155 pcmk__output_new(&out, "text", NULL, NULL);
156
157 pcmk__register_messages(out, entries);
158 assert_int_equal(g_hash_table_size(out->messages), 1);
159 assert_ptr_equal(g_hash_table_lookup(out->messages, "msg1"), null_message_fn);
160
162}
163
164static void
165override_default_handler(void **state) {
166 pcmk__output_t *out = NULL;
167
168 pcmk__message_entry_t entries[] = {
169 { "msg1", "default", null_message_fn },
170 { "msg1", "text", null_message_fn_2 },
171 { NULL },
172 };
173
174 pcmk__output_new(&out, "text", NULL, NULL);
175
176 pcmk__register_messages(out, entries);
177 assert_int_equal(g_hash_table_size(out->messages), 1);
178 assert_ptr_equal(g_hash_table_lookup(out->messages, "msg1"), null_message_fn_2);
179
181}
182
183PCMK__UNIT_TEST(NULL, NULL,
184 cmocka_unit_test_setup_teardown(invalid_entries, setup, teardown),
185 cmocka_unit_test_setup_teardown(valid_entries, setup, teardown),
186 cmocka_unit_test_setup_teardown(duplicate_message_ids, setup, teardown),
187 cmocka_unit_test_setup_teardown(duplicate_functions, setup, teardown),
188 cmocka_unit_test_setup_teardown(default_handler, setup, teardown),
189 cmocka_unit_test_setup_teardown(override_default_handler, setup, teardown))
Formatted output for pacemaker tools.
void pcmk__register_messages(pcmk__output_t *out, const pcmk__message_entry_t *table)
Definition: output.c:161
int pcmk__register_format(GOptionGroup *group, const char *name, pcmk__output_factory_t create, const GOptionEntry *options)
Definition: output.c:91
void pcmk__output_free(pcmk__output_t *out)
Definition: output.c:26
int pcmk__output_new(pcmk__output_t **out, const char *fmt_name, const char *filename, char **argv)
Definition: output.c:42
int pcmk__call_message(pcmk__output_t *out, const char *message_id,...)
Definition: output.c:131
void pcmk__register_message(pcmk__output_t *out, const char *message_id, pcmk__message_fn_t fn)
Definition: output.c:153
void pcmk__unregister_formats(void)
Definition: output.c:123
@ pcmk_rc_ok
Definition: results.h:148
This structure contains everything that makes up a single output formatter.
int(* message)(pcmk__output_t *out, const char *message_id,...)
GHashTable * messages
Custom messages that are currently registered on this formatter.
const char * fmt_name
The name of this output formatter.
void(* register_message)(pcmk__output_t *out, const char *message_id, pcmk__message_fn_t fn)
bool(* init)(pcmk__output_t *out)
void(* free_priv)(pcmk__output_t *out)
#define pcmk__assert_asserts(stmt)
#define PCMK__UNIT_TEST(group_setup, group_teardown,...)