Create utility method to generate .torrent-files

Change-Id: Ib8aa32f178399c020ecfeab4f905933889dadb19
Refs: #3432
diff --git a/tests/unit-tests/torrent-file.t.cpp b/tests/unit-tests/torrent-file.t.cpp
index abd224a..955d54c 100644
--- a/tests/unit-tests/torrent-file.t.cpp
+++ b/tests/unit-tests/torrent-file.t.cpp
@@ -22,11 +22,18 @@
 #include "boost-test.hpp"
 
 #include "torrent-file.hpp"
+#include "file-manifest.hpp"
 
 #include <ndn-cxx/data.hpp>
 #include <ndn-cxx/signature.hpp>
 #include <ndn-cxx/security/key-chain.hpp>
 
+#include <boost/range/adaptors.hpp>
+#include <boost/filesystem.hpp>
+#include <boost/filesystem/fstream.hpp>
+
+namespace fs = boost::filesystem;
+
 namespace ndn {
 
 namespace ntorrent {
@@ -35,81 +42,81 @@
 
 
 const static uint8_t TorrentFileTest[] = {
-  0x6, 0xfd,
-  0x1, 0xe4,
-     0x7, 0x25,
+  0x6, 0xfd, // data
+  0x1, 0xea,
+     0x7, 0x2c, // name
         0x8, 0x8,
            0x4e, 0x54, 0x4f, 0x52, 0x52, 0x45, 0x4e, 0x54,
         0x8, 0xa,
            0x6c, 0x69, 0x6e, 0x75, 0x78, 0x31, 0x35, 0x2e, 0x30, 0x31,
-        0x8, 0xd,
-          0x2e, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x66, 0x69, 0x6c, 0x65,
-     0x14, 0x0,
-     0x15, 0x77,
-        0x7, 0x37,
-           0x8, 0x8,
-              0x4e, 0x54, 0x4f, 0x52, 0x52, 0x45, 0x4e, 0x54,
-           0x8, 0xa,
-              0x6c, 0x69, 0x6e, 0x75, 0x78, 0x31, 0x35, 0x2e, 0x30, 0x31,
-           0x8, 0xd,
-              0x2e, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x66, 0x69, 0x6c, 0x65,
-           0x8, 0x8,
-              0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x32,
-           0x8, 0x6,
-              0x41, 0x45, 0x33, 0x32, 0x31, 0x43,
-        0x7, 0x16,
-           0x8, 0x8,
-              0x4e, 0x54, 0x4f, 0x52, 0x52, 0x45, 0x4e, 0x54,
-           0x8, 0xa,
-              0x6c, 0x69, 0x6e, 0x75, 0x78, 0x31, 0x35, 0x2e, 0x30, 0x31,
-        0x7, 0x11,
-           0x8, 0x5,
-              0x66, 0x69, 0x6c, 0x65, 0x30,
-           0x8, 0x8,
-              0x31, 0x41, 0x32, 0x42, 0x33, 0x43, 0x34, 0x44,
-        0x7, 0x11,
-           0x8, 0x5,
-              0x66, 0x69, 0x6c, 0x65, 0x31,
-           0x8, 0x8,
-              0x32, 0x41, 0x33, 0x42, 0x34, 0x43, 0x35, 0x45,
-     0x16, 0x3c,
-        0x1b, 0x1,
-           0x1,
-        0x1c, 0x37,
-            0x7, 0x35,
-               0x8, 0xc,
-                  0x74, 0x6d, 0x70, 0x2d, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79,
-               0x8, 0x4,
-                  0x3d, 0xa8, 0x2c, 0x19,
-               0x8, 0x3,
-                  0x4b, 0x45, 0x59,
-               0x8, 0x11,
-                  0x6b, 0x73, 0x6b, 0x2d, 0x31, 0x34, 0x35, 0x34, 0x39, 0x37, 0x33, 0x38, 0x37, 0x36, 0x31, 0x37, 0x31,
-               0x8, 0x7,
-                  0x49, 0x44, 0x2d, 0x43, 0x45, 0x52, 0x54,
-      0x17, 0xfd,
-         0x1, 0x0, 0x37, 0x61, 0xc9, 0x3b, 0x43, 0xe8, 0xa3, 0xcd, 0xf0, 0xb1,
-         0x14, 0x78, 0x50, 0x6, 0x3c, 0x8a, 0x7, 0x4d, 0xe4, 0xa8, 0xbe, 0xc1,
-         0x8c, 0x40, 0xaf, 0xaa, 0x21, 0x9f, 0x58, 0xed, 0xc0, 0x99, 0x92, 0xb8,
-         0xb2, 0xb8, 0xac, 0x4, 0x3f, 0xa2, 0x25, 0xd7, 0x68, 0xa9, 0x5e, 0xc6,
-         0xf5, 0x20, 0x69, 0xe3, 0xf, 0x37, 0xfc, 0xc7, 0x3f, 0x72, 0x8, 0x74,
-         0x8, 0x5e, 0x10, 0x4d, 0xef, 0xa3, 0x58, 0x59, 0xb6, 0x90, 0x53, 0x1c,
-         0x4b, 0x22, 0xb0, 0x3e, 0x87, 0x95, 0x5b, 0xa6, 0xd, 0x84, 0x1f, 0x60,
-         0xda, 0xe, 0x22, 0x29, 0xda, 0x38, 0x1c, 0x90, 0x4a, 0x2a, 0x60, 0xe4,
-         0xc9, 0x36, 0xb6, 0x4f, 0x9a, 0x17, 0x69, 0x99, 0xf4, 0x84, 0xa5, 0x5b,
-         0xec, 0x70, 0x34, 0x1b, 0xbc, 0x14, 0xee, 0xb1, 0xa7, 0x42, 0xb7, 0xd8,
-         0x9, 0x45, 0xe0, 0x2d, 0x4, 0x8f, 0x66, 0xdb, 0x43, 0x68, 0x8e, 0x53,
-         0x94, 0x1e, 0xcd, 0xaa, 0x47, 0x80, 0xaf, 0xd0, 0x1d, 0x6b, 0x21, 0x1,
-         0x5a, 0x36, 0x97, 0x87, 0x44, 0xc9, 0x31, 0x57, 0xcd, 0x5d, 0xc1, 0xa5,
-         0xfc, 0x35, 0xb1, 0x60, 0x29, 0xc6, 0x82, 0xe9, 0x52, 0x33, 0xac, 0xf9,
-         0xb, 0xca, 0xbe, 0x62, 0x8b, 0x88, 0x49, 0x9a, 0x6f, 0xbd, 0xed, 0x1e,
-         0x8c, 0x4c, 0x63, 0xfb, 0xd9, 0x20, 0xcb, 0x1c, 0x66, 0xa4, 0xb9, 0xc,
-         0x21, 0x61, 0xc4, 0x56, 0x4c, 0xa8, 0x58, 0x4b, 0x7a, 0x81, 0x2c, 0xf0,
-         0x2f, 0xce, 0x7d, 0x1d, 0xbf, 0x16, 0xc, 0x74, 0x35, 0x83, 0x8a, 0x22,
-         0xc4, 0x2, 0xeb, 0x42, 0xd3, 0x76, 0x36, 0x8a, 0x71, 0x7b, 0x6b, 0xb8,
-         0x3f, 0x7a, 0xb8, 0xc6, 0xf6, 0xca, 0xed, 0x74, 0xdb, 0xa4, 0x42, 0x65,
-         0xa5, 0x96, 0xde, 0xd9, 0xfa, 0x45, 0x25, 0x9a, 0xc1, 0xde, 0xd1, 0xf6,
-         0x7a, 0xaf, 0xa3, 0xfd, 0x4e, 0xa9
+        0x8, 0xc,
+           0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x66, 0x69, 0x6c, 0x65,
+        0x8, 0x6,
+           0x41, 0x42, 0x32, 0x43, 0x44, 0x41,
+      0x14, 0x0, // meta-info
+      0x15, 0x76,  // content
+          0x7, 0x36,
+             0x8, 0x8,
+                0x4e, 0x54, 0x4f, 0x52, 0x52, 0x45, 0x4e, 0x54,
+             0x8, 0xa,
+                0x6c, 0x69, 0x6e, 0x75, 0x78, 0x31, 0x35, 0x2e, 0x30, 0x31,
+             0x8, 0xc,
+                0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x66, 0x69, 0x6c, 0x65,
+             0x8, 0x8,
+                0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x32,
+             0x8, 0x6,
+                0x41, 0x45, 0x33, 0x32, 0x31, 0x43,
+          0x7, 0x16,
+             0x8, 0x8,
+                0x4e, 0x54, 0x4f, 0x52, 0x52, 0x45, 0x4e, 0x54,
+             0x8, 0xa,
+                0x6c, 0x69, 0x6e, 0x75, 0x78, 0x31, 0x35, 0x2e, 0x30, 0x31,
+          0x7, 0x11,
+             0x8, 0x5,
+                0x66, 0x69, 0x6c, 0x65, 0x30,
+             0x8, 0x8,
+                0x31, 0x41, 0x32, 0x42, 0x33, 0x43, 0x34, 0x44,
+          0x7, 0x11,
+             0x8, 0x5,
+                0x66, 0x69, 0x6c, 0x65, 0x31,
+             0x8, 0x8,
+                0x32, 0x41, 0x33, 0x42, 0x34, 0x43, 0x35, 0x45,
+      0x16, 0x3c, // SignatureInfo
+          0x1b, 0x1, // SignatureType
+              0x1,
+          0x1c, 0x37, // KeyLocator
+              0x7, 0x35,
+                 0x8, 0xc,
+                    0x74, 0x6d, 0x70, 0x2d, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79,
+                 0x8, 0x4,
+                    0x3d, 0xa8, 0x2c, 0x19,
+                 0x8, 0x3,
+                    0x4b, 0x45, 0x59,
+                 0x8, 0x11,
+                    0x6b, 0x73, 0x6b, 0x2d, 0x31, 0x34, 0x35, 0x34, 0x39, 0x37, 0x33, 0x38,
+                    0x37, 0x36, 0x31, 0x37, 0x31,
+                 0x8, 0x7,
+                    0x49, 0x44, 0x2d, 0x43, 0x45, 0x52, 0x54,
+      0x17, 0xfd, // SignatureValue
+          0x1, 0x0, 0x3d, 0xb6, 0x32, 0x59, 0xbd, 0xe5, 0xad, 0x27, 0x1b, 0xc2, 0x68,
+          0x3d, 0x7a, 0xd3, 0x4e, 0xf, 0x40, 0xa5, 0xf8, 0x80, 0x4b, 0xf2, 0xf9, 0xb1,
+          0x7, 0xea, 0x56, 0x84, 0xd, 0x94, 0xd, 0xf9, 0x88, 0xd4, 0xe0, 0xb6, 0x63, 0xac,
+          0x3a, 0xdc, 0x17, 0xc2, 0xff, 0xde, 0xc, 0xc3, 0xef, 0xb, 0x3b, 0x1a, 0xef, 0xb,
+          0x7, 0x99, 0x9b, 0xb7, 0xe6, 0x4a, 0x68, 0xf8, 0xda, 0x62, 0x29, 0xfd, 0xb1, 0xb1,
+          0xe9, 0xe3, 0x3a, 0x42, 0x1f, 0xbd, 0xad, 0x96, 0xc4, 0x5f, 0x34, 0x55, 0x9, 0xba,
+          0x7a, 0x82, 0x2d, 0x9c, 0x7b, 0x52, 0x9d, 0xf, 0xd6, 0xea, 0xc3, 0x60, 0xbf, 0x75,
+          0xfb, 0x0, 0x1b, 0xb8, 0x4, 0xa8, 0x6e, 0x95, 0x5a, 0xcf, 0xca, 0x90, 0x20, 0x21,
+          0x58, 0x27, 0x2c, 0xef, 0xed, 0x23, 0x37, 0xfa, 0xd, 0xc6, 0x3, 0x7b, 0xd6, 0xef,
+          0x76, 0x3, 0xd7, 0x22, 0xd8, 0x6f, 0xa2, 0x7d, 0xc2, 0x84, 0xee, 0x65, 0xbf, 0x63,
+          0xe2, 0x27, 0xc4, 0xeb, 0xb7, 0xb2, 0xa6, 0xa0, 0x58, 0x68, 0x1a, 0x3a, 0x85, 0xd8,
+          0x8d, 0xd8, 0xfb, 0x52, 0x9b, 0xba, 0x22, 0x2d, 0xb2, 0x4b, 0x9e, 0x3d, 0xf5, 0x61,
+          0x83, 0x6f, 0x78, 0x67, 0x85, 0x3d, 0xf, 0x24, 0x47, 0xbf, 0x8c, 0xdf, 0xdf, 0x8a,
+          0xc8, 0xa9, 0xed, 0xaf, 0x8b, 0x49, 0xdf, 0x2d, 0x2a, 0xfe, 0x2f, 0x4b, 0xc5, 0xe6,
+          0x7e, 0xee, 0x35, 0xf1, 0x6, 0x88, 0x9c, 0xa0, 0x25, 0xf, 0x6, 0x56, 0xf4, 0x72,
+          0x89, 0x2f, 0x95, 0x64, 0x39, 0x38, 0x21, 0xc3, 0x75, 0xef, 0x80, 0x5a, 0x73, 0x1a,
+          0xec, 0xb9, 0x6d, 0x3, 0x47, 0xac, 0x64, 0x7f, 0x85, 0xbe, 0xb9, 0xab, 0x87, 0x9f,
+          0xd2, 0x9c, 0xe7, 0x9c, 0x86, 0xd5, 0x59, 0x65, 0x73, 0x24, 0x15, 0x3e, 0xfc, 0x94,
+          0xf8, 0x7, 0x26, 0x9b, 0x4f, 0x6e, 0x1b, 0x1c
 };
 
 BOOST_AUTO_TEST_SUITE(TestTorrentFile)
@@ -117,31 +124,32 @@
 BOOST_AUTO_TEST_CASE(CheckGettersSetters)
 {
 
-  TorrentFile file("/NTORRENT/linux15.01/.torrent-file",
-                   "/NTORRENT/linux15.01/.torrent-file/segment2/AE321C",
+  TorrentFile file("/NTORRENT/linux15.01/torrent-file/AB2CDA",
+                   "/NTORRENT/linux15.01/torrent-file/segment2/AE321C",
                    "/NTORRENT/linux15.01",
                    {"/NTORRENT/linux15.01/file0/1A2B3C4D",
                    "/NTORRENT/linux15.01/file1/2A3B4C5E"});
 
-  BOOST_CHECK_EQUAL(file.getName(), "/NTORRENT/linux15.01/.torrent-file");
+  BOOST_CHECK_EQUAL(file.getName(), "/NTORRENT/linux15.01/torrent-file/AB2CDA");
   BOOST_CHECK_EQUAL(file.getCatalog().size(), 2);
-  BOOST_CHECK_EQUAL(*(file.getTorrentFilePtr()), "/NTORRENT/linux15.01/.torrent-file/segment2/AE321C");
+  BOOST_CHECK_EQUAL(*(file.getTorrentFilePtr()),
+                   "/NTORRENT/linux15.01/torrent-file/segment2/AE321C");
   BOOST_CHECK_EQUAL(file.getCatalog()[0], "/NTORRENT/linux15.01/file0/1A2B3C4D");
   BOOST_CHECK_EQUAL(file.getCatalog()[1], "/NTORRENT/linux15.01/file1/2A3B4C5E");
 
-  TorrentFile file2("/NTORRENT/linux15.01/.torrent-file",
+  TorrentFile file2("/NTORRENT/linux15.01/torrent-file/AB2CDA",
                     "/NTORRENT/linux15.01",
                     {"/NTORRENT/linux15.01/file0/1A2B3C4D"});
 
-  BOOST_CHECK_EQUAL(file2.getName(), "/NTORRENT/linux15.01/.torrent-file");
+  BOOST_CHECK_EQUAL(file2.getName(), "/NTORRENT/linux15.01/torrent-file/AB2CDA");
   BOOST_CHECK(!file2.getTorrentFilePtr());
   BOOST_CHECK_EQUAL(file2.getCatalog().size(), 1);
 }
 
 BOOST_AUTO_TEST_CASE(CheckEncodeDecode)
 {
-  TorrentFile file("/NTORRENT/linux15.01/.torrent-file",
-                   "/NTORRENT/linux15.01/.torrent-file/segment2/AE321C",
+  TorrentFile file("/NTORRENT/linux15.01/torrent-file/AB2CDA",
+                   "/NTORRENT/linux15.01/torrent-file/segment2/AE321C",
                    "/NTORRENT/linux15.01",
                    {"/NTORRENT/linux15.01/file0/1A2B3C4D",
                    "/NTORRENT/linux15.01/file1/2A3B4C5E"});
@@ -155,8 +163,9 @@
   TorrentFile file2;
   file2.wireDecode(wire);
 
-  BOOST_CHECK_EQUAL(file2.getName(), "/NTORRENT/linux15.01/.torrent-file");
-  BOOST_CHECK_EQUAL(*(file2.getTorrentFilePtr()), "/NTORRENT/linux15.01/.torrent-file/segment2/AE321C");
+  BOOST_CHECK_EQUAL(file2.getName(), "/NTORRENT/linux15.01/torrent-file/AB2CDA");
+  BOOST_CHECK_EQUAL(*(file2.getTorrentFilePtr()),
+                   "/NTORRENT/linux15.01/torrent-file/segment2/AE321C");
   BOOST_CHECK_EQUAL(file2.getCatalog().size(), 2);
   BOOST_CHECK_EQUAL(file2.getCatalog()[0], "/NTORRENT/linux15.01/file0/1A2B3C4D");
   BOOST_CHECK_EQUAL(file2.getCatalog()[1], "/NTORRENT/linux15.01/file1/2A3B4C5E");
@@ -165,7 +174,7 @@
 
 BOOST_AUTO_TEST_CASE(CheckEncodeDecodeNoTorrentFilePtr)
 {
-  TorrentFile file("/NTORRENT/linux15.01/.torrent-file",
+  TorrentFile file("/NTORRENT/linux15.01/torrent-file/AB2CDA",
                    "/NTORRENT/linux15.01",
                    {"/NTORRENT/linux15.01/file0/1A2B3C4D",
                    "/NTORRENT/linux15.01/file1/2A3B4C5E"});
@@ -179,7 +188,7 @@
   TorrentFile file2;
   file2.wireDecode(wire);
 
-  BOOST_CHECK_EQUAL(file2.getName(), "/NTORRENT/linux15.01/.torrent-file");
+  BOOST_CHECK_EQUAL(file2.getName(), "/NTORRENT/linux15.01/torrent-file/AB2CDA");
   BOOST_CHECK(!file2.getTorrentFilePtr());
   BOOST_CHECK_EQUAL(file2.getCatalog().size(), 2);
   BOOST_CHECK_EQUAL(file2.getCatalog()[0], "/NTORRENT/linux15.01/file0/1A2B3C4D");
@@ -188,7 +197,7 @@
 
 BOOST_AUTO_TEST_CASE(CheckEncodeDecodeEmptyTorrentFile)
 {
-  TorrentFile file("/NTORRENT/linux15.01/.torrent-file",
+  TorrentFile file("/NTORRENT/linux15.01/torrent-file/AB2CDA",
                   "",
                   {});
 
@@ -207,8 +216,8 @@
 BOOST_AUTO_TEST_CASE(CheckEncodeDecodeEmptyCatalog)
 {
 
-  TorrentFile file("/NTORRENT/linux15.01/.torrent-file",
-                  "/NTORRENT/linux15.01/.torrent-file/segment2/AE321C",
+  TorrentFile file("/NTORRENT/linux15.01/torrent-file/AB2CDA",
+                  "/NTORRENT/linux15.01/torrent-file/segment2/AE321C",
                   "/NTORRENT/linux15.01",
                   {});
 
@@ -229,8 +238,9 @@
   Block TorrentFileBlock(TorrentFileTest, sizeof(TorrentFileTest));
   TorrentFile file(TorrentFileBlock);
 
-  BOOST_CHECK_EQUAL(file.getName(), "/NTORRENT/linux15.01/.torrent-file");
-  BOOST_CHECK_EQUAL(*(file.getTorrentFilePtr()), "/NTORRENT/linux15.01/.torrent-file/segment2/AE321C");
+  BOOST_CHECK_EQUAL(file.getName(), "/NTORRENT/linux15.01/torrent-file/AB2CDA");
+  BOOST_CHECK_EQUAL(*(file.getTorrentFilePtr()),
+                    "/NTORRENT/linux15.01/torrent-file/segment2/AE321C");
   BOOST_CHECK_EQUAL(file.getCatalog().size(), 2);
   BOOST_CHECK_EQUAL(file.getCatalog()[0], "/NTORRENT/linux15.01/file0/1A2B3C4D");
   BOOST_CHECK_EQUAL(file.getCatalog()[1], "/NTORRENT/linux15.01/file1/2A3B4C5E");
@@ -239,8 +249,8 @@
 
 BOOST_AUTO_TEST_CASE(TestInsertErase)
 {
-  TorrentFile file("/NTORRENT/linux15.01/.torrent-file",
-                   "/NTORRENT/linux15.01/.torrent-file/segment2/AE321C",
+  TorrentFile file("/NTORRENT/linux15.01/torrent-file/AB2CDA",
+                   "/NTORRENT/linux15.01/torrent-file/segment2/AE321C",
                    "/NTORRENT/linux15.01",
                    {"/NTORRENT/linux15.01/file0/1A2B3C4D",
                    "/NTORRENT/linux15.01/file1/2A3B4C5E"});
@@ -258,8 +268,8 @@
 
 BOOST_AUTO_TEST_CASE(TestInsertAndEncodeTwice)
 {
-  TorrentFile file("/NTORRENT/linux15.01/.torrent-file",
-                   "/NTORRENT/linux15.01/.torrent-file/segment2/AE321C",
+  TorrentFile file("/NTORRENT/linux15.01/torrent-file/AB2CDA",
+                   "/NTORRENT/linux15.01/torrent-file/segment2/AE321C",
                    "/NTORRENT/linux15.01",
                    {"/NTORRENT/linux15.01/file0/1A2B3C4D",
                    "/NTORRENT/linux15.01/file1/2A3B4C5E"});
@@ -289,6 +299,137 @@
 
 BOOST_AUTO_TEST_SUITE_END()
 
+BOOST_AUTO_TEST_CASE(TestTorrentFileGenerator)
+{
+  const struct {
+      size_t         d_dataPacketSize;
+      size_t         d_subManifestSize;
+      const char     *d_directoryPath;
+      size_t         d_namesPerSegment;
+      bool           d_shouldThrow;
+  } DATA [] = {
+    // Affirmative tests
+    {1024           , 100          , "tests/testdata/foo" , 1, false },
+    {512            , 80           , "tests/testdata/foo" , 3, false },
+    {256            , 50           , "tests/testdata/foo" , 2, false },
+    {2048           , 20           , "tests/testdata/foo" , 4, false },
+    {512            , 80           , "tests/testdata/foo" , 1, false },
+    {1024           , 50           , "tests/testdata/foo" , 1, false },
+    {2048           , 128          , "tests/testdata/foo",  2, false },
+    // Negative tests
+    // non-existent directory
+    {128          , 128            , "tests/testdata/foo-fake", 2, true },
+  };
+  enum { NUM_DATA = sizeof DATA / sizeof *DATA };
+  for (int i = 0; i < NUM_DATA; ++i) {
+    auto dataPacketSize  = DATA[i].d_dataPacketSize;
+    auto subManifestSize = DATA[i].d_subManifestSize;
+    auto directoryPath   = DATA[i].d_directoryPath;
+    auto namesPerSegment = DATA[i].d_namesPerSegment;
+    auto shouldThrow     = DATA[i].d_shouldThrow;
+
+
+    std::pair<std::vector<TorrentFile>,
+              std::vector<std::pair<std::vector<FileManifest>,
+                                    std::vector<Data>>>> torrentFilePair1;
+
+    std::pair<std::vector<TorrentFile>,
+              std::vector<std::pair<std::vector<FileManifest>,
+                                    std::vector<Data>>>> torrentFilePair2;
+
+    if (shouldThrow) {
+      BOOST_REQUIRE_THROW(TorrentFile::generate(directoryPath,
+                                              namesPerSegment,
+                                              subManifestSize,
+                                              dataPacketSize),
+                          TorrentFile::Error);
+
+      BOOST_REQUIRE_THROW(TorrentFile::generate(directoryPath,
+                                                namesPerSegment,
+                                                subManifestSize,
+                                                dataPacketSize,
+                                                true),
+                          TorrentFile::Error);
+    }
+    else {
+      torrentFilePair1 = TorrentFile::generate(directoryPath,
+                                              namesPerSegment,
+                                              subManifestSize,
+                                              dataPacketSize);
+
+      torrentFilePair2 = TorrentFile::generate(directoryPath,
+                                              namesPerSegment,
+                                              subManifestSize,
+                                              dataPacketSize,
+                                              true);
+
+      auto torrentFileSegments = torrentFilePair1.first;
+      auto manifestPairs1 = torrentFilePair1.second;
+      auto manifestPairs2 = torrentFilePair2.second;
+
+      // Check that generate has not returned any data packets unless otherwise specified
+      for (auto i = manifestPairs1.begin(); i != manifestPairs1.end(); ++i) {
+        BOOST_CHECK_EQUAL((*i).second.size(), 0);
+      }
+
+      Name directoryPathName(directoryPath);
+      fs::recursive_directory_iterator directoryPtr(fs::system_complete(directoryPath).string());
+      int numberOfDirectoryFiles = 0;
+      for (fs::recursive_directory_iterator i = directoryPtr;
+           i != fs::recursive_directory_iterator(); ++i) {
+        numberOfDirectoryFiles++;
+      }
+      // Verify the basic attributes of the torrent-file
+      for (auto it = torrentFileSegments.begin(); it != torrentFileSegments.end(); ++it) {
+        // Verify that each file torrent-file is signed
+        BOOST_CHECK_NO_THROW(it->getFullName());
+        BOOST_CHECK_EQUAL(it->getCommonPrefix(),
+                          Name("/NTORRENT" +
+                               directoryPathName.getSubName(
+                                 directoryPathName.size() - 1).toUri()));
+        if (it != torrentFileSegments.end() - 1) {
+          BOOST_CHECK_EQUAL(it->getCatalog().size(), namesPerSegment);
+          BOOST_CHECK_EQUAL(*(it->getTorrentFilePtr()), (it+1)->getFullName());
+        }
+        else {
+          BOOST_CHECK_LE(it->getCatalog().size(), subManifestSize);
+          BOOST_CHECK(!(it->getTorrentFilePtr()));
+        }
+      }
+      int myDiv = (numberOfDirectoryFiles / namesPerSegment);
+      if (numberOfDirectoryFiles % namesPerSegment == 0) {
+        BOOST_CHECK_EQUAL(torrentFileSegments.size(), myDiv);
+      }
+      else {
+        BOOST_CHECK_EQUAL(torrentFileSegments.size(), (myDiv + 1));
+      }
+
+      std::vector<uint8_t> dataBytes;
+      for (auto i = manifestPairs2.begin() ; i != manifestPairs2.end(); ++i) {
+        for (auto d : (*i).second) {
+          auto content = d.getContent();
+          dataBytes.insert(dataBytes.end(), content.value_begin(), content.value_end());
+        }
+      }
+      // load  the contents of the directory files from disk
+      std::vector<uint8_t> directoryFilesBytes;
+      fs::recursive_directory_iterator directoryPtr2(fs::system_complete(directoryPath).string());
+      for (fs::recursive_directory_iterator i = directoryPtr2;
+           i != fs::recursive_directory_iterator();
+           ++i) {
+        fs::ifstream is((*i), fs::ifstream::binary | fs::ifstream::in);
+        is >> std::noskipws;
+        std::istream_iterator<uint8_t> start(is), end;
+        std::vector<uint8_t> fileBytes(start, end);
+        directoryFilesBytes.insert(directoryFilesBytes.end(), fileBytes.begin(), fileBytes.end());
+      }
+      // confirm that they are equal
+      BOOST_CHECK_EQUAL_COLLECTIONS(directoryFilesBytes.begin(), directoryFilesBytes.end(),
+                                    dataBytes.begin(), dataBytes.end());
+    }
+  }
+}
+
 } // namespace tests
 
 } // namespace ntorrent