encoding: in Block::blockFromValue(), fail early if TLV length is zero

Also add a test for the boost::asio::const_buffer conversion operator

Change-Id: I312e8cba21ee1e6c29f3fb90485fa2932a2e5fb2
diff --git a/tests/unit/encoding/block.t.cpp b/tests/unit/encoding/block.t.cpp
index fda45ca..b6a841b 100644
--- a/tests/unit/encoding/block.t.cpp
+++ b/tests/unit/encoding/block.t.cpp
@@ -24,6 +24,7 @@
 
 #include "tests/boost-test.hpp"
 
+#include <boost/asio/buffer.hpp>
 #include <boost/lexical_cast.hpp>
 #include <boost/test/data/test_case.hpp>
 
@@ -419,6 +420,28 @@
 
 BOOST_AUTO_TEST_SUITE_END() // Construction
 
+BOOST_AUTO_TEST_CASE(BlockFromValue)
+{
+  Block b1(301);
+  BOOST_CHECK_EXCEPTION(b1.blockFromValue(), Block::Error, [] (const auto& e) {
+    return e.what() == "Cannot construct block from empty TLV-VALUE"s;
+  });
+
+  Block b2(302, make_shared<Buffer>());
+  BOOST_CHECK_EXCEPTION(b2.blockFromValue(), Block::Error, [] (const auto& e) {
+    return e.what() == "Cannot construct block from empty TLV-VALUE"s;
+  });
+
+  b1.encode();
+  Block b3(303, b1);
+  b3.encode();
+  Block nested = b3.blockFromValue();
+  BOOST_CHECK_EQUAL(nested.type(), 301);
+  BOOST_CHECK_EQUAL(nested.size(), 4);
+  BOOST_CHECK_EQUAL(nested.value_size(), 0);
+  BOOST_CHECK(nested == b1);
+}
+
 BOOST_AUTO_TEST_SUITE(SubElements)
 
 BOOST_AUTO_TEST_CASE(Parse)
@@ -600,6 +623,14 @@
 
 BOOST_AUTO_TEST_SUITE_END() // SubElements
 
+BOOST_AUTO_TEST_CASE(ToAsioConstBuffer)
+{
+  Block block = "0101A0"_block;
+  boost::asio::const_buffer buffer(block);
+  BOOST_CHECK_EQUAL(boost::asio::buffer_cast<const uint8_t*>(buffer), block.wire());
+  BOOST_CHECK_EQUAL(boost::asio::buffer_size(buffer), block.size());
+}
+
 BOOST_AUTO_TEST_CASE(Equality)
 {
   const uint8_t one[] = {0x08, 0x00};