// Copyright 2018 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 "garnet/bin/scpi/app.h"
#include "gtest/gtest.h"
#include "lib/component/cpp/testing/test_with_context.h"

namespace scpi {
namespace testing {

using namespace fuchsia::scpi;

class AppTest : public component::testing::TestWithContext {
 protected:
  AppTest() : app_(std::make_unique<App>(TakeContext())) { app_->Start(); }

  void TearDown() override { TestWithContext::TearDown(); }

  SystemControllerPtr GetSystemController() {
    SystemControllerPtr system_controller;
    controller().outgoing_public_services().ConnectToService(
        system_controller.NewRequest());
    return system_controller;
  }

 private:
  std::unique_ptr<App> app_;
};

// GetDvfsInfo
TEST_F(AppTest, GetDvfsInfo) {
  SystemControllerPtr scpi_ = GetSystemController();
  Status st;
  int size;
  scpi_->GetDvfsInfo(0, [&](Status err, fidl::VectorPtr<DvfsOpp> opps) {
    st = err;
    size = (int)opps->size();
  });
  RunLoopUntilIdle();
  EXPECT_EQ(fuchsia::scpi::Status::OK, st);
  EXPECT_NE(0, size);
}

// GetSystemStatus
TEST_F(AppTest, GetSystemStatus) {
  SystemControllerPtr scpi_ = GetSystemController();
  Status st;
  int temp;
  scpi_->GetSystemStatus([&](Status err, SystemStatus sys_status) {
    st = err;
    temp = sys_status.temperature;
  });
  RunLoopUntilIdle();
  EXPECT_EQ(fuchsia::scpi::Status::OK, st);
  EXPECT_NE(0, temp);
}

}  // namespace testing
}  // namespace scpi
