pacemaker 2.1.5-a3f44794f94
Scalable High-Availability cluster resource manager
pcmk__set_env_option_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>
12
13#include "mock_private.h"
14
15static void
16bad_input_string(void **state)
17{
18 // Bad setenv()/unsetenv() input: NULL, empty, or containing '='
19
20 // Never call setenv()
21 pcmk__mock_setenv = true;
22
23 pcmk__set_env_option(NULL, "new_value");
24 pcmk__set_env_option("", "new_value");
25 pcmk__set_env_option("name=val", "new_value");
26
27 pcmk__mock_setenv = false;
28
29 // Never call unsetenv()
31
32 pcmk__set_env_option(NULL, NULL);
33 pcmk__set_env_option("", NULL);
34 pcmk__set_env_option("name=val", NULL);
35
36 pcmk__mock_unsetenv = false;
37}
38
39static void
40input_too_long_for_both(void **state)
41{
42 /* pcmk__set_env_option() wants to set "PCMK_<option>" and "HA_<option>". If
43 * "PCMK_<option>" is too long for the buffer, it simply moves on to
44 * "HA_<option>". A string of length (NAME_MAX - 3) will set us just over
45 * the edge for both tries.
46 */
47 char long_opt[NAME_MAX - 2];
48
49 for (int i = 0; i < NAME_MAX - 3; i++) {
50 long_opt[i] = 'a';
51 }
52 long_opt[NAME_MAX - 3] = '\0';
53
54 // Never call setenv() or unsetenv()
55 pcmk__mock_setenv = true;
56 pcmk__set_env_option(long_opt, "new_value");
57 pcmk__mock_setenv = false;
58
60 pcmk__set_env_option(long_opt, NULL);
61 pcmk__mock_unsetenv = false;
62}
63
64static void
65input_too_long_for_pcmk(void **state)
66{
67 /* If an input is too long to set "PCMK_<option>", make sure we fall through
68 * to try to set "HA_<option>".
69 *
70 * A string of length (NAME_MAX - 5) will set us just over the edge for
71 * "PCMK_<option>", while still short enough for "HA_<option>" to fit.
72 */
73 char long_opt[NAME_MAX - 4];
74 char buf[NAME_MAX];
75
76 for (int i = 0; i < NAME_MAX - 5; i++) {
77 long_opt[i] = 'a';
78 }
79 long_opt[NAME_MAX - 5] = '\0';
80
81 snprintf(buf, NAME_MAX, "HA_%s", long_opt);
82
83 // Call setenv() for "HA_" only
84 pcmk__mock_setenv = true;
85
86 expect_string(__wrap_setenv, name, buf);
87 expect_string(__wrap_setenv, value, "new_value");
88 expect_value(__wrap_setenv, overwrite, 1);
89 will_return(__wrap_setenv, 0);
90 pcmk__set_env_option(long_opt, "new_value");
91
92 pcmk__mock_setenv = false;
93
94 // Call unsetenv() for "HA_" only
96
97 expect_string(__wrap_unsetenv, name, buf);
98 will_return(__wrap_unsetenv, 0);
99 pcmk__set_env_option(long_opt, NULL);
100
101 pcmk__mock_unsetenv = false;
102}
103
104static void
105valid_inputs_set(void **state)
106{
107 // Make sure we set "PCMK_<option>" and "HA_<option>"
108 pcmk__mock_setenv = true;
109
110 expect_string(__wrap_setenv, name, "PCMK_env_var");
111 expect_string(__wrap_setenv, value, "new_value");
112 expect_value(__wrap_setenv, overwrite, 1);
113 will_return(__wrap_setenv, 0);
114 expect_string(__wrap_setenv, name, "HA_env_var");
115 expect_string(__wrap_setenv, value, "new_value");
116 expect_value(__wrap_setenv, overwrite, 1);
117 will_return(__wrap_setenv, 0);
118 pcmk__set_env_option("env_var", "new_value");
119
120 // Empty string is also a valid value
121 expect_string(__wrap_setenv, name, "PCMK_env_var");
122 expect_string(__wrap_setenv, value, "");
123 expect_value(__wrap_setenv, overwrite, 1);
124 will_return(__wrap_setenv, 0);
125 expect_string(__wrap_setenv, name, "HA_env_var");
126 expect_string(__wrap_setenv, value, "");
127 expect_value(__wrap_setenv, overwrite, 1);
128 will_return(__wrap_setenv, 0);
129 pcmk__set_env_option("env_var", "");
130
131 pcmk__mock_setenv = false;
132}
133
134static void
135valid_inputs_unset(void **state)
136{
137 // Make sure we unset "PCMK_<option>" and "HA_<option>"
138 pcmk__mock_unsetenv = true;
139
140 expect_string(__wrap_unsetenv, name, "PCMK_env_var");
141 will_return(__wrap_unsetenv, 0);
142 expect_string(__wrap_unsetenv, name, "HA_env_var");
143 will_return(__wrap_unsetenv, 0);
144 pcmk__set_env_option("env_var", NULL);
145
146 pcmk__mock_unsetenv = false;
147}
148
149PCMK__UNIT_TEST(NULL, NULL,
150 cmocka_unit_test(bad_input_string),
151 cmocka_unit_test(input_too_long_for_both),
152 cmocka_unit_test(input_too_long_for_pcmk),
153 cmocka_unit_test(valid_inputs_set),
154 cmocka_unit_test(valid_inputs_unset))
const char * name
Definition: cib.c:24
#define NAME_MAX
Definition: logging.c:103
int __wrap_setenv(const char *name, const char *value, int overwrite)
Definition: mock.c:121
bool pcmk__mock_unsetenv
Definition: mock.c:146
bool pcmk__mock_setenv
Definition: mock.c:118
int __wrap_unsetenv(const char *name)
Definition: mock.c:149
void pcmk__set_env_option(const char *option, const char *value)
Set or unset a Pacemaker environment variable option.
Definition: options.c:333
#define PCMK__UNIT_TEST(group_setup, group_teardown,...)