Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

120 рядки
6.2 KiB

  1. #include <stdarg.h>
  2. #include "mock.h"
  3. const amqp_table_t amqp_empty_table = { 0, nullptr };
  4. AmqpMock* amqp_mock_instance = nullptr;
  5. amqp_connection_state_t AmqpMock::defaultConnectionState = reinterpret_cast<amqp_connection_state_t>(1);
  6. amqp_socket_t* AmqpMock::defaultSocket = reinterpret_cast<amqp_socket_t*>(2);
  7. amqp_rpc_reply_t AmqpMock::defaultRpcReply {
  8. static_cast<amqp_response_type_enum>(AMQP_RESPONSE_NORMAL),
  9. { 0, nullptr },
  10. 0
  11. };
  12. void AmqpMock::setInstance(AmqpMock* value)
  13. {
  14. amqp_mock_instance = value;
  15. }
  16. void AmqpMock::clearInstance(AmqpMock* value)
  17. {
  18. if (amqp_mock_instance == value)
  19. amqp_mock_instance = nullptr;
  20. }
  21. const char* amqp_error_string2(int err)
  22. { return (amqp_mock_instance ? amqp_mock_instance->amqp_error_string2(err) : nullptr); }
  23. amqp_channel_open_ok_t* amqp_channel_open(amqp_connection_state_t state, amqp_channel_t channel)
  24. { return (amqp_mock_instance ? amqp_mock_instance->amqp_channel_open(state, channel) : nullptr); }
  25. amqp_rpc_reply_t amqp_get_rpc_reply(amqp_connection_state_t state)
  26. { return (amqp_mock_instance ? amqp_mock_instance->amqp_get_rpc_reply(state) : AmqpMock::defaultRpcReply); }
  27. amqp_rpc_reply_t amqp_channel_close(amqp_connection_state_t state, amqp_channel_t channel, int code)
  28. { return (amqp_mock_instance ? amqp_mock_instance->amqp_channel_close(state, channel, code) : amqp_rpc_reply_t { }); }
  29. amqp_queue_declare_ok_t* amqp_queue_declare(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, amqp_boolean_t passive, amqp_boolean_t durable, amqp_boolean_t exclusive, amqp_boolean_t auto_delete, amqp_table_t arguments)
  30. { return (amqp_mock_instance ? amqp_mock_instance->amqp_queue_declare(state, channel, queue, passive, durable, exclusive, auto_delete, arguments) : nullptr); }
  31. void amqp_release_buffers(amqp_connection_state_t state)
  32. { if (amqp_mock_instance) amqp_mock_instance->amqp_release_buffers(state); }
  33. amqp_rpc_reply_t amqp_consume_message(amqp_connection_state_t state, amqp_envelope_t *envelope, struct timeval *timeout, int flags)
  34. { return (amqp_mock_instance ? amqp_mock_instance->amqp_consume_message(state, envelope, timeout, flags) : AmqpMock::defaultRpcReply); }
  35. int amqp_simple_wait_frame_noblock(amqp_connection_state_t state, amqp_frame_t *decoded_frame, struct timeval *tv)
  36. { return (amqp_mock_instance ? amqp_mock_instance->amqp_simple_wait_frame_noblock(state, decoded_frame, tv) : 0); }
  37. amqp_rpc_reply_t amqp_read_message(amqp_connection_state_t state, amqp_channel_t channel, amqp_message_t *message, int flags)
  38. { return (amqp_mock_instance ? amqp_mock_instance->amqp_read_message(state, channel, message, flags) : AmqpMock::defaultRpcReply); }
  39. amqp_rpc_reply_t amqp_connection_close(amqp_connection_state_t state, int code)
  40. { return (amqp_mock_instance ? amqp_mock_instance->amqp_connection_close(state, code) : AmqpMock::defaultRpcReply); }
  41. void amqp_destroy_envelope(amqp_envelope_t *envelope)
  42. { if (amqp_mock_instance) amqp_mock_instance->amqp_destroy_envelope(envelope); }
  43. void amqp_destroy_message(amqp_message_t *message)
  44. { if (amqp_mock_instance) amqp_mock_instance->amqp_destroy_message(message); }
  45. int amqp_destroy_connection(amqp_connection_state_t state)
  46. { return (amqp_mock_instance ? amqp_mock_instance->amqp_destroy_connection(state) : 0); }
  47. void amqp_maybe_release_buffers(amqp_connection_state_t state)
  48. { if (amqp_mock_instance) amqp_mock_instance->amqp_maybe_release_buffers(state); }
  49. amqp_connection_state_t amqp_new_connection(void)
  50. { return (amqp_mock_instance ? amqp_mock_instance->amqp_new_connection() : AmqpMock::defaultConnectionState); }
  51. amqp_socket_t* amqp_tcp_socket_new(amqp_connection_state_t state)
  52. { return (amqp_mock_instance ? amqp_mock_instance->amqp_tcp_socket_new(state) : AmqpMock::defaultSocket); }
  53. int amqp_socket_open(amqp_socket_t *self, const char *host, int port)
  54. { return (amqp_mock_instance ? amqp_mock_instance->amqp_socket_open(self, host, port) : 0); }
  55. #pragma clang diagnostic push
  56. #pragma clang diagnostic ignored "-Wvarargs"
  57. amqp_rpc_reply_t amqp_login(amqp_connection_state_t state, char const *vhost, int channel_max, int frame_max, int heartbeat, amqp_sasl_method_enum sasl_method, ...)
  58. {
  59. if (!amqp_mock_instance)
  60. return AmqpMock::defaultRpcReply;
  61. amqp_rpc_reply_t ret;
  62. va_list args;
  63. va_start(args, sasl_method);
  64. switch (sasl_method)
  65. {
  66. case AMQP_SASL_METHOD_PLAIN:
  67. {
  68. const char* username = va_arg(args, const char*);
  69. const char* password = va_arg(args, const char*);
  70. ret = amqp_mock_instance->amqp_login_plain(state, vhost, channel_max, frame_max, heartbeat, sasl_method, username, password);
  71. }
  72. break;
  73. case AMQP_SASL_METHOD_EXTERNAL:
  74. {
  75. const char* token = va_arg(args, const char*);
  76. ret = amqp_mock_instance->amqp_login_external(state, vhost, channel_max, frame_max, heartbeat, sasl_method, token);
  77. }
  78. break;
  79. default:
  80. ret = AmqpMock::defaultRpcReply;
  81. }
  82. va_end(args);
  83. return ret;
  84. }
  85. #pragma clang diagnostic pop
  86. amqp_queue_bind_ok_t* amqp_queue_bind(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, amqp_bytes_t exchange, amqp_bytes_t routing_key, amqp_table_t arguments)
  87. { return (amqp_mock_instance ? amqp_mock_instance->amqp_queue_bind(state, channel, queue, exchange, routing_key, arguments) : nullptr); }
  88. int amqp_basic_publish(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t exchange, amqp_bytes_t routing_key, amqp_boolean_t mandatory, amqp_boolean_t immediate, struct amqp_basic_properties_t_ const *properties, amqp_bytes_t body)
  89. { return (amqp_mock_instance ? amqp_mock_instance->amqp_basic_publish(state, channel, exchange, routing_key, mandatory, immediate, properties, body) : 0); }
  90. amqp_basic_consume_ok_t* amqp_basic_consume(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, amqp_bytes_t consumer_tag, amqp_boolean_t no_local, amqp_boolean_t no_ack, amqp_boolean_t exclusive, amqp_table_t arguments)
  91. { return (amqp_mock_instance ? amqp_mock_instance->amqp_basic_consume(state, channel, queue, consumer_tag, no_local, no_ack, exclusive, arguments) : nullptr); }