blob: 11bcfeff56d370c4f7d35c76b7252a0e9e3317ee [file] [log] [blame]
// Copyright 2023 The Fuchsia 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 "src/devices/power/drivers/fusb302/usb-pd-message-objects.h"
#include <cstdint>
#include <zxtest/zxtest.h>
namespace usb_pd {
namespace {
static_assert(std::is_trivially_destructible_v<PowerData>);
static_assert(std::is_trivially_destructible_v<FixedPowerSupplyData>);
static_assert(std::is_trivially_destructible_v<VariablePowerSupplyData>);
static_assert(std::is_trivially_destructible_v<BatteryPowerSupplyData>);
static_assert(std::is_trivially_destructible_v<PowerRequestData>);
static_assert(std::is_trivially_destructible_v<FixedVariableSupplyPowerRequestData>);
static_assert(std::is_trivially_destructible_v<BatteryPowerRequestData>);
TEST(FixedPowerSupplyDataTest, VoltageMv) {
{
FixedPowerSupplyData fixed_power_supply;
fixed_power_supply.set_voltage_mv(50);
EXPECT_EQ(1, fixed_power_supply.voltage_50mv());
EXPECT_EQ(50, fixed_power_supply.voltage_mv());
}
{
FixedPowerSupplyData fixed_power_supply;
fixed_power_supply.set_voltage_mv(51'150);
EXPECT_EQ(1'023, fixed_power_supply.voltage_50mv());
EXPECT_EQ(51'150, fixed_power_supply.voltage_mv());
}
}
TEST(FixedPowerSupplyDataTest, MaximumCurrentMa) {
{
FixedPowerSupplyData fixed_power_supply;
fixed_power_supply.set_maximum_current_ma(10);
EXPECT_EQ(1, fixed_power_supply.maximum_current_10ma());
EXPECT_EQ(10, fixed_power_supply.maximum_current_ma());
}
{
FixedPowerSupplyData fixed_power_supply;
fixed_power_supply.set_maximum_current_ma(10'230);
EXPECT_EQ(1'023, fixed_power_supply.maximum_current_10ma());
EXPECT_EQ(10'230, fixed_power_supply.maximum_current_ma());
}
}
TEST(FixedPowerSupplyDataTest, LaptopPowerSupply) {
PowerData power_data1(0x0b01912c);
ASSERT_EQ(PowerSupplyType::kFixedSupply, power_data1.supply_type());
FixedPowerSupplyData fixed_power_data1(power_data1);
EXPECT_EQ(5'000, fixed_power_data1.voltage_mv());
EXPECT_EQ(3'000, fixed_power_data1.maximum_current_ma());
EXPECT_EQ(PeakCurrentSupport::kNoOverload, fixed_power_data1.peak_current());
EXPECT_FALSE(fixed_power_data1.supports_dual_role_power());
EXPECT_FALSE(fixed_power_data1.requires_usb_suspend());
EXPECT_TRUE(fixed_power_data1.has_unconstrained_power());
EXPECT_FALSE(fixed_power_data1.supports_usb_communications());
EXPECT_TRUE(fixed_power_data1.supports_dual_role_data());
EXPECT_TRUE(fixed_power_data1.supports_unchunked_extended_messages());
EXPECT_FALSE(fixed_power_data1.supports_extended_power_range());
PowerData power_data2(0x00002d12c);
ASSERT_EQ(PowerSupplyType::kFixedSupply, power_data2.supply_type());
FixedPowerSupplyData fixed_power_data2(power_data2);
EXPECT_EQ(9'000, fixed_power_data2.voltage_mv());
EXPECT_EQ(3'000, fixed_power_data2.maximum_current_ma());
PowerData power_data3(0x0004b12c);
ASSERT_EQ(PowerSupplyType::kFixedSupply, power_data3.supply_type());
FixedPowerSupplyData fixed_power_data3(power_data3);
EXPECT_EQ(15'000, fixed_power_data3.voltage_mv());
EXPECT_EQ(3'000, fixed_power_data3.maximum_current_ma());
PowerData power_data4(0x00064145);
ASSERT_EQ(PowerSupplyType::kFixedSupply, power_data4.supply_type());
FixedPowerSupplyData fixed_power_data4(power_data4);
EXPECT_EQ(20'000, fixed_power_data4.voltage_mv());
EXPECT_EQ(3'250, fixed_power_data4.maximum_current_ma());
}
TEST(FixedPowerSupplyDataTest, FrameworkLaptopPort) {
PowerData power_data3(0x0004b12c);
ASSERT_EQ(PowerSupplyType::kFixedSupply, power_data3.supply_type());
FixedPowerSupplyData fixed_power_data1(PowerData(0x2701912c));
EXPECT_EQ(5'000, fixed_power_data1.voltage_mv());
EXPECT_EQ(3'000, fixed_power_data1.maximum_current_ma());
EXPECT_TRUE(fixed_power_data1.supports_dual_role_power());
EXPECT_FALSE(fixed_power_data1.requires_usb_suspend());
EXPECT_FALSE(fixed_power_data1.has_unconstrained_power());
EXPECT_TRUE(fixed_power_data1.supports_usb_communications());
EXPECT_TRUE(fixed_power_data1.supports_dual_role_data());
EXPECT_TRUE(fixed_power_data1.supports_unchunked_extended_messages());
EXPECT_FALSE(fixed_power_data1.supports_extended_power_range());
}
TEST(FixedPowerSupplyDataTest, AnkerModelA2377) {
// Anker 30W Nano 511 - Model A2377
PowerData power_data1(0x0a01912c);
ASSERT_EQ(PowerSupplyType::kFixedSupply, power_data1.supply_type());
FixedPowerSupplyData fixed_power_data1(power_data1);
EXPECT_EQ(5'000, fixed_power_data1.voltage_mv());
EXPECT_EQ(3'000, fixed_power_data1.maximum_current_ma());
EXPECT_EQ(PeakCurrentSupport::kNoOverload, fixed_power_data1.peak_current());
EXPECT_FALSE(fixed_power_data1.supports_dual_role_power());
EXPECT_FALSE(fixed_power_data1.requires_usb_suspend());
EXPECT_TRUE(fixed_power_data1.has_unconstrained_power());
EXPECT_FALSE(fixed_power_data1.supports_usb_communications());
EXPECT_TRUE(fixed_power_data1.supports_dual_role_data());
EXPECT_FALSE(fixed_power_data1.supports_unchunked_extended_messages());
EXPECT_FALSE(fixed_power_data1.supports_extended_power_range());
PowerData power_data2(0x00002d12c);
ASSERT_EQ(PowerSupplyType::kFixedSupply, power_data2.supply_type());
FixedPowerSupplyData fixed_power_data2(power_data2);
EXPECT_EQ(9'000, fixed_power_data2.voltage_mv());
EXPECT_EQ(3'000, fixed_power_data2.maximum_current_ma());
PowerData power_data3(0x0003c0fa);
ASSERT_EQ(PowerSupplyType::kFixedSupply, power_data3.supply_type());
FixedPowerSupplyData fixed_power_data3(power_data3);
EXPECT_EQ(12'000, fixed_power_data3.voltage_mv());
EXPECT_EQ(2'500, fixed_power_data3.maximum_current_ma());
PowerData power_data4(0x0004b0c8);
ASSERT_EQ(PowerSupplyType::kFixedSupply, power_data4.supply_type());
FixedPowerSupplyData fixed_power_data4(power_data4);
EXPECT_EQ(15'000, fixed_power_data4.voltage_mv());
EXPECT_EQ(2'000, fixed_power_data4.maximum_current_ma());
PowerData power_data5(0x00064096);
ASSERT_EQ(PowerSupplyType::kFixedSupply, power_data5.supply_type());
FixedPowerSupplyData fixed_power_data5(power_data5);
EXPECT_EQ(20'000, fixed_power_data5.voltage_mv());
EXPECT_EQ(1'500, fixed_power_data5.maximum_current_ma());
}
TEST(AugmentedPowerDataTest, AnkerModelA2377) {
PowerData power_data6(0xc8dc213c);
ASSERT_EQ(PowerSupplyType::kAugmentedPowerDataObject, power_data6.supply_type());
PowerData power_data7(0xc9402128);
ASSERT_EQ(PowerSupplyType::kAugmentedPowerDataObject, power_data7.supply_type());
}
TEST(VariablePowerSupplyDataTest, MaximumVoltageMv) {
{
VariablePowerSupplyData variable_power_supply;
variable_power_supply.set_maximum_voltage_mv(50);
EXPECT_EQ(1, variable_power_supply.maximum_voltage_50mv());
EXPECT_EQ(50, variable_power_supply.maximum_voltage_mv());
}
{
VariablePowerSupplyData variable_power_supply;
variable_power_supply.set_maximum_voltage_mv(51'150);
EXPECT_EQ(1'023, variable_power_supply.maximum_voltage_50mv());
EXPECT_EQ(51'150, variable_power_supply.maximum_voltage_mv());
}
}
TEST(VariablePowerSupplyDataTest, MinimumVoltageMv) {
{
VariablePowerSupplyData variable_power_supply;
variable_power_supply.set_minimum_voltage_mv(50);
EXPECT_EQ(1, variable_power_supply.minimum_voltage_50mv());
EXPECT_EQ(50, variable_power_supply.minimum_voltage_mv());
}
{
VariablePowerSupplyData variable_power_supply;
variable_power_supply.set_minimum_voltage_mv(51'150);
EXPECT_EQ(1'023, variable_power_supply.minimum_voltage_50mv());
EXPECT_EQ(51'150, variable_power_supply.minimum_voltage_mv());
}
}
TEST(VariablePowerSupplyDataTest, MaximumCurrentMa) {
{
VariablePowerSupplyData variable_power_supply;
variable_power_supply.set_maximum_current_ma(10);
EXPECT_EQ(1, variable_power_supply.maximum_current_10ma());
EXPECT_EQ(10, variable_power_supply.maximum_current_ma());
}
{
VariablePowerSupplyData variable_power_supply;
variable_power_supply.set_maximum_current_ma(10'230);
EXPECT_EQ(1'023, variable_power_supply.maximum_current_10ma());
EXPECT_EQ(10'230, variable_power_supply.maximum_current_ma());
}
}
TEST(BatteryPowerSupplyDataTest, MaximumVoltageMv) {
{
BatteryPowerSupplyData battery_power_supply;
battery_power_supply.set_maximum_voltage_mv(50);
EXPECT_EQ(1, battery_power_supply.maximum_voltage_50mv());
EXPECT_EQ(50, battery_power_supply.maximum_voltage_mv());
}
{
BatteryPowerSupplyData battery_power_supply;
battery_power_supply.set_maximum_voltage_mv(51'150);
EXPECT_EQ(1'023, battery_power_supply.maximum_voltage_50mv());
EXPECT_EQ(51'150, battery_power_supply.maximum_voltage_mv());
}
}
TEST(BatteryPowerSupplyDataTest, MinimumVoltageMv) {
{
BatteryPowerSupplyData battery_power_supply;
battery_power_supply.set_minimum_voltage_mv(50);
EXPECT_EQ(1, battery_power_supply.minimum_voltage_50mv());
EXPECT_EQ(50, battery_power_supply.minimum_voltage_mv());
}
{
BatteryPowerSupplyData battery_power_supply;
battery_power_supply.set_minimum_voltage_mv(51'150);
EXPECT_EQ(1'023, battery_power_supply.minimum_voltage_50mv());
EXPECT_EQ(51'150, battery_power_supply.minimum_voltage_mv());
}
}
TEST(BatteryPowerSupplyDataTest, MaximumPowerMw) {
{
BatteryPowerSupplyData battery_power_supply;
battery_power_supply.set_maximum_power_mw(250);
EXPECT_EQ(1, battery_power_supply.maximum_power_250mw());
EXPECT_EQ(250, battery_power_supply.maximum_power_mw());
}
{
BatteryPowerSupplyData battery_power_supply;
battery_power_supply.set_maximum_power_mw(255'750);
EXPECT_EQ(1'023, battery_power_supply.maximum_power_250mw());
EXPECT_EQ(255'750, battery_power_supply.maximum_power_mw());
}
}
TEST(SinkFixedPowerSupplyDataTest, VoltageMv) {
{
SinkFixedPowerSupplyData fixed_power_supply;
fixed_power_supply.set_voltage_mv(50);
EXPECT_EQ(1, fixed_power_supply.voltage_50mv());
EXPECT_EQ(50, fixed_power_supply.voltage_mv());
}
{
SinkFixedPowerSupplyData fixed_power_supply;
fixed_power_supply.set_voltage_mv(51'150);
EXPECT_EQ(1'023, fixed_power_supply.voltage_50mv());
EXPECT_EQ(51'150, fixed_power_supply.voltage_mv());
}
}
TEST(SinkFixedPowerSupplyDataTest, MaximumCurrentMa) {
{
SinkFixedPowerSupplyData fixed_power_supply;
fixed_power_supply.set_maximum_current_ma(10);
EXPECT_EQ(1, fixed_power_supply.maximum_current_10ma());
EXPECT_EQ(10, fixed_power_supply.maximum_current_ma());
}
{
SinkFixedPowerSupplyData fixed_power_supply;
fixed_power_supply.set_maximum_current_ma(10'230);
EXPECT_EQ(1'023, fixed_power_supply.maximum_current_10ma());
EXPECT_EQ(10'230, fixed_power_supply.maximum_current_ma());
}
}
TEST(FixedVariableSupplyPowerRequestDataTest, CreateForPosition) {
FixedVariableSupplyPowerRequestData request_data1 =
FixedVariableSupplyPowerRequestData::CreateForPosition(1);
EXPECT_EQ(1, request_data1.related_power_data_object_position());
FixedVariableSupplyPowerRequestData request_data7 =
FixedVariableSupplyPowerRequestData::CreateForPosition(7);
EXPECT_EQ(7, request_data7.related_power_data_object_position());
}
TEST(FixedVariableSupplyPowerRequestDataTest, OperatingCurrentMa) {
{
FixedVariableSupplyPowerRequestData request_data =
FixedVariableSupplyPowerRequestData::CreateForPosition(1);
request_data.set_operating_current_ma(10);
EXPECT_EQ(1, request_data.operating_current_10ma());
EXPECT_EQ(10, request_data.operating_current_ma());
}
{
FixedVariableSupplyPowerRequestData request_data =
FixedVariableSupplyPowerRequestData::CreateForPosition(1);
request_data.set_operating_current_ma(10'230);
EXPECT_EQ(1'023, request_data.operating_current_10ma());
EXPECT_EQ(10'230, request_data.operating_current_ma());
}
}
TEST(FixedVariableSupplyPowerRequestDataTest, LimitCurrentMa) {
{
FixedVariableSupplyPowerRequestData request_data =
FixedVariableSupplyPowerRequestData::CreateForPosition(1);
request_data.set_limit_current_ma(10);
EXPECT_EQ(1, request_data.limit_current_10ma());
EXPECT_EQ(10, request_data.limit_current_ma());
}
{
FixedVariableSupplyPowerRequestData request_data =
FixedVariableSupplyPowerRequestData::CreateForPosition(1);
request_data.set_limit_current_ma(10'230);
EXPECT_EQ(1'023, request_data.limit_current_10ma());
EXPECT_EQ(10'230, request_data.limit_current_ma());
}
}
TEST(FixedVariableSupplyPowerRequestDataTest, PixelPhoneToLaptopPort) {
FixedVariableSupplyPowerRequestData request_data(0x1304b12c);
EXPECT_EQ(3'000, request_data.operating_current_ma());
EXPECT_EQ(3'000, request_data.limit_current_ma());
EXPECT_EQ(1u, request_data.related_power_data_object_position());
EXPECT_EQ(false, request_data.supports_power_give_back());
EXPECT_EQ(false, request_data.capability_mismatch());
EXPECT_EQ(true, request_data.supports_usb_communications());
EXPECT_EQ(true, request_data.prefers_waiving_usb_suspend());
EXPECT_EQ(false, request_data.supports_unchunked_extended_messages());
EXPECT_EQ(false, request_data.supports_extended_power_range());
}
TEST(BatteryPowerRequestDataTest, OperatingPowerMw) {
{
BatteryPowerRequestData request_data = BatteryPowerRequestData::CreateForPosition(1);
request_data.set_operating_power_mw(250);
EXPECT_EQ(1, request_data.operating_power_250mw());
EXPECT_EQ(250, request_data.operating_power_mw());
}
{
BatteryPowerRequestData request_data = BatteryPowerRequestData::CreateForPosition(1);
request_data.set_operating_power_mw(255'750);
EXPECT_EQ(1'023, request_data.operating_power_250mw());
EXPECT_EQ(255'750, request_data.operating_power_mw());
}
}
TEST(BatteryPowerRequestDataTest, LimitPowerMw) {
{
BatteryPowerRequestData request_data = BatteryPowerRequestData::CreateForPosition(1);
request_data.set_limit_power_mw(250);
EXPECT_EQ(1, request_data.limit_power_250mw());
EXPECT_EQ(250, request_data.limit_power_mw());
}
{
BatteryPowerRequestData request_data = BatteryPowerRequestData::CreateForPosition(1);
request_data.set_limit_power_mw(255'750);
EXPECT_EQ(1'023, request_data.limit_power_250mw());
EXPECT_EQ(255'750, request_data.limit_power_mw());
}
}
} // namespace
} // namespace usb_pd