blob: 1edc1984f0095f74dc5740fab072dd5121898545 [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/sys/activity/activity_provider_connection.h"
#include <fuchsia/ui/activity/cpp/fidl.h>
#include <memory>
#include "src/lib/testing/loop_fixture/test_loop_fixture.h"
#include "src/sys/activity/fake_listener.h"
#include "src/sys/activity/state_machine_driver.h"
namespace {
fuchsia::ui::activity::DiscreteActivity DiscreteActivity() {
fuchsia::ui::activity::GenericActivity generic;
fuchsia::ui::activity::DiscreteActivity activity;
activity.set_generic(std::move(generic));
return activity;
}
} // namespace
namespace activity {
class ActivityProviderConnectionTest : public ::gtest::TestLoopFixture {
public:
ActivityProviderConnectionTest() : driver_(dispatcher()) {}
void SetUp() override {
conn_ = std::make_unique<ActivityProviderConnection>(
&driver_, dispatcher(), client_.NewRequest(dispatcher()),
::testing::UnitTest::GetInstance()->random_seed());
}
protected:
StateMachineDriver driver_;
std::unique_ptr<ActivityProviderConnection> conn_;
fuchsia::ui::activity::ProviderPtr client_;
};
TEST_F(ActivityProviderConnectionTest, ReceiveCurrentStateOnConnection) {
testing::FakeListener listener;
client_->WatchState(listener.NewHandle(dispatcher()));
RunLoopUntilIdle();
EXPECT_EQ(listener.StateChanges().size(), 1u);
}
TEST_F(ActivityProviderConnectionTest, SingleStateChange) {
testing::FakeListener listener;
client_->WatchState(listener.NewHandle(dispatcher()));
driver_.ReceiveDiscreteActivity(DiscreteActivity(), Now(), []() {});
RunLoopUntilIdle();
EXPECT_EQ(listener.StateChanges().size(), 2u);
}
TEST_F(ActivityProviderConnectionTest, MultipleStateChanges) {
testing::FakeListener listener;
client_->WatchState(listener.NewHandle(dispatcher()));
driver_.ReceiveDiscreteActivity(DiscreteActivity(), Now(), []() {});
auto timeout = driver_.state_machine().TimeoutFor(fuchsia::ui::activity::State::ACTIVE);
ASSERT_NE(timeout, std::nullopt);
RunLoopFor(*timeout);
EXPECT_EQ(listener.StateChanges().size(), 3u);
}
TEST_F(ActivityProviderConnectionTest, CleansUpListenerOnStop) {
testing::FakeListener listener;
client_->WatchState(listener.NewHandle(dispatcher()));
conn_->Stop();
EXPECT_EQ(driver_.num_observers(), 0u);
}
TEST_F(ActivityProviderConnectionTest, CleansUpListenerOnDestructor) {
{
testing::FakeListener listener;
client_->WatchState(listener.NewHandle(dispatcher()));
}
EXPECT_EQ(driver_.num_observers(), 0u);
}
TEST_F(ActivityProviderConnectionTest, CleansUpListenerOnConnClose) {
conn_.reset();
EXPECT_EQ(driver_.num_observers(), 0u);
}
} // namespace activity