pacemaker 3.0.1-16e74fc4da
Scalable High-Availability cluster resource manager
Loading...
Searching...
No Matches
pcmk_parse_score_test.c
Go to the documentation of this file.
1/*
2 * Copyright 2024 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>
11
12#include <limits.h>
13
14#include <crm/common/scores.h>
16
17extern int pcmk__score_red;
18extern int pcmk__score_green;
19extern int pcmk__score_yellow;
20
21static int default_score = 99;
22
23static void
24assert_score(const char *score_s, int expected_rc, int expected_score)
25{
26 int score = 0;
27 int rc = pcmk_parse_score(score_s, &score, default_score);
28
29 assert_int_equal(rc, expected_rc);
30 assert_int_equal(score, expected_score);
31}
32
33static void
34null_score_string(void **state)
35{
36 assert_score(NULL, pcmk_rc_ok, default_score);
37
38 // Test out-of-bounds default score
39
40 default_score = -2000000;
41 assert_score(NULL, pcmk_rc_ok, -PCMK_SCORE_INFINITY);
42
43 default_score = 2000000;
44 assert_score(NULL, pcmk_rc_ok, PCMK_SCORE_INFINITY);
45
46 default_score = 99;
47}
48
49static void
50null_score(void **state)
51{
52 assert_int_equal(pcmk_parse_score(NULL, NULL, default_score), pcmk_rc_ok);
53 assert_int_equal(pcmk_parse_score("0", NULL, default_score), pcmk_rc_ok);
54 assert_int_equal(pcmk_parse_score("foo", NULL, default_score),
56}
57
58static void
59bad_input(void **state)
60{
61 assert_score("redder", pcmk_rc_bad_input, default_score);
62 assert_score("3.141592", pcmk_rc_ok, 3);
63 assert_score("0xf00d", pcmk_rc_ok, 0);
64}
65
66static void
67special_values(void **state)
68{
69 assert_score("-INFINITY", pcmk_rc_ok, -PCMK_SCORE_INFINITY);
70 assert_score("INFINITY", pcmk_rc_ok, PCMK_SCORE_INFINITY);
71 assert_score("+INFINITY", pcmk_rc_ok, PCMK_SCORE_INFINITY);
72
73 pcmk__score_red = 10;
76
77 assert_score("red", pcmk_rc_ok, pcmk__score_red);
78 assert_score("green", pcmk_rc_ok, pcmk__score_green);
79 assert_score("yellow", pcmk_rc_ok, pcmk__score_yellow);
80
81 assert_score("ReD", pcmk_rc_ok, pcmk__score_red);
82 assert_score("GrEeN", pcmk_rc_ok, pcmk__score_green);
83 assert_score("yElLoW", pcmk_rc_ok, pcmk__score_yellow);
84}
85
86/* These ridiculous macros turn an integer constant into a string constant. */
87#define A(x) #x
88#define B(x) A(x)
89
90static void
91outside_limits(void **state)
92{
93 char *very_long = crm_strdup_printf(" %lld0", LLONG_MAX);
94
95 // Still within int range
97 assert_score("-" B(PCMK_SCORE_INFINITY) "00", pcmk_rc_ok,
99
100 // Outside long long range
101 assert_score(very_long, pcmk_rc_ok, PCMK_SCORE_INFINITY);
102 very_long[0] = '-';
103 assert_score(very_long, pcmk_rc_ok, -PCMK_SCORE_INFINITY);
104
105 free(very_long);
106}
107
108static void
109inside_limits(void **state)
110{
111 assert_score("1234", pcmk_rc_ok, 1234);
112 assert_score("-1234", pcmk_rc_ok, -1234);
113}
114
115PCMK__UNIT_TEST(NULL, NULL,
116 cmocka_unit_test(null_score_string),
117 cmocka_unit_test(null_score),
118 cmocka_unit_test(bad_input),
119 cmocka_unit_test(special_values),
120 cmocka_unit_test(outside_limits),
121 cmocka_unit_test(inside_limits))
int pcmk__score_yellow
Definition scores.c:18
#define B(x)
int pcmk__score_green
Definition scores.c:17
int pcmk__score_red
Definition scores.c:16
@ pcmk_rc_ok
Definition results.h:159
@ pcmk_rc_bad_input
Definition results.h:119
Pacemaker APIs related to scores.
int pcmk_parse_score(const char *score_s, int *score, int default_score)
Parse an integer score from a string.
Definition scores.c:34
#define PCMK_SCORE_INFINITY
Integer score to use to represent "infinity".
Definition scores.h:26
char * crm_strdup_printf(char const *format,...) G_GNUC_PRINTF(1
#define PCMK__UNIT_TEST(group_setup, group_teardown,...)