diff options
Diffstat (limited to 'tests/func/mongo/sync-cursor')
-rw-r--r-- | tests/func/mongo/sync-cursor/f_sync_cursor_iterate.c | 88 | ||||
-rw-r--r-- | tests/func/mongo/sync-cursor/f_sync_cursor_tailable.c | 115 |
2 files changed, 203 insertions, 0 deletions
diff --git a/tests/func/mongo/sync-cursor/f_sync_cursor_iterate.c b/tests/func/mongo/sync-cursor/f_sync_cursor_iterate.c new file mode 100644 index 0000000..56ccb77 --- /dev/null +++ b/tests/func/mongo/sync-cursor/f_sync_cursor_iterate.c @@ -0,0 +1,88 @@ +#include "test.h" +#include <mongo.h> + +#include <errno.h> +#include <string.h> + +void +test_func_mongo_sync_cursor_iterate (void) +{ + mongo_sync_connection *conn; + bson *query, *result; + mongo_sync_cursor *sc; + bson_cursor *c; + gint i; + gint32 first_i32 = -1, last_i32 = -1, current_i32 = -1; + gboolean early_break = FALSE, continous = TRUE; + + conn = mongo_sync_connect (config.primary_host, config.primary_port, FALSE); + + for (i = 0; i < 10; i++) + { + bson *data = bson_new (); + bson_append_boolean (data, "f_sync_cursor_iterate", TRUE); + bson_append_int32 (data, "i32", 42 * 100 + i); + bson_finish (data); + + mongo_sync_cmd_insert (conn, config.ns, data, NULL); + bson_free (data); + } + + query = bson_new (); + bson_append_boolean (query, "f_sync_cursor_iterate", TRUE); + bson_finish (query); + + sc = mongo_sync_cursor_new (conn, config.ns, + mongo_sync_cmd_query (conn, config.ns, 0, 0, 3, + query, NULL)); + bson_free (query); + + ok (sc != NULL, + "mongo_sync_cursor_new() works"); + + result = mongo_sync_cursor_get_data (sc); + ok (result == NULL, + "mongo_sync_cursor_get_data() should fail without _cursor_next()"); + + i = 0; + while (mongo_sync_cursor_next (sc) && i < 10) + { + result = mongo_sync_cursor_get_data (sc); + + if (!result) + { + early_break = TRUE; + break; + } + i++; + c = bson_find (result, "i32"); + bson_cursor_get_int32 (c, ¤t_i32); + bson_cursor_free (c); + bson_free (result); + + if (first_i32 == -1) + { + first_i32 = current_i32; + last_i32 = first_i32 - 1; + } + + if (current_i32 != last_i32 + 1) + continous = FALSE; + last_i32 = current_i32; + } + + ok (early_break == FALSE, + "mongo_sync_cursor_next() can iterate over the whole stuff"); + ok (continous == TRUE, + "mongo_sync_cursor_next() iterates over all elements"); + + cmp_ok (first_i32, "!=", last_i32, + "Iteration returns different elements, as expected"); + cmp_ok (i, ">=", 10, + "Iteration really does return all documents"); + + mongo_sync_cursor_free (sc); + mongo_sync_disconnect (conn); +} + +RUN_NET_TEST (6, func_mongo_sync_cursor_iterate); diff --git a/tests/func/mongo/sync-cursor/f_sync_cursor_tailable.c b/tests/func/mongo/sync-cursor/f_sync_cursor_tailable.c new file mode 100644 index 0000000..c200ed8 --- /dev/null +++ b/tests/func/mongo/sync-cursor/f_sync_cursor_tailable.c @@ -0,0 +1,115 @@ +#include "test.h" +#include <mongo.h> + +#include <errno.h> +#include <string.h> + +void +test_func_mongo_sync_cursor_tailable (void) +{ + mongo_sync_connection *conn; + bson *query, *data; + mongo_sync_cursor *sc, *tc; + mongo_packet *p; + gint i; + gchar *capped_ns, *capped_coll; + + bson_cursor *c; + gboolean tailed = FALSE; + + conn = mongo_sync_connect (config.primary_host, config.primary_port, FALSE); + + query = bson_new (); + bson_finish (query); + + p = mongo_sync_cmd_query (conn, config.ns, + MONGO_WIRE_FLAG_QUERY_TAILABLE_CURSOR | + MONGO_WIRE_FLAG_QUERY_NO_CURSOR_TIMEOUT, + 0, 3, query, NULL); + ok (p == NULL, + "Tailable cursors should not work on non-capped collections"); + + capped_coll = g_strconcat (config.coll, ".capped", NULL); + capped_ns = g_strconcat (config.ns, ".capped", NULL); + + query = bson_build (BSON_TYPE_STRING, "create", capped_coll, -1, + BSON_TYPE_BOOLEAN, "capped", TRUE, + BSON_TYPE_INT32, "size", 64 * 1024 * 10, + BSON_TYPE_NONE); + bson_finish (query); + + mongo_sync_cmd_drop (conn, config.db, capped_coll); + p = mongo_sync_cmd_custom (conn, config.db, query); + bson_free (query); + + ok (p != NULL, + "Creating a capped collection works"); + mongo_wire_packet_free (p); + + for (i = 0; i < 10; i++) + { + data = bson_new (); + bson_append_boolean (data, "f_sync_cursor_tailable", TRUE); + bson_append_int32 (data, "i32", 42 * 1000 + i); + bson_finish (data); + + mongo_sync_cmd_insert (conn, capped_ns, data, NULL); + bson_free (data); + } + + query = bson_new (); + bson_append_boolean (query, "f_sync_cursor_tailable", TRUE); + bson_finish (query); + + tc = mongo_sync_cursor_new (conn, capped_ns, + mongo_sync_cmd_query (conn, capped_ns, + MONGO_WIRE_FLAG_QUERY_TAILABLE_CURSOR | + MONGO_WIRE_FLAG_QUERY_NO_CURSOR_TIMEOUT, + 0, 3, query, NULL)); + + sc = mongo_sync_cursor_new (conn, capped_ns, + mongo_sync_cmd_query (conn, capped_ns, + 0, + 0, 3, query, NULL)); + + bson_free (query); + + /* Exhaust both queries */ + for (i = 0; i < 10; i++) + { + mongo_sync_cursor_next (tc); + mongo_sync_cursor_next (sc); + } + + data = bson_new (); + bson_append_boolean (data, "f_sync_cursor_tailable", TRUE); + bson_append_boolean (data, "tailed", TRUE); + bson_finish (data); + + mongo_sync_cmd_insert (conn, capped_ns, data, NULL); + bson_free (data); + + ok (mongo_sync_cursor_next (tc) == TRUE, + "mongo_sync_cursor_next() works after a tailable cursor got new data"); + ok (mongo_sync_cursor_next (sc) == FALSE, + "mongo_sync_cursor_next() fails on a non-tailable cursor"); + + data = mongo_sync_cursor_get_data (tc); + ok (data != NULL, + "mongo_sync_cursor_get_data() works on a tailable cursor"); + c = bson_find (data, "tailed"); + bson_cursor_get_boolean (c, &tailed); + ok (tailed == TRUE, + "We got the appropriate data back!"); + bson_cursor_free (c); + + mongo_sync_cursor_free (sc); + mongo_sync_cursor_free (tc); + + mongo_sync_cmd_drop (conn, config.db, capped_coll); + g_free (capped_ns); + g_free (capped_coll); + mongo_sync_disconnect (conn); +} + +RUN_NET_TEST (6, func_mongo_sync_cursor_tailable); |