blob: 122a6bba50cfa1dc0e1591bfe7f01a07de2bdb8a [file] [log] [blame]
// Copyright 2020 The Chromium 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/ui/a11y/lib/util/boot_info_manager.h"
#include <fuchsia/feedback/cpp/fidl.h>
#include <fuchsia/feedback/cpp/fidl_test_base.h>
#include <lib/fidl/cpp/binding_set.h>
#include <lib/sys/cpp/testing/component_context_provider.h>
#include <future>
#include <gtest/gtest.h>
#include "src/lib/testing/loop_fixture/test_loop_fixture.h"
namespace accessibility_test {
class FakeLastRebootInfoProvider : fuchsia::feedback::testing::LastRebootInfoProvider_TestBase {
public:
FakeLastRebootInfoProvider() = default;
~FakeLastRebootInfoProvider() override = default;
void SetLastReboot(fuchsia::feedback::LastReboot last_reboot) {
last_reboot_ = std::move(last_reboot);
}
fidl::InterfaceRequestHandler<fuchsia::feedback::LastRebootInfoProvider> GetHandler(
async_dispatcher_t* dispatcher = nullptr) {
return [this,
dispatcher](fidl::InterfaceRequest<fuchsia::feedback::LastRebootInfoProvider> request) {
bindings_.AddBinding(this, std::move(request), dispatcher);
};
}
void Get(GetCallback callback) override { callback(std::move(last_reboot_)); }
void NotImplemented_(const std::string& name) override {
ADD_FAILURE() << "Unimplemented function called: " << name;
}
private:
fidl::BindingSet<fuchsia::feedback::LastRebootInfoProvider> bindings_;
fuchsia::feedback::LastReboot last_reboot_;
};
class BootInfoManagerTest : public gtest::TestLoopFixture {
public:
BootInfoManagerTest() = default;
~BootInfoManagerTest() override = default;
void SetUp() override {
gtest::TestLoopFixture::SetUp();
fake_last_reboot_info_provider_ = std::make_unique<FakeLastRebootInfoProvider>();
context_provider_.service_directory_provider()->AddService(
fake_last_reboot_info_provider_->GetHandler(dispatcher()));
RunLoopUntilIdle();
boot_info_manager_ = std::make_unique<a11y::BootInfoManager>(context_provider_.context());
RunLoopUntilIdle();
}
bool CallLastRebootWasUserInitiatedAndGetResult() {
// The BootInfoManager uses a synchronous fidl connection. In a prod
// environment, the client and server would be running in separate
// processes. However, in this test, unless we explicitly start a separate
// thread for the client call, the server's response will be blocked.
std::future<bool> result =
std::async([this]() { return boot_info_manager_->LastRebootWasUserInitiated(); });
while (result.wait_for(std::chrono::milliseconds(1)) != std::future_status::ready) {
// Run the main thread's loop, allowing the server object to respond to requests.
RunLoopUntilIdle();
}
return result.get();
}
protected:
sys::testing::ComponentContextProvider context_provider_;
std::unique_ptr<FakeLastRebootInfoProvider> fake_last_reboot_info_provider_;
std::unique_ptr<a11y::BootInfoManager> boot_info_manager_;
};
TEST_F(BootInfoManagerTest, BootInfoManagerUserInitiated) {
fuchsia::feedback::LastReboot last_reboot;
last_reboot.set_reason(fuchsia::feedback::RebootReason::USER_REQUEST);
fake_last_reboot_info_provider_->SetLastReboot(std::move(last_reboot));
EXPECT_TRUE(CallLastRebootWasUserInitiatedAndGetResult());
}
TEST_F(BootInfoManagerTest, BootInfoManagerSystemInitiated) {
fuchsia::feedback::LastReboot last_reboot;
last_reboot.set_reason(fuchsia::feedback::RebootReason::SYSTEM_UPDATE);
fake_last_reboot_info_provider_->SetLastReboot(std::move(last_reboot));
EXPECT_FALSE(CallLastRebootWasUserInitiatedAndGetResult());
}
} // namespace accessibility_test