// Copyright 2018 The Chromium OS 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 "power_manager/powerd/policy/backlight_controller_test_util.h"

#include <cmath>
#include <memory>

#include <chromeos/dbus/service_constants.h>
#include <dbus/message.h>
#include <gtest/gtest.h>

#include "power_manager/powerd/system/dbus_wrapper_stub.h"

namespace power_manager {
namespace policy {
namespace test {

void CallIncreaseScreenBrightness(system::DBusWrapperStub* wrapper) {
  DCHECK(wrapper);
  dbus::MethodCall method_call(kPowerManagerInterface,
                               kIncreaseScreenBrightnessMethod);
  ASSERT_TRUE(wrapper->CallExportedMethodSync(&method_call));
}

void CallDecreaseScreenBrightness(system::DBusWrapperStub* wrapper,
                                  bool allow_off) {
  DCHECK(wrapper);
  dbus::MethodCall method_call(kPowerManagerInterface,
                               kDecreaseScreenBrightnessMethod);
  dbus::MessageWriter(&method_call).AppendBool(allow_off);
  ASSERT_TRUE(wrapper->CallExportedMethodSync(&method_call));
}

void CallSetScreenBrightness(
    system::DBusWrapperStub* wrapper,
    double percent,
    SetBacklightBrightnessRequest_Transition transition,
    SetBacklightBrightnessRequest_Cause cause) {
  DCHECK(wrapper);
  dbus::MethodCall method_call(kPowerManagerInterface,
                               kSetScreenBrightnessMethod);
  dbus::MessageWriter writer(&method_call);
  SetBacklightBrightnessRequest proto;
  proto.set_percent(percent);
  proto.set_transition(transition);
  proto.set_cause(cause);
  writer.AppendProtoAsArrayOfBytes(proto);
  ASSERT_TRUE(wrapper->CallExportedMethodSync(&method_call));
}

void CheckBrightnessChangedSignal(system::DBusWrapperStub* wrapper,
                                  size_t index,
                                  const std::string& signal_name,
                                  double brightness_percent,
                                  BacklightBrightnessChange_Cause cause) {
  std::unique_ptr<dbus::Signal> signal;
  ASSERT_TRUE(wrapper->GetSentSignal(index, signal_name, nullptr, &signal));

  BacklightBrightnessChange proto;
  ASSERT_TRUE(dbus::MessageReader(signal.get()).PopArrayOfBytesAsProto(&proto));
  EXPECT_DOUBLE_EQ(round(brightness_percent), round(proto.percent()));
  EXPECT_EQ(cause, proto.cause());
}

}  // namespace test
}  // namespace policy
}  // namespace power_manager
