summaryrefslogtreecommitdiffstats
path: root/lib/pengine/tests/rules
diff options
context:
space:
mode:
Diffstat (limited to 'lib/pengine/tests/rules')
-rw-r--r--lib/pengine/tests/rules/Makefile.am18
-rw-r--r--lib/pengine/tests/rules/pe_cron_range_satisfied_test.c165
2 files changed, 183 insertions, 0 deletions
diff --git a/lib/pengine/tests/rules/Makefile.am b/lib/pengine/tests/rules/Makefile.am
new file mode 100644
index 0000000..261ec16
--- /dev/null
+++ b/lib/pengine/tests/rules/Makefile.am
@@ -0,0 +1,18 @@
+#
+# Copyright 2020-2021 the Pacemaker project contributors
+#
+# The version control history for this file may have further details.
+#
+# This source code is licensed under the GNU General Public License version 2
+# or later (GPLv2+) WITHOUT ANY WARRANTY.
+#
+
+include $(top_srcdir)/mk/tap.mk
+include $(top_srcdir)/mk/unittest.mk
+
+LDADD += $(top_builddir)/lib/pengine/libpe_rules_test.la
+
+# Add "_test" to the end of all test program names to simplify .gitignore.
+check_PROGRAMS = pe_cron_range_satisfied_test
+
+TESTS = $(check_PROGRAMS)
diff --git a/lib/pengine/tests/rules/pe_cron_range_satisfied_test.c b/lib/pengine/tests/rules/pe_cron_range_satisfied_test.c
new file mode 100644
index 0000000..a8ba6cf
--- /dev/null
+++ b/lib/pengine/tests/rules/pe_cron_range_satisfied_test.c
@@ -0,0 +1,165 @@
+/*
+ * Copyright 2020-2022 the Pacemaker project contributors
+ *
+ * The version control history for this file may have further details.
+ *
+ * This source code is licensed under the GNU General Public License version 2
+ * or later (GPLv2+) WITHOUT ANY WARRANTY.
+ */
+
+#include <crm_internal.h>
+
+#include <glib.h>
+
+#include <crm/msg_xml.h>
+#include <crm/common/unittest_internal.h>
+#include <crm/common/xml.h>
+#include <crm/pengine/rules_internal.h>
+
+static void
+run_one_test(const char *t, const char *x, int expected) {
+ crm_time_t *tm = crm_time_new(t);
+ xmlNodePtr xml = string2xml(x);
+
+ assert_int_equal(pe_cron_range_satisfied(tm, xml), expected);
+
+ crm_time_free(tm);
+ free_xml(xml);
+}
+
+static void
+no_time_given(void **state) {
+ assert_int_equal(pe_cron_range_satisfied(NULL, NULL), pcmk_rc_op_unsatisfied);
+}
+
+static void
+any_time_satisfies_empty_spec(void **state) {
+ crm_time_t *tm = crm_time_new(NULL);
+
+ assert_int_equal(pe_cron_range_satisfied(tm, NULL), pcmk_rc_ok);
+
+ crm_time_free(tm);
+}
+
+static void
+time_satisfies_year_spec(void **state) {
+ run_one_test("2020-01-01",
+ "<date_spec " XML_ATTR_ID "='spec' years='2020'/>",
+ pcmk_rc_ok);
+}
+
+static void
+time_after_year_spec(void **state) {
+ run_one_test("2020-01-01",
+ "<date_spec " XML_ATTR_ID "='spec' years='2019'/>",
+ pcmk_rc_after_range);
+}
+
+static void
+time_satisfies_year_range(void **state) {
+ run_one_test("2020-01-01",
+ "<date_spec " XML_ATTR_ID "='spec' years='2010-2030'/>",
+ pcmk_rc_ok);
+}
+
+static void
+time_before_year_range(void **state) {
+ run_one_test("2000-01-01",
+ "<date_spec " XML_ATTR_ID "='spec' years='2010-2030'/>",
+ pcmk_rc_before_range);
+}
+
+static void
+time_after_year_range(void **state) {
+ run_one_test("2020-01-01",
+ "<date_spec " XML_ATTR_ID "='spec' years='2010-2015'/>",
+ pcmk_rc_after_range);
+}
+
+static void
+range_without_start_year_passes(void **state) {
+ run_one_test("2010-01-01",
+ "<date_spec " XML_ATTR_ID "='spec' years='-2020'/>",
+ pcmk_rc_ok);
+}
+
+static void
+range_without_end_year_passes(void **state) {
+ run_one_test("2010-01-01",
+ "<date_spec " XML_ATTR_ID "='spec' years='2000-'/>",
+ pcmk_rc_ok);
+ run_one_test("2000-10-01",
+ "<date_spec " XML_ATTR_ID "='spec' years='2000-'/>",
+ pcmk_rc_ok);
+}
+
+static void
+yeardays_satisfies(void **state) {
+ run_one_test("2020-01-30",
+ "<date_spec " XML_ATTR_ID "='spec' yeardays='30'/>",
+ pcmk_rc_ok);
+}
+
+static void
+time_after_yeardays_spec(void **state) {
+ run_one_test("2020-02-15",
+ "<date_spec " XML_ATTR_ID "='spec' yeardays='40'/>",
+ pcmk_rc_after_range);
+}
+
+static void
+yeardays_feb_29_satisfies(void **state) {
+ run_one_test("2016-02-29",
+ "<date_spec " XML_ATTR_ID "='spec' yeardays='60'/>",
+ pcmk_rc_ok);
+}
+
+static void
+exact_ymd_satisfies(void **state) {
+ run_one_test("2001-12-31",
+ "<date_spec " XML_ATTR_ID "='spec' years='2001' months='12' "
+ "monthdays='31'/>",
+ pcmk_rc_ok);
+}
+
+static void
+range_in_month_satisfies(void **state) {
+ run_one_test("2001-06-10",
+ "<date_spec " XML_ATTR_ID "='spec' years='2001' months='6' "
+ "monthdays='1-10'/>",
+ pcmk_rc_ok);
+}
+
+static void
+exact_ymd_after_range(void **state) {
+ run_one_test("2001-12-31",
+ "<date_spec " XML_ATTR_ID "='spec' years='2001' months='12' "
+ "monthdays='30'/>",
+ pcmk_rc_after_range);
+}
+
+static void
+time_after_monthdays_range(void **state) {
+ run_one_test("2001-06-10",
+ "<date_spec " XML_ATTR_ID "='spec' years='2001' months='6' "
+ "monthdays='11-15'/>",
+ pcmk_rc_before_range);
+}
+
+PCMK__UNIT_TEST(NULL, NULL,
+ cmocka_unit_test(no_time_given),
+ cmocka_unit_test(any_time_satisfies_empty_spec),
+ cmocka_unit_test(time_satisfies_year_spec),
+ cmocka_unit_test(time_after_year_spec),
+ cmocka_unit_test(time_satisfies_year_range),
+ cmocka_unit_test(time_before_year_range),
+ cmocka_unit_test(time_after_year_range),
+ cmocka_unit_test(range_without_start_year_passes),
+ cmocka_unit_test(range_without_end_year_passes),
+ cmocka_unit_test(yeardays_satisfies),
+ cmocka_unit_test(time_after_yeardays_spec),
+ cmocka_unit_test(yeardays_feb_29_satisfies),
+ cmocka_unit_test(exact_ymd_satisfies),
+ cmocka_unit_test(range_in_month_satisfies),
+ cmocka_unit_test(exact_ymd_after_range),
+ cmocka_unit_test(time_after_monthdays_range))