data: add shortcuts to access SignatureType and KeyLocator

Also, modernize the API of SignatureInfo and deprecate
unsetKeyLocator() and unsetValidityPeriod()

Change-Id: I8b775a4deb185784a3dcc8bd96c8f5f0c2915854
diff --git a/tests/unit/signature-info.t.cpp b/tests/unit/signature-info.t.cpp
index 2702282..1b0fe58 100644
--- a/tests/unit/signature-info.t.cpp
+++ b/tests/unit/signature-info.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2018 Regents of the University of California.
+ * Copyright (c) 2013-2020 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -22,6 +22,7 @@
 #include "ndn-cxx/signature-info.hpp"
 
 #include "tests/boost-test.hpp"
+
 #include <boost/lexical_cast.hpp>
 
 namespace ndn {
@@ -30,17 +31,17 @@
 BOOST_AUTO_TEST_SUITE(TestSignatureInfo)
 
 const uint8_t sigInfoRsa[] = {
-0x16, 0x1b, // SignatureInfo
-  0x1b, 0x01, // SignatureType
-    0x01, // Sha256WithRsa
-  0x1c, 0x16, // KeyLocator
-    0x07, 0x14, // Name
-      0x08, 0x04,
-        0x74, 0x65, 0x73, 0x74,
-      0x08, 0x03,
-        0x6b, 0x65, 0x79,
-      0x08, 0x07,
-        0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72
+  0x16, 0x1b, // SignatureInfo
+    0x1b, 0x01, // SignatureType
+      0x01, // Sha256WithRsa
+    0x1c, 0x16, // KeyLocator
+      0x07, 0x14, // Name
+        0x08, 0x04,
+          0x74, 0x65, 0x73, 0x74,
+        0x08, 0x03,
+          0x6b, 0x65, 0x79,
+        0x08, 0x07,
+          0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72
 };
 
 BOOST_AUTO_TEST_CASE(Constructor)
@@ -49,6 +50,8 @@
   BOOST_CHECK_EQUAL(info.getSignatureType(), -1);
   BOOST_CHECK_EQUAL(info.hasKeyLocator(), false);
   BOOST_CHECK_THROW(info.getKeyLocator(), SignatureInfo::Error);
+  BOOST_CHECK_EQUAL(info.hasValidityPeriod(), false);
+  BOOST_CHECK_THROW(info.getValidityPeriod(), SignatureInfo::Error);
 
   BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(info), "Invalid SignatureInfo");
 
@@ -63,23 +66,21 @@
   SignatureInfo sha256RsaInfo(tlv::SignatureSha256WithRsa, keyLocator);
   BOOST_CHECK_EQUAL(sha256RsaInfo.getSignatureType(), tlv::SignatureSha256WithRsa);
   BOOST_CHECK_EQUAL(sha256RsaInfo.hasKeyLocator(), true);
-  BOOST_CHECK_NO_THROW(sha256RsaInfo.getKeyLocator());
   BOOST_CHECK_EQUAL(sha256RsaInfo.getKeyLocator().getName(), Name("/test/key/locator"));
+  BOOST_CHECK_EQUAL(sha256RsaInfo.hasValidityPeriod(), false);
+  BOOST_CHECK_THROW(sha256RsaInfo.getValidityPeriod(), SignatureInfo::Error);
 
-  BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(sha256RsaInfo), "SignatureSha256WithRsa Name=/test/key/locator");
+  BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(sha256RsaInfo),
+                    "SignatureSha256WithRsa Name=/test/key/locator");
 
-  const Block& encoded = sha256RsaInfo.wireEncode();
+  auto encoded = sha256RsaInfo.wireEncode();
   Block sigInfoBlock(sigInfoRsa, sizeof(sigInfoRsa));
-
-  BOOST_CHECK_EQUAL_COLLECTIONS(sigInfoBlock.wire(),
-                                sigInfoBlock.wire() + sigInfoBlock.size(),
-                                encoded.wire(),
-                                encoded.wire() + encoded.size());
+  BOOST_CHECK_EQUAL_COLLECTIONS(sigInfoBlock.wire(), sigInfoBlock.wire() + sigInfoBlock.size(),
+                                encoded.wire(), encoded.wire() + encoded.size());
 
   sha256RsaInfo = SignatureInfo(sigInfoBlock);
   BOOST_CHECK_EQUAL(sha256RsaInfo.getSignatureType(), tlv::SignatureSha256WithRsa);
   BOOST_CHECK_EQUAL(sha256RsaInfo.hasKeyLocator(), true);
-  BOOST_CHECK_NO_THROW(sha256RsaInfo.getKeyLocator());
   BOOST_CHECK_EQUAL(sha256RsaInfo.getKeyLocator().getName(), Name("/test/key/locator"));
 }
 
@@ -132,37 +133,53 @@
 
 }
 
-BOOST_AUTO_TEST_CASE(SetterGetter)
+BOOST_AUTO_TEST_CASE(GetSetSignatureType)
 {
   SignatureInfo info;
   BOOST_CHECK_EQUAL(info.getSignatureType(), -1);
-  BOOST_CHECK_EQUAL(info.hasKeyLocator(), false);
-  BOOST_CHECK_THROW(info.getKeyLocator(), SignatureInfo::Error);
+  BOOST_CHECK_THROW(info.wireEncode(), SignatureInfo::Error);
 
-  info.setSignatureType(tlv::SignatureSha256WithRsa);
-  BOOST_CHECK_EQUAL(info.getSignatureType(), tlv::SignatureSha256WithRsa);
-  BOOST_CHECK_EQUAL(info.hasKeyLocator(), false);
+  info.setSignatureType(tlv::SignatureSha256WithEcdsa);
+  BOOST_CHECK_EQUAL(info.getSignatureType(), tlv::SignatureSha256WithEcdsa);
+  BOOST_CHECK_EQUAL(info.hasWire(), false);
 
-  KeyLocator keyLocator("/test/key/locator");
-  info.setKeyLocator(keyLocator);
-  BOOST_CHECK_EQUAL(info.hasKeyLocator(), true);
-  BOOST_CHECK_NO_THROW(info.getKeyLocator());
-  BOOST_CHECK_EQUAL(info.getKeyLocator().getName(), Name("/test/key/locator"));
+  info.wireEncode();
+  BOOST_CHECK_EQUAL(info.hasWire(), true);
+  info.setSignatureType(tlv::SignatureSha256WithEcdsa);
+  BOOST_CHECK_EQUAL(info.hasWire(), true);
 
-  const Block& encoded = info.wireEncode();
-  Block sigInfoBlock(sigInfoRsa, sizeof(sigInfoRsa));
-
-  BOOST_CHECK_EQUAL_COLLECTIONS(sigInfoBlock.wire(),
-                                sigInfoBlock.wire() + sigInfoBlock.size(),
-                                encoded.wire(),
-                                encoded.wire() + encoded.size());
-
-  info.unsetKeyLocator();
-  BOOST_CHECK_EQUAL(info.hasKeyLocator(), false);
-  BOOST_CHECK_THROW(info.getKeyLocator(), SignatureInfo::Error);
+  info.setSignatureType(static_cast<tlv::SignatureTypeValue>(1234));
+  BOOST_CHECK_EQUAL(info.getSignatureType(), 1234);
+  BOOST_CHECK_EQUAL(info.hasWire(), false);
 }
 
-BOOST_AUTO_TEST_CASE(ValidityPeriodExtension)
+BOOST_AUTO_TEST_CASE(GetSetKeyLocator)
+{
+  SignatureInfo info(tlv::SignatureSha256WithEcdsa);
+  BOOST_CHECK_EQUAL(info.hasKeyLocator(), false);
+  BOOST_CHECK_THROW(info.getKeyLocator(), SignatureInfo::Error);
+
+  info.setKeyLocator(Name("/test/key/locator"));
+  BOOST_CHECK_EQUAL(info.hasKeyLocator(), true);
+  BOOST_CHECK_EQUAL(info.getKeyLocator().getName(), "/test/key/locator");
+  BOOST_CHECK_EQUAL(info.hasWire(), false);
+
+  info.wireEncode();
+  BOOST_CHECK_EQUAL(info.hasWire(), true);
+  info.setKeyLocator(Name("/test/key/locator"));
+  BOOST_CHECK_EQUAL(info.hasWire(), true);
+  info.setKeyLocator(Name("/another/key/locator"));
+  BOOST_CHECK_EQUAL(info.hasWire(), false);
+
+  info.wireEncode();
+  BOOST_CHECK_EQUAL(info.hasWire(), true);
+  info.setKeyLocator(nullopt);
+  BOOST_CHECK_EQUAL(info.hasKeyLocator(), false);
+  BOOST_CHECK_THROW(info.getKeyLocator(), SignatureInfo::Error);
+  BOOST_CHECK_EQUAL(info.hasWire(), false);
+}
+
+BOOST_AUTO_TEST_CASE(ValidityPeriod)
 {
   const uint8_t sigInfo[] = {
     0x16, 0x45, // SignatureInfo
@@ -185,50 +202,61 @@
           0x54, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30
   };
 
-  time::system_clock::TimePoint notBefore = time::getUnixEpoch();
-  time::system_clock::TimePoint notAfter = notBefore + 1_day;
+  const auto notBefore = time::getUnixEpoch();
+  const auto notAfter = notBefore + 1_day;
   security::ValidityPeriod vp1(notBefore, notAfter);
 
-  // encode
-  SignatureInfo info;
-  info.setSignatureType(tlv::SignatureSha256WithRsa);
-  info.setKeyLocator(KeyLocator("/test/key/locator"));
+  SignatureInfo info(tlv::SignatureSha256WithRsa, KeyLocator("/test/key/locator"));
+  BOOST_CHECK_EQUAL(info.hasValidityPeriod(), false);
+  BOOST_CHECK_THROW(info.getValidityPeriod(), SignatureInfo::Error);
+
+  info.wireEncode();
   info.setValidityPeriod(vp1);
-
+  BOOST_CHECK_EQUAL(info.hasValidityPeriod(), true);
   BOOST_CHECK_EQUAL(info.getValidityPeriod(), vp1);
+  BOOST_CHECK_EQUAL(info.hasWire(), false);
 
-  const Block& encoded = info.wireEncode();
-
+  // encode
+  auto encoded = info.wireEncode();
+  BOOST_CHECK_EQUAL(info.hasWire(), true);
   BOOST_CHECK_EQUAL_COLLECTIONS(sigInfo, sigInfo + sizeof(sigInfo),
                                 encoded.wire(), encoded.wire() + encoded.size());
 
+  info.setValidityPeriod(vp1);
+  BOOST_CHECK_EQUAL(info.hasWire(), true);
+
   // decode
   Block block(sigInfo, sizeof(sigInfo));
-  SignatureInfo info2;
-  info2.wireDecode(block);
+  SignatureInfo info2(block);
+  BOOST_CHECK_EQUAL(info2.hasValidityPeriod(), true);
   BOOST_CHECK_EQUAL(info2.getValidityPeriod(), vp1);
+  BOOST_CHECK_EQUAL(info2.hasWire(), true);
 
-  const security::ValidityPeriod& validityPeriod = info2.getValidityPeriod();
-  BOOST_CHECK(validityPeriod.getPeriod() == std::make_pair(notBefore, notAfter));
+  info2.setValidityPeriod(security::ValidityPeriod(notBefore, notBefore + 42_days));
+  BOOST_CHECK_EQUAL(info2.hasValidityPeriod(), true);
+  BOOST_CHECK_NE(info2.getValidityPeriod(), vp1);
+  BOOST_CHECK(info2.getValidityPeriod().getPeriod() == std::make_pair(notBefore, notBefore + 42_days));
+  BOOST_CHECK_EQUAL(info2.hasWire(), false);
+
+  info2.wireEncode();
+  BOOST_CHECK_EQUAL(info2.hasWire(), true);
+  info2.setValidityPeriod(nullopt);
+  BOOST_CHECK_EQUAL(info2.hasValidityPeriod(), false);
+  BOOST_CHECK_THROW(info2.getValidityPeriod(), SignatureInfo::Error);
+  BOOST_CHECK_EQUAL(info2.hasWire(), false);
 }
 
 BOOST_AUTO_TEST_CASE(OtherTlvs)
 {
-  SignatureInfo info;
-  BOOST_CHECK_EQUAL(info.getSignatureType(), -1);
-  BOOST_CHECK_EQUAL(info.hasKeyLocator(), false);
-  BOOST_CHECK_THROW(info.getKeyLocator(), SignatureInfo::Error);
-
-  const uint8_t tlv1[] = {
-    0x81, // T
-    0x01, // L
-    0x01, // V
-  };
-  Block block1(tlv1, sizeof(tlv1));
-
-  info.appendTypeSpecificTlv(block1);
+  SignatureInfo info(tlv::SignatureSha256WithEcdsa);
+  info.appendTypeSpecificTlv("810101"_block);
   BOOST_CHECK_THROW(info.getTypeSpecificTlv(0x82), SignatureInfo::Error);
-  BOOST_REQUIRE_NO_THROW(info.getTypeSpecificTlv(0x81));
+  BOOST_CHECK_EQUAL(info.getTypeSpecificTlv(0x81).type(), 0x81);
+
+  info.wireEncode();
+  BOOST_CHECK_EQUAL(info.hasWire(), true);
+  info.appendTypeSpecificTlv("82020202"_block);
+  BOOST_CHECK_EQUAL(info.hasWire(), false);
 }
 
 BOOST_AUTO_TEST_CASE(OtherTlvsEncoding) // Bug #3914