blob: e3435629caffd10d56e8328d5bb1eb182d91c705 [file] [log] [blame] [edit]
// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "missive/dbus/dbus_test_environment.h"
#include <limits>
#include <optional>
#include <string>
#include <utility>
#include <base/functional/bind.h>
#include <base/memory/scoped_refptr.h>
#include <base/task/sequenced_task_runner.h>
#include <base/task/thread_pool.h>
#include <base/test/task_environment.h>
#include <chromeos/dbus/service_constants.h>
#include <dbus/bus.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 "missive/util/test_support_callbacks.h"
using ::testing::Invoke;
using ::testing::NiceMock;
using ::testing::Return;
namespace reporting::test {
DBusTestEnvironment::DBusTestEnvironment()
: dbus_task_runner_(base::ThreadPool::CreateSequencedTaskRunner(
{base::TaskPriority::BEST_EFFORT, base::MayBlock()})) {
test::TestEvent<scoped_refptr<NiceMock<dbus::MockBus>>> dbus_waiter;
dbus_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&DBusTestEnvironment::CreateMockDBus, dbus_waiter.cb()));
mock_bus_ = dbus_waiter.result();
EXPECT_CALL(*mock_bus_, GetDBusTaskRunner())
.WillRepeatedly(Return(dbus_task_runner_.get()));
EXPECT_CALL(*mock_bus_, GetOriginTaskRunner())
.WillRepeatedly(Return(dbus_task_runner_.get()));
// We actually want AssertOnOriginThread and AssertOnDBusThread to work
// properly (actually assert they are on dbus_thread_). If the unit tests
// end up creating calls on the wrong thread, the unit test will just hang
// anyways, and it's easier to debug if we make the program crash at that
// point. Since these are ON_CALLs, VerifyAndClearMockExpectations doesn't
// clear them.
ON_CALL(*mock_bus_, AssertOnOriginThread())
.WillByDefault(Invoke(this, &DBusTestEnvironment::AssertOnDBusThread));
ON_CALL(*mock_bus_, AssertOnDBusThread())
.WillByDefault(Invoke(this, &DBusTestEnvironment::AssertOnDBusThread));
mock_chrome_proxy_ = base::WrapRefCounted(new NiceMock<dbus::MockObjectProxy>(
mock_bus_.get(), chromeos::kChromeReportingServiceName,
dbus::ObjectPath(chromeos::kChromeReportingServicePath)));
}
scoped_refptr<::testing::NiceMock<::dbus::MockBus>>
DBusTestEnvironment::mock_bus() const {
return mock_bus_;
}
scoped_refptr<::testing::NiceMock<dbus::MockObjectProxy>>
DBusTestEnvironment::mock_chrome_proxy() const {
return mock_chrome_proxy_;
}
// static
void DBusTestEnvironment::CreateMockDBus(
base::OnceCallback<void(scoped_refptr<NiceMock<dbus::MockBus>>)> ready_cb) {
dbus::Bus::Options options;
options.bus_type = dbus::Bus::SYSTEM;
std::move(ready_cb).Run(base::WrapRefCounted<NiceMock<dbus::MockBus>>(
new NiceMock<dbus::MockBus>(options)));
}
void DBusTestEnvironment::AssertOnDBusThread() const {
ASSERT_TRUE(dbus_task_runner_->RunsTasksInCurrentSequence());
}
} // namespace reporting::test