// Copyright 2014 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 "buffet/commands/dbus_command_proxy.h"

#include <functional>
#include <memory>

#include <dbus/mock_bus.h>
#include <dbus/mock_exported_object.h>
#include <dbus/property.h>
#include <chromeos/dbus/dbus_object.h>
#include <chromeos/dbus/dbus_object_test_helpers.h>
#include <gtest/gtest.h>

#include "buffet/commands/command_dictionary.h"
#include "buffet/commands/command_instance.h"
#include "buffet/commands/unittest_utils.h"
#include "buffet/libbuffet/dbus_constants.h"

using ::testing::AnyNumber;
using ::testing::Return;
using ::testing::Invoke;
using ::testing::_;

using buffet::unittests::CreateDictionaryValue;
using chromeos::dbus_utils::AsyncEventSequencer;
using chromeos::dbus_utils::ExportedObjectManager;
using chromeos::VariantDictionary;

namespace buffet {

namespace {

const char kTestCommandCategoty[] = "test_command_category";
const char kTestCommandId[] = "cmd_1";

}  // namespace

class DBusCommandProxyTest : public ::testing::Test {
 public:
  void SetUp() override {
    // Set up a mock DBus bus object.
    dbus::Bus::Options options;
    options.bus_type = dbus::Bus::SYSTEM;
    bus_ = new dbus::MockBus(options);
    // By default, don't worry about threading assertions.
    EXPECT_CALL(*bus_, AssertOnOriginThread()).Times(AnyNumber());
    EXPECT_CALL(*bus_, AssertOnDBusThread()).Times(AnyNumber());

    // Command instance.
    // TODO(antonm): Test results.
    auto json = CreateDictionaryValue(R"({
      'robot': {
        'jump': {
          'parameters': {
            'height': {
              'type': 'integer',
              'minimum': 0,
              'maximum': 100
            },
            '_jumpType': {
              'type': 'string',
              'enum': ['_withAirFlip', '_withSpin', '_withKick']
            }
          },
          'results': {
            'foo': {
              'type': 'integer'
            },
            'bar': {
              'type': 'string'
            }
          }
        }
      }
    })");
    CHECK(dict_.LoadCommands(*json, kTestCommandCategoty, nullptr, nullptr))
        << "Failed to parse test command dictionary";

    json = CreateDictionaryValue(R"({
      'name': 'robot.jump',
      'parameters': {
        'height': 53,
        '_jumpType': '_withKick'
      }
    })");
    command_instance_ = CommandInstance::FromJson(json.get(), dict_, nullptr);
    command_instance_->SetID(kTestCommandId);

    // Set up a mock ExportedObject to be used with the DBus command proxy.
    std::string cmd_path = dbus_constants::kCommandServicePathPrefix;
    cmd_path += kTestCommandId;
    const dbus::ObjectPath kCmdObjPath(cmd_path);
    // Use a mock exported object for the exported object manager.
    mock_exported_object_command_ =
        new dbus::MockExportedObject(bus_.get(), kCmdObjPath);
    EXPECT_CALL(*bus_, GetExportedObject(kCmdObjPath)).Times(AnyNumber())
        .WillRepeatedly(Return(mock_exported_object_command_.get()));
    EXPECT_CALL(*mock_exported_object_command_,
                ExportMethod(_, _, _, _)).Times(AnyNumber());

    std::unique_ptr<CommandProxyInterface> command_proxy(
        new DBusCommandProxy(nullptr, bus_, command_instance_.get(), cmd_path));
    command_instance_->AddProxy(std::move(command_proxy));
    GetCommandProxy()->RegisterAsync(
        AsyncEventSequencer::GetDefaultCompletionAction());
  }

  void TearDown() override {
    EXPECT_CALL(*mock_exported_object_command_, Unregister()).Times(1);
    command_instance_.reset();
    dict_.Clear();
    bus_ = nullptr;
  }

  DBusCommandProxy* GetCommandProxy() const {
    CHECK_EQ(command_instance_->proxies_.size(), 1U);
    return static_cast<DBusCommandProxy*>(command_instance_->proxies_[0].get());
  }

  chromeos::dbus_utils::DBusObject* GetProxyDBusObject() {
    return &GetCommandProxy()->dbus_object_;
  }

  std::string GetStatus() const {
    return GetCommandProxy()->dbus_adaptor_.GetStatus();
  }

  int32_t GetProgress() const {
    return GetCommandProxy()->dbus_adaptor_.GetProgress();
  }

  VariantDictionary GetParameters() const {
    return GetCommandProxy()->dbus_adaptor_.GetParameters();
  }

  VariantDictionary GetResults() const {
    return GetCommandProxy()->dbus_adaptor_.GetResults();
  }

  std::unique_ptr<dbus::Response> CallMethod(
      const std::string& method_name,
      const std::function<void(dbus::MessageWriter*)>& param_callback) {
    dbus::MethodCall method_call(dbus_constants::kCommandInterface,
                                 method_name);
    method_call.SetSerial(1234);
    dbus::MessageWriter writer(&method_call);
    if (param_callback)
      param_callback(&writer);
    return chromeos::dbus_utils::testing::CallMethod(*GetProxyDBusObject(),
                                                     &method_call);
  }

  static bool IsResponseError(const std::unique_ptr<dbus::Response>& response) {
    return (response->GetMessageType() == dbus::Message::MESSAGE_ERROR);
  }

  static void VerifyResponse(
      const std::unique_ptr<dbus::Response>& response,
      const std::function<void(dbus::MessageReader*)>& result_callback) {
    EXPECT_FALSE(IsResponseError(response));
    dbus::MessageReader reader(response.get());
    if (result_callback)
      result_callback(&reader);
    EXPECT_FALSE(reader.HasMoreData());
  }

  template<typename T>
  T GetPropertyValue(const std::string& property_name) {
    dbus::MethodCall method_call(dbus::kPropertiesInterface,
                                 dbus::kPropertiesGet);
    method_call.SetSerial(1234);
    dbus::MessageWriter writer(&method_call);
    writer.AppendString(dbus_constants::kCommandInterface);
    writer.AppendString(property_name);
    auto response = chromeos::dbus_utils::testing::CallMethod(
        *GetProxyDBusObject(), &method_call);
    T value{};
    VerifyResponse(response, [&value](dbus::MessageReader* reader) {
      EXPECT_TRUE(chromeos::dbus_utils::PopValueFromReader(reader, &value));
    });
    return value;
  }

  std::unique_ptr<CommandInstance> command_instance_;
  CommandDictionary dict_;

  scoped_refptr<dbus::MockExportedObject> mock_exported_object_command_;
  scoped_refptr<dbus::MockBus> bus_;
};

TEST_F(DBusCommandProxyTest, Init) {
  VariantDictionary params = {
    {"height", int32_t{53}},
    {"_jumpType", std::string{"_withKick"}},
  };
  VariantDictionary results;

  EXPECT_EQ(CommandInstance::kStatusQueued, GetStatus());
  EXPECT_EQ(0, GetProgress());
  EXPECT_EQ(params, GetParameters());
  EXPECT_EQ(results, GetResults());
  EXPECT_EQ("robot.jump",
            GetPropertyValue<std::string>(dbus_constants::kCommandName));
  EXPECT_EQ(kTestCommandCategoty,
            GetPropertyValue<std::string>(dbus_constants::kCommandCategory));
  EXPECT_EQ(kTestCommandId,
            GetPropertyValue<std::string>(dbus_constants::kCommandId));
  EXPECT_EQ(CommandInstance::kStatusQueued,
            GetPropertyValue<std::string>(dbus_constants::kCommandStatus));
  EXPECT_EQ(0, GetPropertyValue<int32_t>(dbus_constants::kCommandProgress));
  EXPECT_EQ(params,
            GetPropertyValue<VariantDictionary>(
                dbus_constants::kCommandParameters));
  EXPECT_EQ(results,
            GetPropertyValue<VariantDictionary>(
                dbus_constants::kCommandResults));
}

TEST_F(DBusCommandProxyTest, SetProgress) {
  EXPECT_CALL(*mock_exported_object_command_, SendSignal(_)).Times(2);
  auto response = CallMethod(dbus_constants::kCommandSetProgress,
                             [](dbus::MessageWriter* writer) {
    writer->AppendInt32(10);
  });
  VerifyResponse(response, {});
  EXPECT_EQ(CommandInstance::kStatusInProgress, GetStatus());
  EXPECT_EQ(10, GetProgress());
  EXPECT_EQ(CommandInstance::kStatusInProgress,
            GetPropertyValue<std::string>(dbus_constants::kCommandStatus));
  EXPECT_EQ(10, GetPropertyValue<int32_t>(dbus_constants::kCommandProgress));
}

TEST_F(DBusCommandProxyTest, SetProgress_OutOfRange) {
  auto response = CallMethod(dbus_constants::kCommandSetProgress,
                             [](dbus::MessageWriter* writer) {
    writer->AppendInt32(110);
  });
  EXPECT_TRUE(IsResponseError(response));
  EXPECT_EQ(CommandInstance::kStatusQueued, GetStatus());
  EXPECT_EQ(0, GetProgress());
}

TEST_F(DBusCommandProxyTest, SetResults) {
  EXPECT_CALL(*mock_exported_object_command_, SendSignal(_)).Times(1);
  const VariantDictionary results = {
    {"foo", int32_t{42}},
    {"bar", std::string{"foobar"}},
  };
  auto response = CallMethod(dbus_constants::kCommandSetResults,
                             [results](dbus::MessageWriter* writer) {
    chromeos::dbus_utils::AppendValueToWriter(writer, results);
  });
  VerifyResponse(response, {});
  EXPECT_EQ(results, GetResults());
  EXPECT_EQ(results,
            GetPropertyValue<VariantDictionary>(
                dbus_constants::kCommandResults));
}

TEST_F(DBusCommandProxyTest, SetResults_UnknownProperty) {
  EXPECT_CALL(*mock_exported_object_command_, SendSignal(_)).Times(0);
  const VariantDictionary results = {
    {"quux", int32_t{42}},
  };
  auto response = CallMethod(dbus_constants::kCommandSetResults,
                             [results](dbus::MessageWriter* writer) {
    chromeos::dbus_utils::AppendValueToWriter(writer, results);
  });
  EXPECT_TRUE(IsResponseError(response));
}

TEST_F(DBusCommandProxyTest, Abort) {
  EXPECT_CALL(*mock_exported_object_command_, SendSignal(_)).Times(1);
  auto response = CallMethod(dbus_constants::kCommandAbort, {});
  VerifyResponse(response, {});
  EXPECT_EQ(CommandInstance::kStatusAborted, GetStatus());
}

TEST_F(DBusCommandProxyTest, Cancel) {
  EXPECT_CALL(*mock_exported_object_command_, SendSignal(_)).Times(1);
  auto response = CallMethod(dbus_constants::kCommandCancel, {});
  VerifyResponse(response, {});
  EXPECT_EQ(CommandInstance::kStatusCanceled, GetStatus());
}

TEST_F(DBusCommandProxyTest, Done) {
  // 3 property updates:
  // status: queued -> inProgress
  // progress: 0 -> 100
  // status: inProgress -> done
  EXPECT_CALL(*mock_exported_object_command_, SendSignal(_)).Times(3);
  auto response = CallMethod(dbus_constants::kCommandDone, {});
  VerifyResponse(response, {});
  EXPECT_EQ(CommandInstance::kStatusDone, GetStatus());
  EXPECT_EQ(100, GetProgress());
}

}  // namespace buffet
