blob: 82fb87001b00d46af428a4b3871bc3dcc56e153f [file] [log] [blame]
// Copyright 2024 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "biod/biod_feature.h"
#include <memory>
#include <string>
#include <utility>
#include <base/test/task_environment.h>
#include <chromeos/dbus/service_constants.h>
#include <dbus/message.h>
#include <dbus/mock_bus.h>
#include <dbus/mock_object_proxy.h>
#include <dbus/object_path.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "biod/mock_session_state_manager.h"
#include "biod/updater/firmware_selector.h"
#include "featured/fake_platform_features.h"
namespace biod {
using testing::_;
using testing::A;
using testing::Return;
MATCHER_P(IsMember, name, "") {
if (arg->GetMember() != name) {
*result_listener << "has member " << arg->GetMember();
return false;
}
return true;
}
class MockFirmwareSelector : public updater::FirmwareSelectorInterface {
public:
MOCK_METHOD(bool, IsBetaFirmwareAllowed, (), (const, override));
MOCK_METHOD(void, AllowBetaFirmware, (bool enable), (override));
MOCK_METHOD((base::expected<base::FilePath, FindFirmwareFileStatus>),
FindFirmwareFile,
(const std::string& board_name),
(override));
};
class BiodFeatureTest : public testing::Test {
public:
BiodFeatureTest() {
dbus::Bus::Options options;
options.bus_type = dbus::Bus::SYSTEM;
bus_ = new dbus::MockBus(std::move(options));
proxy_ = new dbus::MockObjectProxy(
bus_.get(), power_manager::kPowerManagerServiceName,
dbus::ObjectPath(power_manager::kPowerManagerServicePath));
session_manager_ = std::make_unique<MockSessionStateManager>();
EXPECT_CALL(*bus_,
GetObjectProxy(power_manager::kPowerManagerServiceName, _))
.WillRepeatedly(Return(proxy_.get()));
EXPECT_CALL(*bus_, GetOriginTaskRunner())
.WillRepeatedly(
Return(base::SequencedTaskRunner::GetCurrentDefault().get()));
}
protected:
base::test::SingleThreadTaskEnvironment task_environment_{
base::test::TaskEnvironment::TimeSource::MOCK_TIME};
scoped_refptr<dbus::MockBus> bus_;
scoped_refptr<dbus::MockObjectProxy> proxy_;
std::unique_ptr<MockSessionStateManager> session_manager_;
};
TEST_F(BiodFeatureTest, TestFirmwareDefaultProductionFirmwareSelected) {
feature::FakePlatformFeatures features(bus_);
auto selector = std::make_unique<MockFirmwareSelector>();
EXPECT_CALL(*selector, IsBetaFirmwareAllowed).WillOnce(Return(false));
EXPECT_CALL(*selector, AllowBetaFirmware).Times(0);
// Make sure reboot was not requested.
EXPECT_CALL(*proxy_,
CallMethodAndBlock(IsMember(power_manager::kRequestRestartMethod),
A<int>()))
.Times(0);
BiodFeature biod_feature(bus_, session_manager_.get(), &features,
std::move(selector));
}
TEST_F(BiodFeatureTest, TestForceTransitionToProductionFirmware) {
feature::FakePlatformFeatures features(bus_);
auto selector = std::make_unique<MockFirmwareSelector>();
EXPECT_CALL(*selector, IsBetaFirmwareAllowed).WillOnce(Return(true));
EXPECT_CALL(*selector, AllowBetaFirmware(false)).Times(1);
// Make sure reboot was not requested.
EXPECT_CALL(*proxy_,
CallMethodAndBlock(IsMember(power_manager::kRequestRestartMethod),
A<int>()))
.Times(0);
BiodFeature biod_feature(bus_, session_manager_.get(), &features,
std::move(selector));
}
} // namespace biod