| // Copyright 2020 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <gmock/gmock.h> |
| #include <gtest/gtest.h> |
| |
| #include "libec/versions_command.h" |
| |
| namespace ec { |
| namespace { |
| |
| using ::testing::Return; |
| |
| TEST(VersionsCommand, VersionsCommand) { |
| VersionsCommand cmd(EC_CMD_FP_CONTEXT); |
| EXPECT_EQ(cmd.Version(), 1); |
| EXPECT_EQ(cmd.Command(), EC_CMD_GET_CMD_VERSIONS); |
| EXPECT_EQ(cmd.CommandCode(), EC_CMD_FP_CONTEXT); |
| } |
| |
| // Mock the underlying EcCommand to test |
| class VersionsCommandTest : public testing::Test { |
| public: |
| class MockVersionsCommand : public VersionsCommand { |
| public: |
| using VersionsCommand::VersionsCommand; |
| MOCK_METHOD(bool, Run, (int fd), (override)); |
| MOCK_METHOD(struct ec_response_get_cmd_versions*, Resp, (), (override)); |
| MOCK_METHOD(uint32_t, Result, (), (const, override)); |
| }; |
| }; |
| |
| TEST_F(VersionsCommandTest, Unknown) { |
| VersionsCommand cmd(EC_CMD_FP_CONTEXT); |
| // The command has not been run, so we don't know the status. |
| EXPECT_EQ(cmd.IsVersionSupported(1), EcCmdVersionSupportStatus::UNKNOWN); |
| } |
| |
| TEST_F(VersionsCommandTest, CommandNotFound) { |
| MockVersionsCommand mock_command(EC_CMD_FP_CONTEXT); |
| EXPECT_CALL(mock_command, Result) |
| .WillRepeatedly(Return(EC_RES_INVALID_COMMAND)); |
| |
| EXPECT_EQ(mock_command.IsVersionSupported(1), |
| EcCmdVersionSupportStatus::UNSUPPORTED); |
| } |
| |
| TEST_F(VersionsCommandTest, CommandNotSupported) { |
| MockVersionsCommand mock_command(EC_CMD_FP_CONTEXT); |
| EXPECT_CALL(mock_command, Result).WillRepeatedly(Return(EC_RES_SUCCESS)); |
| constexpr int kVersionZero = 0; |
| constexpr int kVersionOne = 1; |
| struct ec_response_get_cmd_versions response = {.version_mask = |
| 1 << kVersionZero}; |
| EXPECT_CALL(mock_command, Resp).WillOnce(Return(&response)); |
| |
| EXPECT_EQ(mock_command.IsVersionSupported(kVersionOne), |
| EcCmdVersionSupportStatus::UNSUPPORTED); |
| } |
| |
| TEST_F(VersionsCommandTest, CommandSupported) { |
| MockVersionsCommand mock_command(EC_CMD_FP_CONTEXT); |
| EXPECT_CALL(mock_command, Result).WillRepeatedly(Return(EC_RES_SUCCESS)); |
| constexpr int kVersionOne = 1; |
| struct ec_response_get_cmd_versions response = {.version_mask = |
| 1 << kVersionOne}; |
| EXPECT_CALL(mock_command, Resp).WillOnce(Return(&response)); |
| |
| EXPECT_EQ(mock_command.IsVersionSupported(kVersionOne), |
| EcCmdVersionSupportStatus::SUPPORTED); |
| } |
| |
| TEST_F(VersionsCommandTest, InvalidParamShouldNotBeRetried) { |
| MockVersionsCommand mock_command(EC_CMD_FP_CONTEXT); |
| |
| // We should only run the command once even though we specify retries, |
| // since this type of failure cannot be retried. |
| EXPECT_CALL(mock_command, Run).WillOnce(Return(false)); |
| EXPECT_CALL(mock_command, Result).WillOnce(Return(EC_RES_INVALID_PARAM)); |
| |
| constexpr int kTestFd = -1; |
| constexpr int kNumAttempts = 2; |
| EXPECT_FALSE(mock_command.RunWithMultipleAttempts(kTestFd, kNumAttempts)); |
| } |
| |
| } // namespace |
| } // namespace ec |