Switch eStoraged to asio interface

Switching the D-Bus interface to asio makes it easier to integrate with
EntityManager. In addition, this switch to asio makes sense since some
of the erase operations take a long time, about 6 minutes.

This commit also removes one of the clang-tidy checks because clang was
flagging an error in one of the boost asio files, inside the constructor
for sdbusplus::asio::connection.

Tested:
Tested most of the methods and properties using busctl.
$ busctl call xyz.openbmc_project.eStoraged.mmcblk0 \
  /xyz/openbmc_project/inventory/storage/mmcblk0 \
  xyz.openbmc_project.Inventory.Item.Volume FormatLuks ays 3 1 2 3 \
  xyz.openbmc_project.Inventory.Item.Volume.FilesystemType.ext4 \
  --timeout=60
$ busctl call xyz.openbmc_project.eStoraged.mmcblk0 \
  /xyz/openbmc_project/inventory/storage/mmcblk0 \
  xyz.openbmc_project.Inventory.Item.Volume Lock
$ busctl call xyz.openbmc_project.eStoraged.mmcblk0 \
  /xyz/openbmc_project/inventory/storage/mmcblk0 \
  xyz.openbmc_project.Inventory.Item.Volume Unlock ay 3 1 2 3
$ busctl get-property xyz.openbmc_project.eStoraged.mmcblk0 \
  /xyz/openbmc_project/inventory/storage/mmcblk0 \
  xyz.openbmc_project.Inventory.Item.Volume Locked
$ busctl get-property xyz.openbmc_project.eStoraged.mmcblk0 \
  /xyz/openbmc_project/inventory/storage/mmcblk0 \
  xyz.openbmc_project.Inventory.Item.Drive Capacity
$ busctl call xyz.openbmc_project.eStoraged.mmcblk0 \
  /xyz/openbmc_project/inventory/storage/mmcblk0 \
  xyz.openbmc_project.Inventory.Item.Volume Erase s \
  xyz.openbmc_project.Inventory.Item.Volume.EraseMethod.VerifyGeometry
$ busctl call xyz.openbmc_project.eStoraged.mmcblk0 \
  /xyz/openbmc_project/inventory/storage/mmcblk0 \
  xyz.openbmc_project.Inventory.Item.Volume Erase s \
  xyz.openbmc_project.Inventory.Item.Volume.EraseMethod.LogicalOverWrite \
  --timeout=1200
$ busctl call xyz.openbmc_project.eStoraged.mmcblk0 \
  /xyz/openbmc_project/inventory/storage/mmcblk0 \
  xyz.openbmc_project.Inventory.Item.Volume Erase s \
  xyz.openbmc_project.Inventory.Item.Volume.EraseMethod.LogicalVerify \
  --timeout=1200

Signed-off-by: John Wedig <johnwedig@google.com>
Change-Id: I99cb371871bfa68eb0193f614f899221afd9013a
diff --git a/.clang-tidy b/.clang-tidy
index 0c9cc0b..bdf15ab 100644
--- a/.clang-tidy
+++ b/.clang-tidy
@@ -96,7 +96,6 @@
 clang-analyzer-apiModeling.google.GTest,
 clang-analyzer-apiModeling.llvm.CastValue,
 clang-analyzer-apiModeling.llvm.ReturnValue,
-clang-analyzer-core.CallAndMessage,
 clang-analyzer-core.CallAndMessageModeling,
 clang-analyzer-core.DivideZero,
 clang-analyzer-core.DynamicTypePropagation,
diff --git a/include/estoraged.hpp b/include/estoraged.hpp
index 3a4fb6c..aa89bee 100644
--- a/include/estoraged.hpp
+++ b/include/estoraged.hpp
@@ -5,6 +5,7 @@
 
 #include <libcryptsetup.h>
 
+#include <sdbusplus/asio/object_server.hpp>
 #include <sdbusplus/bus.hpp>
 #include <sdbusplus/exception.hpp>
 #include <sdbusplus/server/object.hpp>
@@ -20,23 +21,19 @@
 
 namespace estoraged
 {
-using driveInherit = sdbusplus::server::object_t<
-    sdbusplus::xyz::openbmc_project::Inventory::Item::server::Drive>;
-using eStoragedInherit = sdbusplus::server::object_t<
-    sdbusplus::xyz::openbmc_project::Inventory::Item::server::Volume>;
 using estoraged::Cryptsetup;
 using estoraged::Filesystem;
+using sdbusplus::xyz::openbmc_project::Inventory::Item::server::Volume;
 
 /** @class eStoraged
  *  @brief eStoraged object to manage a LUKS encrypted storage device.
  */
-class EStoraged : private eStoragedInherit, private driveInherit
+class EStoraged
 {
   public:
     /** @brief Constructor for eStoraged
      *
-     *  @param[in] bus - sdbusplus dbus object
-     *  @param[in] path - DBus object path
+     *  @param[in] server - sdbusplus asio object server
      *  @param[in] devPath - path to device file, e.g. /dev/mmcblk0
      *  @param[in] luksName - name for the LUKS container
      *  @param[in] cryptInterface - (optional) pointer to CryptsetupInterface
@@ -44,52 +41,53 @@
      *  @param[in] fsInterface - (optional) pointer to FilesystemInterface
      *    object
      */
-    EStoraged(sdbusplus::bus::bus& bus, const char* path,
+    EStoraged(sdbusplus::asio::object_server& server,
               const std::string& devPath, const std::string& luksName,
               uint64_t size,
               std::unique_ptr<CryptsetupInterface> cryptInterface =
                   std::make_unique<Cryptsetup>(),
               std::unique_ptr<FilesystemInterface> fsInterface =
-                  std::make_unique<Filesystem>()) :
-        eStoragedInherit(bus, path),
-        driveInherit(bus, path), devPath(devPath), containerName(luksName),
-        mountPoint("/mnt/" + luksName + "_fs"),
-        cryptIface(std::move(cryptInterface)), fsIface(std::move(fsInterface))
-    {
-        capacity(size);
-    }
+                  std::make_unique<Filesystem>());
+
+    /** @brief Destructor for eStoraged. */
+    ~EStoraged();
+
+    EStoraged& operator=(const EStoraged&) = delete;
+    EStoraged(const EStoraged&) = delete;
+    EStoraged(EStoraged&&) = default;
+    EStoraged& operator=(EStoraged&&) = default;
 
     /** @brief Format the LUKS encrypted device and create empty filesystem.
      *
      *  @param[in] password - password to set for the LUKS device.
      *  @param[in] type - filesystem type, e.g. ext4
      */
-    void formatLuks(std::vector<uint8_t> password,
-                    FilesystemType type) override;
+    void formatLuks(const std::vector<uint8_t>& password,
+                    Volume::FilesystemType type);
 
     /** @brief Erase the contents of the storage device.
      *
      *  @param[in] eraseType - type of erase operation.
      */
-    void erase(EraseMethod eraseType) override;
+    void erase(Volume::EraseMethod eraseType);
 
     /** @brief Unmount filesystem and lock the LUKS device.
      */
-    void lock() override;
+    void lock();
 
     /** @brief Unlock device and mount the filesystem.
      *
      *  @param[in] password - password for the LUKS device.
      */
-    void unlock(std::vector<uint8_t> password) override;
+    void unlock(std::vector<uint8_t> password);
 
     /** @brief Change the password for the LUKS device.
      *
      *  @param[in] oldPassword - old password for the LUKS device.
      *  @param[in] newPassword - new password for the LUKS device.
      */
-    void changePassword(std::vector<uint8_t> oldPassword,
-                        std::vector<uint8_t> newPassword) override;
+    void changePassword(const std::vector<uint8_t>& oldPassword,
+                        const std::vector<uint8_t>& newPassword);
 
     /** @brief Check if the LUKS device is currently locked. */
     bool isLocked() const;
@@ -107,6 +105,9 @@
     /** @brief Mount point for the filesystem. */
     std::string mountPoint;
 
+    /** @brief Indicates whether the LUKS device is currently locked. */
+    bool lockedProperty;
+
     /** @brief Pointer to cryptsetup interface object.
      *  @details This is used to mock out the cryptsetup functions.
      */
@@ -117,6 +118,15 @@
      */
     std::unique_ptr<FilesystemInterface> fsIface;
 
+    /** @brief D-Bus object server. */
+    sdbusplus::asio::object_server& objectServer;
+
+    /** @brief D-Bus interface for the logical volume. */
+    std::shared_ptr<sdbusplus::asio::dbus_interface> volumeInterface;
+
+    /** @brief D-Bus interface for the physical drive. */
+    std::shared_ptr<sdbusplus::asio::dbus_interface> driveInterface;
+
     /** @brief Format LUKS encrypted device.
      *
      *  @param[in] cd - initialized crypt_device struct for the device.
@@ -150,6 +160,12 @@
 
     /** @brief Unmount the filesystem. */
     void unmountFilesystem();
+
+    /** @brief Set the locked property.
+     *
+     *  @param[in] isLocked - indicates whether the LUKS device is locked.
+     */
+    void locked(bool isLocked);
 };
 
 } // namespace estoraged
diff --git a/src/estoraged.cpp b/src/estoraged.cpp
index f6176e4..6225f91 100644
--- a/src/estoraged.cpp
+++ b/src/estoraged.cpp
@@ -12,12 +12,15 @@
 #include <openssl/rand.h>
 
 #include <phosphor-logging/lg2.hpp>
+#include <sdbusplus/asio/object_server.hpp>
 #include <xyz/openbmc_project/Common/error.hpp>
 
 #include <cstdlib>
 #include <filesystem>
 #include <iostream>
+#include <string>
 #include <string_view>
+#include <utility>
 #include <vector>
 
 namespace estoraged
@@ -26,13 +29,72 @@
 using sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
 using sdbusplus::xyz::openbmc_project::Common::Error::ResourceNotFound;
 using sdbusplus::xyz::openbmc_project::Common::Error::UnsupportedRequest;
+using sdbusplus::xyz::openbmc_project::Inventory::Item::server::Volume;
 
-void EStoraged::formatLuks(std::vector<uint8_t> password, FilesystemType type)
+EStoraged::EStoraged(sdbusplus::asio::object_server& server,
+                     const std::string& devPath, const std::string& luksName,
+                     uint64_t size,
+                     std::unique_ptr<CryptsetupInterface> cryptInterface,
+                     std::unique_ptr<FilesystemInterface> fsInterface) :
+    devPath(devPath),
+    containerName(luksName), mountPoint("/mnt/" + luksName + "_fs"),
+    lockedProperty(false), cryptIface(std::move(cryptInterface)),
+    fsIface(std::move(fsInterface)), objectServer(server)
+{
+    /* Get the filename of the device (without "/dev/"). */
+    std::string deviceName = std::filesystem::path(devPath).filename().string();
+    /* DBus object path */
+    std::string path = "/xyz/openbmc_project/inventory/storage/" + deviceName;
+
+    /* Add Volume interface. */
+    volumeInterface = objectServer.add_interface(
+        path, "xyz.openbmc_project.Inventory.Item.Volume");
+    volumeInterface->register_method(
+        "FormatLuks", [this](const std::vector<uint8_t>& password,
+                             Volume::FilesystemType type) {
+            this->formatLuks(password, type);
+        });
+    volumeInterface->register_method(
+        "Erase",
+        [this](Volume::EraseMethod eraseType) { this->erase(eraseType); });
+    volumeInterface->register_method("Lock", [this]() { this->lock(); });
+    volumeInterface->register_method(
+        "Unlock",
+        [this](std::vector<uint8_t>& password) { this->unlock(password); });
+    volumeInterface->register_method(
+        "ChangePassword", [this](const std::vector<uint8_t>& oldPassword,
+                                 const std::vector<uint8_t>& newPassword) {
+            this->changePassword(oldPassword, newPassword);
+        });
+    volumeInterface->register_property_r(
+        "Locked", lockedProperty, sdbusplus::vtable::property_::emits_change,
+        [this](bool& value) {
+            value = this->isLocked();
+            return value;
+        });
+
+    /* Add Drive interface. */
+    driveInterface = objectServer.add_interface(
+        path, "xyz.openbmc_project.Inventory.Item.Drive");
+    driveInterface->register_property("Capacity", size);
+
+    volumeInterface->initialize();
+    driveInterface->initialize();
+}
+
+EStoraged::~EStoraged()
+{
+    objectServer.remove_interface(volumeInterface);
+    objectServer.remove_interface(driveInterface);
+}
+
+void EStoraged::formatLuks(const std::vector<uint8_t>& password,
+                           Volume::FilesystemType type)
 {
     std::string msg = "OpenBMC.0.1.DriveFormat";
     lg2::info("Starting format", "REDFISH_MESSAGE_ID", msg);
 
-    if (type != FilesystemType::ext4)
+    if (type != Volume::FilesystemType::ext4)
     {
         lg2::error("Only ext4 filesystems are supported currently",
                    "REDFISH_MESSAGE_ID", std::string("OpenBMC.0.1.FormatFail"));
@@ -54,56 +116,56 @@
     mountFilesystem();
 }
 
-void EStoraged::erase(EraseMethod inEraseMethod)
+void EStoraged::erase(Volume::EraseMethod inEraseMethod)
 {
     std::cerr << "Erasing encrypted eMMC" << std::endl;
     lg2::info("Starting erase", "REDFISH_MESSAGE_ID",
               std::string("OpenBMC.0.1.DriveErase"));
     switch (inEraseMethod)
     {
-        case EraseMethod::CryptoErase:
+        case Volume::EraseMethod::CryptoErase:
         {
             CryptErase myCryptErase(devPath);
             myCryptErase.doErase();
             break;
         }
-        case EraseMethod::VerifyGeometry:
+        case Volume::EraseMethod::VerifyGeometry:
         {
             VerifyDriveGeometry myVerifyGeometry(devPath);
             myVerifyGeometry.geometryOkay();
             break;
         }
-        case EraseMethod::LogicalOverWrite:
+        case Volume::EraseMethod::LogicalOverWrite:
         {
             Pattern myErasePattern(devPath);
             myErasePattern.writePattern();
             break;
         }
-        case EraseMethod::LogicalVerify:
+        case Volume::EraseMethod::LogicalVerify:
         {
             Pattern myErasePattern(devPath);
             myErasePattern.verifyPattern();
             break;
         }
-        case EraseMethod::VendorSanitize:
+        case Volume::EraseMethod::VendorSanitize:
         {
             Sanitize mySanitize(devPath);
             mySanitize.doSanitize();
             break;
         }
-        case EraseMethod::ZeroOverWrite:
+        case Volume::EraseMethod::ZeroOverWrite:
         {
             Zero myZero(devPath);
             myZero.writeZero();
             break;
         }
-        case EraseMethod::ZeroVerify:
+        case Volume::EraseMethod::ZeroVerify:
         {
             Zero myZero(devPath);
             myZero.verifyZero();
             break;
         }
-        case EraseMethod::SecuredLocked:
+        case Volume::EraseMethod::SecuredLocked:
         {
             if (isLocked())
             {
@@ -138,12 +200,12 @@
         throw ResourceNotFound();
     }
 
-    activateLuksDev(cryptHandle.get(), password);
+    activateLuksDev(cryptHandle.get(), std::move(password));
     mountFilesystem();
 }
 
-void EStoraged::changePassword(std::vector<uint8_t> /*oldPassword*/,
-                               std::vector<uint8_t> /*newPassword*/)
+void EStoraged::changePassword(const std::vector<uint8_t>& /*oldPassword*/,
+                               const std::vector<uint8_t>& /*newPassword*/)
 {
     std::cerr << "Changing password for encrypted eMMC" << std::endl;
     lg2::info("Starting change password", "REDFISH_MESSAGE_ID",
@@ -152,7 +214,7 @@
 
 bool EStoraged::isLocked() const
 {
-    return locked();
+    return lockedProperty;
 }
 
 std::string_view EStoraged::getMountPoint() const
@@ -353,4 +415,9 @@
               std::string("OpenBMC.0.1.DeactivateLuksDevSuccess"));
 }
 
+void EStoraged::locked(bool isLocked)
+{
+    lockedProperty = isLocked;
+}
+
 } // namespace estoraged
diff --git a/src/main.cpp b/src/main.cpp
index 82ffcdd..aea7904 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -3,12 +3,16 @@
 
 #include <unistd.h>
 
+#include <boost/asio/io_context.hpp>
 #include <phosphor-logging/lg2.hpp>
+#include <sdbusplus/asio/connection.hpp>
+#include <sdbusplus/asio/object_server.hpp>
 #include <sdbusplus/bus.hpp>
 #include <util.hpp>
 
 #include <filesystem>
 #include <iostream>
+#include <memory>
 #include <string>
 
 static void usage(std::string_view name)
@@ -24,7 +28,6 @@
 
 int main(int argc, char** argv)
 {
-
     std::string physicalBlockDev = "/dev/mmcblk0";
     std::string containerBlockDev;
     int opt = 0;
@@ -55,32 +58,22 @@
             containerBlockDev = "luks-" + deviceName;
         }
 
-        /* DBus path location to place the object. */
-        std::string path =
-            "/xyz/openbmc_project/inventory/storage/" + deviceName;
-        /*
-         * Create a new bus and affix an object manager for the subtree path we
-         * intend to place objects at.
-         */
-        auto b = sdbusplus::bus::new_default();
-        sdbusplus::server::manager_t m{b, path.c_str()};
-
-        /* Reserve the dbus service name. */
+        // setup connection to dbus
+        boost::asio::io_context io;
+        auto conn = std::make_shared<sdbusplus::asio::connection>(io);
+        // request D-Bus server name.
         std::string busName = "xyz.openbmc_project.eStoraged." + deviceName;
-        b.request_name(busName.c_str());
+        conn->request_name(busName.c_str());
+        auto server = sdbusplus::asio::object_server(conn);
 
-        /* Create an eStoraged object. */
         estoraged::EStoraged esObject{
-            b, path.c_str(), physicalBlockDev, containerBlockDev,
+            server, physicalBlockDev, containerBlockDev,
             estoraged::util::Util::findSizeOfBlockDevice(physicalBlockDev)};
         lg2::info("Storage management service is running", "REDFISH_MESSAGE_ID",
                   std::string("OpenBMC.1.0.ServiceStarted"));
 
-        while (true)
-        {
-            b.wait();
-            b.process_discard();
-        }
+        io.run();
+        return 0;
     }
     catch (const std::exception& e)
     {
diff --git a/src/meson.build b/src/meson.build
index ed28e88..d12786f 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -1,8 +1,23 @@
 phosphor_dbus_interfaces_dep = dependency('phosphor-dbus-interfaces')
 phosphor_logging_dep = dependency('phosphor-logging')
-sdbusplus_dep = dependency('sdbusplus')
+
+sdbusplus_dep = dependency('sdbusplus', required: false, include_type: 'system')
+if not sdbusplus_dep.found()
+  sdbusplus_proj = subproject('sdbusplus', required: true)
+  sdbusplus = sdbusplus_proj.get_variable('sdbusplus_dep')
+  sdbusplus = sdbusplus.as_system('system')
+endif
+
 stdplus_dep = dependency('stdplus')
 
+boost_dep = dependency('boost',version : '>=1.78.0', required : false, include_type: 'system')
+if not boost_dep.found()
+  subproject('boost', required: false)
+  boost_inc = include_directories('subprojects/boost_1_78_0/', is_system:true)
+  boost  = declare_dependency(include_directories : boost_inc)
+  boost = boost.as_system('system')
+endif
+
 subdir('erase')
 
 libeStoraged_deps = [
@@ -12,6 +27,7 @@
   phosphor_logging_dep,
   sdbusplus_dep,
   stdplus_dep,
+  boost_dep,
 ]
 
 libeStoraged_lib = static_library(
diff --git a/src/test/estoraged_test.cpp b/src/test/estoraged_test.cpp
index e7ad562..05f872f 100644
--- a/src/test/estoraged_test.cpp
+++ b/src/test/estoraged_test.cpp
@@ -4,7 +4,9 @@
 
 #include <unistd.h>
 
-#include <sdbusplus/test/sdbus_mock.hpp>
+#include <boost/asio/io_context.hpp>
+#include <sdbusplus/asio/connection.hpp>
+#include <sdbusplus/asio/object_server.hpp>
 #include <xyz/openbmc_project/Common/error.hpp>
 #include <xyz/openbmc_project/Inventory/Item/Volume/client.hpp>
 
@@ -12,6 +14,7 @@
 #include <filesystem>
 #include <fstream>
 #include <iterator>
+#include <memory>
 #include <string>
 #include <vector>
 
@@ -27,37 +30,31 @@
 using std::filesystem::path;
 using ::testing::_;
 using ::testing::ContainsRegex;
-using ::testing::IsNull;
 using ::testing::Return;
 using ::testing::StrEq;
 
-/*
- * This sdbus mock object gets used in the destructor of one of the parent
- * classes for the MockeStoraged object, so this can't be part of the
- * eStoragedTest class.
- */
-sdbusplus::SdBusMock sdbusMock;
-
 class EStoragedTest : public testing::Test
 {
   public:
     const char* testFileName = "testfile";
     const char* testLuksDevName = "testfile_luksDev";
-    uint64_t testSize = 24;
+    const uint64_t testSize = 24;
     std::ofstream testFile;
-    std::unique_ptr<estoraged::EStoraged> esObject;
     const char* testPath = "/test/openbmc_project/storage/test_dev";
     const char* estoragedInterface =
         "xyz.openbmc_project.Inventory.Item.Volume";
     const char* driveInterface = "xyz.openbmc_project.Inventory.Item.Drive";
-    sdbusplus::bus::bus bus;
     std::string passwordString;
     std::vector<uint8_t> password;
     MockCryptsetupInterface* mockCryptIface{};
     MockFilesystemInterface* mockFsIface{};
+    boost::asio::io_context io;
+    std::shared_ptr<sdbusplus::asio::connection> conn;
+    std::unique_ptr<sdbusplus::asio::object_server> objectServer;
+    std::unique_ptr<estoraged::EStoraged> esObject;
 
     EStoragedTest() :
-        bus(sdbusplus::get_mocked_new(&sdbusMock)), passwordString("password"),
+        passwordString("password"),
         password(passwordString.begin(), passwordString.end())
     {}
 
@@ -72,24 +69,6 @@
             throw std::runtime_error("Failed to open test file");
         }
 
-        EXPECT_CALL(sdbusMock,
-                    sd_bus_add_object_vtable(IsNull(), _, StrEq(testPath),
-                                             StrEq(estoragedInterface), _, _))
-            .WillRepeatedly(Return(0));
-
-        EXPECT_CALL(sdbusMock,
-                    sd_bus_add_object_vtable(IsNull(), _, StrEq(testPath),
-                                             StrEq(driveInterface), _, _))
-            .WillRepeatedly(Return(0));
-
-        EXPECT_CALL(sdbusMock,
-                    sd_bus_emit_object_added(IsNull(), StrEq(testPath)))
-            .WillRepeatedly(Return(0));
-
-        EXPECT_CALL(sdbusMock,
-                    sd_bus_emit_object_removed(IsNull(), StrEq(testPath)))
-            .WillRepeatedly(Return(0));
-
         std::unique_ptr<MockCryptsetupInterface> cryptIface =
             std::make_unique<MockCryptsetupInterface>();
         mockCryptIface = cryptIface.get();
@@ -97,8 +76,13 @@
             std::make_unique<MockFilesystemInterface>();
         mockFsIface = fsIface.get();
 
+        conn = std::make_shared<sdbusplus::asio::connection>(io);
+        // request D-Bus server name.
+        conn->request_name("xyz.openbmc_project.eStoraged.test");
+        objectServer = std::make_unique<sdbusplus::asio::object_server>(conn);
+
         esObject = std::make_unique<estoraged::EStoraged>(
-            bus, testPath, testFileName, testLuksDevName, testSize,
+            *objectServer, testFileName, testLuksDevName, testSize,
             std::move(cryptIface), std::move(fsIface));
     }
 
@@ -111,16 +95,6 @@
 /* Test case to format and then lock the LUKS device. */
 TEST_F(EStoragedTest, FormatPass)
 {
-    EXPECT_CALL(sdbusMock,
-                sd_bus_emit_properties_changed_strv(IsNull(), StrEq(testPath),
-                                                    StrEq(driveInterface), _))
-        .WillRepeatedly(Return(0));
-
-    EXPECT_CALL(sdbusMock,
-                sd_bus_emit_properties_changed_strv(
-                    IsNull(), StrEq(testPath), StrEq(estoragedInterface), _))
-        .WillRepeatedly(Return(0));
-
     EXPECT_CALL(*mockCryptIface, cryptFormat(_, _, _, _, _, _, _, _)).Times(1);
 
     EXPECT_CALL(*mockCryptIface, cryptKeyslotAddByVolumeKey(_, _, _, _, _, _))
@@ -166,16 +140,6 @@
  */
 TEST_F(EStoragedTest, MountPointExistsPass)
 {
-    EXPECT_CALL(sdbusMock,
-                sd_bus_emit_properties_changed_strv(IsNull(), StrEq(testPath),
-                                                    StrEq(driveInterface), _))
-        .WillRepeatedly(Return(0));
-
-    EXPECT_CALL(sdbusMock,
-                sd_bus_emit_properties_changed_strv(
-                    IsNull(), StrEq(testPath), StrEq(estoragedInterface), _))
-        .WillRepeatedly(Return(0));
-
     EXPECT_CALL(*mockCryptIface, cryptFormat(_, _, _, _, _, _, _, _)).Times(1);
 
     EXPECT_CALL(*mockCryptIface, cryptKeyslotAddByVolumeKey(_, _, _, _, _, _))
@@ -245,16 +209,6 @@
 /* Test case where we fail to set the password for the LUKS device. */
 TEST_F(EStoragedTest, AddKeyslotFail)
 {
-    EXPECT_CALL(sdbusMock,
-                sd_bus_emit_properties_changed_strv(IsNull(), StrEq(testPath),
-                                                    StrEq(driveInterface), _))
-        .WillRepeatedly(Return(0));
-
-    EXPECT_CALL(sdbusMock,
-                sd_bus_emit_properties_changed_strv(
-                    IsNull(), StrEq(testPath), StrEq(estoragedInterface), _))
-        .WillRepeatedly(Return(0));
-
     EXPECT_CALL(*mockCryptIface, cryptFormat(_, _, _, _, _, _, _, _)).Times(1);
 
     EXPECT_CALL(*mockCryptIface, cryptKeyslotAddByVolumeKey(_, _, _, _, _, _))
@@ -268,16 +222,6 @@
 /* Test case where we fail to load the LUKS header. */
 TEST_F(EStoragedTest, LoadLuksHeaderFail)
 {
-    EXPECT_CALL(sdbusMock,
-                sd_bus_emit_properties_changed_strv(IsNull(), StrEq(testPath),
-                                                    StrEq(driveInterface), _))
-        .WillRepeatedly(Return(0));
-
-    EXPECT_CALL(sdbusMock,
-                sd_bus_emit_properties_changed_strv(
-                    IsNull(), StrEq(testPath), StrEq(estoragedInterface), _))
-        .WillRepeatedly(Return(0));
-
     EXPECT_CALL(*mockCryptIface, cryptFormat(_, _, _, _, _, _, _, _)).Times(1);
 
     EXPECT_CALL(*mockCryptIface, cryptKeyslotAddByVolumeKey(_, _, _, _, _, _))
@@ -293,16 +237,6 @@
 /* Test case where we fail to activate the LUKS device. */
 TEST_F(EStoragedTest, ActivateFail)
 {
-    EXPECT_CALL(sdbusMock,
-                sd_bus_emit_properties_changed_strv(IsNull(), StrEq(testPath),
-                                                    StrEq(driveInterface), _))
-        .WillRepeatedly(Return(0));
-
-    EXPECT_CALL(sdbusMock,
-                sd_bus_emit_properties_changed_strv(
-                    IsNull(), StrEq(testPath), StrEq(estoragedInterface), _))
-        .WillRepeatedly(Return(0));
-
     EXPECT_CALL(*mockCryptIface, cryptFormat(_, _, _, _, _, _, _, _)).Times(1);
 
     EXPECT_CALL(*mockCryptIface, cryptKeyslotAddByVolumeKey(_, _, _, _, _, _))
@@ -321,16 +255,6 @@
 /* Test case where we fail to create the filesystem. */
 TEST_F(EStoragedTest, CreateFilesystemFail)
 {
-    EXPECT_CALL(sdbusMock,
-                sd_bus_emit_properties_changed_strv(IsNull(), StrEq(testPath),
-                                                    StrEq(driveInterface), _))
-        .WillRepeatedly(Return(0));
-
-    EXPECT_CALL(sdbusMock,
-                sd_bus_emit_properties_changed_strv(
-                    IsNull(), StrEq(testPath), StrEq(estoragedInterface), _))
-        .WillRepeatedly(Return(0));
-
     EXPECT_CALL(*mockCryptIface, cryptFormat(_, _, _, _, _, _, _, _)).Times(1);
 
     EXPECT_CALL(*mockCryptIface, cryptKeyslotAddByVolumeKey(_, _, _, _, _, _))
@@ -351,16 +275,6 @@
 /* Test case where we fail to create the mount point. */
 TEST_F(EStoragedTest, CreateMountPointFail)
 {
-    EXPECT_CALL(sdbusMock,
-                sd_bus_emit_properties_changed_strv(IsNull(), StrEq(testPath),
-                                                    StrEq(driveInterface), _))
-        .WillRepeatedly(Return(0));
-
-    EXPECT_CALL(sdbusMock,
-                sd_bus_emit_properties_changed_strv(
-                    IsNull(), StrEq(testPath), StrEq(estoragedInterface), _))
-        .WillRepeatedly(Return(0));
-
     EXPECT_CALL(*mockCryptIface, cryptFormat(_, _, _, _, _, _, _, _)).Times(1);
 
     EXPECT_CALL(*mockCryptIface, cryptKeyslotAddByVolumeKey(_, _, _, _, _, _))
@@ -387,16 +301,6 @@
 /* Test case where we fail to mount the filesystem. */
 TEST_F(EStoragedTest, MountFail)
 {
-    EXPECT_CALL(sdbusMock,
-                sd_bus_emit_properties_changed_strv(IsNull(), StrEq(testPath),
-                                                    StrEq(driveInterface), _))
-        .WillRepeatedly(Return(0));
-
-    EXPECT_CALL(sdbusMock,
-                sd_bus_emit_properties_changed_strv(
-                    IsNull(), StrEq(testPath), StrEq(estoragedInterface), _))
-        .WillRepeatedly(Return(0));
-
     EXPECT_CALL(*mockCryptIface, cryptFormat(_, _, _, _, _, _, _, _)).Times(1);
 
     EXPECT_CALL(*mockCryptIface, cryptKeyslotAddByVolumeKey(_, _, _, _, _, _))
@@ -431,16 +335,6 @@
 /* Test case where we fail to unmount the filesystem. */
 TEST_F(EStoragedTest, UnmountFail)
 {
-    EXPECT_CALL(sdbusMock,
-                sd_bus_emit_properties_changed_strv(IsNull(), StrEq(testPath),
-                                                    StrEq(driveInterface), _))
-        .WillRepeatedly(Return(0));
-
-    EXPECT_CALL(sdbusMock,
-                sd_bus_emit_properties_changed_strv(
-                    IsNull(), StrEq(testPath), StrEq(estoragedInterface), _))
-        .WillRepeatedly(Return(0));
-
     EXPECT_CALL(*mockCryptIface, cryptFormat(_, _, _, _, _, _, _, _)).Times(1);
 
     EXPECT_CALL(*mockCryptIface, cryptKeyslotAddByVolumeKey(_, _, _, _, _, _))
@@ -477,16 +371,6 @@
 /* Test case where we fail to remove the mount point. */
 TEST_F(EStoragedTest, RemoveMountPointFail)
 {
-    EXPECT_CALL(sdbusMock,
-                sd_bus_emit_properties_changed_strv(IsNull(), StrEq(testPath),
-                                                    StrEq(driveInterface), _))
-        .WillRepeatedly(Return(0));
-
-    EXPECT_CALL(sdbusMock,
-                sd_bus_emit_properties_changed_strv(
-                    IsNull(), StrEq(testPath), StrEq(estoragedInterface), _))
-        .WillRepeatedly(Return(0));
-
     EXPECT_CALL(*mockCryptIface, cryptFormat(_, _, _, _, _, _, _, _)).Times(1);
 
     EXPECT_CALL(*mockCryptIface, cryptKeyslotAddByVolumeKey(_, _, _, _, _, _))
@@ -527,16 +411,6 @@
 /* Test case where we fail to deactivate the LUKS device. */
 TEST_F(EStoragedTest, DeactivateFail)
 {
-    EXPECT_CALL(sdbusMock,
-                sd_bus_emit_properties_changed_strv(IsNull(), StrEq(testPath),
-                                                    StrEq(driveInterface), _))
-        .WillRepeatedly(Return(0));
-
-    EXPECT_CALL(sdbusMock,
-                sd_bus_emit_properties_changed_strv(
-                    IsNull(), StrEq(testPath), StrEq(estoragedInterface), _))
-        .WillRepeatedly(Return(0));
-
     EXPECT_CALL(*mockCryptIface, cryptFormat(_, _, _, _, _, _, _, _)).Times(1);
 
     EXPECT_CALL(*mockCryptIface, cryptKeyslotAddByVolumeKey(_, _, _, _, _, _))
diff --git a/subprojects/boost.wrap b/subprojects/boost.wrap
new file mode 100644
index 0000000..2f7a22f
--- /dev/null
+++ b/subprojects/boost.wrap
@@ -0,0 +1,4 @@
+[wrap-file]
+source_url = https://downloads.yoctoproject.org/mirror/sources/boost_1_78_0.tar.bz2
+source_hash = 8681f175d4bdb26c52222665793eef08490d7758529330f98d3b29dd0735bccc
+source_filename = 1_78_0.tar.bz2