diff --git a/lib/common/tests/strings/Makefile.am b/lib/common/tests/strings/Makefile.am
index 64dab7494b..7fb9ae71fc 100644
--- a/lib/common/tests/strings/Makefile.am
+++ b/lib/common/tests/strings/Makefile.am
@@ -1,33 +1,34 @@
 #
 # 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.
 #
 
 AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include
 LDADD = $(top_builddir)/lib/common/libcrmcommon.la -lcmocka
 
 include $(top_srcdir)/mk/tap.mk
 
 # Add "_test" to the end of all test program names to simplify .gitignore.
 check_PROGRAMS = \
 		crm_get_msec_test 	\
 		crm_is_true_test 	\
 		crm_str_to_boolean_test 	\
 		pcmk__add_word_test		\
 		pcmk__btoa_test			\
 		pcmk__char_in_any_str_test	\
 		pcmk__ends_with_test 		\
 		pcmk__parse_ll_range_test	\
 		pcmk__scan_double_test		\
+		pcmk__scan_min_int_test		\
 		pcmk__scan_port_test		\
 		pcmk__starts_with_test 		\
 		pcmk__str_any_of_test		\
 		pcmk__str_in_list_test		\
 		pcmk__strcmp_test 			\
 		pcmk__trim_test
 
 TESTS = $(check_PROGRAMS)
diff --git a/lib/common/tests/strings/pcmk__scan_min_int_test.c b/lib/common/tests/strings/pcmk__scan_min_int_test.c
new file mode 100644
index 0000000000..9c5d073ddb
--- /dev/null
+++ b/lib/common/tests/strings/pcmk__scan_min_int_test.c
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2022 the Pacemaker project contributors
+ *
+ * The version control history for this file may have further details.
+ *
+ * This source code is licensed under the GNU Lesser General Public License
+ * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY.
+ */
+
+#include <crm_internal.h>
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <setjmp.h>
+#include <cmocka.h>
+
+static void
+empty_input_string(void **state)
+{
+    int result;
+
+    assert_int_equal(pcmk__scan_min_int("", &result, 1), EINVAL);
+    assert_int_equal(result, 1);
+
+    assert_int_equal(pcmk__scan_min_int(NULL, &result, 1), pcmk_rc_ok);
+    assert_int_equal(result, 1);
+}
+
+static void
+input_below_minimum(void **state)
+{
+    int result;
+
+    assert_int_equal(pcmk__scan_min_int("100", &result, 1024), pcmk_rc_ok);
+    assert_int_equal(result, 1024);
+}
+
+static void
+input_above_maximum(void **state)
+{
+    int result;
+
+    assert_int_equal(pcmk__scan_min_int("20000000000000000", &result, 100), EOVERFLOW);
+    assert_int_equal(result, INT_MAX);
+}
+
+static void
+input_just_right(void **state)
+{
+    int result;
+
+    assert_int_equal(pcmk__scan_min_int("1024", &result, 1024), pcmk_rc_ok);
+    assert_int_equal(result, 1024);
+
+    assert_int_equal(pcmk__scan_min_int("2048", &result, 1024), pcmk_rc_ok);
+    assert_int_equal(result, 2048);
+}
+
+int main(int argc, char **argv)
+{
+    const struct CMUnitTest tests[] = {
+        cmocka_unit_test(empty_input_string),
+        cmocka_unit_test(input_below_minimum),
+        cmocka_unit_test(input_above_maximum),
+        cmocka_unit_test(input_just_right),
+    };
+
+    cmocka_set_message_output(CM_OUTPUT_TAP);
+    return cmocka_run_group_tests(tests, NULL, NULL);
+}
+