]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
test/mgr: Add PyUtil unit tests
authorstzuraski898 <steven.zuraski@ibm.com>
Wed, 28 Jan 2026 21:49:31 +0000 (21:49 +0000)
committerstzuraski898 <steven.zuraski@ibm.com>
Wed, 28 Jan 2026 21:49:31 +0000 (21:49 +0000)
Fixes: https://tracker.ceph.com/issues/72938
Signed-off-by: stzuraski898 <steven.zuraski@ibm.com>
src/test/mgr/test_pyutil.cc [new file with mode: 0644]

diff --git a/src/test/mgr/test_pyutil.cc b/src/test/mgr/test_pyutil.cc
new file mode 100644 (file)
index 0000000..f5cb127
--- /dev/null
@@ -0,0 +1,102 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#include <Python.h>
+
+#include "common/options.h"
+#include "global/global_init.h"
+#include "gtest/gtest.h"
+#include "mgr/PyUtil.h"
+
+#include "TestMgr.h"
+
+TEST(PyUtil, IntType)
+{
+  PyObject* int_obj = get_python_typed_option_value(Option::TYPE_INT, "11");
+  ASSERT_TRUE(PyLong_Check(int_obj));
+  EXPECT_EQ(PyLong_AsLong(int_obj), 11);
+  Py_DECREF(int_obj);
+}
+
+TEST(PyUtil, FloatType)
+{
+  PyObject* float_obj =
+      get_python_typed_option_value(Option::TYPE_FLOAT, "11.22");
+  ASSERT_TRUE(PyFloat_Check(float_obj));
+  EXPECT_DOUBLE_EQ(PyFloat_AsDouble(float_obj), 11.22);
+  Py_DECREF(float_obj);
+}
+
+TEST(PyUtil, BoolType)
+{
+  PyObject* bool_obj_true =
+      get_python_typed_option_value(Option::TYPE_BOOL, "true");
+  ASSERT_EQ(bool_obj_true, Py_True);
+  Py_DECREF(bool_obj_true);
+
+  PyObject* bool_obj_false =
+      get_python_typed_option_value(Option::TYPE_BOOL, "false");
+  ASSERT_EQ(bool_obj_false, Py_False);
+  Py_DECREF(bool_obj_false);
+}
+
+TEST(PyUtil, StringType)
+{
+  PyObject* string_obj = get_python_typed_option_value(Option::TYPE_STR, "test");
+  ASSERT_TRUE(PyUnicode_Check(string_obj));
+  EXPECT_STREQ(PyUnicode_AsUTF8(string_obj), "test");
+  Py_DECREF(string_obj);
+}
+
+/* Begin Negative Tests */
+
+TEST(PyUtil, BoolWithInvalidString)
+{
+  PyObject* bool_obj_false =
+      get_python_typed_option_value(Option::TYPE_BOOL, "maybe");
+  ASSERT_EQ(bool_obj_false, Py_False);
+  Py_DECREF(bool_obj_false);
+}
+
+TEST(PyUtil, StringTypeEmptyString)
+{
+  PyObject* string_obj = get_python_typed_option_value(Option::TYPE_STR, "");
+  ASSERT_TRUE(PyUnicode_Check(string_obj));
+  EXPECT_STREQ(PyUnicode_AsUTF8(string_obj), "");
+  Py_DECREF(string_obj);
+}
+
+TEST(PyUtil, IntTypeExtremes)
+{
+  PyObject* int_obj_max =
+      get_python_typed_option_value(Option::TYPE_INT, "2147483647");
+  ASSERT_TRUE(PyLong_Check(int_obj_max));
+  EXPECT_EQ(PyLong_AsLong(int_obj_max), 2147483647);
+  Py_DECREF(int_obj_max);
+
+  PyObject* int_obj_min =
+      get_python_typed_option_value(Option::TYPE_INT, "-2147483648");
+  ASSERT_TRUE(PyLong_Check(int_obj_min));
+  EXPECT_EQ(PyLong_AsLong(int_obj_min), -2147483648);
+  Py_DECREF(int_obj_min);
+}
+
+/*Commented out until Tracker 74181 is resolved
+  Causes a segfault since there is no guard against bad input
+TEST(PyUtil, IntTypeMismatch)
+{
+  PyObject* int_obj = get_python_typed_option_value(Option::TYPE_INT, "abc");
+  ASSERT_TRUE(PyLong_Check(int_obj));
+  Py_DECREF(int_obj);
+}
+*/
+/* End Negative Tests */
+
+int
+main(int argc, char* argv[])
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  ::testing::AddGlobalTestEnvironment(new PythonEnv);
+
+  return RUN_ALL_TESTS();
+}