// Copyright 2019 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 "vm_tools/cicerone/dbus_message_testing_helper.h"

namespace vm_tools {
namespace cicerone {

using ::testing::MakePolymorphicMatcher;
using ::testing::PolymorphicMatcher;

HasMethodNameMatcher::HasMethodNameMatcher(
    const std::string& expected_method_name)
    : expected_method_name_(expected_method_name) {}

HasMethodNameMatcher::HasMethodNameMatcher(const HasMethodNameMatcher& rhs) =
    default;
HasMethodNameMatcher::~HasMethodNameMatcher() = default;

bool HasMethodNameMatcher::MatchAndExplain(
    dbus::Message* message, testing::MatchResultListener* listener) const {
  *listener << "method name is " << message->GetMember();
  return message->GetMember() == expected_method_name_;
}

void HasMethodNameMatcher::DescribeTo(std::ostream* os) const {
  *os << "has method name " << expected_method_name_;
}

void HasMethodNameMatcher::DescribeNegationTo(std::ostream* os) const {
  *os << "does not have method name " << expected_method_name_;
}

PolymorphicMatcher<HasMethodNameMatcher> HasMethodName(
    const std::string& expected_method_name) {
  return MakePolymorphicMatcher(HasMethodNameMatcher(expected_method_name));
}

HasInterfaceNameMatcher::HasInterfaceNameMatcher(
    const std::string& expected_interface_name)
    : expected_interface_name_(expected_interface_name) {}

HasInterfaceNameMatcher::HasInterfaceNameMatcher(
    const HasInterfaceNameMatcher& rhs) = default;
HasInterfaceNameMatcher::~HasInterfaceNameMatcher() = default;

bool HasInterfaceNameMatcher::MatchAndExplain(
    dbus::Message* message, testing::MatchResultListener* listener) const {
  *listener << "interface name is " << message->GetInterface();
  return message->GetInterface() == expected_interface_name_;
}

void HasInterfaceNameMatcher::DescribeTo(std::ostream* os) const {
  *os << "has interface name " << expected_interface_name_;
}

void HasInterfaceNameMatcher::DescribeNegationTo(std::ostream* os) const {
  *os << "does not have interface name " << expected_interface_name_;
}

PolymorphicMatcher<HasInterfaceNameMatcher> HasInterfaceName(
    const std::string& expected_interface_name) {
  return MakePolymorphicMatcher(
      HasInterfaceNameMatcher(expected_interface_name));
}

}  // namespace cicerone
}  // namespace vm_tools
