예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #3
0
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;
}
예제 #4
0
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;
    }
}