blob: dd3954eebbb0e6aa3564c67286b3ab7d3d0c6b4a [file] [log] [blame]
#include "cryptErase.hpp"
#include "cryptsetupInterface.hpp"
#include "estoraged.hpp"
#include "estoraged_test.hpp"
#include <unistd.h>
#include <xyz/openbmc_project/Common/error.hpp>
#include <exception>
#include <filesystem>
#include <fstream>
#include <string>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
namespace estoraged_test
{
using estoraged::CryptErase;
using sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
using sdbusplus::xyz::openbmc_project::Common::Error::ResourceNotFound;
using ::testing::_;
using ::testing::Return;
using ::testing::StrEq;
const std::string testFileName = "testFile";
class CryptoEraseTest : public testing::Test
{
public:
std::ofstream testFile;
void SetUp() override
{
/* Create an empty file that we'll pretend is a 'storage device'. */
testFile.open(testFileName.c_str(),
std::ios::out | std::ios::binary | std::ios::trunc);
testFile.close();
if (testFile.fail())
{
throw std::runtime_error("Failed to open test file");
}
testFile.close();
}
};
TEST_F(CryptoEraseTest, EraseCryptPass)
{
std::unique_ptr<MockCryptsetupInterface> mockCryptIface =
std::make_unique<MockCryptsetupInterface>();
EXPECT_CALL(*mockCryptIface, cryptLoad(_, StrEq(CRYPT_LUKS2), nullptr))
.WillOnce(Return(0));
EXPECT_CALL(*mockCryptIface, cryptKeySlotMax(StrEq(CRYPT_LUKS2)))
.WillOnce(Return(1));
EXPECT_CALL(*mockCryptIface, cryptKeySlotStatus(_, 0))
.WillOnce(Return(CRYPT_SLOT_ACTIVE_LAST));
EXPECT_CALL(*mockCryptIface, cryptKeyslotDestroy(_, 0)).Times(1);
CryptErase myCryptErase = CryptErase(testFileName.c_str(),
std::move(mockCryptIface));
EXPECT_NO_THROW(myCryptErase.doErase());
}
TEST_F(CryptoEraseTest, EraseCrypMaxSlotFails)
{
std::unique_ptr<MockCryptsetupInterface> mockCryptIface =
std::make_unique<MockCryptsetupInterface>();
EXPECT_CALL(*mockCryptIface, cryptLoad(_, StrEq(CRYPT_LUKS2), nullptr))
.WillOnce(Return(0));
EXPECT_CALL(*mockCryptIface, cryptKeySlotMax(StrEq(CRYPT_LUKS2)))
.WillOnce(Return(-1));
CryptErase myCryptErase = CryptErase(testFileName.c_str(),
std::move(mockCryptIface));
EXPECT_THROW(myCryptErase.doErase(), ResourceNotFound);
}
TEST_F(CryptoEraseTest, EraseCrypMaxSlotZero)
{
std::unique_ptr<MockCryptsetupInterface> mockCryptIface =
std::make_unique<MockCryptsetupInterface>();
EXPECT_CALL(*mockCryptIface, cryptLoad(_, StrEq(CRYPT_LUKS2), nullptr))
.WillOnce(Return(0));
EXPECT_CALL(*mockCryptIface, cryptKeySlotMax(StrEq(CRYPT_LUKS2)))
.WillOnce(Return(0));
CryptErase myCryptErase = CryptErase(testFileName.c_str(),
std::move(mockCryptIface));
EXPECT_THROW(myCryptErase.doErase(), ResourceNotFound);
}
TEST_F(CryptoEraseTest, EraseCrypOnlyInvalid)
{
std::unique_ptr<MockCryptsetupInterface> mockCryptIface =
std::make_unique<MockCryptsetupInterface>();
EXPECT_CALL(*mockCryptIface, cryptLoad(_, StrEq(CRYPT_LUKS2), nullptr))
.WillOnce(Return(0));
EXPECT_CALL(*mockCryptIface, cryptKeySlotMax(StrEq(CRYPT_LUKS2)))
.WillOnce(Return(32));
EXPECT_CALL(*mockCryptIface, cryptKeySlotStatus(_, _))
.WillRepeatedly(Return(CRYPT_SLOT_INVALID));
CryptErase myCryptErase = CryptErase(testFileName.c_str(),
std::move(mockCryptIface));
EXPECT_NO_THROW(myCryptErase.doErase());
}
TEST_F(CryptoEraseTest, EraseCrypDestoryFails)
{
std::unique_ptr<MockCryptsetupInterface> mockCryptIface =
std::make_unique<MockCryptsetupInterface>();
EXPECT_CALL(*mockCryptIface, cryptLoad(_, StrEq(CRYPT_LUKS2), nullptr))
.WillOnce(Return(0));
EXPECT_CALL(*mockCryptIface, cryptKeySlotMax(StrEq(CRYPT_LUKS2)))
.WillOnce(Return(1));
EXPECT_CALL(*mockCryptIface, cryptKeySlotStatus(_, 0))
.WillOnce(Return(CRYPT_SLOT_ACTIVE));
EXPECT_CALL(*mockCryptIface, cryptKeyslotDestroy(_, 0))
.WillOnce(Return(-1));
CryptErase myCryptErase = CryptErase(testFileName.c_str(),
std::move(mockCryptIface));
EXPECT_THROW(myCryptErase.doErase(), InternalFailure);
}
} // namespace estoraged_test