// 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_control_connection.h"

#include <fuchsia/ui/activity/control/cpp/fidl.h>

#include <memory>

#include "garnet/public/lib/gtest/test_loop_fixture.h"
#include "src/sys/activity/state_machine_driver.h"

namespace activity {

class ActivityControlConnectionTest : public ::gtest::TestLoopFixture {
 public:
  ActivityControlConnectionTest() : driver_(dispatcher()) {}

  void SetUp() override {
    conn_ = std::make_unique<ActivityControlConnection>(&driver_, dispatcher(),
                                                        client_.NewRequest(dispatcher()));
  }

 protected:
  StateMachineDriver driver_;
  std::unique_ptr<ActivityControlConnection> conn_;
  fuchsia::ui::activity::control::ControlPtr client_;
};

TEST_F(ActivityControlConnectionTest, SetState) {
  client_->SetState(fuchsia::ui::activity::State::ACTIVE);
  RunLoopUntilIdle();
  EXPECT_EQ(driver_.state(), fuchsia::ui::activity::State::ACTIVE);

  auto timeout = driver_.state_machine().TimeoutFor(fuchsia::ui::activity::State::ACTIVE);
  ASSERT_NE(timeout, std::nullopt);
  RunLoopFor(*timeout);

  // The state machine should now always report ACTIVE, even after timing out.
  EXPECT_EQ(driver_.GetState(), fuchsia::ui::activity::State::ACTIVE);
}

}  // namespace activity
