// Copyright 2017 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 "trunks/power_manager.h"

#include <string>
#include <utility>

#include <dbus/mock_object_proxy.h>
#include <gmock/gmock.h>
#include <google/protobuf/message_lite.h>
#include <gtest/gtest.h>
#include <power_manager/dbus-proxy-mocks.h>
#include <power_manager/proto_bindings/suspend.pb.h>

#include "trunks/dbus_interface.h"
#include "trunks/mock_command_transceiver.h"
#include "trunks/mock_resource_manager.h"
#include "trunks/trunks_factory_for_test.h"

using testing::_;
using testing::DoAll;
using testing::Invoke;
using testing::Return;
using testing::StrictMock;

using MessageCallback = base::Callback<void(const std::vector<uint8_t>&)>;
using ConnectedCallback = dbus::ObjectProxy::OnConnectedCallback;
using ErrorCallback = base::Callback<void(brillo::Error*)>;
using SuccessCallback = base::Callback<void()>;
using NameOwnerChangedCallback =
    base::Callback<void(const std::string&, const std::string&)>;
using ServiceAvailableCallback =
    dbus::ObjectProxy::WaitForServiceToBeAvailableCallback;

namespace {

const char kPowerManagerInterface[] = "org.chromium.PowerManager";
const char kSuspendImminentSignal[] = "SuspendImminent";
const char kDarkSuspendImminentSignal[] = "DarkSuspendImminent";
const char kSuspendDoneSignal[] = "SuspendDone";

const int32_t kSomeDelayId = 1001;
const int32_t kSomeSuspendId = 17;

void SerializeProto(const google::protobuf::MessageLite& proto,
                    std::vector<uint8_t>* raw_buf) {
  std::string serialized_proto;
  CHECK(proto.SerializeToString(&serialized_proto));
  raw_buf->assign(serialized_proto.begin(), serialized_proto.end());
}

bool DeserializeProto(const std::vector<uint8_t>& raw_buf,
                      google::protobuf::MessageLite* proto) {
  return proto->ParseFromArray(&raw_buf.front(), raw_buf.size());
}

void SendMessage(const MessageCallback& callback,
                 const google::protobuf::MessageLite& proto) {
  std::vector<uint8_t> serialized_proto;
  SerializeProto(proto, &serialized_proto);
  callback.Run(serialized_proto);
}

}  // namespace

namespace trunks {

class PowerManagerTest : public testing::Test {
 public:
  struct Signal {
    std::string name;
    MessageCallback on_signal;
    ConnectedCallback on_connected;
  };

  PowerManagerTest() {
    power_manager_.set_resource_manager(&resource_manager_);
    power_manager_.set_power_manager_proxy(&proxy_);
  }

  void SetUp() override {
    ON_CALL(proxy_, DoRegisterSuspendDoneSignalHandler(_, _))
        .WillByDefault(Invoke(
            [this](MessageCallback signal, ConnectedCallback* connected) {
              suspend_done_.name = kSuspendDoneSignal;
              suspend_done_.on_signal = signal;
              suspend_done_.on_connected = std::move(*connected);
            }));
    ON_CALL(proxy_, DoRegisterSuspendImminentSignalHandler(_, _))
        .WillByDefault(Invoke([this](const MessageCallback& signal,
                                     ConnectedCallback* connected) {
          suspend_imminent_.name = kSuspendImminentSignal;
          suspend_imminent_.on_signal = signal;
          suspend_imminent_.on_connected = std::move(*connected);
        }));
    ON_CALL(proxy_, DoRegisterDarkSuspendImminentSignalHandler(_, _))
        .WillByDefault(Invoke([this](const MessageCallback& signal,
                                     ConnectedCallback* connected) {
          dark_suspend_imminent_.name = kDarkSuspendImminentSignal;
          dark_suspend_imminent_.on_signal = signal;
          dark_suspend_imminent_.on_connected = std::move(*connected);
        }));
    ON_CALL(*object_proxy_, DoWaitForServiceToBeAvailable(_))
        .WillByDefault(Invoke([this](ServiceAvailableCallback* cb) {
          service_available_ = std::move(*cb);
        }));
    ON_CALL(*object_proxy_, SetNameOwnerChangedCallback(_))
        .WillByDefault(Invoke([this](const NameOwnerChangedCallback& cb) {
          name_owner_changed_ = cb;
        }));
    ON_CALL(proxy_, UnregisterSuspendDelay(_, _, _))
        .WillByDefault(Return(true));
    ON_CALL(proxy_, GetObjectProxy())
        .WillByDefault(Return(object_proxy_.get()));
  }

  void SendSuspendDone(int32_t suspend_id = kSomeSuspendId) {
    power_manager::SuspendDone message;
    message.set_suspend_id(suspend_id);
    SendMessage(suspend_done_.on_signal, message);
  }
  void SendSuspendImminent(int32_t suspend_id = kSomeSuspendId,
                           bool dark = false) {
    power_manager::SuspendImminent message;
    message.set_suspend_id(suspend_id);
    Signal* signal = dark ? &dark_suspend_imminent_ : &suspend_imminent_;
    SendMessage(signal->on_signal, message);
  }
  void ConnectSignal(Signal* signal, bool success = true) {
    std::move(signal->on_connected)
        .Run(kPowerManagerInterface, signal->name, success);
  }
  void ConnectAllSignals() {
    ConnectSignal(&suspend_done_);
    ConnectSignal(&suspend_imminent_);
    ConnectSignal(&dark_suspend_imminent_);
  }
  void ServiceAvailable(bool available = true) {
    EXPECT_CALL(*object_proxy_, SetNameOwnerChangedCallback(_))
        .Times(available ? 1 : 0);
    std::move(service_available_).Run(available);
  }
  void ServiceLost() { name_owner_changed_.Run("some_owner", std::string()); }
  void ServiceRestored() {
    name_owner_changed_.Run(std::string(), "some_owner");
  }

  brillo::ErrorPtr TestError() {
    return brillo::Error::Create(FROM_HERE, "test_domain", "test_code",
                                 "test_message");
  }

  void SetSuspendDelay(int32_t delay_id = kSomeDelayId) {
    EXPECT_CALL(proxy_, RegisterSuspendDelayAsync(_, _, _, _))
        .WillOnce(Invoke([delay_id](const std::vector<uint8_t>& /* request */,
                                    const MessageCallback& on_reply,
                                    const ErrorCallback& /* on_error */,
                                    int /* timeout_ms */) {
          power_manager::RegisterSuspendDelayReply reply;
          reply.set_delay_id(delay_id);
          SendMessage(on_reply, reply);
        }));
  }
  void DenySuspendDelay() {
    EXPECT_CALL(proxy_, RegisterSuspendDelayAsync(_, _, _, _))
        .WillOnce(
            Invoke([this](const std::vector<uint8_t>& /* request */,
                          const MessageCallback& /* on_reply */,
                          const ErrorCallback& on_error, int /* timeout_ms */) {
              brillo::ErrorPtr error = TestError();
              on_error.Run(error.get());
            }));
  }

  void ExpectSuspendReadiness(bool reply_success = true) {
    last_readiness_info_.Clear();
    EXPECT_CALL(proxy_, HandleSuspendReadinessAsync(_, _, _, _))
        .WillOnce(
            Invoke([this, reply_success](
                       const std::vector<uint8_t>& serialized_proto,
                       const SuccessCallback& on_success,
                       const ErrorCallback& on_error, int /* timeout_ms */) {
              DeserializeProto(serialized_proto, &last_readiness_info_);
              if (reply_success) {
                on_success.Run();
              } else {
                brillo::ErrorPtr error = TestError();
                on_error.Run(error.get());
              }
            }))
        .RetiresOnSaturation();
  }
  void CheckSuspendReadiness(int32_t suspend_id = kSomeSuspendId,
                             int32_t delay_id = kSomeDelayId) {
    EXPECT_EQ(suspend_id, last_readiness_info_.suspend_id());
    EXPECT_EQ(delay_id, last_readiness_info_.delay_id());
  }

  void ExpectUnregisterSuspendDelay(bool reply_success = true) {
    last_unregister_suspend_delay_.Clear();
    EXPECT_CALL(proxy_, UnregisterSuspendDelay(_, _, _))
        .WillOnce(Invoke([this, reply_success](
                             const std::vector<uint8_t>& serialized_proto,
                             brillo::ErrorPtr* error,
                             int /* timeout_ms */) -> bool {
          DeserializeProto(serialized_proto, &last_unregister_suspend_delay_);
          if (!reply_success) {
            *error = TestError();
          }
          return reply_success;
        }))
        .RetiresOnSaturation();
  }
  void CheckUnregisterSuspendDelay(int32_t delay_id = kSomeDelayId) {
    EXPECT_EQ(delay_id, last_unregister_suspend_delay_.delay_id());
  }

  void Init() {
    EXPECT_CALL(proxy_, DoRegisterSuspendDoneSignalHandler(_, _)).Times(1);
    EXPECT_CALL(proxy_, DoRegisterSuspendImminentSignalHandler(_, _)).Times(1);
    EXPECT_CALL(proxy_, DoRegisterDarkSuspendImminentSignalHandler(_, _))
        .Times(1);
    EXPECT_CALL(*object_proxy_, DoWaitForServiceToBeAvailable(_)).Times(1);
    power_manager_.Init(ignored_bus_);
  }

  void NormalStart() {
    Init();
    ConnectAllSignals();
    SetSuspendDelay();
    ServiceAvailable();
  }

  void SuspendResume(bool do_suspend = true,
                     bool do_resume = true,
                     int32_t suspend_id = kSomeSuspendId,
                     int32_t delay_id = kSomeDelayId) {
    EXPECT_CALL(resource_manager_, Suspend()).Times(do_suspend);
    if (do_suspend) {
      ExpectSuspendReadiness();
      SendSuspendImminent(suspend_id);
      CheckSuspendReadiness(suspend_id, delay_id);
    }

    EXPECT_CALL(resource_manager_, Resume()).Times(do_resume);
    if (do_resume) {
      SendSuspendDone();
    }
    testing::Mock::VerifyAndClearExpectations(&proxy_);
    testing::Mock::VerifyAndClearExpectations(&resource_manager_);
  }

 protected:
  using MockDBusObjectProxyType = StrictMock<dbus::MockObjectProxy>;
  scoped_refptr<MockDBusObjectProxyType> object_proxy_ =
      new MockDBusObjectProxyType(
          nullptr, "", dbus::ObjectPath(trunks::kTrunksServicePath));
  org::chromium::PowerManagerProxyMock proxy_;
  TrunksFactoryForTest factory_;
  StrictMock<MockCommandTransceiver> transceiver_;
  StrictMock<MockResourceManager> resource_manager_{factory_, &transceiver_};
  PowerManager power_manager_;

  Signal suspend_done_;
  Signal suspend_imminent_;
  Signal dark_suspend_imminent_;
  NameOwnerChangedCallback name_owner_changed_;
  ServiceAvailableCallback service_available_;

  power_manager::SuspendReadinessInfo last_readiness_info_;
  power_manager::UnregisterSuspendDelayRequest last_unregister_suspend_delay_;

 private:
  scoped_refptr<dbus::Bus> ignored_bus_ = new dbus::Bus(dbus::Bus::Options());
};

TEST_F(PowerManagerTest, StartSuccess) {
  NormalStart();
}

TEST_F(PowerManagerTest, ServiceAvailableFailure) {
  // If ServiceAvailable(false) is received, don't proceed registering
  // SuspendDelay.
  Init();
  ConnectAllSignals();
  EXPECT_CALL(proxy_, RegisterSuspendDelayAsync(_, _, _, _)).Times(0);
  ServiceAvailable(false);
}

TEST_F(PowerManagerTest, SuspendWithoutResumeSignalConnected) {
  // Don't suspend resource manager if there is no signal to initiate resume.
  // SuspendReadinessInfo should still be reported.
  Init();
  SetSuspendDelay();
  ConnectSignal(&suspend_done_, false);
  ConnectSignal(&suspend_imminent_);
  ConnectSignal(&dark_suspend_imminent_);
  ServiceAvailable();
  ExpectSuspendReadiness();
  EXPECT_CALL(resource_manager_, Suspend()).Times(0);
  SendSuspendImminent();
  CheckSuspendReadiness();
}

TEST_F(PowerManagerTest, SuspendWithoutSuspendDelay) {
  // IF all signals are connected but SuspendDelay is not registered, still
  // suspend resource manager on SuspendImminent, just don't send
  // SuspendReadinessInfo.
  Init();
  DenySuspendDelay();
  ConnectAllSignals();
  ServiceAvailable();
  EXPECT_CALL(proxy_, HandleSuspendReadinessAsync(_, _, _, _)).Times(0);
  EXPECT_CALL(resource_manager_, Suspend()).Times(1);
  SendSuspendImminent();
}

TEST_F(PowerManagerTest, SuspendResume) {
  // Test that it works multiple times.
  // SuspendReadinessInfo should contain the right suspend_ids.
  NormalStart();
  SuspendResume(true, true, kSomeSuspendId);
  SuspendResume(true, true, kSomeSuspendId + 5);
  SuspendResume(true, true, kSomeSuspendId - 5);
}

TEST_F(PowerManagerTest, SuspendWithoutResume) {
  // If SuspendImminent is received twice, without resume in between, the
  // resource manager should still be suspended twice. The suspended state
  // is not tracked outside of resource manager.
  // SuspendReadinessInfo should contain the right suspend_ids.
  NormalStart();
  SuspendResume(true, false, kSomeSuspendId);
  SuspendResume(true, false, kSomeSuspendId + 3);
}

TEST_F(PowerManagerTest, ResumeWithoutSuspend) {
  // Resource manager should be resumed even if there was no previous suspend.
  // In case of SuspendDone signals without intermittent SuspendImminent,
  // resource manager should be resumed every time.
  NormalStart();
  SuspendResume(false, true);
  SuspendResume(false, true);
}

TEST_F(PowerManagerTest, SuspendReadinessIgnoresResult) {
  // The results of sending SuspendReadinessInfo shouldn't affect the behavior.
  // Errors are ignored.
  NormalStart();
  EXPECT_CALL(resource_manager_, Suspend()).Times(3);
  EXPECT_CALL(resource_manager_, Resume()).Times(3);
  ExpectSuspendReadiness(false);
  SendSuspendImminent(kSomeSuspendId);
  CheckSuspendReadiness(kSomeSuspendId);

  SendSuspendDone();

  ExpectSuspendReadiness(false);
  SendSuspendImminent(kSomeSuspendId + 1);
  CheckSuspendReadiness(kSomeSuspendId + 1);

  ExpectSuspendReadiness(false);
  SendSuspendImminent(kSomeSuspendId);
  CheckSuspendReadiness(kSomeSuspendId);

  SendSuspendDone();

  SendSuspendDone();
}

TEST_F(PowerManagerTest, TearDown) {
  // If SuspendDelay is registered, TearDown should unregister it.
  // It stops sending ReadinessInfo after TearDown, even if a signal is
  // received.
  NormalStart();
  ExpectUnregisterSuspendDelay();
  power_manager_.TearDown();
  CheckUnregisterSuspendDelay();
  EXPECT_CALL(proxy_, HandleSuspendReadinessAsync(_, _, _, _)).Times(0);
  EXPECT_CALL(resource_manager_, Suspend()).Times(1);
  SendSuspendImminent();
}

TEST_F(PowerManagerTest, TearDownAfterSuspendResume) {
  NormalStart();
  SuspendResume();
  SuspendResume();
  ExpectUnregisterSuspendDelay();
  power_manager_.TearDown();
  CheckUnregisterSuspendDelay();
}

TEST_F(PowerManagerTest, TearDownInSuspend) {
  NormalStart();
  SuspendResume(true, false);
  ExpectUnregisterSuspendDelay();
  power_manager_.TearDown();
  CheckUnregisterSuspendDelay();
}

TEST_F(PowerManagerTest, UnregisterSuspendDelayFailure) {
  // If UnregisterSuspendDelay failed during tear down, continue
  // using it, if a signal is received after that.
  NormalStart();
  ExpectUnregisterSuspendDelay(false);
  power_manager_.TearDown();
  CheckUnregisterSuspendDelay();
  SuspendResume();
}

TEST_F(PowerManagerTest, ServiceLost) {
  // If service is lost, resource manager should be resumed just in case.
  // SuspendDelay should not be attempted to be unregistered - service is
  // gone.
  NormalStart();
  EXPECT_CALL(proxy_, UnregisterSuspendDelay(_, _, _)).Times(0);
  EXPECT_CALL(resource_manager_, Resume()).Times(1);
  ServiceLost();
}

TEST_F(PowerManagerTest, ServiceRestored) {
  NormalStart();
  EXPECT_CALL(proxy_, UnregisterSuspendDelay(_, _, _)).Times(0);
  EXPECT_CALL(resource_manager_, Resume()).Times(1);
  ServiceLost();
  testing::Mock::VerifyAndClearExpectations(&resource_manager_);

  // While no service, don't send ReadinessInfo, but otherwise process
  // SuspendImminent and SuspendDone.
  EXPECT_CALL(proxy_, HandleSuspendReadinessAsync(_, _, _, _)).Times(0);
  EXPECT_CALL(resource_manager_, Suspend()).Times(1);
  SendSuspendImminent();
  EXPECT_CALL(resource_manager_, Resume()).Times(1);
  SendSuspendDone();
  testing::Mock::VerifyAndClearExpectations(&resource_manager_);

  // When service is restored, register SuspendDelay, and start using the
  // new delay_id.
  int32_t new_delay_id = kSomeDelayId + 1;
  SetSuspendDelay(new_delay_id);
  ServiceRestored();

  SuspendResume(true, true, kSomeSuspendId, new_delay_id);

  ExpectUnregisterSuspendDelay();
  power_manager_.TearDown();
  CheckUnregisterSuspendDelay(new_delay_id);
}

TEST_F(PowerManagerTest, UnexpectedServiceRestored) {
  // If "service restored" event received without prior "service lost",
  // assume we missed that prior event, and handle as if we received
  // both events. Don't attempt to unregister previous SuspendDelay.
  NormalStart();

  int32_t new_delay_id = kSomeDelayId + 1;
  SetSuspendDelay(new_delay_id);
  EXPECT_CALL(proxy_, UnregisterSuspendDelay(_, _, _)).Times(0);
  EXPECT_CALL(resource_manager_, Resume()).Times(1);
  ServiceRestored();

  SuspendResume(true, true, kSomeSuspendId, new_delay_id);
}

}  // namespace trunks
