/**
 * Copyright (c) 2021 OceanBase
 * OceanBase CE is licensed under Mulan PubL v2.
 * You can use this software according to the terms and conditions of the Mulan PubL v2.
 * You may obtain a copy of Mulan PubL v2 at:
 *          http://license.coscl.org.cn/MulanPubL-2.0
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PubL v2 for more details.
 */

#ifndef OCEANBASE_UNITTEST_CLOG_MOCK_LOG_MEMBERSHIPMGR
#define OCEANBASE_UNITTEST_CLOG_MOCK_LOG_MEMBERSHIPMGR
#include "clog/ob_log_membership_mgr_V2.h"
#include "clog/ob_i_submit_log_cb.h"
#include "clog/ob_log_define.h"
#include "clog/ob_log_type.h"
#include "common/ob_member_list.h"
#include "common/ob_partition_key.h"

namespace oceanbase {
namespace election {
class ObIElectionMgr;
}

namespace clog {
class ObILogSWForMS;
class ObILogStateMgrForMS;
class ObILogCallbackEngine;
class ObLogEntry;
class ObLogEntryHeader;

class MockObLogMembershipMgr : public ObILogMembershipMgr, public ObISubmitLogCb {
public:
  MockObLogMembershipMgr()
  {}
  virtual ~MockObLogMembershipMgr()
  {}

public:
  int init(const common::ObMemberList& member_list, const int64_t membership_timestamp,
      const uint64_t membership_log_id, const int64_t replica_num, const common::ObAddr& self,
      const common::ObPartitionKey& partition_key, ObILogSWForMS* sw, ObILogStateMgrForMS* state_mgr,
      ObILogCallbackEngine* cb_engine, election::ObIElectionMgr* election_mgr)
  {
    UNUSED(member_list);
    UNUSED(membership_timestamp);
    UNUSED(membership_log_id);
    UNUSED(replica_num);
    UNUSED(self);
    UNUSED(partition_key);
    UNUSED(sw);
    UNUSED(state_mgr);
    UNUSED(cb_engine);
    UNUSED(election_mgr);
    return OB_SUCCESS;
  }
  bool is_state_changed()
  {
    return true;
  }
  int switch_state()
  {
    return OB_SUCCESS;
  }
  int receive_recovery_log(
      const ObLogEntry& log_entry, const bool is_confirmed, const int64_t accum_checksum, const bool is_batch_committed)
  {
    UNUSED(log_entry);
    UNUSED(is_confirmed);
    UNUSED(accum_checksum);
    UNUSED(is_batch_committed);
    return OB_SUCCESS;
  }
  int add_member(const common::ObMember& member, const int64_t quorum, obrpc::ObMCLogInfo& log_info)
  {
    UNUSED(member);
    UNUSED(quorum);
    UNUSED(log_info);
    return OB_SUCCESS;
  }
  int remove_member(const common::ObMember& member, const int64_t quorum, obrpc::ObMCLogInfo& log_info)
  {
    UNUSED(member);
    UNUSED(quorum);
    UNUSED(log_info);
    return OB_SUCCESS;
  }
  int64_t get_replica_num() const
  {
    return 3;
  }
  bool is_single_member_mode() const
  {
    return false;
  }
  common::ObReplicaType get_replica_type() const
  {
    return REPLICA_TYPE_MAX;
  }
  common::ObReplicaProperty get_replica_property() const
  {
    return ObReplicaProperty();
  }
  const common::ObMemberList& get_curr_member_list() const
  {
    return member_list_;
  }
  virtual int get_lower_level_replica_list(common::ObChildReplicaList& list) const
  {
    UNUSED(list);
    return 0;
  }
  virtual int check_paxos_children() const
  {
    return 0;
  }
  virtual void reset_children_list()
  {
    return;
  }
  virtual int set_children_list_to_curr_member_list()
  {
    return 0;
  }
  virtual int try_add_member_to_children_list(
      const ObMember& member, const common::ObRegion& region, const common::ObReplicaType replica_type)
  {
    UNUSED(member);
    UNUSED(region);
    UNUSED(replica_type);
    return 0;
  }
  virtual int try_replace_add_to_children_list(const ObMember& member, const common::ObRegion& region,
      const common::ObReplicaType replica_type, const int64_t next_ilog_ts)
  {
    UNUSED(member);
    UNUSED(region);
    UNUSED(replica_type);
    UNUSED(next_ilog_ts);
    return 0;
  }
  virtual int try_remove_server_from_children_list(const common::ObAddr& server)
  {
    UNUSED(server);
    return 0;
  }
  virtual bool is_children_list_full()
  {
    return true;
  }
  virtual int receive_log(
      const ObLogEntry& log_entry, const common::ObAddr& server, const int64_t cluster_id, const ReceiveLogType rl_type)
  {
    UNUSED(log_entry);
    UNUSED(server);
    UNUSED(cluster_id);
    UNUSED(rl_type);
    return 0;
  }
  virtual int append_disk_log(const ObLogEntry& log_entry, const ObLogCursor& log_cursor, const int64_t accum_checksum,
      const bool batch_committed)
  {
    UNUSED(log_entry);
    UNUSED(log_cursor);
    UNUSED(accum_checksum);
    UNUSED(batch_committed);
    return 0;
  }
  virtual int64_t get_timestamp() const
  {
    return 0;
  }
  virtual uint64_t get_log_id() const
  {
    return 0;
  }
  virtual void reset_status()
  {
    return;
  }
  virtual int write_start_membership(const ObLogType& log_type)
  {
    UNUSED(log_type);
    return 0;
  }
  virtual bool is_state_init() const
  {
    return true;
  }
  virtual void reset_follower_pending_entry()
  {
    return;
  }
  virtual void submit_success_cb_task(const ObLogType& log_type, const uint64_t log_id, const char* log_buf,
      const int64_t log_buf_len, const common::ObProposalID& proposal_id)
  {
    UNUSED(log_type);
    UNUSED(log_id);
    UNUSED(log_buf);
    UNUSED(log_buf_len);
    UNUSED(proposal_id);
    return;
  }
  virtual void reconfirm_update_status(const ObLogEntry& log_entry)
  {
    UNUSED(log_entry);
    return;
  }
  virtual int force_set_as_single_replica()
  {
    return 0;
  }
  virtual int force_set_replica_num(const int64_t replica_num)
  {
    UNUSED(replica_num);
    return 0;
  }
  virtual int set_replica_type(const enum ObReplicaType replica_type)
  {
    UNUSED(replica_type);
    return 0;
  }
  virtual int change_member_list_to_self(const int64_t new_membership_version)
  {
    UNUSED(new_membership_version);
    return OB_SUCCESS;
  }
  virtual int on_success(const common::ObPartitionKey& partition_key, const clog::ObLogType log_type,
      const uint64_t log_id, const int64_t version, const bool batch_committed, const bool batch_last_succeed)
  {
    UNUSED(partition_key);
    UNUSED(log_type);
    UNUSED(log_id);
    UNUSED(version);
    UNUSED(batch_committed);
    UNUSED(batch_last_succeed);
    return 0;
  }
  virtual int inc_replica_num(const int64_t replica_num)
  {
    UNUSED(replica_num);
    return OB_NOT_SUPPORTED;
  }
  virtual int dec_replica_num(const int64_t replica_num)
  {
    UNUSED(replica_num);
    return OB_NOT_SUPPORTED;
  }
  virtual int change_quorum(const common::ObMemberList& curr_member_list, const int64_t curr_quorum,
      const int64_t new_quorum, obrpc::ObMCLogInfo& log_info)
  {
    UNUSED(curr_member_list);
    UNUSED(curr_quorum);
    UNUSED(new_quorum);
    UNUSED(log_info);
    return 0;
  }
  virtual common::ObProposalID get_ms_proposal_id() const
  {
    return ms_proposal_id_;
  }
  virtual int update_ms_proposal_id(const common::ObProposalID& ms_proposal_id)
  {
    UNUSED(ms_proposal_id);
    return OB_SUCCESS;
  }

  virtual bool has_elect_mlist() const
  {
    return false;
  }
  virtual int get_curr_ms_log_body(ObLogEntryHeader& log_entry_header, char* buffer, const int64_t buf_len) const
  {
    UNUSED(log_entry_header);
    UNUSED(buffer);
    UNUSED(buf_len);
    return OB_SUCCESS;
  }
  virtual int reset_renew_ms_log_task()
  {
    return OB_SUCCESS;
  }
  virtual bool is_renew_ms_log_majority_success() const
  {
    return true;
  }
  virtual int check_renew_ms_log_sync_state() const
  {
    return OB_SUCCESS;
  }

private:
  common::ObMemberList member_list_;
  common::ObProposalID ms_proposal_id_;
};
}  // namespace clog
}  // namespace oceanbase

#endif  // OCEANBASE_UNITTEST_CLOG_MOCK_LOG_MEMBERSHIPMGR
