From 053b6d9fd3e893ebfcd7d147bb6f525f1b2b2a21 Mon Sep 17 00:00:00 2001 From: John Freeman Date: Wed, 19 Feb 2020 15:30:27 -0600 Subject: [PATCH] Include field name when diagnosing field not found: Closes #3263 --- src/ripple/protocol/STObject.h | 18 +++++++++++------- src/ripple/protocol/impl/STObject.cpp | 8 ++++---- src/test/protocol/STTx_test.cpp | 19 +++++++++++++++---- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/ripple/protocol/STObject.h b/src/ripple/protocol/STObject.h index 5f94aadab..97cd3611b 100644 --- a/src/ripple/protocol/STObject.h +++ b/src/ripple/protocol/STObject.h @@ -41,7 +41,11 @@ namespace ripple { class STArray; -//------------------------------------------------------------------------------ +inline void +throwFieldNotFound(SField const& field) +{ + Throw("Field not found: " + field.getName()); +} class STObject : public STBase @@ -492,7 +496,7 @@ public: STBase* rf = getPField (field, true); if (! rf) - Throw ("Field not found"); + throwFieldNotFound(field); if (rf->getSType () == STI_NOTPRESENT) rf = makeFieldPresent (field); @@ -552,7 +556,7 @@ private: const STBase* rf = peekAtPField (field); if (! rf) - Throw ("Field not found"); + throwFieldNotFound(field); SerializedTypeID id = rf->getSType (); @@ -578,7 +582,7 @@ private: const STBase* rf = peekAtPField (field); if (! rf) - Throw ("Field not found"); + throwFieldNotFound(field); SerializedTypeID id = rf->getSType (); @@ -602,7 +606,7 @@ private: STBase* rf = getPField (field, true); if (! rf) - Throw ("Field not found"); + throwFieldNotFound(field); if (rf->getSType () == STI_NOTPRESENT) rf = makeFieldPresent (field); @@ -622,7 +626,7 @@ private: STBase* rf = getPField (field, true); if (! rf) - Throw ("Field not found"); + throwFieldNotFound(field); if (rf->getSType () == STI_NOTPRESENT) rf = makeFieldPresent (field); @@ -642,7 +646,7 @@ private: STBase* rf = getPField (field, true); if (! rf) - Throw ("Field not found"); + throwFieldNotFound(field); if (rf->getSType () == STI_NOTPRESENT) rf = makeFieldPresent (field); diff --git a/src/ripple/protocol/impl/STObject.cpp b/src/ripple/protocol/impl/STObject.cpp index 752b2155f..7391651b3 100644 --- a/src/ripple/protocol/impl/STObject.cpp +++ b/src/ripple/protocol/impl/STObject.cpp @@ -343,7 +343,7 @@ const STBase& STObject::peekAtField (SField const& field) const int index = getFieldIndex (field); if (index == -1) - Throw ("Field not found"); + throwFieldNotFound(field); return peekAtIndex (index); } @@ -353,7 +353,7 @@ STBase& STObject::getField (SField const& field) int index = getFieldIndex (field); if (index == -1) - Throw ("Field not found"); + throwFieldNotFound(field); return getIndex (index); } @@ -453,7 +453,7 @@ STBase* STObject::makeFieldPresent (SField const& field) if (index == -1) { if (!isFree ()) - Throw ("Field not found"); + throwFieldNotFound(field); return getPIndex (emplace_back(detail::nonPresentObject, field)); } @@ -473,7 +473,7 @@ void STObject::makeFieldAbsent (SField const& field) int index = getFieldIndex (field); if (index == -1) - Throw ("Field not found"); + throwFieldNotFound(field); const STBase& f = peekAtIndex (index); diff --git a/src/test/protocol/STTx_test.cpp b/src/test/protocol/STTx_test.cpp index 51a2de51e..a37064b15 100644 --- a/src/test/protocol/STTx_test.cpp +++ b/src/test/protocol/STTx_test.cpp @@ -29,9 +29,22 @@ #include #include +#include namespace ripple { +/** + * Return true if the string loosely matches the regex. + * + * Meant for testing human-readable strings that may change over time. + */ +inline bool +matches(char const* string, char const* regex) +{ + return std::regex_search( + string, std::basic_regex(regex, std::regex_constants::icase)); +} + class STTx_test : public beast::unit_test::suite { public: @@ -1283,8 +1296,7 @@ public: } catch (std::runtime_error const& ex) { - BEAST_EXPECT ( - std::strcmp (ex.what(), "Field not found") == 0); + BEAST_EXPECT(matches(ex.what(), "field not found")); } } @@ -1348,8 +1360,7 @@ public: } catch (std::runtime_error const& ex) { - BEAST_EXPECT ( - std::strcmp (ex.what(), "Field not found") == 0); + BEAST_EXPECT(matches(ex.what(), "field not found")); } }