diff options
| -rw-r--r-- | libnvxx/const_nv_list.cc | 46 | ||||
| -rw-r--r-- | libnvxx/tests/nvxx_basic.cc | 64 |
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); |
