// Copyright 2020 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.

#ifndef ATTESTATION_PCA_AGENT_SERVER_RESPONSE_WITH_VERIFIER_H_
#define ATTESTATION_PCA_AGENT_SERVER_RESPONSE_WITH_VERIFIER_H_

#include "attestation/pca_agent/server/pca_agent_service.h"

#include <memory>
#include <string>

#include <base/bind.h>
#include <brillo/dbus/dbus_method_response.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>

namespace attestation {
namespace pca_agent {

using ::testing::_;
using ::testing::Invoke;

template <typename ReplyType, typename Verifier>
class ResponseWithVerifier
    : public brillo::dbus_utils::DBusMethodResponse<ReplyType> {
 public:
  explicit ResponseWithVerifier(Verifier&& v)
      : brillo::dbus_utils::DBusMethodResponse<ReplyType>(
            /*method_call=*/nullptr,
            base::Bind([](std::unique_ptr<dbus::Response> response) {
              FAIL() << "The sender shouldn't have been called.";
            })),
        verifier_(v) {
    // By default, |Return| calls |Verify|.
    ON_CALL(*this, Return(_)).WillByDefault(Invoke(verifier_));
    EXPECT_CALL(*this, Return(_)).Times(1);
  }
  ~ResponseWithVerifier() = default;
  // Makes |Return| a mock mothod so we can set EXPECT_* to it.
  MOCK_METHOD(void, Return, (const ReplyType& reply), (override));

 private:
  Verifier verifier_;
};

template <typename ReplyType, typename Verifier>
std::unique_ptr<ResponseWithVerifier<ReplyType, Verifier>>
MakeResponseWithVerifier(Verifier&& v) {
  return std::make_unique<ResponseWithVerifier<ReplyType, Verifier>>(v);
}

}  // namespace pca_agent
}  // namespace attestation

#endif  // ATTESTATION_PCA_AGENT_SERVER_RESPONSE_WITH_VERIFIER_H_
