blob: 14d8b2871b1ba9b652b036aa3eedae6ed21ba4a3 [file] [log] [blame]
// 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 "typecd/cros_ec_util.h"
#include <string>
#include <dbus/mock_bus.h>
#include <dbus/mock_object_proxy.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
using testing::_;
using testing::Invoke;
namespace {
constexpr char kDebugdServiceName[] = "org.chromium.debugd";
constexpr char kDebugdServicePath[] = "/org/chromium/debugd";
// Some sample inputs to feed into the mode entry checker.
const char kSampleInventoryInput1[] = "10 : Thermal management support";
const char kSampleInventoryInput2[] =
"asdfas98790823845(*)*&$*)@*!@#&*_)$!$_)&!asdf`1`32`123--__&&@_@&_$\n"
"90900-w3e0--0-z.xc,.x l\nsadflkjas;diojfapsodf0909sdad09f90sd0f9808093";
const char kSampleInventoryInput3[] =
"33 : 64-bit host events support\n"
"34 : Execute code in RAM support\n"
"35 : Consumer Electronics Control support\n"
"36 : Tight timestamp for sensors events support\n"
"37 : Refined tablet mode hysteresis support\n"
"38 : Early Firmware Selection v2 support\n"
"41 : TCPMv2 Type-C commands support\n"
"42 : Host-controlled Type-C mode entry\n"
"43 : Unknown feature\n";
const char kSampleInventoryInput4[] = "";
// The following helper functions have been borrowed from:
// src/platform2/authpolicy/authpolicy_test.cc
//
// Creates a D-Bus response with the given |response_str| as message.
std::unique_ptr<dbus::Response> RespondWithString(
dbus::MethodCall* method_call, const std::string& response_str) {
// Set an arbitrary serial number.
method_call->SetSerial(123);
std::unique_ptr<dbus::Response> response =
dbus::Response::FromMethodCall(method_call);
dbus::MessageWriter writer(response.get());
writer.AppendString(response_str);
return response;
}
// Matcher for D-Bus method names to be used in CallMethod*().
MATCHER_P(IsMethod, method_name, "") {
return arg->GetMember() == method_name;
}
} // namespace
namespace typecd {
class CrosECUtilTest : public ::testing::Test {};
// Test the mode entry parsing for various return strings of
// EcGetInventory.
TEST_F(CrosECUtilTest, ModeEntrySupported) {
dbus::Bus::Options options;
options.bus_type = dbus::Bus::SYSTEM;
scoped_refptr<dbus::MockBus> bus = new dbus::MockBus(options);
scoped_refptr<dbus::MockObjectProxy> mock_object_proxy =
new dbus::MockObjectProxy(bus.get(), kDebugdServiceName,
dbus::ObjectPath(kDebugdServicePath));
// Mock the GetObjectProxy for the |bus|.
EXPECT_CALL(*bus, GetObjectProxy(kDebugdServiceName,
dbus::ObjectPath(kDebugdServicePath)))
.WillOnce(testing::Return(mock_object_proxy.get()));
// Mock the method calls from the object proxy.
EXPECT_CALL(*mock_object_proxy, CallMethodAndBlockWithErrorDetails(
IsMethod("EcGetInventory"), _, _))
.WillOnce(Invoke([](dbus::MethodCall* method_call, int timeout,
dbus::ScopedDBusError* error) {
return RespondWithString(method_call, kSampleInventoryInput1);
}))
.WillOnce(Invoke([](dbus::MethodCall* method_call, int timeout,
dbus::ScopedDBusError* error) {
return RespondWithString(method_call, kSampleInventoryInput2);
}))
.WillOnce(Invoke([](dbus::MethodCall* method_call, int timeout,
dbus::ScopedDBusError* error) {
return RespondWithString(method_call, kSampleInventoryInput3);
}))
.WillOnce(Invoke([](dbus::MethodCall* method_call, int timeout,
dbus::ScopedDBusError* error) {
return RespondWithString(method_call, kSampleInventoryInput4);
}));
auto util = std::make_unique<CrosECUtil>(bus);
EXPECT_FALSE(util->ModeEntrySupported());
EXPECT_FALSE(util->ModeEntrySupported());
EXPECT_TRUE(util->ModeEntrySupported());
EXPECT_FALSE(util->ModeEntrySupported());
}
} // namespace typecd