diff --git a/src/backend/postgres/test/test-db.c b/src/backend/postgres/test/test-db.c index 8cbfa253c2..9dc809ff48 100644 --- a/src/backend/postgres/test/test-db.c +++ b/src/backend/postgres/test/test-db.c @@ -180,7 +180,7 @@ test_access (const char *db_name, const char *mode, gboolean multi_user) session_2 = gnc_session_new (); gnc_session_begin (session_2, filename, FALSE, FALSE); - io_err = gnc_session_get_error (session_1); + io_err = gnc_session_get_error (session_2); if (multi_user) { @@ -409,6 +409,138 @@ test_updates (GNCSession *session, const char *db_name, const char *mode, g_free (filename); } +static gboolean +num_trans_helper (Transaction *trans, gpointer data) +{ + int *num = data; + + *num += 1; + + return TRUE; +} + +static int +session_num_trans (GNCSession *session) +{ + AccountGroup *group; + GNCBook *book; + int num = 0; + + g_return_val_if_fail (session, 0); + + book = gnc_session_get_book (session); + group = gnc_book_get_group (book); + + xaccGroupForEachTransaction (group, num_trans_helper, &num); + + return num; +} + +typedef struct +{ + GNCSession *session_base; + const char *db_name; + const char *mode; + gint loaded; + gint total; +} QueryTestData; + +static gboolean +test_trans_query (Transaction *trans, gpointer data) +{ + QueryTestData *qtd = data; + GNCBackendError io_err; + GNCSession *session; + AccountGroup *group; + char *filename; + GNCBook *book; + GList *list; + Query *q; + + filename = db_file_url (qtd->db_name, qtd->mode); + + session = gnc_session_new (); + + gnc_session_begin (session, filename, FALSE, FALSE); + io_err = gnc_session_get_error (session); + if (!do_test_args (io_err == ERR_BACKEND_NO_ERR, + "Beginning db session", + __FILE__, __LINE__, + "can't begin session for %s", + filename)) + return FALSE; + + gnc_session_load (session); + io_err = gnc_session_get_error (session); + if (!do_test_args (io_err == ERR_BACKEND_NO_ERR, + "Loading db session", + __FILE__, __LINE__, + "can't load session for %s", + filename)) + return FALSE; + + book = gnc_session_get_book (session); + group = gnc_book_get_group (book); + + q = make_trans_query (trans); + xaccQuerySetGroup (q, group); + + list = xaccQueryGetTransactions (q, QUERY_MATCH_ANY); + if (g_list_length (list) != 1) + { + failure_args ("test num returned", __FILE__, __LINE__, + "number of matching transactions %d not 1", + g_list_length (list)); + return FALSE; + } + + qtd->loaded += session_num_trans (session); + qtd->total += session_num_trans (qtd->session_base); + + if (!xaccTransEqual (trans, list->data, TRUE, TRUE)) + { + failure ("matching transaction is wrong"); + return FALSE; + } + + success ("found right transaction"); + + xaccFreeQuery (q); + gnc_session_destroy (session); + g_free (filename); + + return TRUE; +} + +static gboolean +test_queries (GNCSession *session_base, const char *db_name, const char *mode) +{ + QueryTestData qtd; + AccountGroup *group; + GNCBook *book; + gboolean ok; + + g_return_val_if_fail (db_name && mode, FALSE); + + book = gnc_session_get_book (session_base); + group = gnc_book_get_group (book); + + qtd.session_base = session_base; + qtd.db_name = db_name; + qtd.mode = mode; + qtd.loaded = 0; + qtd.total = 0; + + ok = xaccGroupForEachTransaction (group, test_trans_query, &qtd); + +#if 0 + g_warning ("average percentage loaded = %3.2f%%", + (qtd.loaded / (double) qtd.total) * 100.0); +#endif + + return ok; +} + static gboolean test_mode (const char *db_name, const char *mode, gboolean updates, gboolean multi_user) @@ -419,8 +551,7 @@ test_mode (const char *db_name, const char *mode, session = get_random_session (); - add_random_transactions_to_session (session, - get_random_int_in_range (10, 20)); + add_random_transactions_to_session (session, 20); if (!save_db_file (session, db_name, "single-update")) return FALSE; @@ -466,6 +597,9 @@ test_mode (const char *db_name, const char *mode, if (updates && !test_updates (session_db, db_name, mode, multi_user)) return FALSE; + if (multi_user && !test_queries (session_db, db_name, mode)) + return FALSE; + gnc_session_destroy (session); gnc_session_destroy (session_db); @@ -478,13 +612,22 @@ run_test (void) #if 0 if (!test_mode ("single_file", "single-file", FALSE, FALSE)) return; +#endif +#if 0 if (!test_mode ("single_update", "single-update", TRUE, FALSE)) return; #endif +#if 0 if (!test_mode ("multi_user", "multi-user", TRUE, TRUE)) return; +#endif + +#if 1 + if (!test_mode ("multi_user_poll", "multi-user-poll", TRUE, TRUE)) + return; +#endif } static void @@ -506,10 +649,13 @@ guile_main (int argc, char **argv) set_max_kvp_frame_elements (3); set_max_group_depth (3); - set_max_group_accounts (5); + set_max_group_accounts (3); random_timespec_zero_nsec (TRUE); + /* Querying on exact prices is problematic. */ + trans_query_include_price (FALSE); + xaccLogDisable (); run_test ();