root/lib/common/tests/scores/pcmk_parse_score_test.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. assert_score
  2. null_score_string
  3. null_score
  4. bad_input
  5. special_values
  6. outside_limits
  7. inside_limits

   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>
  15 #include <crm/common/unittest_internal.h>
  16 
  17 extern int pcmk__score_red;
  18 extern int pcmk__score_green;
  19 extern int pcmk__score_yellow;
  20 
  21 static int default_score = 99;
  22 
  23 static void
  24 assert_score(const char *score_s, int expected_rc, int expected_score)
     /* [previous][next][first][last][top][bottom][index][help] */
  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 
  33 static void
  34 null_score_string(void **state)
     /* [previous][next][first][last][top][bottom][index][help] */
  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 
  49 static void
  50 null_score(void **state)
     /* [previous][next][first][last][top][bottom][index][help] */
  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),
  55                      EINVAL);
  56 }
  57 
  58 static void
  59 bad_input(void **state)
     /* [previous][next][first][last][top][bottom][index][help] */
  60 {
  61     assert_score("redder", EINVAL, default_score);
  62     assert_score("3.141592", pcmk_rc_ok, 3);
  63     assert_score("0xf00d", pcmk_rc_ok, 0);
  64 }
  65 
  66 static void
  67 special_values(void **state)
     /* [previous][next][first][last][top][bottom][index][help] */
  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;
  74     pcmk__score_green = 20;
  75     pcmk__score_yellow = 30;
  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 
  90 static void
  91 outside_limits(void **state)
     /* [previous][next][first][last][top][bottom][index][help] */
  92 {
  93     char *very_long = crm_strdup_printf(" %lld0", LLONG_MAX);
  94 
  95     // Still within int range
  96     assert_score(B(PCMK_SCORE_INFINITY) "00", pcmk_rc_ok, PCMK_SCORE_INFINITY);
  97     assert_score("-" B(PCMK_SCORE_INFINITY) "00", pcmk_rc_ok,
  98                  -PCMK_SCORE_INFINITY);
  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     free(very_long);
 105 }
 106 
 107 static void
 108 inside_limits(void **state)
     /* [previous][next][first][last][top][bottom][index][help] */
 109 {
 110     assert_score("1234", pcmk_rc_ok, 1234);
 111     assert_score("-1234", pcmk_rc_ok, -1234);
 112 }
 113 
 114 PCMK__UNIT_TEST(NULL, NULL,
 115                 cmocka_unit_test(null_score_string),
 116                 cmocka_unit_test(null_score),
 117                 cmocka_unit_test(bad_input),
 118                 cmocka_unit_test(special_values),
 119                 cmocka_unit_test(outside_limits),
 120                 cmocka_unit_test(inside_limits))

/* [previous][next][first][last][top][bottom][index][help] */