diff --git a/src/backend/postgres/test/test-db.c b/src/backend/postgres/test/test-db.c index 4421bbeeba..d876436d84 100644 --- a/src/backend/postgres/test/test-db.c +++ b/src/backend/postgres/test/test-db.c @@ -20,7 +20,7 @@ save_xml_file (GNCSession *session, const char *filename_base) char cwd[1024]; char *filename; - g_return_if_fail (session && filename); + g_return_if_fail (session && filename_base); getcwd (cwd, sizeof (cwd)); @@ -51,66 +51,206 @@ save_xml_files (GNCSession *session_1, GNCSession *session_2) save_xml_file (session_2, "test_file_2"); } -static void -run_test (void) +static char * +db_file_url (const char *db_name, const char *mode) +{ + g_return_val_if_fail (db_name && mode, NULL); + + return g_strdup_printf ("postgres://localhost:7777/%s?mode=%s", + db_name, mode); +} + +static gboolean +save_db_file (GNCSession *session, const char *db_name, const char *mode) { - GNCSession *session; - GNCSession *session_db; GNCBackendError io_err; char *filename; - gboolean ok; - session = get_random_session (); + g_return_val_if_fail (session && db_name && mode, FALSE); - add_random_transactions_to_session (session, - get_random_int_in_range (1, 20)); - - filename = g_strdup ("postgres://localhost:7777/gnc_test?mode=single-file"); + filename = db_file_url (db_name, mode); gnc_session_begin (session, filename, FALSE, TRUE); io_err = gnc_session_get_error (session); - if (!do_test (io_err == ERR_BACKEND_NO_ERR, "Beginning gnc_test")) - return; + if (!do_test_args (io_err == ERR_BACKEND_NO_ERR, + "Beginning db session", + __FILE__, __LINE__, + "can't begin session for %s in mode %s", + db_name, mode)) + return FALSE; gnc_session_save (session); io_err = gnc_session_get_error (session); - if (!do_test (io_err == ERR_BACKEND_NO_ERR, "Saving gnc_test")) - return; + if (!do_test_args (io_err == ERR_BACKEND_NO_ERR, + "Saving db session", + __FILE__, __LINE__, + "can't save session for %s in mode %s", + db_name, mode)) + return FALSE; gnc_session_end (session); io_err = gnc_session_get_error (session); - if (!do_test (io_err == ERR_BACKEND_NO_ERR, "Ending gnc_test")) - return; + if (!do_test_args (io_err == ERR_BACKEND_NO_ERR, + "Ending db session", + __FILE__, __LINE__, + "can't end session for %s in mode %s", + db_name, mode)) + return FALSE; - if (!do_test (gnc_session_get_url (session) == NULL, "session url not NULL")) - return; + do_test (gnc_session_get_url (session) == NULL, "session url not NULL"); - session_db = gnc_session_new (); + g_free (filename); - gnc_session_begin (session_db, filename, FALSE, FALSE); - io_err = gnc_session_get_error (session_db); - if (!do_test (io_err == ERR_BACKEND_NO_ERR, "Beginning gnc_test load")) - return; + return TRUE; +} - gnc_session_load (session_db); - io_err = gnc_session_get_error (session_db); - if (!do_test (io_err == ERR_BACKEND_NO_ERR, "Loading gnc_test")) - return; +static gboolean +load_db_file (GNCSession *session, const char *db_name, const char *mode) +{ + GNCBackendError io_err; + char *filename; - gnc_session_end (session_db); - io_err = gnc_session_get_error (session_db); - if (!do_test (io_err == ERR_BACKEND_NO_ERR, "Ending gnc_test load")) - return; + g_return_val_if_fail (session && db_name && mode, FALSE); + + filename = db_file_url (db_name, mode); + + 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 in mode %s", + db_name, mode)) + 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 in mode %s", + db_name, mode)) + return FALSE; + + gnc_session_end (session); + io_err = gnc_session_get_error (session); + if (!do_test_args (io_err == ERR_BACKEND_NO_ERR, + "Ending db session", + __FILE__, __LINE__, + "can't end session for %s in mode %s", + db_name, mode)) + return FALSE; + + do_test (gnc_session_get_url (session) == NULL, "session url not NULL"); + + g_free (filename); + + return TRUE; +} + +static gboolean +test_access (const char *db_name, const char *mode, gboolean multi_user) +{ + GNCBackendError io_err; + GNCSession *session_1; + GNCSession *session_2; + char *filename; + + g_return_val_if_fail (db_name && mode, FALSE); + + filename = db_file_url (db_name, mode); + + session_1 = gnc_session_new (); + + gnc_session_begin (session_1, filename, FALSE, FALSE); + io_err = gnc_session_get_error (session_1); + if (!do_test_args (io_err == ERR_BACKEND_NO_ERR, + "Beginning db session", + __FILE__, __LINE__, + "can't begin session for %s in mode %s", + db_name, mode)) + return FALSE; + + session_2 = gnc_session_new (); + + gnc_session_begin (session_1, filename, FALSE, FALSE); + io_err = gnc_session_get_error (session_1); + + if (multi_user) + { + if (!do_test_args (io_err == ERR_BACKEND_NO_ERR, + "Beginning second multi-user db session", + __FILE__, __LINE__, + "can't begin second session for %s in mode %s", + db_name, mode)) + return FALSE; + } + else + { + if (!do_test_args (io_err != ERR_BACKEND_NO_ERR, + "Beginning second single-user db session", + __FILE__, __LINE__, + "began second session for %s in mode %s", + db_name, mode)) + return FALSE; + } + + gnc_session_destroy (session_1); + gnc_session_destroy (session_2); + + return TRUE; +} + +static gboolean +test_mode (const char *db_name, const char *mode, + gboolean updates, gboolean multi_user) +{ + GNCSession *session; + GNCSession *session_db; + gboolean ok; + + session = get_random_session (); + + add_random_transactions_to_session (session, + get_random_int_in_range (1, 20)); + + if (!save_db_file (session, db_name, mode)) + return FALSE; + + session_db = gnc_session_new (); + + if (!load_db_file (session_db, db_name, mode)) + return FALSE; ok = gnc_book_equal (gnc_session_get_book (session), gnc_session_get_book (session_db)); - do_test (ok, "Books not equal"); + do_test_args (ok, "Books equal", __FILE__, __LINE__, + "Books not equal for session %s in mode %s", + db_name, mode); if (!ok) + { save_xml_files (session, session_db); + return FALSE; + } - g_free (filename); + ok = test_access (db_name, mode, multi_user); + + gnc_session_destroy (session); + gnc_session_destroy (session_db); + + return ok; +} + +static void +run_test (void) +{ + if (!test_mode ("single_file", "single-file", FALSE, FALSE)) + return; + + if (!test_mode ("single_update", "single-update", FALSE, FALSE)) + return; } static void