interest: Add Link and SelectedDelegation fields

Change-Id: I1e4bafe8559ef87135de6cb6f209fc94dfa231b0
Refs: #2587
diff --git a/tests/unit-tests/interest.t.cpp b/tests/unit-tests/interest.t.cpp
index be466b0..42be675 100644
--- a/tests/unit-tests/interest.t.cpp
+++ b/tests/unit-tests/interest.t.cpp
@@ -24,6 +24,7 @@
 #include "data.hpp"
 #include "security/signature-sha256-with-rsa.hpp"
 #include "security/digest-sha256.hpp"
+#include "security/key-chain.hpp"
 #include "encoding/buffer-stream.hpp"
 
 #include "boost-test.hpp"
@@ -109,6 +110,392 @@
           0x2,  0x3,  0xe8
 };
 
+const uint8_t InterestWithLink[] = {
+  0x05,  0xfb, // Interest
+      0x07,  0x14, // Name
+          0x08,  0x5, // NameComponent
+              0x6c,  0x6f,  0x63,  0x61,  0x6c,
+          0x08,  0x3, // NameComponent
+              0x6e,  0x64,  0x6e,
+          0x08,  0x6, // NameComponent
+              0x70,  0x72,  0x65,  0x66,  0x69,  0x78,
+      0x0a,  0x4, // Nonce
+          0x1, 0x0, 0x0, 0x00,
+      0x06, 0xda, // Data
+          0x07, 0x14, // Name
+              0x08, 0x05,
+                  0x6c, 0x6f, 0x63, 0x61, 0x6c,
+              0x08, 0x03,
+                  0x6e, 0x64, 0x6e,
+              0x08, 0x06,
+                  0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
+          0x14, 0x07, // MetaInfo
+              0x18, 0x01, // ContentType
+                  0x01,
+              0x19, 0x02, // FreshnessPeriod
+                  0x27, 0x10,
+          0x15, 0x1a, // Content
+              0x1f, 0x0c, // LinkDelegation
+                  0x1e, 0x01, // LinkPreference
+                      0x0a,
+                  0x07, 0x07, // Name
+                      0x08, 0x05,
+                          0x6c, 0x6f, 0x63, 0x61, 0x6c,
+              0x1f, 0x0a, // LinkDelegation
+                  0x1e, 0x01, // LinkPreference
+                      0x14,
+                  0x07, 0x05, // Name
+                      0x08, 0x03,
+                          0x6e, 0x64, 0x6e,
+           0x16, 0x1b, // SignatureInfo
+               0x1b, 0x01, // SignatureType
+                   0x01,
+           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,
+           0x17, 0x80, // SignatureValue
+               0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
+               0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
+               0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
+               0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
+               0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b, 0xcf,
+               0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9,
+               0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8,
+               0x55, 0xf6, 0x1c, 0x19, 0x0b, 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7,
+               0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3,
+               0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1,
+      0x20, 0x01, // SelectedDelegation
+          0x00
+};
+
+const uint8_t InterestWithLinkMissingContentType[] = {
+  0x05,  0xf8, // Interest
+      0x07,  0x14, // Name
+          0x08,  0x5, // NameComponent
+              0x6c,  0x6f,  0x63,  0x61,  0x6c,
+          0x08,  0x3, // NameComponent
+              0x6e,  0x64,  0x6e,
+          0x08,  0x6, // NameComponent
+              0x70,  0x72,  0x65,  0x66,  0x69,  0x78,
+      0x0a,  0x4, // Nonce
+          0x1, 0x0, 0x0, 0x00,
+      0x06, 0xd7, // Data
+          0x07, 0x14, // Name
+              0x08, 0x05,
+                  0x6c, 0x6f, 0x63, 0x61, 0x6c,
+              0x08, 0x03,
+                  0x6e, 0x64, 0x6e,
+              0x08, 0x06,
+                  0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
+          0x14, 0x04, // MetaInfo
+              0x19, 0x02, // FreshnessPeriod
+                  0x27, 0x10,
+          0x15, 0x1a, // Content
+              0x1f, 0x0c, // LinkDelegation
+                  0x1e, 0x01, // LinkPreference
+                      0x0a,
+                  0x07, 0x07, // Name
+                      0x08, 0x05,
+                          0x6c, 0x6f, 0x63, 0x61, 0x6c,
+              0x1f, 0x0a, // LinkDelegation
+                  0x1e, 0x01, // LinkPreference
+                      0x14,
+                  0x07, 0x05, // Name
+                      0x08, 0x03,
+                          0x6e, 0x64, 0x6e,
+           0x16, 0x1b, // SignatureInfo
+               0x1b, 0x01, // SignatureType
+                   0x01,
+           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,
+           0x17, 0x80, // SignatureValue
+               0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
+               0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
+               0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
+               0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
+               0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b, 0xcf,
+               0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9,
+               0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8,
+               0x55, 0xf6, 0x1c, 0x19, 0x0b, 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7,
+               0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3,
+               0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1,
+      0x20, 0x01, // SelectedDelegation
+          0x00
+};
+
+const uint8_t InterestWithLinkNoMetaInfo[] = {
+  0x05,  0xf2, // Interest
+      0x07,  0x14, // Name
+          0x08,  0x5, // NameComponent
+              0x6c,  0x6f,  0x63,  0x61,  0x6c,
+          0x08,  0x3, // NameComponent
+              0x6e,  0x64,  0x6e,
+          0x08,  0x6, // NameComponent
+              0x70,  0x72,  0x65,  0x66,  0x69,  0x78,
+      0x0a,  0x4, // Nonce
+          0x1, 0x0, 0x0, 0x00,
+      0x06, 0xd1, // Data
+          0x07, 0x14, // Name
+              0x08, 0x05,
+                  0x6c, 0x6f, 0x63, 0x61, 0x6c,
+              0x08, 0x03,
+                  0x6e, 0x64, 0x6e,
+              0x08, 0x06,
+                  0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
+          0x15, 0x1a, // Content
+              0x1f, 0x0c, // LinkDelegation
+                  0x1e, 0x01, // LinkPreference
+                      0x0a,
+                  0x07, 0x07, // Name
+                      0x08, 0x05,
+                          0x6c, 0x6f, 0x63, 0x61, 0x6c,
+              0x1f, 0x0a, // LinkPreference
+                  0x1e, 0x01, // LinkPreference
+                      0x14,
+                  0x07, 0x05, // Name
+                      0x08, 0x03,
+                          0x6e, 0x64, 0x6e,
+           0x16, 0x1b, // SignatureInfo
+               0x1b, 0x01, // SignatureType
+                   0x01,
+           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,
+           0x17, 0x80, // SignatureValue
+               0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
+               0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
+               0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
+               0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
+               0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b, 0xcf,
+               0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9,
+               0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8,
+               0x55, 0xf6, 0x1c, 0x19, 0x0b, 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7,
+               0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3,
+               0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1,
+      0x20, 0x01, // SelectedDelegation
+          0x00
+};
+
+const uint8_t InterestWithLinkWrongContentType[] = {
+  0x05,  0xfb, // Interest
+      0x07,  0x14, // Name
+          0x08,  0x5, // NameComponent
+              0x6c,  0x6f,  0x63,  0x61,  0x6c,
+          0x08,  0x3, // NameComponent
+              0x6e,  0x64,  0x6e,
+          0x08,  0x6, // NameComponent
+              0x70,  0x72,  0x65,  0x66,  0x69,  0x78,
+      0x0a,  0x4, // Nonce
+          0x1, 0x0, 0x0, 0x00,
+      0x06, 0xda, // Data
+          0x07, 0x14, // Name
+              0x08, 0x05,
+                  0x6c, 0x6f, 0x63, 0x61, 0x6c,
+              0x08, 0x03,
+                  0x6e, 0x64, 0x6e,
+              0x08, 0x06,
+                  0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
+          0x14, 0x07, // MetaInfo
+              0x18, 0x01, // ContentType
+                  0x00,
+              0x19, 0x02, // FreshnessPeriod
+                  0x27, 0x10,
+          0x15, 0x1a, // Content
+              0x1f, 0x0c, // LinkDelegation
+                  0x1e, 0x01, // LinkPreference
+                      0x0a,
+                  0x07, 0x07, // Name
+                      0x08, 0x05,
+                          0x6c, 0x6f, 0x63, 0x61, 0x6c,
+              0x1f, 0x0a, // LinkDelegation
+                  0x1e, 0x01, // LinkPreference
+                      0x14,
+                  0x07, 0x05, // Name
+                      0x08, 0x03,
+                          0x6e, 0x64, 0x6e,
+           0x16, 0x1b, // SignatureInfo
+               0x1b, 0x01, // SignatureType
+                   0x01,
+           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,
+           0x17, 0x80, // SignatureValue
+               0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
+               0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
+               0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
+               0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
+               0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b, 0xcf,
+               0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9,
+               0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8,
+               0x55, 0xf6, 0x1c, 0x19, 0x0b, 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7,
+               0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3,
+               0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1,
+      0x20, 0x01, // SelectedDelegation
+          0x00
+};
+
+const uint8_t InterestWithSelectedDelegationButNoLink[] = {
+  0x05,  0x1f, // Interest
+      0x07,  0x14, // Name
+          0x08,  0x5, // NameComponent
+              0x6c,  0x6f,  0x63,  0x61,  0x6c,
+          0x08,  0x3, // NameComponent
+              0x6e,  0x64,  0x6e,
+          0x08,  0x6, // NameComponent
+              0x70,  0x72,  0x65,  0x66,  0x69,  0x78,
+      0x0a,  0x4, // Nonce
+          0x1, 0x0, 0x0, 0x00,
+      0x20, 0x01, // SelectedDelegation
+          0x00
+};
+
+const uint8_t InterestWithLinkNotNonIntegerSelectedDelegation[] = {
+  0x05,  0xfb, // Interest
+      0x07,  0x14, // Name
+          0x08,  0x5, // NameComponent
+              0x6c,  0x6f,  0x63,  0x61,  0x6c,
+          0x08,  0x3, // NameComponent
+              0x6e,  0x64,  0x6e,
+          0x08,  0x6, // NameComponent
+              0x70,  0x72,  0x65,  0x66,  0x69,  0x78,
+      0x0a,  0x4, // Nonce
+          0x1, 0x0, 0x0, 0x00,
+      0x06, 0xda, // Data
+          0x07, 0x14, // Name
+              0x08, 0x05,
+                  0x6c, 0x6f, 0x63, 0x61, 0x6c,
+              0x08, 0x03,
+                  0x6e, 0x64, 0x6e,
+              0x08, 0x06,
+                  0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
+          0x14, 0x07, // MetaInfo
+              0x18, 0x01, // ContentType
+                  0x01,
+              0x19, 0x02, // FreshnessPeriod
+                  0x27, 0x10,
+          0x15, 0x1a, // Content
+              0x1f, 0x0c, // LinkDelegation
+                  0x1e, 0x01, // LinkPreference
+                      0x0a,
+                  0x07, 0x07, // Name
+                      0x08, 0x05,
+                          0x6c, 0x6f, 0x63, 0x61, 0x6c,
+              0x1f, 0x0a, // LinkDelegation
+                  0x1e, 0x01, // LinkPreference
+                      0x14,
+                  0x07, 0x05, // Name
+                      0x08, 0x03,
+                          0x6e, 0x64, 0x6e,
+           0x16, 0x1b, // SignatureInfo
+               0x1b, 0x01, // SignatureType
+                   0x01,
+           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,
+           0x17, 0x78, // SignatureValue
+               0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
+               0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
+               0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
+               0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
+               0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b, 0xcf,
+               0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9,
+               0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8,
+               0x55, 0xf6, 0x1c, 0x19, 0x0b, 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7,
+               0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3,
+               0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7,
+      0x20, 0x03, // SelectedDelegation
+          0xAA, 0xAA, 0xAA
+};
+
+const uint8_t InterestWithLinkNonDecreasingOrder[] = {
+  0x05,  0xfb, // Interest
+      0x07,  0x14, // Name
+          0x08,  0x5, // NameComponent
+              0x6c,  0x6f,  0x63,  0x61,  0x6c,
+          0x08,  0x3, // NameComponent
+              0x6e,  0x64,  0x6e,
+          0x08,  0x6, // NameComponent
+              0x70,  0x72,  0x65,  0x66,  0x69,  0x78,
+      0x0a,  0x4, // Nonce
+          0x1, 0x0, 0x0, 0x00,
+      0x06, 0xda, // Data
+          0x07, 0x14, // Name
+              0x08, 0x05,
+                  0x6c, 0x6f, 0x63, 0x61, 0x6c,
+              0x08, 0x03,
+                  0x6e, 0x64, 0x6e,
+              0x08, 0x06,
+                  0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
+          0x14, 0x07, // MetaInfo
+              0x18, 0x01, // ContentType
+                  0x01,
+              0x19, 0x02, // FreshnessPeriod
+                  0x27, 0x10,
+          0x15, 0x1a, // Content
+              0x1f, 0x0c, // LinkDelegation
+                  0x1e, 0x01, // LinkPreference
+                      0x14,
+                  0x07, 0x07, // Name
+                      0x08, 0x05,
+                          0x6c, 0x6f, 0x63, 0x61, 0x6c,
+              0x1f, 0x0a, // LinkDelegation
+                  0x1e, 0x01, // LinkPreference
+                      0x0a,
+                  0x07, 0x05, // Name
+                      0x08, 0x03,
+                          0x6e, 0x64, 0x6e,
+           0x16, 0x1b, // SignatureInfo
+               0x1b, 0x01, // SignatureType
+                   0x01,
+           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,
+           0x17, 0x80, // SignatureValue
+               0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
+               0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
+               0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
+               0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
+               0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b, 0xcf,
+               0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9,
+               0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8,
+               0x55, 0xf6, 0x1c, 0x19, 0x0b, 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7,
+               0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3,
+               0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1,
+      0x20, 0x01, // SelectedDelegation
+          0x01
+};
+
 const uint8_t InterestWithLocalControlHeader[] = {
   0x50, 0x25, 0x51, 0x01, 0x0a,
   0x05, 0x20, 0x07, 0x14, 0x08, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x08, 0x03, 0x6e, 0x64,
@@ -130,6 +517,8 @@
   //                Nonce
   //                Scope?
   //                InterestLifetime?
+  //                Link?
+  //                SelectedDelegation?
 
   Interest a;
   Interest b;
@@ -189,6 +578,32 @@
   b.setInterestLifetime(time::seconds(10));
   BOOST_CHECK_EQUAL(a == b, true);
   BOOST_CHECK_EQUAL(a != b, false);
+
+  // Link object
+  Link link("test", {{10, "/test1"}, {20, "/test2"}, {100, "/test3"}});
+  KeyChain keyChain;
+  keyChain.sign(link);
+  Block wire = link.wireEncode();
+
+  a.setLink(wire);
+  BOOST_CHECK_EQUAL(a == b, false);
+  BOOST_CHECK_EQUAL(a != b, true);
+
+  b.setLink(wire);
+  BOOST_CHECK_EQUAL(a == b, true);
+  BOOST_CHECK_EQUAL(a != b, false);
+
+  // Selected Delegation
+  BOOST_CHECK_EQUAL(a.hasSelectedDelegation(), false);
+  BOOST_CHECK_EQUAL(b.hasSelectedDelegation(), false);
+
+  a.setSelectedDelegation(Name("test2"));
+  BOOST_CHECK_EQUAL(a == b, false);
+  BOOST_CHECK_EQUAL(a != b, true);
+
+  b.setSelectedDelegation(Name("test2"));
+  BOOST_CHECK_EQUAL(a == b, true);
+  BOOST_CHECK_EQUAL(a != b, false);
 }
 
 BOOST_AUTO_TEST_CASE(SelectorsEqualityChecks)
@@ -265,6 +680,210 @@
   BOOST_CHECK_EQUAL(a != b, false);
 }
 
+BOOST_AUTO_TEST_CASE(LinkObject)
+{
+  Link link1("test", {{10, "/test1"}, {20, "/test2"}, {100, "/test3"}});
+  KeyChain keyChain;
+  keyChain.sign(link1);
+  Block wire = link1.wireEncode();
+
+  Interest a;
+  BOOST_REQUIRE_NO_THROW(a.setLink(wire));
+
+  BOOST_REQUIRE_NO_THROW(a.getLink());
+
+  Link link2 = a.getLink();
+  Name name = link2.getName();
+  BOOST_CHECK_EQUAL(Name("test"), name);
+  BOOST_CHECK_EQUAL(a.hasLink(), true);
+  Link::DelegationSet delegations;
+  delegations = link2.getDelegations();
+
+  auto i = delegations.begin();
+  BOOST_CHECK_EQUAL(std::get<0>(*i), 10);
+  BOOST_CHECK_EQUAL(std::get<1>(*i), Name("test1"));
+  ++i;
+  BOOST_CHECK_EQUAL(std::get<0>(*i), 20);
+  BOOST_CHECK_EQUAL(std::get<1>(*i), Name("test2"));
+  ++i;
+  BOOST_CHECK_EQUAL(std::get<0>(*i), 100);
+  BOOST_CHECK_EQUAL(std::get<1>(*i), Name("test3"));
+
+  a.unsetLink();
+  BOOST_CHECK_EQUAL(a.hasLink(), false);
+}
+
+BOOST_AUTO_TEST_CASE(SelectedDelegationChecks)
+{
+  Link link("test", {{10, "/test1"}, {20, "/test2"}, {100, "/test3"}});
+  KeyChain keyChain;
+  keyChain.sign(link);
+  Block wire = link.wireEncode();
+
+  Interest a;
+  a.setLink(wire);
+  BOOST_CHECK_EQUAL(a.hasSelectedDelegation(), false);
+
+  BOOST_REQUIRE_NO_THROW(a.setSelectedDelegation(Name("test2")));
+  BOOST_CHECK_EQUAL(a.getSelectedDelegation(), Name("test2"));
+
+  BOOST_REQUIRE_NO_THROW(a.setSelectedDelegation(uint32_t(2)));
+  BOOST_CHECK_EQUAL(a.getSelectedDelegation(), Name("test3"));
+
+  a.unsetSelectedDelegation();
+  BOOST_CHECK_EQUAL(a.hasSelectedDelegation(), false);
+}
+
+BOOST_AUTO_TEST_CASE(EncodeDecodeWithLink)
+{
+  Link link1("test", {{10, "/test1"}, {20, "/test2"}, {100, "/test3"}});
+  KeyChain keyChain;
+  keyChain.sign(link1);
+  Block wire = link1.wireEncode();
+
+  Interest a;
+  a.setName("/Test/Encode/Decode/With/Link");
+  a.setChildSelector(1);
+  a.setNonce(100);
+  a.setScope(1);
+  a.setInterestLifetime(time::seconds(10));
+  a.setLink(wire);
+
+  Block interestBlock = a.wireEncode();
+  Interest b(interestBlock);
+
+  BOOST_CHECK_EQUAL(a == b, true);
+
+  Link link2 = b.getLink();
+  Link::DelegationSet delegations;
+  delegations = link2.getDelegations();
+
+  auto i = delegations.begin();
+  BOOST_CHECK_EQUAL(std::get<0>(*i), 10);
+  BOOST_CHECK_EQUAL(std::get<1>(*i), Name("test1"));
+  ++i;
+  BOOST_CHECK_EQUAL(std::get<0>(*i), 20);
+  BOOST_CHECK_EQUAL(std::get<1>(*i), Name("test2"));
+  ++i;
+  BOOST_CHECK_EQUAL(std::get<0>(*i), 100);
+  BOOST_CHECK_EQUAL(std::get<1>(*i), Name("test3"));
+
+}
+
+BOOST_AUTO_TEST_CASE(DecodeInterestWithLink)
+{
+  Block interestBlock(InterestWithLink, sizeof(InterestWithLink));
+
+  ndn::Interest i;
+  BOOST_REQUIRE_NO_THROW(i.wireDecode(interestBlock));
+  Link link = i.getLink();
+  BOOST_CHECK_EQUAL(link.getName(), Name("/local/ndn/prefix"));
+  Link::DelegationSet delegations = link.getDelegations();
+
+  auto it = delegations.begin();
+  BOOST_CHECK_EQUAL(std::get<0>(*it), 10);
+  BOOST_CHECK_EQUAL(std::get<1>(*it), Name("local"));
+  ++it;
+  BOOST_CHECK_EQUAL(std::get<0>(*it), 20);
+  BOOST_CHECK_EQUAL(std::get<1>(*it), Name("ndn"));
+
+  BOOST_REQUIRE_NO_THROW(i.getSelectedDelegation());
+  BOOST_CHECK_EQUAL(i.getSelectedDelegation(), Name("local"));
+}
+
+BOOST_AUTO_TEST_CASE(DecodeInterestWithLinkNonDecreasingOrder)
+{
+  Block interestBlock(InterestWithLinkNonDecreasingOrder,
+                      sizeof(InterestWithLinkNonDecreasingOrder));
+
+  ndn::Interest i;
+  BOOST_REQUIRE_NO_THROW(i.wireDecode(interestBlock));
+  BOOST_REQUIRE_NO_THROW(i.getSelectedDelegation());
+  BOOST_CHECK_EQUAL(i.getSelectedDelegation(), Name("ndn"));
+}
+
+BOOST_AUTO_TEST_CASE(LinkObjectMissingContentType)
+{
+  Block interestBlock(InterestWithLinkMissingContentType,
+                      sizeof(InterestWithLinkMissingContentType));
+
+  ndn::Interest i;
+  BOOST_REQUIRE_NO_THROW(i.wireDecode(interestBlock));
+  BOOST_REQUIRE_THROW(i.getLink(), Link::Error);
+}
+
+BOOST_AUTO_TEST_CASE(LinkObjectNoMetaInfo)
+{
+  Block interestBlock(InterestWithLinkNoMetaInfo,
+                      sizeof(InterestWithLinkNoMetaInfo));
+
+  ndn::Interest i;
+  BOOST_REQUIRE_NO_THROW(i.wireDecode(interestBlock));
+  BOOST_REQUIRE_THROW(i.getLink(), Block::Error);
+}
+
+BOOST_AUTO_TEST_CASE(LinkObjectWrongContentType)
+{
+  Block interestBlock(InterestWithLinkWrongContentType,
+                      sizeof(InterestWithLinkWrongContentType));
+
+  ndn::Interest i;
+  BOOST_REQUIRE_NO_THROW(i.wireDecode(interestBlock));
+  BOOST_REQUIRE_THROW(i.getLink(), Link::Error);
+}
+
+BOOST_AUTO_TEST_CASE(InterestContainingSelectedDelegationButNoLink)
+{
+  Block interestBlock(InterestWithSelectedDelegationButNoLink,
+                      sizeof(InterestWithSelectedDelegationButNoLink));
+
+  ndn::Interest i;
+  BOOST_REQUIRE_THROW(i.wireDecode(interestBlock), Interest::Error);
+}
+
+BOOST_AUTO_TEST_CASE(SelectedDelegationIsNotNonNegativeInteger)
+{
+  Block interestBlock(InterestWithLinkNotNonIntegerSelectedDelegation,
+                      sizeof(InterestWithLinkNotNonIntegerSelectedDelegation));
+
+  ndn::Interest i;
+  BOOST_REQUIRE_THROW(i.wireDecode(interestBlock), tlv::Error);
+}
+
+BOOST_AUTO_TEST_CASE(SelectedDelegationEqualToDelegationCount)
+{
+  Link link1("test", {{10, "/test1"}, {20, "/test2"}, {100, "/test3"}});
+  KeyChain keyChain;
+  keyChain.sign(link1);
+  Block wire = link1.wireEncode();
+
+  Interest a;
+  a.setName("/Test/Encode/Decode/With/Link");
+  a.setChildSelector(1);
+  a.setNonce(100);
+  a.setScope(1);
+  a.setInterestLifetime(time::seconds(10));
+  a.setLink(wire);
+  BOOST_REQUIRE_THROW(a.setSelectedDelegation(3), Interest::Error);
+}
+
+BOOST_AUTO_TEST_CASE(SelectedDelegationGreaterThanDelegationCount)
+{
+  Link link1("test", {{10, "/test1"}, {20, "/test2"}, {100, "/test3"}});
+  KeyChain keyChain;
+  keyChain.sign(link1);
+  Block wire = link1.wireEncode();
+
+  Interest a;
+  a.setName("/Test/Encode/Decode/With/Link");
+  a.setChildSelector(1);
+  a.setNonce(100);
+  a.setScope(1);
+  a.setInterestLifetime(time::seconds(10));
+  a.setLink(wire);
+  BOOST_REQUIRE_THROW(a.setSelectedDelegation(4), Interest::Error);
+}
+
 BOOST_AUTO_TEST_CASE(Decode)
 {
   Block interestBlock(Interest1, sizeof(Interest1));