blob: 988e8da7a444b6b60756961f5a574824f8413854 [file] [log] [blame]
// Copyright 2022 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <algorithm>
#include <array>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <base/test/task_environment.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "libec/ec_command.h"
#include "libec/rgb_keyboard_command.h"
namespace ec {
namespace {
using ::testing::Return;
TEST(RgbkbdSetColorCommand, HeaderSize) {
EXPECT_EQ(sizeof(rgb_keyboard::Header), sizeof(ec_params_rgbkbd_set_color));
}
TEST(RgbkbdSetColorCommand, RgbkbdSetColorCommandSingle) {
const std::vector<struct rgb_s> expected = {
{.r = 0xaa, .g = 0xbb, .b = 0xcc},
};
uint8_t start_key = 0xdd;
RgbkbdSetColorCommand cmd(start_key, expected);
EXPECT_EQ(cmd.Command(), EC_CMD_RGBKBD_SET_COLOR);
EXPECT_GE(cmd.Version(), 0);
EXPECT_EQ(cmd.Req()->req.start_key, start_key);
EXPECT_EQ(cmd.Req()->req.length, expected.size());
EXPECT_EQ(cmd.Req()->color[0].r, expected[0].r);
EXPECT_EQ(cmd.Req()->color[0].g, expected[0].g);
EXPECT_EQ(cmd.Req()->color[0].b, expected[0].b);
}
TEST(RgbkbdSetColorCommand, RgbkbdSetColorCommandMultiple) {
std::vector<struct rgb_s> color;
std::array<struct rgb_s, 128> expected;
uint8_t start_key = 0;
for (int i = 0; i < expected.size(); i++) {
expected[i].r = std::rand() & 0xff;
expected[i].g = std::rand() & 0xff;
expected[i].b = std::rand() & 0xff;
}
std::copy(expected.begin(), expected.end(), std::back_inserter(color));
RgbkbdSetColorCommand cmd(start_key, color);
EXPECT_EQ(cmd.Command(), EC_CMD_RGBKBD_SET_COLOR);
EXPECT_GE(cmd.Version(), 0);
EXPECT_EQ(cmd.Req()->req.start_key, start_key);
EXPECT_EQ(cmd.Req()->req.length, expected.size());
EXPECT_EQ(std::memcmp(&cmd.Req()->color[0], &expected[0],
expected.size() * sizeof(expected[0])),
0);
}
TEST(RgbkbdCommand, RgbkbdClearCommand) {
struct rgb_s color;
color.r = 0x0a;
color.g = 0x0b;
color.b = 0x0c;
auto cmd = RgbkbdCommand::Create(EC_RGBKBD_SUBCMD_CLEAR, color);
EXPECT_TRUE(cmd);
EXPECT_EQ(cmd->Command(), EC_CMD_RGBKBD);
EXPECT_EQ(cmd->Version(), 0);
EXPECT_EQ(cmd->Req()->subcmd, EC_RGBKBD_SUBCMD_CLEAR);
EXPECT_EQ(cmd->Req()->color.r, color.r);
EXPECT_EQ(cmd->Req()->color.g, color.g);
EXPECT_EQ(cmd->Req()->color.b, color.b);
cmd = RgbkbdCommand::Create(EC_RGBKBD_SUBCMD_COUNT, color);
EXPECT_FALSE(cmd);
}
TEST(RgbkbdCommand, RgbkbdGetConfigCommand) {
auto cmd = RgbkbdCommand::Create(EC_RGBKBD_SUBCMD_GET_CONFIG);
EXPECT_TRUE(cmd);
EXPECT_EQ(cmd->Command(), EC_CMD_RGBKBD);
EXPECT_EQ(cmd->Version(), 0);
EXPECT_EQ(cmd->Req()->subcmd, EC_RGBKBD_SUBCMD_GET_CONFIG);
}
// Mock the underlying EcCommand to test.
class RgbkbdCommandTest : public testing::Test {
public:
class MockRgbkbdCommand : public RgbkbdCommand {
public:
using RgbkbdCommand::RgbkbdCommand;
MOCK_METHOD(struct ec_response_rgbkbd*, Resp, (), (const, override));
};
};
TEST_F(RgbkbdCommandTest, RgbkbdGetConfigResponse) {
auto mock_cmd =
RgbkbdCommand::Create<MockRgbkbdCommand>(EC_RGBKBD_SUBCMD_GET_CONFIG);
struct ec_response_rgbkbd response = {.rgbkbd_type = 2};
EXPECT_CALL(*mock_cmd, Resp).WillRepeatedly(Return(&response));
EXPECT_EQ(mock_cmd->GetConfig(), 2);
}
} // namespace
} // namespace ec