blob: 70eb1685612f10642b99c05e75e3178c065b4d64 [file] [log] [blame]
// Copyright 2019 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 "diagnostics/common/battery_utils.h"
#include <map>
#include <memory>
#include <utility>
#include <base/message_loop/message_loop.h>
#include <base/time/time.h>
#include <dbus/message.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "power_manager/proto_bindings/power_supply_properties.pb.h"
namespace diagnostics {
using ::chromeos::cros_healthd::mojom::BatteryInfoPtr;
using ::testing::_;
bool ExtractBatteryMetrics(dbus::Response* response,
BatteryInfoPtr* output_info);
namespace {
const char kBatteryVendor[] = "TEST_MFR";
const double kBatteryVoltage = 127.45;
const int kBatteryCycleCount = 2;
const char kBatterySerialNumber[] = "1000";
const double kBatteryVoltageMinDesign = 114.00;
const double kBatteryChargeFull = 4.3;
const double kBatteryChargeFullDesign = 3.92;
// Test the expected path of extracting battery metrics from a D-bus response.
TEST(BatteryUtils, TestExtractingBatteryMetrics) {
// Create PowerSupplyProperties response protobuf.
std::unique_ptr<dbus::Response> response = dbus::Response::CreateEmpty();
dbus::MessageWriter writer(response.get());
power_manager::PowerSupplyProperties power_supply_proto;
power_supply_proto.set_battery_vendor(kBatteryVendor);
power_supply_proto.set_battery_voltage(kBatteryVoltage);
power_supply_proto.set_battery_cycle_count(kBatteryCycleCount);
power_supply_proto.set_battery_charge_full(kBatteryChargeFull);
power_supply_proto.set_battery_charge_full_design(kBatteryChargeFullDesign);
power_supply_proto.set_battery_serial_number(kBatterySerialNumber);
power_supply_proto.set_battery_voltage_min_design(kBatteryVoltageMinDesign);
writer.AppendProtoAsArrayOfBytes(power_supply_proto);
BatteryInfoPtr info;
ExtractBatteryMetrics(response.get(), &info);
ASSERT_EQ(kBatteryCycleCount, info->cycle_count);
ASSERT_EQ(kBatteryVendor, info->vendor);
ASSERT_EQ(kBatteryVoltage, info->voltage_now);
ASSERT_EQ(kBatteryChargeFull, info->charge_full);
ASSERT_EQ(kBatteryChargeFullDesign, info->charge_full_design);
ASSERT_EQ(kBatterySerialNumber, info->serial_number);
ASSERT_EQ(kBatteryVoltageMinDesign, info->voltage_min_design);
}
// Test that ExtractBatteryMetrics exits safely (returning false) when it
// receves a bad D-bus response.
TEST(BatteryUtils, TestBadDbusResponse) {
std::unique_ptr<dbus::Response> response = dbus::Response::CreateEmpty();
dbus::MessageWriter writer(response.get());
writer.AppendVariantOfBool(false);
dbus::MessageReader reader_response(response.get());
power_manager::PowerSupplyProperties power_supply_properties_proto;
ASSERT_FALSE(
reader_response.PopArrayOfBytesAsProto(&power_supply_properties_proto));
BatteryInfoPtr info;
ASSERT_FALSE(ExtractBatteryMetrics(response.get(), &info));
}
} // namespace
} // namespace diagnostics