blob: 3bfb2f4d927bac9261fe9484bd75771077bd2d8f [file] [log] [blame]
// Copyright 2019 The Fuchsia 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/bin/root_presenter/activity_notifier.h"
#include <fuchsia/ui/activity/cpp/fidl.h>
#include <fuchsia/ui/activity/cpp/fidl_test_base.h>
#include <fuchsia/ui/input/cpp/fidl.h>
#include <lib/async/time.h>
#include <lib/sys/cpp/component_context.h>
#include <lib/sys/cpp/testing/component_context_provider.h>
#include <zircon/assert.h>
#include <zircon/status.h>
#include <gtest/gtest.h>
#include "src/lib/testing/loop_fixture/test_loop_fixture.h"
namespace root_presenter {
namespace {
class FakeActivityTracker : public fuchsia::ui::activity::testing::Tracker_TestBase {
public:
void NotImplemented_(const std::string& name) final { ZX_DEBUG_ASSERT_IMPLEMENTED; }
fidl::InterfaceRequestHandler<fuchsia::ui::activity::Tracker> GetHandler(
async_dispatcher_t* dispatcher = nullptr) {
return [this, dispatcher](fidl::InterfaceRequest<fuchsia::ui::activity::Tracker> request) {
binding_.Bind(std::move(request), dispatcher);
};
}
void ReportDiscreteActivity(fuchsia::ui::activity::DiscreteActivity activity,
zx_time_t event_time,
ReportDiscreteActivityCallback callback) override {
activities_.push_back(std::move(activity));
callback();
}
const std::vector<fuchsia::ui::activity::DiscreteActivity>& activities() const {
return activities_;
}
private:
std::vector<fuchsia::ui::activity::DiscreteActivity> activities_;
fidl::Binding<fuchsia::ui::activity::Tracker> binding_{this};
};
class ActivityNotifierImplTest : public gtest::TestLoopFixture {
public:
ActivityNotifierImplTest()
: activity_notifier_(dispatcher(), ActivityNotifierImpl::kDefaultInterval,
*context_provider_.context()) {
context_provider_.service_directory_provider()->AddService(
fake_tracker_.GetHandler(dispatcher()));
}
protected:
sys::testing::ComponentContextProvider context_provider_;
ActivityNotifierImpl activity_notifier_;
FakeActivityTracker fake_tracker_;
};
TEST_F(ActivityNotifierImplTest, KeyboardInput) {
fuchsia::ui::input::InputEvent event;
event.keyboard().phase = fuchsia::ui::input::KeyboardEventPhase::PRESSED;
event.keyboard().code_point = 0x40;
activity_notifier_.ReceiveInputEvent(event);
RunLoopUntilIdle();
EXPECT_EQ(fake_tracker_.activities().size(), 1u);
}
TEST_F(ActivityNotifierImplTest, PointerInput) {
fuchsia::ui::input::InputEvent event;
event.pointer().type = fuchsia::ui::input::PointerEventType::TOUCH;
event.pointer().phase = fuchsia::ui::input::PointerEventPhase::ADD;
activity_notifier_.ReceiveInputEvent(event);
RunLoopUntilIdle();
EXPECT_EQ(fake_tracker_.activities().size(), 1u);
}
TEST_F(ActivityNotifierImplTest, MediaButtonsInput) {
fuchsia::ui::input::MediaButtonsEvent event;
event.set_volume(10);
activity_notifier_.ReceiveMediaButtonsEvent(event);
RunLoopUntilIdle();
EXPECT_EQ(fake_tracker_.activities().size(), 1u);
}
TEST_F(ActivityNotifierImplTest, FocusEventsIgnored) {
fuchsia::ui::input::FocusEvent focus;
fuchsia::ui::input::InputEvent event;
event.set_focus(focus);
activity_notifier_.ReceiveInputEvent(event);
RunLoopUntilIdle();
EXPECT_TRUE(fake_tracker_.activities().empty());
}
TEST_F(ActivityNotifierImplTest, MultipleInputsWithinInterval) {
fuchsia::ui::input::InputEvent event1, event2;
event1.keyboard().phase = fuchsia::ui::input::KeyboardEventPhase::PRESSED;
event1.keyboard().code_point = 0x40;
event2.pointer().type = fuchsia::ui::input::PointerEventType::TOUCH;
event2.pointer().phase = fuchsia::ui::input::PointerEventPhase::ADD;
activity_notifier_.ReceiveInputEvent(event1);
RunLoopUntilIdle();
EXPECT_EQ(fake_tracker_.activities().size(), 1u);
activity_notifier_.ReceiveInputEvent(event2);
RunLoopUntilIdle();
// Only one event ought to have been sent
EXPECT_EQ(fake_tracker_.activities().size(), 1u);
}
TEST_F(ActivityNotifierImplTest, MultipleInputsAcrossInterval) {
fuchsia::ui::input::InputEvent event1, event2;
event1.keyboard().phase = fuchsia::ui::input::KeyboardEventPhase::PRESSED;
event1.keyboard().code_point = 0x40;
event2.pointer().type = fuchsia::ui::input::PointerEventType::TOUCH;
event2.pointer().phase = fuchsia::ui::input::PointerEventPhase::ADD;
activity_notifier_.ReceiveInputEvent(event1);
RunLoopFor(ActivityNotifierImpl::kDefaultInterval);
activity_notifier_.ReceiveInputEvent(event2);
RunLoopUntilIdle();
EXPECT_EQ(fake_tracker_.activities().size(), 2u);
}
} // namespace
} // namespace root_presenter