static bool handle_ismaster (mock_server_t *server, mongoc_stream_t *client, mongoc_rpc_t *rpc, const bson_t *doc) { bson_t reply_doc = BSON_INITIALIZER; time_t now = time (NULL); BSON_ASSERT (server); BSON_ASSERT (client); BSON_ASSERT (rpc); BSON_ASSERT (doc); bson_append_bool (&reply_doc, "ismaster", -1, server->isMaster); bson_append_int32 (&reply_doc, "maxBsonObjectSize", -1, server->maxBsonObjectSize); bson_append_int32 (&reply_doc, "maxMessageSizeBytes", -1, server->maxMessageSizeBytes); bson_append_int32 (&reply_doc, "minWireVersion", -1, server->minWireVersion); bson_append_int32 (&reply_doc, "maxWireVersion", -1, server->maxWireVersion); bson_append_double (&reply_doc, "ok", -1, 1.0); bson_append_time_t (&reply_doc, "localtime", -1, now); mock_server_reply_simple (server, client, rpc, MONGOC_REPLY_NONE, &reply_doc); bson_destroy (&reply_doc); return true; }
static bool handle_ping (mock_server_t *server, mongoc_stream_t *client, mongoc_rpc_t *rpc, const bson_t *doc) { bson_t reply = BSON_INITIALIZER; bson_append_int32 (&reply, "ok", 2, 1); mock_server_reply_simple (server, client, rpc, MONGOC_REPLY_NONE, &reply); bson_destroy (&reply); return true; }
static bool auto_ismaster (request_t *request, void *data) { const char *response_json = (const char *) data; char *quotes_replaced; bson_t response; bson_error_t error; if (!request->is_command || strcasecmp (request->command_name, "ismaster")) { return false; } quotes_replaced = single_quotes_to_double (response_json); if (!bson_init_from_json (&response, quotes_replaced, -1, &error)) { fprintf (stderr, "%s\n", error.message); fflush (stderr); abort (); } if (mock_server_get_rand_delay (request->server)) { _mongoc_usleep ((int64_t) (rand () % 10) * 1000); } if (mock_server_get_verbose (request->server)) { printf ("%5.2f %hu <- %hu \t%s\n", mock_server_get_uptime_sec (request->server), request->client_port, mock_server_get_port (request->server), quotes_replaced); fflush (stdout); } mock_server_reply_simple (request->server, request->client, &request->request_rpc, MONGOC_REPLY_NONE, &response, 0); bson_destroy (&response); bson_free (quotes_replaced); request_destroy (request); return true; }
void mock_server_replies (request_t *request, uint32_t flags, int64_t cursor_id, int32_t starting_from, int32_t number_returned, const char *docs_json) { char *quotes_replaced = single_quotes_to_double (docs_json); bson_t doc; bson_error_t error; bool r; assert (request); r = bson_init_from_json (&doc, quotes_replaced, -1, &error); if (!r) { MONGOC_WARNING ("%s", error.message); return; } if (mock_server_get_verbose (request->server)) { printf ("%5.2f %hu <- %hu \t%s\n", mock_server_get_uptime_sec (request->server), request->client_port, mock_server_get_port (request->server), quotes_replaced); fflush (stdout); } mock_server_reply_simple (request->server, request->client, &request->request_rpc, MONGOC_REPLY_NONE, &doc, cursor_id); bson_destroy (&doc); bson_free (quotes_replaced); }
static void read_prefs_handler (mock_server_t *server, mongoc_stream_t *stream, mongoc_rpc_t *rpc, void *user_data) { bool *success = user_data; int32_t len; bson_iter_t iter; bson_iter_t child; bson_iter_t child2; bson_iter_t child3; bson_t b; bson_t reply = BSON_INITIALIZER; int r; if (rpc->header.opcode == MONGOC_OPCODE_QUERY) { memcpy (&len, rpc->query.query, 4); len = BSON_UINT32_FROM_LE (len); r = bson_init_static (&b, rpc->query.query, len); assert (r); r = bson_iter_init_find (&iter, &b, "$query"); assert (r); assert (BSON_ITER_HOLDS_DOCUMENT (&iter)); r = bson_iter_init_find (&iter, &b, "$readPreference"); assert (r); assert (BSON_ITER_HOLDS_DOCUMENT (&iter)); r = bson_iter_recurse (&iter, &child); assert (r); r = bson_iter_next (&child); assert (r); assert (BSON_ITER_HOLDS_UTF8 (&child)); assert (!strcmp ("mode", bson_iter_key (&child))); assert (!strcmp ("secondaryPreferred", bson_iter_utf8 (&child, NULL))); r = bson_iter_next (&child); assert (r); assert (BSON_ITER_HOLDS_ARRAY (&child)); r = bson_iter_recurse (&child, &child2); assert (r); r = bson_iter_next (&child2); assert (r); assert (BSON_ITER_HOLDS_DOCUMENT (&child2)); r = bson_iter_recurse (&child2, &child3); assert (r); r = bson_iter_next (&child3); assert (r); assert (BSON_ITER_HOLDS_UTF8 (&child3)); assert (!strcmp ("dc", bson_iter_key (&child3))); assert (!strcmp ("ny", bson_iter_utf8 (&child3, NULL))); r = bson_iter_next (&child3); assert (!r); r = bson_iter_next (&child2); assert (r); r = bson_iter_recurse (&child2, &child3); assert (r); r = bson_iter_next (&child3); assert (!r); mock_server_reply_simple (server, stream, rpc, MONGOC_REPLY_NONE, &reply); *success = true; } }