// Copyright (c) 2013 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 "shill/mock_crypto_util_proxy.h"

#include <string>
#include <vector>

#include "shill/callbacks.h"
#include "shill/error.h"
#include "shill/event_dispatcher.h"
#include "shill/testing.h"

using testing::_;
using testing::DoAll;
using testing::Return;

namespace shill {

MockCryptoUtilProxy::MockCryptoUtilProxy(
    EventDispatcher* dispatcher, GLib* glib)
    : CryptoUtilProxy(dispatcher, glib) {
  ON_CALL(*this, VerifyDestination(_, _, _, _, _, _, _, _, _))
      .WillByDefault(DoAll(SetOperationFailedInArgumentAndWarn<8>(),
                           Return(false)));
  ON_CALL(*this, EncryptData(_, _, _, _))
      .WillByDefault(DoAll(SetOperationFailedInArgumentAndWarn<3>(),
                           Return(false)));
}

MockCryptoUtilProxy::~MockCryptoUtilProxy() {}

bool MockCryptoUtilProxy::RealVerifyDestination(
    const std::string& certificate,
    const std::string& public_key,
    const std::string& nonce,
    const std::string& signed_data,
    const std::string& destination_udn,
    const std::vector<uint8_t>& ssid,
    const std::string& bssid,
    const ResultBoolCallback& result_callback,
    Error* error) {
  return CryptoUtilProxy::VerifyDestination(certificate, public_key,
                                            nonce, signed_data,
                                            destination_udn, ssid, bssid,
                                            result_callback, error);
}

bool MockCryptoUtilProxy::RealEncryptData(
    const std::string& public_key,
    const std::string& data,
    const ResultStringCallback& result_callback,
    Error* error) {
  return CryptoUtilProxy::EncryptData(public_key, data,
                                      result_callback, error);
}

bool MockCryptoUtilProxy::RealStartShimForCommand(
    const std::string& command,
    const std::string& input,
    const StringCallback& result_handler) {
  return CryptoUtilProxy::StartShimForCommand(command, input,
                                              result_handler);
}

}  // namespace shill
