159dffa63SJohn Edward Broadbent
259dffa63SJohn Edward Broadbent #include "cryptErase.hpp"
359dffa63SJohn Edward Broadbent #include "cryptsetupInterface.hpp"
459dffa63SJohn Edward Broadbent #include "estoraged.hpp"
559dffa63SJohn Edward Broadbent #include "estoraged_test.hpp"
659dffa63SJohn Edward Broadbent
759dffa63SJohn Edward Broadbent #include <unistd.h>
859dffa63SJohn Edward Broadbent
959dffa63SJohn Edward Broadbent #include <xyz/openbmc_project/Common/error.hpp>
1059dffa63SJohn Edward Broadbent
1159dffa63SJohn Edward Broadbent #include <exception>
1259dffa63SJohn Edward Broadbent #include <filesystem>
1359dffa63SJohn Edward Broadbent #include <fstream>
1459dffa63SJohn Edward Broadbent #include <string>
1559dffa63SJohn Edward Broadbent
1659dffa63SJohn Edward Broadbent #include <gmock/gmock.h>
1759dffa63SJohn Edward Broadbent #include <gtest/gtest.h>
1859dffa63SJohn Edward Broadbent
1959dffa63SJohn Edward Broadbent namespace estoraged_test
2059dffa63SJohn Edward Broadbent {
2159dffa63SJohn Edward Broadbent
2259dffa63SJohn Edward Broadbent using estoraged::CryptErase;
2359dffa63SJohn Edward Broadbent using sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
2459dffa63SJohn Edward Broadbent using sdbusplus::xyz::openbmc_project::Common::Error::ResourceNotFound;
2559dffa63SJohn Edward Broadbent using ::testing::_;
2659dffa63SJohn Edward Broadbent using ::testing::Return;
2759dffa63SJohn Edward Broadbent using ::testing::StrEq;
2859dffa63SJohn Edward Broadbent
2982897c35SEd Tanous const std::string testFileName = "testFile";
3082897c35SEd Tanous
3182897c35SEd Tanous class CryptoEraseTest : public testing::Test
3259dffa63SJohn Edward Broadbent {
3359dffa63SJohn Edward Broadbent public:
3459dffa63SJohn Edward Broadbent std::ofstream testFile;
3559dffa63SJohn Edward Broadbent
SetUp()3659dffa63SJohn Edward Broadbent void SetUp() override
3759dffa63SJohn Edward Broadbent {
3859dffa63SJohn Edward Broadbent /* Create an empty file that we'll pretend is a 'storage device'. */
39ba000b95SPatrick Williams testFile.open(testFileName,
4059dffa63SJohn Edward Broadbent std::ios::out | std::ios::binary | std::ios::trunc);
4159dffa63SJohn Edward Broadbent testFile.close();
4259dffa63SJohn Edward Broadbent if (testFile.fail())
4359dffa63SJohn Edward Broadbent {
4459dffa63SJohn Edward Broadbent throw std::runtime_error("Failed to open test file");
4559dffa63SJohn Edward Broadbent }
4659dffa63SJohn Edward Broadbent testFile.close();
4759dffa63SJohn Edward Broadbent }
4859dffa63SJohn Edward Broadbent };
4959dffa63SJohn Edward Broadbent
TEST_F(CryptoEraseTest,EraseCryptPass)5082897c35SEd Tanous TEST_F(CryptoEraseTest, EraseCryptPass)
5159dffa63SJohn Edward Broadbent {
5259dffa63SJohn Edward Broadbent std::unique_ptr<MockCryptsetupInterface> mockCryptIface =
5359dffa63SJohn Edward Broadbent std::make_unique<MockCryptsetupInterface>();
5459dffa63SJohn Edward Broadbent
5559dffa63SJohn Edward Broadbent EXPECT_CALL(*mockCryptIface, cryptLoad(_, StrEq(CRYPT_LUKS2), nullptr))
5659dffa63SJohn Edward Broadbent .WillOnce(Return(0));
5759dffa63SJohn Edward Broadbent
5859dffa63SJohn Edward Broadbent EXPECT_CALL(*mockCryptIface, cryptKeySlotMax(StrEq(CRYPT_LUKS2)))
5959dffa63SJohn Edward Broadbent .WillOnce(Return(1));
6059dffa63SJohn Edward Broadbent
6159dffa63SJohn Edward Broadbent EXPECT_CALL(*mockCryptIface, cryptKeySlotStatus(_, 0))
6259dffa63SJohn Edward Broadbent .WillOnce(Return(CRYPT_SLOT_ACTIVE_LAST));
6359dffa63SJohn Edward Broadbent
6459dffa63SJohn Edward Broadbent EXPECT_CALL(*mockCryptIface, cryptKeyslotDestroy(_, 0)).Times(1);
6559dffa63SJohn Edward Broadbent
66*15b63e12SPatrick Williams CryptErase myCryptErase =
67*15b63e12SPatrick Williams CryptErase(testFileName, std::move(mockCryptIface));
6859dffa63SJohn Edward Broadbent EXPECT_NO_THROW(myCryptErase.doErase());
6959dffa63SJohn Edward Broadbent }
7059dffa63SJohn Edward Broadbent
TEST_F(CryptoEraseTest,EraseCrypMaxSlotFails)7182897c35SEd Tanous TEST_F(CryptoEraseTest, EraseCrypMaxSlotFails)
7259dffa63SJohn Edward Broadbent {
7359dffa63SJohn Edward Broadbent std::unique_ptr<MockCryptsetupInterface> mockCryptIface =
7459dffa63SJohn Edward Broadbent std::make_unique<MockCryptsetupInterface>();
7559dffa63SJohn Edward Broadbent
7659dffa63SJohn Edward Broadbent EXPECT_CALL(*mockCryptIface, cryptLoad(_, StrEq(CRYPT_LUKS2), nullptr))
7759dffa63SJohn Edward Broadbent .WillOnce(Return(0));
7859dffa63SJohn Edward Broadbent
7959dffa63SJohn Edward Broadbent EXPECT_CALL(*mockCryptIface, cryptKeySlotMax(StrEq(CRYPT_LUKS2)))
8059dffa63SJohn Edward Broadbent .WillOnce(Return(-1));
8159dffa63SJohn Edward Broadbent
82*15b63e12SPatrick Williams CryptErase myCryptErase =
83*15b63e12SPatrick Williams CryptErase(testFileName, std::move(mockCryptIface));
8459dffa63SJohn Edward Broadbent EXPECT_THROW(myCryptErase.doErase(), ResourceNotFound);
8559dffa63SJohn Edward Broadbent }
8659dffa63SJohn Edward Broadbent
TEST_F(CryptoEraseTest,EraseCrypMaxSlotZero)8782897c35SEd Tanous TEST_F(CryptoEraseTest, EraseCrypMaxSlotZero)
8859dffa63SJohn Edward Broadbent {
8959dffa63SJohn Edward Broadbent std::unique_ptr<MockCryptsetupInterface> mockCryptIface =
9059dffa63SJohn Edward Broadbent std::make_unique<MockCryptsetupInterface>();
9159dffa63SJohn Edward Broadbent
9259dffa63SJohn Edward Broadbent EXPECT_CALL(*mockCryptIface, cryptLoad(_, StrEq(CRYPT_LUKS2), nullptr))
9359dffa63SJohn Edward Broadbent .WillOnce(Return(0));
9459dffa63SJohn Edward Broadbent
9559dffa63SJohn Edward Broadbent EXPECT_CALL(*mockCryptIface, cryptKeySlotMax(StrEq(CRYPT_LUKS2)))
9659dffa63SJohn Edward Broadbent .WillOnce(Return(0));
9759dffa63SJohn Edward Broadbent
98*15b63e12SPatrick Williams CryptErase myCryptErase =
99*15b63e12SPatrick Williams CryptErase(testFileName, std::move(mockCryptIface));
10059dffa63SJohn Edward Broadbent EXPECT_THROW(myCryptErase.doErase(), ResourceNotFound);
10159dffa63SJohn Edward Broadbent }
10259dffa63SJohn Edward Broadbent
TEST_F(CryptoEraseTest,EraseCrypOnlyInvalid)10382897c35SEd Tanous TEST_F(CryptoEraseTest, EraseCrypOnlyInvalid)
10459dffa63SJohn Edward Broadbent {
10559dffa63SJohn Edward Broadbent std::unique_ptr<MockCryptsetupInterface> mockCryptIface =
10659dffa63SJohn Edward Broadbent std::make_unique<MockCryptsetupInterface>();
10759dffa63SJohn Edward Broadbent
10859dffa63SJohn Edward Broadbent EXPECT_CALL(*mockCryptIface, cryptLoad(_, StrEq(CRYPT_LUKS2), nullptr))
10959dffa63SJohn Edward Broadbent .WillOnce(Return(0));
11059dffa63SJohn Edward Broadbent
11159dffa63SJohn Edward Broadbent EXPECT_CALL(*mockCryptIface, cryptKeySlotMax(StrEq(CRYPT_LUKS2)))
11259dffa63SJohn Edward Broadbent .WillOnce(Return(32));
11359dffa63SJohn Edward Broadbent
11459dffa63SJohn Edward Broadbent EXPECT_CALL(*mockCryptIface, cryptKeySlotStatus(_, _))
11559dffa63SJohn Edward Broadbent .WillRepeatedly(Return(CRYPT_SLOT_INVALID));
11659dffa63SJohn Edward Broadbent
117*15b63e12SPatrick Williams CryptErase myCryptErase =
118*15b63e12SPatrick Williams CryptErase(testFileName, std::move(mockCryptIface));
11959dffa63SJohn Edward Broadbent EXPECT_NO_THROW(myCryptErase.doErase());
12059dffa63SJohn Edward Broadbent }
12159dffa63SJohn Edward Broadbent
TEST_F(CryptoEraseTest,EraseCrypDestoryFails)12282897c35SEd Tanous TEST_F(CryptoEraseTest, EraseCrypDestoryFails)
12359dffa63SJohn Edward Broadbent {
12459dffa63SJohn Edward Broadbent std::unique_ptr<MockCryptsetupInterface> mockCryptIface =
12559dffa63SJohn Edward Broadbent std::make_unique<MockCryptsetupInterface>();
12659dffa63SJohn Edward Broadbent
12759dffa63SJohn Edward Broadbent EXPECT_CALL(*mockCryptIface, cryptLoad(_, StrEq(CRYPT_LUKS2), nullptr))
12859dffa63SJohn Edward Broadbent .WillOnce(Return(0));
12959dffa63SJohn Edward Broadbent
13059dffa63SJohn Edward Broadbent EXPECT_CALL(*mockCryptIface, cryptKeySlotMax(StrEq(CRYPT_LUKS2)))
13159dffa63SJohn Edward Broadbent .WillOnce(Return(1));
13259dffa63SJohn Edward Broadbent
13359dffa63SJohn Edward Broadbent EXPECT_CALL(*mockCryptIface, cryptKeySlotStatus(_, 0))
13459dffa63SJohn Edward Broadbent .WillOnce(Return(CRYPT_SLOT_ACTIVE));
13559dffa63SJohn Edward Broadbent
13659dffa63SJohn Edward Broadbent EXPECT_CALL(*mockCryptIface, cryptKeyslotDestroy(_, 0))
13759dffa63SJohn Edward Broadbent .WillOnce(Return(-1));
13859dffa63SJohn Edward Broadbent
139*15b63e12SPatrick Williams CryptErase myCryptErase =
140*15b63e12SPatrick Williams CryptErase(testFileName, std::move(mockCryptIface));
14159dffa63SJohn Edward Broadbent EXPECT_THROW(myCryptErase.doErase(), InternalFailure);
14259dffa63SJohn Edward Broadbent }
14359dffa63SJohn Edward Broadbent
14459dffa63SJohn Edward Broadbent } // namespace estoraged_test
145