pacemaker 3.0.1-16e74fc4da
Scalable High-Availability cluster resource manager
Loading...
Searching...
No Matches
pcmk__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 General Public License version 2
7 * or later (GPLv2+) WITHOUT ANY WARRANTY.
8 */
9
10#include <crm_internal.h>
12
13#include "mock_private.h"
14
15static void
16empty_input_string(void **state)
17{
18 pcmk__mock_getenv = true;
19
20 // getenv() not called
21 assert_null(pcmk__env_option(NULL));
22 assert_null(pcmk__env_option(""));
23
24 pcmk__mock_getenv = false;
25}
26
27static void
28input_too_long_for_both(void **state)
29{
30 /* pcmk__env_option() prepends "PCMK_" before lookup. If the option name is
31 * too long for the buffer or isn't found in the env, then it prepends "HA_"
32 * and tries again. A string of length (NAME_MAX - 3) will set us just over
33 * just over the edge for both tries.
34 */
35 char long_opt[NAME_MAX - 2];
36
37 for (int i = 0; i < NAME_MAX - 3; i++) {
38 long_opt[i] = 'a';
39 }
40 long_opt[NAME_MAX - 3] = '\0';
41
42 pcmk__mock_getenv = true;
43
44 // getenv() not called
45 assert_null(pcmk__env_option(long_opt));
46
47 pcmk__mock_getenv = false;
48}
49
50static void
51input_too_long_for_pcmk(void **state)
52{
53 /* If an input is too long for "PCMK_<option>", make sure we fall through
54 * to try "HA_<option>".
55 *
56 * pcmk__env_option() prepends "PCMK_" first. A string of length
57 * (NAME_MAX - 5) will set us just over the edge, still short enough for
58 * "HA_<option>" to fit.
59 */
60 char long_opt[NAME_MAX - 4];
61 char buf[NAME_MAX];
62
63 for (int i = 0; i < NAME_MAX - 5; i++) {
64 long_opt[i] = 'a';
65 }
66 long_opt[NAME_MAX - 5] = '\0';
67
68 pcmk__mock_getenv = true;
69
70 /* NULL/non-NULL retval doesn't really matter here; just testing that we
71 * call getenv() for "HA_" prefix after too long for "PCMK_".
72 */
73 snprintf(buf, NAME_MAX, "HA_%s", long_opt);
74 expect_string(__wrap_getenv, name, buf);
75 will_return(__wrap_getenv, "value");
76 assert_string_equal(pcmk__env_option(long_opt), "value");
77
78 pcmk__mock_getenv = false;
79}
80
81static void
82value_not_found(void **state)
83{
84 // Value not found using PCMK_ or HA_ prefix. Should return NULL.
85 pcmk__mock_getenv = true;
86
87 expect_string(__wrap_getenv, name, "PCMK_env_var");
88 will_return(__wrap_getenv, NULL);
89
90 expect_string(__wrap_getenv, name, "HA_env_var");
91 will_return(__wrap_getenv, NULL);
92
93 assert_null(pcmk__env_option("env_var"));
94
95 pcmk__mock_getenv = false;
96}
97
98static void
99value_found_pcmk(void **state)
100{
101 // Value found using PCMK_. Should return value and skip HA_ lookup.
102 pcmk__mock_getenv = true;
103
104 expect_string(__wrap_getenv, name, "PCMK_env_var");
105 will_return(__wrap_getenv, "value");
106 assert_string_equal(pcmk__env_option("env_var"), "value");
107
108 pcmk__mock_getenv = false;
109}
110
111static void
112value_found_ha(void **state)
113{
114 // Value not found using PCMK_. Move on to HA_ lookup, find, and return.
115 pcmk__mock_getenv = true;
116
117 expect_string(__wrap_getenv, name, "PCMK_env_var");
118 will_return(__wrap_getenv, NULL);
119
120 expect_string(__wrap_getenv, name, "HA_env_var");
121 will_return(__wrap_getenv, "value");
122
123 assert_string_equal(pcmk__env_option("env_var"), "value");
124
125 pcmk__mock_getenv = false;
126}
127
128PCMK__UNIT_TEST(NULL, NULL,
129 cmocka_unit_test(empty_input_string),
130 cmocka_unit_test(input_too_long_for_both),
131 cmocka_unit_test(input_too_long_for_pcmk),
132 cmocka_unit_test(value_not_found),
133 cmocka_unit_test(value_found_pcmk),
134 cmocka_unit_test(value_found_ha))
const char * name
Definition cib.c:26
#define NAME_MAX
Definition logging.c:112
bool pcmk__mock_getenv
Definition mock.c:114
char * __wrap_getenv(const char *name)
Definition mock.c:117
const char * pcmk__env_option(const char *option)
Definition options.c:1085
#define PCMK__UNIT_TEST(group_setup, group_teardown,...)