| // Copyright 2023 The ChromiumOS Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "libec/rollback_info_command.h" |
| |
| #include <memory> |
| #include <utility> |
| |
| #include <gmock/gmock.h> |
| #include <gtest/gtest.h> |
| |
| namespace ec { |
| namespace { |
| |
| using ::testing::Return; |
| |
| TEST(RollbackInfoCommand, RollbackInfoCommand) { |
| RollbackInfoCommand cmd_v0(0); |
| EXPECT_EQ(cmd_v0.Version(), 0); |
| EXPECT_EQ(cmd_v0.GetVersion(), 0); |
| EXPECT_EQ(cmd_v0.Command(), EC_CMD_ROLLBACK_INFO); |
| |
| RollbackInfoCommand cmd_v1(1); |
| EXPECT_EQ(cmd_v1.Version(), 1); |
| EXPECT_EQ(cmd_v1.GetVersion(), 1); |
| EXPECT_EQ(cmd_v1.Command(), EC_CMD_ROLLBACK_INFO); |
| } |
| |
| // Mock the underlying EcCommand to test. |
| class RollbackInfoCommandTest : public testing::Test { |
| public: |
| class MockRollbackInfoCommand_v0 : public RollbackInfoCommand_v0 { |
| public: |
| using RollbackInfoCommand_v0::RollbackInfoCommand_v0; |
| MOCK_METHOD(const struct ec_response_rollback_info*, |
| Resp, |
| (), |
| (const, override)); |
| }; |
| |
| class MockRollbackInfoCommand_v1 : public RollbackInfoCommand_v1 { |
| public: |
| using RollbackInfoCommand_v1::RollbackInfoCommand_v1; |
| MOCK_METHOD(const struct ec_response_rollback_info_v1*, |
| Resp, |
| (), |
| (const, override)); |
| }; |
| }; |
| |
| TEST_F(RollbackInfoCommandTest, Success_v0) { |
| auto mock_v0 = std::make_unique<MockRollbackInfoCommand_v0>(); |
| struct ec_response_rollback_info response = { |
| .id = 3, |
| .rollback_min_version = 2, |
| .rw_rollback_version = 1, |
| }; |
| EXPECT_CALL(*mock_v0, Resp).WillRepeatedly(Return(&response)); |
| |
| RollbackInfoCommand mock_command(0, std::move(mock_v0), nullptr); |
| |
| EXPECT_EQ(mock_command.ID(), 3); |
| EXPECT_EQ(mock_command.MinVersion(), 2); |
| EXPECT_EQ(mock_command.RWVersion(), 1); |
| EXPECT_FALSE(mock_command.IsSecretInited().has_value()); |
| } |
| |
| TEST_F(RollbackInfoCommandTest, Success_v1) { |
| auto mock_v1 = std::make_unique<MockRollbackInfoCommand_v1>(); |
| struct ec_response_rollback_info_v1 response = { |
| .id = 4, |
| .rollback_min_version = 3, |
| .rw_rollback_version = 2, |
| .is_secret_inited = 1, |
| }; |
| EXPECT_CALL(*mock_v1, Resp).WillRepeatedly(Return(&response)); |
| |
| RollbackInfoCommand mock_command(1, nullptr, std::move(mock_v1)); |
| |
| EXPECT_EQ(mock_command.ID(), 4); |
| EXPECT_EQ(mock_command.MinVersion(), 3); |
| EXPECT_EQ(mock_command.RWVersion(), 2); |
| ASSERT_TRUE(mock_command.IsSecretInited().has_value()); |
| EXPECT_TRUE(mock_command.IsSecretInited().value()); |
| } |
| |
| } // namespace |
| } // namespace ec |