aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLexi Winter <lexi@hemlock.eden.le-fay.org>2025-03-26 12:13:24 +0000
committerLexi Winter <lexi@hemlock.eden.le-fay.org>2025-03-26 12:13:24 +0000
commit7f5e5b3c38f520555e63ed346325b810d7a0757e (patch)
treeb42f901d7e55501a7ee7a00a579f98f94233c5b6
parent55b437198f77edb62d5ebd3457de5266cd67c0e2 (diff)
downloadlibnvxx-7f5e5b3c38f520555e63ed346325b810d7a0757e.tar.gz
libnvxx-7f5e5b3c38f520555e63ed346325b810d7a0757e.tar.bz2
add error handling for get_*_array()
-rw-r--r--libnvxx/const_nv_list.cc46
-rw-r--r--libnvxx/tests/nvxx_basic.cc64
2 files changed, 99 insertions, 11 deletions
diff --git a/libnvxx/const_nv_list.cc b/libnvxx/const_nv_list.cc
index 7929804..0ae3130 100644
--- a/libnvxx/const_nv_list.cc
+++ b/libnvxx/const_nv_list.cc
@@ -193,10 +193,13 @@ __const_nv_list::exists_bool_array(std::string_view key) const
std::span<bool const>
__const_nv_list::get_bool_array(std::string_view key) const
{
+ auto skey = std::string(key);
+
+ if (!::nvlist_exists_bool_array(__m_nv, skey.c_str()))
+ throw nv_key_not_found(skey);
+
auto nitems = std::size_t{};
- auto *data = ::nvlist_get_bool_array(__m_nv,
- std::string(key).c_str(),
- &nitems);
+ auto *data = ::nvlist_get_bool_array(__m_nv, skey.c_str(), &nitems);
return {data, nitems};
}
@@ -230,9 +233,13 @@ __const_nv_list::exists_number_array(std::string_view key) const
std::span<std::uint64_t const>
__const_nv_list::get_number_array(std::string_view key) const
{
+ auto skey = std::string(key);
+
+ if (!::nvlist_exists_number_array(__m_nv, skey.c_str()))
+ throw nv_key_not_found(skey);
+
auto nitems = std::size_t{};
- auto *data = ::nvlist_get_number_array(
- __m_nv, std::string(key).c_str(), &nitems);
+ auto *data = ::nvlist_get_number_array(__m_nv, skey.c_str(), &nitems);
return {data, nitems};
}
@@ -266,9 +273,13 @@ __const_nv_list::exists_string_array(std::string_view key) const
std::vector<std::string_view>
__const_nv_list::get_string_array(std::string_view key) const
{
+ auto skey = std::string(key);
+
+ if (!::nvlist_exists_string_array(__m_nv, skey.c_str()))
+ throw nv_key_not_found(skey);
+
auto nitems = std::size_t{};
- auto *data = nvlist_get_string_array(__m_nv, std::string(key).c_str(),
- &nitems);
+ auto *data = nvlist_get_string_array(__m_nv, skey.c_str(), &nitems);
return std::span(data, data + nitems)
| construct<std::string_view>()
| std::ranges::to<std::vector>();
@@ -305,9 +316,13 @@ __const_nv_list::exists_nvlist_array(std::string_view key) const
std::vector<const_nv_list>
__const_nv_list::get_nvlist_array(std::string_view key) const
{
+ auto skey = std::string(key);
+
+ if (!::nvlist_exists_nvlist_array(__m_nv, skey.c_str()))
+ throw nv_key_not_found(skey);
+
auto nitems = std::size_t{};
- auto *data = nvlist_get_nvlist_array(__m_nv, std::string(key).c_str(),
- &nitems);
+ auto *data = nvlist_get_nvlist_array(__m_nv, skey.c_str(), &nitems);
return {std::from_range,
std::span(data, nitems) | construct<const_nv_list>()};
}
@@ -325,6 +340,11 @@ __const_nv_list::get_descriptor(std::string_view key) const
std::span<int const>
__const_nv_list::get_descriptor_array(std::string_view key) const
{
+ auto skey = std::string(key);
+
+ if (!::nvlist_exists_descriptor_array(__m_nv, skey.c_str()))
+ throw nv_key_not_found(skey);
+
auto nitems = std::size_t{};
auto *data = ::nvlist_get_descriptor_array(
__m_nv, std::string(key).c_str(), &nitems);
@@ -357,9 +377,13 @@ __const_nv_list::exists_binary(std::string_view key) const
std::span<std::byte const>
__const_nv_list::get_binary(std::string_view key) const
{
+ auto skey = std::string(key);
+
+ if (!::nvlist_exists_binary(__m_nv, skey.c_str()))
+ throw nv_key_not_found(skey);
+
auto size = std::size_t{};
- auto *data = nvlist_get_binary(__m_nv, std::string(key).c_str(),
- &size);
+ auto *data = nvlist_get_binary(__m_nv, skey.c_str(), &size);
return {static_cast<std::byte const *>(data), size};
}
diff --git a/libnvxx/tests/nvxx_basic.cc b/libnvxx/tests/nvxx_basic.cc
index 7cdf639..8950654 100644
--- a/libnvxx/tests/nvxx_basic.cc
+++ b/libnvxx/tests/nvxx_basic.cc
@@ -196,6 +196,15 @@ TEST_CASE(nvxx_add_bool_array)
ATF_REQUIRE_EQ(false, nvl.exists(key));
}
+TEST_CASE(nvxx_get_nonexistent_bool_array)
+{
+ auto nvl = bsd::nv_list();
+
+ ATF_REQUIRE_THROW_RE(bsd::nv_key_not_found,
+ "key \"nonesuch\" not found",
+ (void)nvl.get_bool_array("nonesuch"));
+}
+
TEST_CASE(nvxx_add_duplicate_bool_array)
{
using namespace std::literals;
@@ -347,6 +356,15 @@ TEST_CASE(nvxx_add_number_array)
ATF_REQUIRE_EQ(false, nvl.exists(key));
}
+TEST_CASE(nvxx_get_nonexistent_number_array)
+{
+ auto nvl = bsd::nv_list();
+
+ ATF_REQUIRE_THROW_RE(bsd::nv_key_not_found,
+ "key \"nonesuch\" not found",
+ (void)nvl.get_number_array("nonesuch"));
+}
+
TEST_CASE(nvxx_add_duplicate_number_array)
{
using namespace std::literals;
@@ -488,6 +506,15 @@ TEST_CASE(nvxx_add_string_array)
ATF_REQUIRE_EQ(false, nvl.exists(key));
}
+TEST_CASE(nvxx_get_nonexistent_string_array)
+{
+ auto nvl = bsd::nv_list();
+
+ ATF_REQUIRE_THROW_RE(bsd::nv_key_not_found,
+ "key \"nonesuch\" not found",
+ (void)nvl.get_string_array("nonesuch"));
+}
+
TEST_CASE(nvxx_add_duplicate_string_array)
{
using namespace std::literals;
@@ -645,6 +672,15 @@ TEST_CASE(nvxx_add_nvlist_array)
ATF_REQUIRE_EQ(n2, 2);
}
+TEST_CASE(nvxx_get_nonexistent_nvlist_array)
+{
+ auto nvl = bsd::nv_list();
+
+ ATF_REQUIRE_THROW_RE(bsd::nv_key_not_found,
+ "key \"nonesuch\" not found",
+ (void)nvl.get_nvlist_array("nonesuch"));
+}
+
TEST_CASE(nvxx_add_duplicate_nvlist_array)
{
using namespace std::literals;
@@ -659,6 +695,10 @@ TEST_CASE(nvxx_add_duplicate_nvlist_array)
nvl.add_nvlist_range(key, value));
}
+/*
+ * descriptor
+ */
+
TEST_CASE(nvxx_add_descriptor)
{
auto fds = std::array<int, 2>{};
@@ -690,6 +730,15 @@ TEST_CASE(nvxx_add_descriptor)
ATF_REQUIRE_EQ('4', buf[3]);
}
+TEST_CASE(nvxx_get_nonexistent_descriptor)
+{
+ auto nvl = bsd::nv_list();
+
+ ATF_REQUIRE_THROW_RE(bsd::nv_key_not_found,
+ "key \"nonesuch\" not found",
+ (void)nvl.get_descriptor("nonesuch"));
+}
+
TEST_CASE(nvxx_add_duplicate_descriptor)
{
using namespace std::literals;
@@ -747,6 +796,16 @@ TEST_CASE(nvxx_add_duplicate_binary)
nvl.add_binary(key, value));
}
+TEST_CASE(nvxx_get_nonexistent_binary)
+{
+ auto nvl = bsd::nv_list();
+
+ ATF_REQUIRE_THROW_RE(bsd::nv_key_not_found,
+ "key \"nonesuch\" not found",
+ (void)nvl.get_binary("nonesuch"));
+}
+
+
TEST_CASE(nvxx_take_binary)
{
using namespace std::literals;
@@ -801,6 +860,7 @@ ATF_INIT_TEST_CASES(tcs)
ATF_ADD_TEST_CASE(tcs, nvxx_add_bool_array);
ATF_ADD_TEST_CASE(tcs, nvxx_add_duplicate_bool_array);
+ ATF_ADD_TEST_CASE(tcs, nvxx_get_nonexistent_bool_array);
ATF_ADD_TEST_CASE(tcs, nvxx_add_bool_range);
ATF_ADD_TEST_CASE(tcs, nvxx_add_bool_contig_range);
@@ -812,6 +872,7 @@ ATF_INIT_TEST_CASES(tcs)
ATF_ADD_TEST_CASE(tcs, nvxx_add_number_array);
ATF_ADD_TEST_CASE(tcs, nvxx_add_duplicate_number_array);
+ ATF_ADD_TEST_CASE(tcs, nvxx_get_nonexistent_number_array);
ATF_ADD_TEST_CASE(tcs, nvxx_add_number_range);
ATF_ADD_TEST_CASE(tcs, nvxx_add_number_contig_range);
@@ -823,6 +884,7 @@ ATF_INIT_TEST_CASES(tcs)
ATF_ADD_TEST_CASE(tcs, nvxx_add_string_array);
ATF_ADD_TEST_CASE(tcs, nvxx_add_duplicate_string_array);
+ ATF_ADD_TEST_CASE(tcs, nvxx_get_nonexistent_string_array);
ATF_ADD_TEST_CASE(tcs, nvxx_add_string_range);
ATF_ADD_TEST_CASE(tcs, nvxx_add_string_contig_range);
@@ -834,12 +896,14 @@ ATF_INIT_TEST_CASES(tcs)
ATF_ADD_TEST_CASE(tcs, nvxx_add_nvlist_array);
ATF_ADD_TEST_CASE(tcs, nvxx_add_duplicate_nvlist_array);
+ ATF_ADD_TEST_CASE(tcs, nvxx_get_nonexistent_nvlist_array);
ATF_ADD_TEST_CASE(tcs, nvxx_add_descriptor);
ATF_ADD_TEST_CASE(tcs, nvxx_add_duplicate_descriptor);
ATF_ADD_TEST_CASE(tcs, nvxx_add_binary);
ATF_ADD_TEST_CASE(tcs, nvxx_add_duplicate_binary);
+ ATF_ADD_TEST_CASE(tcs, nvxx_get_nonexistent_binary);
ATF_ADD_TEST_CASE(tcs, nvxx_take_binary);
ATF_ADD_TEST_CASE(tcs, nvxx_add_binary_range);