/// be created.
template<typename OptionType>
OptionPtr cloneInternal() const {
- boost::shared_ptr<OptionType>
- option(new OptionType(*dynamic_cast<const OptionType*>(this)));
- return (option);
+ const OptionType* cast_this = dynamic_cast<const OptionType*>(this);
+ if (cast_this) {
+ return (boost::shared_ptr<OptionType>(new OptionType(*cast_this)));
+ }
+ return (OptionPtr());
}
/// @brief Store option's header in a buffer.
#include <dhcp/dhcp6.h>
#include <dhcp/libdhcp++.h>
#include <dhcp/option.h>
+#include <dhcp/option_int.h>
#include <exceptions/exceptions.h>
#include <util/buffer.h>
}
using Option::unpackOptions;
+ using Option::cloneInternal;
};
class OptionTest : public ::testing::Test {
}
+// This test verifies that cloneInternal returns NULL pointer if
+// non-compatible type is used as a template argument.
+// By non-compatible it is meant that the option instance doesn't
+// dynamic_cast to the type specified as template argument.
+// In our case, the NakedOption doesn't cast to OptionUint8 as the
+// latter is not derived from NakedOption.
+TEST_F(OptionTest, cloneInternal) {
+ NakedOption option;
+ OptionPtr clone;
+ // This shouldn't throw nor cause segmentation fault.
+ ASSERT_NO_THROW(clone = option.cloneInternal<OptionUint8>());
+ EXPECT_FALSE(clone);
+}
+
}