ci: compile-check installed headers

Script copied from ndn-cxx with minor modifications

Also, move tlv.hpp to detail/ and cleanup includes in common.hpp

Change-Id: I6240601f005c61bb3547bd5acf854200f3b13093
diff --git a/.jenkins.d/02-cleanup.sh b/.jenkins.d/02-cleanup.sh
new file mode 100755
index 0000000..d56eeae
--- /dev/null
+++ b/.jenkins.d/02-cleanup.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+set -ex
+
+PROJ=ChronoSync
+
+sudo rm -fr /usr/local/include/"$PROJ"
+sudo rm -f /usr/local/lib{,64}/lib"$PROJ"*
+sudo rm -f /usr/local/lib{,64}/pkgconfig/"$PROJ".pc
diff --git a/.jenkins.d/40-headers-check.sh b/.jenkins.d/40-headers-check.sh
new file mode 100755
index 0000000..efc3bf9
--- /dev/null
+++ b/.jenkins.d/40-headers-check.sh
@@ -0,0 +1,45 @@
+#!/usr/bin/env bash
+
+# It's intentional not to use `set -x`, because this script explicitly prints useful information
+# and should not run in trace mode.
+# It's intentional not to use `set -e`, because this script wants to check all headers
+# (similar to running all test cases), instead of failing at the first error.
+
+PROJ=ChronoSync
+
+if [[ -n $DISABLE_HEADERS_CHECK ]]; then
+  echo 'Skipping headers check.'
+  exit 0
+fi
+
+if has CentOS-8 $NODE_LABELS; then
+  export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig
+fi
+
+CXX=${CXX:-g++}
+STD=-std=c++14
+CXXFLAGS="-O2 -Wall -Wno-unneeded-internal-declaration -Wno-unused-const-variable $(pkg-config --cflags libndn-cxx $PROJ)"
+INCLUDEDIR="$(pkg-config --variable=includedir $PROJ)"/$PROJ
+
+echo "Using: $CXX $STD $CXXFLAGS"
+
+NCHECKED=0
+NERRORS=0
+while IFS= read -r -d '' H; do
+  echo "Checking header ${H#${INCLUDEDIR}/}"
+  "$CXX" -xc++ $STD $CXXFLAGS -c -o /dev/null "$H"
+  [[ $? -eq 0 ]] || ((NERRORS++))
+  ((NCHECKED++))
+done < <(find "$INCLUDEDIR" -name '*.hpp' -type f -print0 2>/dev/null)
+
+if [[ $NCHECKED -eq 0 ]]; then
+  echo "No headers found. Is $PROJ installed?"
+  exit 1
+else
+  echo "$NCHECKED headers checked."
+fi
+
+if [[ $NERRORS -gt 0 ]]; then
+  echo "$NERRORS headers could not be compiled."
+  exit 1
+fi
diff --git a/src/detail/bzip2-helper.cpp b/src/detail/bzip2-helper.cpp
index 0784b7f..4c5617e 100644
--- a/src/detail/bzip2-helper.cpp
+++ b/src/detail/bzip2-helper.cpp
@@ -17,12 +17,13 @@
  * ChronoSync, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "detail/bzip2-helper.hpp"
+#include "bzip2-helper.hpp"
 
-#include <boost/iostreams/filtering_stream.hpp>
-#include <boost/iostreams/detail/iostream.hpp>
-#include <boost/iostreams/filter/bzip2.hpp>
 #include <boost/iostreams/copy.hpp>
+#include <boost/iostreams/device/array.hpp>
+#include <boost/iostreams/filtering_stream.hpp>
+#include <boost/iostreams/filter/bzip2.hpp>
+#include <boost/iostreams/stream.hpp>
 
 #include <ndn-cxx/encoding/buffer-stream.hpp>
 
@@ -38,7 +39,7 @@
   bio::filtering_stream<bio::output> out;
   out.push(bio::bzip2_compressor());
   out.push(os);
-  bio::stream<bio::array_source> in(reinterpret_cast<const char*>(buffer), bufferSize);
+  bio::stream<bio::array_source> in(buffer, bufferSize);
   bio::copy(in, out);
   return os.buf();
 }
@@ -50,7 +51,7 @@
   bio::filtering_stream<bio::output> out;
   out.push(bio::bzip2_decompressor());
   out.push(os);
-  bio::stream<bio::array_source> in(reinterpret_cast<const char*>(buffer), bufferSize);
+  bio::stream<bio::array_source> in(buffer, bufferSize);
   bio::copy(in, out);
   return os.buf();
 }
diff --git a/src/detail/common.hpp b/src/detail/common.hpp
index 4e9e4cd..dffd218 100644
--- a/src/detail/common.hpp
+++ b/src/detail/common.hpp
@@ -23,7 +23,7 @@
 #ifndef CHRONOSYNC_DETAIL_COMMON_HPP
 #define CHRONOSYNC_DETAIL_COMMON_HPP
 
-#include "detail/config.hpp"
+#include "config.hpp"
 
 #ifdef CHRONOSYNC_WITH_TESTS
 #define CHRONOSYNC_VIRTUAL_WITH_TESTS virtual
@@ -38,11 +38,10 @@
 #endif
 
 #include <cstddef>
-#include <list>
-#include <queue>
+#include <functional>
+#include <memory>
 #include <set>
 #include <vector>
-#include <tuple>
 
 #include <ndn-cxx/data.hpp>
 #include <ndn-cxx/face.hpp>
@@ -55,22 +54,19 @@
 #include <ndn-cxx/util/time.hpp>
 
 #include <boost/algorithm/string.hpp>
-#include <boost/asio.hpp>
 #include <boost/assert.hpp>
 #include <boost/core/noncopyable.hpp>
 #include <boost/lexical_cast.hpp>
 
 namespace chronosync {
 
-using std::size_t;
-
 using boost::noncopyable;
 
+using std::size_t;
+
 using std::bind;
-using std::cref;
 using std::function;
 using std::make_shared;
-using std::make_tuple;
 using std::ref;
 using std::shared_ptr;
 
@@ -79,17 +75,12 @@
 using ndn::Data;
 using ndn::Interest;
 using ndn::Name;
-using ndn::security::ValidationError;
 using ndn::security::Validator;
-
-namespace tlv {
-using namespace ndn::tlv;
-} // namespace tlv
+using ndn::security::ValidationError;
 
 namespace name = ndn::name;
 namespace time = ndn::time;
 namespace security = ndn::security;
-namespace encoding = ndn::encoding;
 
 } // namespace chronosync
 
diff --git a/src/tlv.hpp b/src/detail/tlv.hpp
similarity index 84%
rename from src/tlv.hpp
rename to src/detail/tlv.hpp
index 6b5f48a..5f9bd31 100644
--- a/src/tlv.hpp
+++ b/src/detail/tlv.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
 /*
- * Copyright (c) 2012-2014 University of California, Los Angeles
+ * Copyright (c) 2012-2021 University of California, Los Angeles
  *
  * This file is part of ChronoSync, synchronization library for distributed realtime
  * applications for NDN.
@@ -19,8 +19,8 @@
  * @author Yingdi Yu <yingdi@cs.ucla.edu>
  */
 
-#ifndef CHRONOSYNC_TLV_HPP
-#define CHRONOSYNC_TLV_HPP
+#ifndef CHRONOSYNC_DETAIL_TLV_HPP
+#define CHRONOSYNC_DETAIL_TLV_HPP
 
 namespace chronosync {
 namespace tlv {
@@ -32,10 +32,10 @@
 enum {
   SyncReply   = 128, // 0x80
   StateLeaf   = 129, // 0x81
-  SeqNo       = 130  // 0x82
+  SeqNo       = 130, // 0x82
 };
 
 } // namespace tlv
 } // namespace chronosync
 
-#endif // CHRONOSYNC_TLV_HPP
+#endif // CHRONOSYNC_DETAIL_TLV_HPP
diff --git a/src/diff-state-container.cpp b/src/diff-state-container.cpp
deleted file mode 100644
index 38a67f3..0000000
--- a/src/diff-state-container.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012-2014 University of California, Los Angeles
- *
- * This file is part of ChronoSync, synchronization library for distributed realtime
- * applications for NDN.
- *
- * ChronoSync is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation, either
- * version 3 of the License, or (at your option) any later version.
- *
- * ChronoSync is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * ChronoSync, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- *
- * @author Zhenkai Zhu <http://irl.cs.ucla.edu/~zhenkai/>
- * @author Chaoyi Bian <bcy@pku.edu.cn>
- * @author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
- * @author Yingdi Yu <yingdi@cs.ucla.edu>
- */
-
-#include "diff-state-container.hpp"
diff --git a/src/interest-table.hpp b/src/interest-table.hpp
index bf5685b..4fc3eb4 100644
--- a/src/interest-table.hpp
+++ b/src/interest-table.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
 /*
- * Copyright (c) 2012-2017 University of California, Los Angeles
+ * Copyright (c) 2012-2021 University of California, Los Angeles
  *
  * This file is part of ChronoSync, synchronization library for distributed realtime
  * applications for NDN.
@@ -27,6 +27,8 @@
 
 #include "interest-container.hpp"
 
+#include <boost/asio/io_service.hpp>
+
 namespace chronosync {
 
 /**
@@ -38,11 +40,7 @@
   class Error : public std::runtime_error
   {
   public:
-    explicit
-    Error(const std::string& what)
-      : std::runtime_error(what)
-    {
-    }
+    using std::runtime_error::runtime_error;
   };
 
   using iterator = InterestContainer::iterator;
diff --git a/src/leaf-container.cpp b/src/leaf-container.cpp
deleted file mode 100644
index 8bad5eb..0000000
--- a/src/leaf-container.cpp
+++ /dev/null
@@ -1,26 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012-2014 University of California, Los Angeles
- *
- * This file is part of ChronoSync, synchronization library for distributed realtime
- * applications for NDN.
- *
- * ChronoSync is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation, either
- * version 3 of the License, or (at your option) any later version.
- *
- * ChronoSync is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * ChronoSync, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- *
- * @author Zhenkai Zhu <http://irl.cs.ucla.edu/~zhenkai/>
- * @author Chaoyi Bian <bcy@pku.edu.cn>
- * @author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
- * @author Yingdi Yu <yingdi@cs.ucla.edu>
- */
-
-#include "leaf-container.hpp"
-// Simply check whether LeafContainer can compile
diff --git a/src/state.cpp b/src/state.cpp
index 2f31b89..ab9d87d 100644
--- a/src/state.cpp
+++ b/src/state.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
 /*
- * Copyright (c) 2012-2020 University of California, Los Angeles
+ * Copyright (c) 2012-2021 University of California, Los Angeles
  *
  * This file is part of ChronoSync, synchronization library for distributed realtime
  * applications for NDN.
@@ -23,6 +23,7 @@
  */
 
 #include "state.hpp"
+#include "detail/tlv.hpp"
 
 #include <boost/range/adaptor/reversed.hpp>
 #include <ndn-cxx/util/exception.hpp>
@@ -36,20 +37,19 @@
 {
   m_wire.reset();
 
-  LeafContainer::iterator leaf = m_leaves.find(info);
-
+  auto leaf = m_leaves.find(info);
   if (leaf == m_leaves.end()) {
-    m_leaves.insert(make_shared<Leaf>(info, cref(seq)));
-    return make_tuple(true, false, 0);
+    m_leaves.insert(make_shared<Leaf>(info, seq));
+    return std::make_tuple(true, false, 0);
   }
   else {
     if ((*leaf)->getSeq() == seq || seq < (*leaf)->getSeq()) {
-      return make_tuple(false, false, 0);
+      return std::make_tuple(false, false, 0);
     }
 
     SeqNo old = (*leaf)->getSeq();
     m_leaves.modify(leaf, [=] (LeafPtr& leaf) { leaf->setSeq(seq); } );
-    return make_tuple(false, true, old);
+    return std::make_tuple(false, true, old);
   }
 }
 
@@ -82,9 +82,9 @@
   return *this;
 }
 
-template<encoding::Tag T>
+template<ndn::encoding::Tag T>
 size_t
-State::wireEncode(encoding::EncodingImpl<T>& block) const
+State::wireEncode(ndn::encoding::EncodingImpl<T>& block) const
 {
   size_t totalLength = 0;
 
diff --git a/src/state.hpp b/src/state.hpp
index e5d0de2..7bbb60c 100644
--- a/src/state.hpp
+++ b/src/state.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
 /*
- * Copyright (c) 2012-2017 University of California, Los Angeles
+ * Copyright (c) 2012-2021 University of California, Los Angeles
  *
  * This file is part of ChronoSync, synchronization library for distributed realtime
  * applications for NDN.
@@ -26,9 +26,9 @@
 #define CHRONOSYNC_STATE_HPP
 
 #include "leaf-container.hpp"
-#include "tlv.hpp"
 
 #include <ndn-cxx/util/sha256.hpp>
+#include <tuple>
 
 namespace chronosync {
 
@@ -49,11 +49,7 @@
   class Error : public std::runtime_error
   {
   public:
-    explicit
-    Error(const std::string& what)
-      : std::runtime_error(what)
-    {
-    }
+    using std::runtime_error::runtime_error;
   };
 
   virtual
@@ -112,9 +108,9 @@
   wireDecode(const Block& wire);
 
 protected:
-  template<encoding::Tag T>
+  template<ndn::encoding::Tag T>
   size_t
-  wireEncode(encoding::EncodingImpl<T>& block) const;
+  wireEncode(ndn::encoding::EncodingImpl<T>& block) const;
 
 protected:
   LeafContainer m_leaves;
diff --git a/tests/wscript b/tests/wscript
index e92ab29..79f4fb0 100644
--- a/tests/wscript
+++ b/tests/wscript
@@ -7,4 +7,5 @@
                 name='unit-tests',
                 source=bld.path.ant_glob('**/*.cpp'),
                 use='ChronoSync',
+                includes='..',
                 install_path=None)
diff --git a/wscript b/wscript
index 6d8d476..788cf61 100644
--- a/wscript
+++ b/wscript
@@ -58,8 +58,8 @@
               cnum=VERSION,
               source=bld.path.ant_glob('src/**/*.cpp'),
               use='NDN_CXX BOOST',
-              includes='src .',
-              export_includes='src .')
+              includes='src/detail',
+              export_includes='src src/detail')
 
     if bld.env.WITH_TESTS:
         bld.recurse('tests')