/*
 * Copyright 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 * Generated mock file from original source file
 *   Functions generated:33
 *
 *  mockcify.pl ver 0.2
 */

#include <functional>
#include <map>
#include <string>
#include <vector>

extern std::map<std::string, int> mock_function_count_map;

// Original included files, if any
// NOTE: Since this is a mock file with mock definitions some number of
//       include files may not be required.  The include-what-you-use
//       still applies, but crafting proper inclusion is out of scope
//       for this effort.  This compilation unit may compile as-is, or
//       may need attention to prune the inclusion set.
#include <base/logging.h>
#include <base/strings/stringprintf.h>

#include <cstdint>
#include <string>

#include "device/include/controller.h"
#include "main/shim/l2c_api.h"
#include "main/shim/shim.h"
#include "osi/include/log.h"
#include "stack/btm/btm_sec.h"
#include "stack/include/bt_hdr.h"
#include "stack/include/l2c_api.h"
#include "stack/l2cap/l2c_int.h"
#include "types/raw_address.h"

// Mocked compile conditionals, if any
#ifndef UNUSED_ATTR
#define UNUSED_ATTR
#endif

namespace test {
namespace mock {
namespace stack_l2cap_api {

// Shared state between mocked functions and tests
// Name: l2c_get_transport_from_fixed_cid
// Params: uint16_t fixed_cid
// Returns: tBT_TRANSPORT
struct l2c_get_transport_from_fixed_cid {
  std::function<tBT_TRANSPORT(uint16_t fixed_cid)> body{
      [](uint16_t fixed_cid) { return 0; }};
  tBT_TRANSPORT operator()(uint16_t fixed_cid) { return body(fixed_cid); };
};
extern struct l2c_get_transport_from_fixed_cid l2c_get_transport_from_fixed_cid;
// Name: L2CA_Register2
// Params: uint16_t psm, const tL2CAP_APPL_INFO& p_cb_info, bool enable_snoop,
// tL2CAP_ERTM_INFO* p_ertm_info, uint16_t my_mtu, uint16_t required_remote_mtu,
// uint16_t sec_level Returns: uint16_t
struct L2CA_Register2 {
  std::function<uint16_t(uint16_t psm, const tL2CAP_APPL_INFO& p_cb_info,
                         bool enable_snoop, tL2CAP_ERTM_INFO* p_ertm_info,
                         uint16_t my_mtu, uint16_t required_remote_mtu,
                         uint16_t sec_level)>
      body{[](uint16_t psm, const tL2CAP_APPL_INFO& p_cb_info,
              bool enable_snoop, tL2CAP_ERTM_INFO* p_ertm_info, uint16_t my_mtu,
              uint16_t required_remote_mtu, uint16_t sec_level) { return 0; }};
  uint16_t operator()(uint16_t psm, const tL2CAP_APPL_INFO& p_cb_info,
                      bool enable_snoop, tL2CAP_ERTM_INFO* p_ertm_info,
                      uint16_t my_mtu, uint16_t required_remote_mtu,
                      uint16_t sec_level) {
    return body(psm, p_cb_info, enable_snoop, p_ertm_info, my_mtu,
                required_remote_mtu, sec_level);
  };
};
extern struct L2CA_Register2 L2CA_Register2;
// Name: L2CA_Register
// Params: uint16_t psm, const tL2CAP_APPL_INFO& p_cb_info, bool enable_snoop,
// tL2CAP_ERTM_INFO* p_ertm_info, uint16_t my_mtu, uint16_t required_remote_mtu,
// uint16_t sec_level Returns: uint16_t
struct L2CA_Register {
  std::function<uint16_t(uint16_t psm, const tL2CAP_APPL_INFO& p_cb_info,
                         bool enable_snoop, tL2CAP_ERTM_INFO* p_ertm_info,
                         uint16_t my_mtu, uint16_t required_remote_mtu,
                         uint16_t sec_level)>
      body{[](uint16_t psm, const tL2CAP_APPL_INFO& p_cb_info,
              bool enable_snoop, tL2CAP_ERTM_INFO* p_ertm_info, uint16_t my_mtu,
              uint16_t required_remote_mtu, uint16_t sec_level) { return 0; }};
  uint16_t operator()(uint16_t psm, const tL2CAP_APPL_INFO& p_cb_info,
                      bool enable_snoop, tL2CAP_ERTM_INFO* p_ertm_info,
                      uint16_t my_mtu, uint16_t required_remote_mtu,
                      uint16_t sec_level) {
    return body(psm, p_cb_info, enable_snoop, p_ertm_info, my_mtu,
                required_remote_mtu, sec_level);
  };
};
extern struct L2CA_Register L2CA_Register;
// Name: L2CA_Deregister
// Params: uint16_t psm
// Returns: void
struct L2CA_Deregister {
  std::function<void(uint16_t psm)> body{[](uint16_t psm) {}};
  void operator()(uint16_t psm) { body(psm); };
};
extern struct L2CA_Deregister L2CA_Deregister;
// Name: L2CA_AllocateLePSM
// Params: void
// Returns: uint16_t
struct L2CA_AllocateLePSM {
  std::function<uint16_t(void)> body{[](void) { return 0; }};
  uint16_t operator()(void) { return body(); };
};
extern struct L2CA_AllocateLePSM L2CA_AllocateLePSM;
// Name: L2CA_FreeLePSM
// Params: uint16_t psm
// Returns: void
struct L2CA_FreeLePSM {
  std::function<void(uint16_t psm)> body{[](uint16_t psm) {}};
  void operator()(uint16_t psm) { body(psm); };
};
extern struct L2CA_FreeLePSM L2CA_FreeLePSM;
// Name: L2CA_ConnectReq2
// Params: uint16_t psm, const RawAddress& p_bd_addr, uint16_t sec_level
// Returns: uint16_t
struct L2CA_ConnectReq2 {
  std::function<uint16_t(uint16_t psm, const RawAddress& p_bd_addr,
                         uint16_t sec_level)>
      body{[](uint16_t psm, const RawAddress& p_bd_addr, uint16_t sec_level) {
        return 0;
      }};
  uint16_t operator()(uint16_t psm, const RawAddress& p_bd_addr,
                      uint16_t sec_level) {
    return body(psm, p_bd_addr, sec_level);
  };
};
extern struct L2CA_ConnectReq2 L2CA_ConnectReq2;
// Name: L2CA_ConnectReq
// Params: uint16_t psm, const RawAddress& p_bd_addr
// Returns: uint16_t
struct L2CA_ConnectReq {
  std::function<uint16_t(uint16_t psm, const RawAddress& p_bd_addr)> body{
      [](uint16_t psm, const RawAddress& p_bd_addr) { return 0; }};
  uint16_t operator()(uint16_t psm, const RawAddress& p_bd_addr) {
    return body(psm, p_bd_addr);
  };
};
extern struct L2CA_ConnectReq L2CA_ConnectReq;
// Name: L2CA_RegisterLECoc
// Params: uint16_t psm, const tL2CAP_APPL_INFO& p_cb_info, uint16_t sec_level,
// tL2CAP_LE_CFG_INFO cfg Returns: uint16_t
struct L2CA_RegisterLECoc {
  std::function<uint16_t(uint16_t psm, const tL2CAP_APPL_INFO& p_cb_info,
                         uint16_t sec_level, tL2CAP_LE_CFG_INFO cfg)>
      body{[](uint16_t psm, const tL2CAP_APPL_INFO& p_cb_info,
              uint16_t sec_level, tL2CAP_LE_CFG_INFO cfg) { return 0; }};
  uint16_t operator()(uint16_t psm, const tL2CAP_APPL_INFO& p_cb_info,
                      uint16_t sec_level, tL2CAP_LE_CFG_INFO cfg) {
    return body(psm, p_cb_info, sec_level, cfg);
  };
};
extern struct L2CA_RegisterLECoc L2CA_RegisterLECoc;
// Name: L2CA_DeregisterLECoc
// Params: uint16_t psm
// Returns: void
struct L2CA_DeregisterLECoc {
  std::function<void(uint16_t psm)> body{[](uint16_t psm) {}};
  void operator()(uint16_t psm) { body(psm); };
};
extern struct L2CA_DeregisterLECoc L2CA_DeregisterLECoc;
// Name: L2CA_ConnectLECocReq
// Params: uint16_t psm, const RawAddress& p_bd_addr, tL2CAP_LE_CFG_INFO* p_cfg,
// uint16_t sec_level Returns: uint16_t
struct L2CA_ConnectLECocReq {
  std::function<uint16_t(uint16_t psm, const RawAddress& p_bd_addr,
                         tL2CAP_LE_CFG_INFO* p_cfg, uint16_t sec_level)>
      body{[](uint16_t psm, const RawAddress& p_bd_addr,
              tL2CAP_LE_CFG_INFO* p_cfg, uint16_t sec_level) { return 0; }};
  uint16_t operator()(uint16_t psm, const RawAddress& p_bd_addr,
                      tL2CAP_LE_CFG_INFO* p_cfg, uint16_t sec_level) {
    return body(psm, p_bd_addr, p_cfg, sec_level);
  };
};
extern struct L2CA_ConnectLECocReq L2CA_ConnectLECocReq;
// Name: L2CA_GetPeerLECocConfig
// Params: uint16_t lcid, tL2CAP_LE_CFG_INFO* peer_cfg
// Returns: bool
struct L2CA_GetPeerLECocConfig {
  std::function<bool(uint16_t lcid, tL2CAP_LE_CFG_INFO* peer_cfg)> body{
      [](uint16_t lcid, tL2CAP_LE_CFG_INFO* peer_cfg) { return false; }};
  bool operator()(uint16_t lcid, tL2CAP_LE_CFG_INFO* peer_cfg) {
    return body(lcid, peer_cfg);
  };
};
extern struct L2CA_GetPeerLECocConfig L2CA_GetPeerLECocConfig;
// Name: L2CA_ConnectCreditBasedRsp
// Params: const RawAddress& p_bd_addr, uint8_t id, std::vector<uint16_t>&
// accepted_lcids, uint16_t result, tL2CAP_LE_CFG_INFO* p_cfg Returns: bool
struct L2CA_ConnectCreditBasedRsp {
  std::function<bool(const RawAddress& p_bd_addr, uint8_t id,
                     std::vector<uint16_t>& accepted_lcids, uint16_t result,
                     tL2CAP_LE_CFG_INFO* p_cfg)>
      body{[](const RawAddress& p_bd_addr, uint8_t id,
              std::vector<uint16_t>& accepted_lcids, uint16_t result,
              tL2CAP_LE_CFG_INFO* p_cfg) { return false; }};
  bool operator()(const RawAddress& p_bd_addr, uint8_t id,
                  std::vector<uint16_t>& accepted_lcids, uint16_t result,
                  tL2CAP_LE_CFG_INFO* p_cfg) {
    return body(p_bd_addr, id, accepted_lcids, result, p_cfg);
  };
};
extern struct L2CA_ConnectCreditBasedRsp L2CA_ConnectCreditBasedRsp;
// Name: L2CA_ConnectCreditBasedReq
// Params: uint16_t psm, const RawAddress& p_bd_addr, tL2CAP_LE_CFG_INFO* p_cfg
// Returns: std::vector<uint16_t>
struct L2CA_ConnectCreditBasedReq {
  std::vector<uint16_t> cids;
  std::function<std::vector<uint16_t>(uint16_t psm, const RawAddress& p_bd_addr,
                                      tL2CAP_LE_CFG_INFO* p_cfg)>
      body{[this](uint16_t psm, const RawAddress& p_bd_addr,
                  tL2CAP_LE_CFG_INFO* p_cfg) { return cids; }};
  std::vector<uint16_t> operator()(uint16_t psm, const RawAddress& p_bd_addr,
                                   tL2CAP_LE_CFG_INFO* p_cfg) {
    return body(psm, p_bd_addr, p_cfg);
  };
};
extern struct L2CA_ConnectCreditBasedReq L2CA_ConnectCreditBasedReq;
// Name: L2CA_ReconfigCreditBasedConnsReq
// Params: const RawAddress& bda, std::vector<uint16_t>& lcids,
// tL2CAP_LE_CFG_INFO* p_cfg Returns: bool
struct L2CA_ReconfigCreditBasedConnsReq {
  std::function<bool(const RawAddress& bda, std::vector<uint16_t>& lcids,
                     tL2CAP_LE_CFG_INFO* p_cfg)>
      body{[](const RawAddress& bda, std::vector<uint16_t>& lcids,
              tL2CAP_LE_CFG_INFO* p_cfg) { return false; }};
  bool operator()(const RawAddress& bda, std::vector<uint16_t>& lcids,
                  tL2CAP_LE_CFG_INFO* p_cfg) {
    return body(bda, lcids, p_cfg);
  };
};
extern struct L2CA_ReconfigCreditBasedConnsReq L2CA_ReconfigCreditBasedConnsReq;
// Name: L2CA_DisconnectReq
// Params: uint16_t cid
// Returns: bool
struct L2CA_DisconnectReq {
  std::function<bool(uint16_t cid)> body{[](uint16_t cid) { return false; }};
  bool operator()(uint16_t cid) { return body(cid); };
};
extern struct L2CA_DisconnectReq L2CA_DisconnectReq;
// Name: L2CA_DisconnectLECocReq
// Params: uint16_t cid
// Returns: bool
struct L2CA_DisconnectLECocReq {
  std::function<bool(uint16_t cid)> body{[](uint16_t cid) { return false; }};
  bool operator()(uint16_t cid) { return body(cid); };
};
extern struct L2CA_DisconnectLECocReq L2CA_DisconnectLECocReq;
// Name: L2CA_GetRemoteCid
// Params: uint16_t lcid, uint16_t* rcid
// Returns: bool
struct L2CA_GetRemoteCid {
  std::function<bool(uint16_t lcid, uint16_t* rcid)> body{
      [](uint16_t lcid, uint16_t* rcid) { return false; }};
  bool operator()(uint16_t lcid, uint16_t* rcid) { return body(lcid, rcid); };
};
extern struct L2CA_GetRemoteCid L2CA_GetRemoteCid;
// Name: L2CA_SetIdleTimeoutByBdAddr
// Params: const RawAddress& bd_addr, uint16_t timeout, tBT_TRANSPORT transport
// Returns: bool
struct L2CA_SetIdleTimeoutByBdAddr {
  std::function<bool(const RawAddress& bd_addr, uint16_t timeout,
                     tBT_TRANSPORT transport)>
      body{[](const RawAddress& bd_addr, uint16_t timeout,
              tBT_TRANSPORT transport) { return false; }};
  bool operator()(const RawAddress& bd_addr, uint16_t timeout,
                  tBT_TRANSPORT transport) {
    return body(bd_addr, timeout, transport);
  };
};
extern struct L2CA_SetIdleTimeoutByBdAddr L2CA_SetIdleTimeoutByBdAddr;
// Name: L2CA_SetTraceLevel
// Params: uint8_t new_level
// Returns: uint8_t
struct L2CA_SetTraceLevel {
  std::function<uint8_t(uint8_t new_level)> body{
      [](uint8_t new_level) { return 0; }};
  uint8_t operator()(uint8_t new_level) { return body(new_level); };
};
extern struct L2CA_SetTraceLevel L2CA_SetTraceLevel;
// Name: L2CA_SetAclPriority
// Params: const RawAddress& bd_addr, tL2CAP_PRIORITY priority
// Returns: bool
struct L2CA_SetAclPriority {
  std::function<bool(const RawAddress& bd_addr, tL2CAP_PRIORITY priority)> body{
      [](const RawAddress& bd_addr, tL2CAP_PRIORITY priority) {
        return false;
      }};
  bool operator()(const RawAddress& bd_addr, tL2CAP_PRIORITY priority) {
    return body(bd_addr, priority);
  };
};
extern struct L2CA_SetAclPriority L2CA_SetAclPriority;
// Name: L2CA_SetTxPriority
// Params: uint16_t cid, tL2CAP_CHNL_PRIORITY priority
// Returns: bool
struct L2CA_SetTxPriority {
  std::function<bool(uint16_t cid, tL2CAP_CHNL_PRIORITY priority)> body{
      [](uint16_t cid, tL2CAP_CHNL_PRIORITY priority) { return false; }};
  bool operator()(uint16_t cid, tL2CAP_CHNL_PRIORITY priority) {
    return body(cid, priority);
  };
};
extern struct L2CA_SetTxPriority L2CA_SetTxPriority;
// Name: L2CA_GetPeerFeatures
// Params: const RawAddress& bd_addr, uint32_t* p_ext_feat, uint8_t* p_chnl_mask
// Returns: bool
struct L2CA_GetPeerFeatures {
  std::function<bool(const RawAddress& bd_addr, uint32_t* p_ext_feat,
                     uint8_t* p_chnl_mask)>
      body{[](const RawAddress& bd_addr, uint32_t* p_ext_feat,
              uint8_t* p_chnl_mask) { return false; }};
  bool operator()(const RawAddress& bd_addr, uint32_t* p_ext_feat,
                  uint8_t* p_chnl_mask) {
    return body(bd_addr, p_ext_feat, p_chnl_mask);
  };
};
extern struct L2CA_GetPeerFeatures L2CA_GetPeerFeatures;
// Name: L2CA_RegisterFixedChannel
// Params: uint16_t fixed_cid, tL2CAP_FIXED_CHNL_REG* p_freg
// Returns: bool
struct L2CA_RegisterFixedChannel {
  std::function<bool(uint16_t fixed_cid, tL2CAP_FIXED_CHNL_REG* p_freg)> body{
      [](uint16_t fixed_cid, tL2CAP_FIXED_CHNL_REG* p_freg) { return false; }};
  bool operator()(uint16_t fixed_cid, tL2CAP_FIXED_CHNL_REG* p_freg) {
    return body(fixed_cid, p_freg);
  };
};
extern struct L2CA_RegisterFixedChannel L2CA_RegisterFixedChannel;
// Name: L2CA_ConnectFixedChnl
// Params: uint16_t fixed_cid, const RawAddress& rem_bda
// Returns: bool
struct L2CA_ConnectFixedChnl {
  std::function<bool(uint16_t fixed_cid, const RawAddress& rem_bda)> body{
      [](uint16_t fixed_cid, const RawAddress& rem_bda) { return false; }};
  bool operator()(uint16_t fixed_cid, const RawAddress& rem_bda) {
    return body(fixed_cid, rem_bda);
  };
};
extern struct L2CA_ConnectFixedChnl L2CA_ConnectFixedChnl;
// Name: L2CA_SendFixedChnlData
// Params: uint16_t fixed_cid, const RawAddress& rem_bda, BT_HDR* p_buf
// Returns: uint16_t
struct L2CA_SendFixedChnlData {
  std::function<uint16_t(uint16_t fixed_cid, const RawAddress& rem_bda,
                         BT_HDR* p_buf)>
      body{[](uint16_t fixed_cid, const RawAddress& rem_bda, BT_HDR* p_buf) {
        return 0;
      }};
  uint16_t operator()(uint16_t fixed_cid, const RawAddress& rem_bda,
                      BT_HDR* p_buf) {
    return body(fixed_cid, rem_bda, p_buf);
  };
};
extern struct L2CA_SendFixedChnlData L2CA_SendFixedChnlData;
// Name: L2CA_RemoveFixedChnl
// Params: uint16_t fixed_cid, const RawAddress& rem_bda
// Returns: bool
struct L2CA_RemoveFixedChnl {
  std::function<bool(uint16_t fixed_cid, const RawAddress& rem_bda)> body{
      [](uint16_t fixed_cid, const RawAddress& rem_bda) { return false; }};
  bool operator()(uint16_t fixed_cid, const RawAddress& rem_bda) {
    return body(fixed_cid, rem_bda);
  };
};
extern struct L2CA_RemoveFixedChnl L2CA_RemoveFixedChnl;
// Name: L2CA_SetLeGattTimeout
// Params: const RawAddress& rem_bda, uint16_t idle_tout
// Returns: bool
struct L2CA_SetLeGattTimeout {
  std::function<bool(const RawAddress& rem_bda, uint16_t idle_tout)> body{
      [](const RawAddress& rem_bda, uint16_t idle_tout) { return false; }};
  bool operator()(const RawAddress& rem_bda, uint16_t idle_tout) {
    return body(rem_bda, idle_tout);
  };
};
extern struct L2CA_SetLeGattTimeout L2CA_SetLeGattTimeout;
// Name: L2CA_DataWrite
// Params: uint16_t cid, BT_HDR* p_data
// Returns: uint8_t
struct L2CA_DataWrite {
  std::function<uint8_t(uint16_t cid, BT_HDR* p_data)> body{
      [](uint16_t cid, BT_HDR* p_data) { return 0; }};
  uint8_t operator()(uint16_t cid, BT_HDR* p_data) {
    return body(cid, p_data);
  };
};
extern struct L2CA_DataWrite L2CA_DataWrite;
// Name: L2CA_LECocDataWrite
// Params: uint16_t cid, BT_HDR* p_data
// Returns: uint8_t
struct L2CA_LECocDataWrite {
  std::function<uint8_t(uint16_t cid, BT_HDR* p_data)> body{
      [](uint16_t cid, BT_HDR* p_data) { return 0; }};
  uint8_t operator()(uint16_t cid, BT_HDR* p_data) {
    return body(cid, p_data);
  };
};
extern struct L2CA_LECocDataWrite L2CA_LECocDataWrite;
// Name: L2CA_SetChnlFlushability
// Params: uint16_t cid, bool is_flushable
// Returns: bool
struct L2CA_SetChnlFlushability {
  std::function<bool(uint16_t cid, bool is_flushable)> body{
      [](uint16_t cid, bool is_flushable) { return false; }};
  bool operator()(uint16_t cid, bool is_flushable) {
    return body(cid, is_flushable);
  };
};
extern struct L2CA_SetChnlFlushability L2CA_SetChnlFlushability;
// Name: L2CA_FlushChannel
// Params: uint16_t lcid, uint16_t num_to_flush
// Returns: uint16_t
struct L2CA_FlushChannel {
  std::function<uint16_t(uint16_t lcid, uint16_t num_to_flush)> body{
      [](uint16_t lcid, uint16_t num_to_flush) { return 0; }};
  uint16_t operator()(uint16_t lcid, uint16_t num_to_flush) {
    return body(lcid, num_to_flush);
  };
};
extern struct L2CA_FlushChannel L2CA_FlushChannel;
// Name: L2CA_IsLinkEstablished
// Params: const RawAddress& bd_addr, tBT_TRANSPORT transport
// Returns: bool
struct L2CA_IsLinkEstablished {
  std::function<bool(const RawAddress& bd_addr, tBT_TRANSPORT transport)> body{
      [](const RawAddress& bd_addr, tBT_TRANSPORT transport) { return false; }};
  bool operator()(const RawAddress& bd_addr, tBT_TRANSPORT transport) {
    return body(bd_addr, transport);
  };
};
extern struct L2CA_IsLinkEstablished L2CA_IsLinkEstablished;

}  // namespace stack_l2cap_api
}  // namespace mock
}  // namespace test

// END mockcify generation
