r23169 - gnucash/trunk/src/backend/dbi/test - Re-enable dbi backend basic tests with g_tester
John Ralls
jralls at code.gnucash.org
Sun Sep 15 13:48:55 EDT 2013
Author: jralls
Date: 2013-09-15 13:48:54 -0400 (Sun, 15 Sep 2013)
New Revision: 23169
Trac: http://svn.gnucash.org/trac/changeset/23169
Added:
gnucash/trunk/src/backend/dbi/test/test-backend-dbi-basic.c
Removed:
gnucash/trunk/src/backend/dbi/test/test-dbi-basic.c
gnucash/trunk/src/backend/dbi/test/test-dbi-business.c
gnucash/trunk/src/backend/dbi/test/test-dbi.c
gnucash/trunk/src/backend/dbi/test/test-load-backend.c
gnucash/trunk/src/backend/dbi/test/utest-backend-dbi-basic.c
gnucash/trunk/src/backend/dbi/test/utest-backend-dbi-business.c
Modified:
gnucash/trunk/src/backend/dbi/test/Makefile.am
gnucash/trunk/src/backend/dbi/test/test-backend-dbi.c
gnucash/trunk/src/backend/dbi/test/test-dbi-business-stuff.c
gnucash/trunk/src/backend/dbi/test/test-dbi-business-stuff.h
gnucash/trunk/src/backend/dbi/test/test-dbi-stuff.c
gnucash/trunk/src/backend/dbi/test/test-dbi-stuff.h
Log:
Re-enable dbi backend basic tests with g_tester
Combining business and basic into renamed test-backend-dbi-basic--
not utest because these are integration tests rather than unit tests.
Remove all of the no-longer-used test program files.
The actual test routines remain in test-dbi-stuff.c and test-dbi-business.c
just to keep the size of test-backend-dbi-basic.c reasonable.
Modified: gnucash/trunk/src/backend/dbi/test/Makefile.am
===================================================================
--- gnucash/trunk/src/backend/dbi/test/Makefile.am 2013-09-14 18:25:55 UTC (rev 23168)
+++ gnucash/trunk/src/backend/dbi/test/Makefile.am 2013-09-15 17:48:54 UTC (rev 23169)
@@ -61,8 +61,7 @@
test_backend_dbi_SOURCES = \
test-backend-dbi.c \
- utest-backend-dbi-basic.c \
- utest-backend-dbi-business.c \
+ test-backend-dbi-basic.c \
test-dbi-stuff.c \
test-dbi-business-stuff.c
Added: gnucash/trunk/src/backend/dbi/test/test-backend-dbi-basic.c
===================================================================
--- gnucash/trunk/src/backend/dbi/test/test-backend-dbi-basic.c (rev 0)
+++ gnucash/trunk/src/backend/dbi/test/test-backend-dbi-basic.c 2013-09-15 17:48:54 UTC (rev 23169)
@@ -0,0 +1,585 @@
+/*
+ * utest-backend-dbi-basic.c
+ *
+ * Created on: 2011-04-23
+ * Author: phil
+ */
+
+#include "config.h"
+
+#include <glib/gstdio.h>
+
+#include <qof.h>
+#include <unittest-support.h>
+#include <test-stuff.h>
+#include <test-dbi-stuff.h>
+#include <test-dbi-business-stuff.h>
+/* For cleaning up the database */
+#include <dbi/dbi.h>
+#include <gnc-uri-utils.h>
+/* For setup_business */
+#include "Account.h"
+#include <TransLog.h>
+#include "Transaction.h"
+#include "Split.h"
+#include "gnc-commodity.h"
+#include "gncAddress.h"
+#include "gncCustomer.h"
+#include "gncInvoice.h"
+/* For test_conn_index_functions */
+#include "../gnc-backend-dbi-priv.h"
+/* For version_control */
+#include <gnc-core-prefs.h>
+#include <qofsession-p.h>
+
+static const gchar* suitename = "/backend/dbi";
+void test_suite_gnc_backend_dbi (void);
+
+typedef struct
+{
+ QofSession *session;
+ gchar *filename;
+ GSList *hdlrs;
+} Fixture;
+
+static void
+setup (Fixture *fixture, gconstpointer pData)
+{
+ gchar *url = (gchar *)pData;
+ fixture->session = qof_session_new();
+ /* When running distcheck the source directory is read-only, which
+ * prevents creating the lock file. Force the session to get
+ * around that.
+ */
+ qof_session_begin (fixture->session, DBI_TEST_XML_FILENAME, TRUE,
+ FALSE, TRUE);
+ g_assert_cmpint (qof_session_get_error (fixture->session), ==,
+ ERR_BACKEND_NO_ERR);
+ qof_session_load (fixture->session, NULL);
+
+ if (g_strcmp0 (url, "sqlite3") == 0)
+ fixture->filename = tempnam ("/tmp", "test-sqlite3-");
+ else
+ fixture->filename = NULL;
+}
+
+static void
+setup_memory (Fixture *fixture, gconstpointer pData)
+{
+ QofSession* session = qof_session_new();
+ gchar *url = (gchar*)pData;
+ QofBook* book;
+ Account *root, *acct1, *acct2;
+ KvpFrame* frame;
+ Transaction* tx;
+ Split *spl1, *spl2;
+ Timespec ts;
+ struct timeval tv;
+ gnc_commodity_table* table;
+ gnc_commodity* currency;
+
+ session = qof_session_new();
+ book = qof_session_get_book (session);
+ root = gnc_book_get_root_account (book);
+
+ table = gnc_commodity_table_get_table (book);
+ currency = gnc_commodity_table_lookup (table, GNC_COMMODITY_NS_CURRENCY, "CAD");
+
+ acct1 = xaccMallocAccount (book);
+ xaccAccountSetType (acct1, ACCT_TYPE_BANK);
+ xaccAccountSetName (acct1, "Bank 1");
+ xaccAccountSetCommodity (acct1, currency);
+
+ frame = qof_instance_get_slots (QOF_INSTANCE(acct1));
+ kvp_frame_set_gint64 (frame, "int64-val", 100);
+ kvp_frame_set_double (frame, "double-val", 3.14159);
+ kvp_frame_set_numeric (frame, "numeric-val", gnc_numeric_zero());
+
+ time (&(tv.tv_sec));
+ tv.tv_usec = 0;
+ ts.tv_sec = tv.tv_sec;
+ ts.tv_nsec = 1000 * tv.tv_usec;
+ kvp_frame_set_timespec (frame, "timespec-val", ts);
+
+ kvp_frame_set_string (frame, "string-val", "abcdefghijklmnop");
+ kvp_frame_set_guid (frame, "guid-val", qof_instance_get_guid (QOF_INSTANCE(acct1)));
+
+ gnc_account_append_child (root, acct1);
+
+ acct2 = xaccMallocAccount (book);
+ xaccAccountSetType (acct2, ACCT_TYPE_BANK);
+ xaccAccountSetName (acct2, "Bank 1");
+
+ tx = xaccMallocTransaction (book);
+ xaccTransBeginEdit (tx);
+ xaccTransSetCurrency (tx, currency);
+ spl1 = xaccMallocSplit (book);
+ xaccTransAppendSplit (tx, spl1);
+ spl2 = xaccMallocSplit (book);
+ xaccTransAppendSplit (tx, spl2);
+ xaccTransCommitEdit (tx);
+
+ fixture->session = session;
+ if (g_strcmp0 (url, "sqlite3") == 0)
+ fixture->filename = tempnam ("/tmp", "test-sqlite3-");
+ else
+ fixture->filename = NULL;
+}
+
+static void
+setup_business (Fixture *fixture, gconstpointer pData)
+{
+ QofSession* session = qof_session_new();
+ gchar *url = (gchar*)pData;
+ QofBook* book = qof_session_get_book (session);
+ Account* root = gnc_book_get_root_account (book);
+ Account* acct1;
+ Account* acct2;
+ gnc_commodity_table* table;
+ gnc_commodity* currency;
+ GncAddress* addr;
+ GncCustomer* cust;
+ GncEmployee* emp;
+ GncTaxTable* tt;
+ GncTaxTableEntry* tte;
+
+ table = gnc_commodity_table_get_table (book);
+ currency = gnc_commodity_table_lookup (table, GNC_COMMODITY_NS_CURRENCY, "CAD");
+
+ acct1 = xaccMallocAccount (book);
+ xaccAccountSetType (acct1, ACCT_TYPE_BANK);
+ xaccAccountSetName (acct1, "Bank 1");
+ xaccAccountSetCommodity (acct1, currency);
+ xaccAccountSetHidden (acct1, FALSE);
+ xaccAccountSetPlaceholder (acct1, FALSE);
+ gnc_account_append_child (root, acct1);
+
+ acct2 = xaccMallocAccount (book);
+ xaccAccountSetType (acct2, ACCT_TYPE_BANK);
+ xaccAccountSetName (acct2, "Bank 2");
+ xaccAccountSetCommodity (acct2, currency);
+ xaccAccountSetHidden (acct2, FALSE);
+ xaccAccountSetPlaceholder (acct2, FALSE);
+ gnc_account_append_child (root, acct2);
+
+ tt = gncTaxTableCreate (book);
+ gncTaxTableSetName (tt, "tt");
+ tte = gncTaxTableEntryCreate();
+ gncTaxTableEntrySetAccount (tte, acct1);
+ gncTaxTableEntrySetType (tte, GNC_AMT_TYPE_VALUE);
+ gncTaxTableEntrySetAmount (tte, gnc_numeric_zero());
+ gncTaxTableAddEntry (tt, tte);
+ tte = gncTaxTableEntryCreate();
+ gncTaxTableEntrySetAccount (tte, acct2);
+ gncTaxTableEntrySetType (tte, GNC_AMT_TYPE_PERCENT);
+ gncTaxTableEntrySetAmount (tte, gnc_numeric_zero());
+ gncTaxTableAddEntry (tt, tte);
+
+ cust = gncCustomerCreate (book);
+ gncCustomerSetID (cust, "0001");
+ gncCustomerSetName (cust, "MyCustomer");
+ gncCustomerSetNotes (cust, "Here are some notes");
+ gncCustomerSetCurrency (cust, currency);
+ addr = gncAddressCreate (book, QOF_INSTANCE(cust));
+ gncAddressSetName (addr, "theAddress");
+ gncAddressSetAddr1 (addr, "Address line #1");
+ gncAddressSetAddr2 (addr, "Address line #2");
+ gncAddressSetAddr3 (addr, "Address line #3");
+ gncAddressSetAddr4 (addr, "Address line #4");
+ gncAddressSetPhone (addr, "(123) 555-1212");
+ gncAddressSetPhone (addr, "(123) 555-2121");
+ gncAddressSetEmail (addr, "cust at mycustomer.com");
+
+ emp = gncEmployeeCreate (book);
+ gncEmployeeSetID (emp, "0001");
+ gncEmployeeSetUsername (emp, "gnucash");
+ gncEmployeeSetLanguage (emp, "english");
+ gncEmployeeSetCurrency (emp, currency);
+
+ fixture->session = session;
+ if (g_strcmp0 (url, "sqlite3") == 0)
+ fixture->filename = tempnam ("/tmp", "test-sqlite3-");
+ else
+ fixture->filename = NULL;
+}
+
+static void
+drop_table (gconstpointer tdata, gconstpointer cdata)
+{
+ gchar *table = (gchar*)tdata;
+ dbi_conn conn = (dbi_conn)cdata;
+ gchar *query = g_strdup_printf ("DROP TABLE %s", table);
+ dbi_result rslt = dbi_conn_query (conn, query);
+ g_free (query);
+}
+
+static void
+destroy_database (gchar* url)
+{
+ gchar *protocol = NULL;
+ gchar *host = NULL;
+ gchar *dbname = NULL;
+ gchar *username = NULL;
+ gchar *password = NULL;
+ gchar *basename = NULL;
+ gint portnum = 0;
+ gchar *port = NULL;
+ dbi_conn conn = NULL;
+ gchar *errfmt = "Unable to delete tables in %s: %s";
+ gint fail = 0;
+ dbi_result tables;
+ GSList *list = NULL;
+
+ gnc_uri_get_components (url, &protocol, &host, &portnum,
+ &username, &password, &dbname);
+ conn = dbi_conn_new (protocol);
+ port = g_strdup_printf ("%d", portnum);
+ if (conn == NULL)
+ {
+ g_printf (errfmt, url, "failed to create connection");
+ return;
+ }
+ fail = dbi_conn_set_option (conn, "host", host);
+ if (!fail)
+ fail = dbi_conn_set_option (conn, "port", port);
+ if (!fail)
+ fail = dbi_conn_set_option (conn, "dbname", dbname);
+ if (!fail)
+ fail = dbi_conn_set_option (conn, "username", username);
+ if (!fail)
+ fail = dbi_conn_set_option (conn, "password", password);
+ if (!fail)
+ fail = dbi_conn_set_option (conn, "encoding", "UTF-8");
+ g_free (port);
+ if (fail != 0)
+ {
+ g_printf (errfmt, url, "failed to set an option");
+ dbi_conn_close (conn);
+ return;
+ }
+ fail = dbi_conn_connect (conn);
+ if (fail != 0)
+ {
+ const gchar *error;
+ gint errnum = dbi_conn_error (conn, &error);
+ g_printf (errfmt, url, error);
+ dbi_conn_close (conn);
+ return;
+ }
+ tables = dbi_conn_get_table_list (conn, dbname, NULL);
+ while (dbi_result_next_row (tables) != 0)
+ {
+ const gchar *table = dbi_result_get_string_idx (tables, 1);
+ list = g_slist_prepend (list, g_strdup (table));
+ }
+ dbi_result_free (tables);
+ g_slist_foreach (list, (GFunc)drop_table, (gpointer)conn);
+ g_slist_free_full (list, (GDestroyNotify)g_free);
+}
+
+static void
+teardown (Fixture *fixture, gconstpointer pData)
+{
+ gchar *lockfile = g_strdup_printf ("%s/test-dbi.xml.LCK",
+ g_dirname (DBI_TEST_XML_FILENAME));
+ gchar *msg = g_strdup_printf ("[xml_session_end()] Error on g_unlink(%s): 2: No such file or directory", lockfile);
+ gchar *logdomain = "gnc.backend";
+ guint loglevel = G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL;
+ TestErrorStruct *check = test_error_struct_new (logdomain, loglevel, msg);
+ fixture->hdlrs = test_log_set_fatal_handler (fixture->hdlrs, check,
+ (GLogFunc)test_checked_handler);
+ qof_session_end (fixture->session);
+ qof_session_destroy (fixture->session);
+ if (fixture->filename)
+ g_unlink (fixture->filename);
+ else
+ destroy_database ((gchar*)pData);
+
+ g_free (msg);
+ g_free (lockfile);
+ g_slist_free_full (fixture->hdlrs, test_free_log_handler);
+ test_clear_error_list();
+}
+
+
+static void
+test_conn_index_functions (QofBackend *qbe)
+{
+ GncDbiBackend *be = (GncDbiBackend*)qbe;
+ GncDbiSqlConnection *conn = (GncDbiSqlConnection*)(be->sql_be.conn);
+ GSList *index_list, *iter;
+
+ index_list = conn->provider->get_index_list (be->conn);
+ g_test_message ("Returned from index list\n");
+ g_assert (index_list != NULL);
+ g_assert_cmpint (g_slist_length (index_list), ==, 4);
+ for (iter = index_list; iter != NULL; iter = g_slist_next (iter))
+ {
+ const char *errmsg;
+ conn->provider->drop_index (be->conn, iter->data);
+ g_assert (DBI_ERROR_NONE == dbi_conn_error (conn->conn, &errmsg));
+ }
+
+ g_slist_free (index_list);
+}
+
+/* Given a synthetic session, use the same logic as
+ * QofSession::save_as to save it to a specified sql url, then load it
+ * back and compare. */
+static void
+test_dbi_store_and_reload (Fixture *fixture, gconstpointer pData)
+{
+
+ const gchar* url = (const gchar*)pData;
+ QofSession* session_2;
+ QofSession* session_3;
+ QofBackend *be;
+
+ gchar *msg = "[gnc_dbi_unlock()] There was no lock entry in the Lock table";
+ gchar *log_domain = "gnc.backend.dbi";
+ guint loglevel = G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL;
+ TestErrorStruct *check = test_error_struct_new (log_domain, loglevel, msg);
+ fixture->hdlrs = test_log_set_fatal_handler (fixture->hdlrs, check,
+ (GLogFunc)test_checked_handler);
+ if (fixture->filename)
+ url = fixture->filename;
+
+ // Save the session data
+ session_2 = qof_session_new();
+ qof_session_begin (session_2, url, FALSE, TRUE, TRUE);
+ g_assert (session_2 != NULL);
+ g_assert_cmpint (qof_session_get_error (session_2), ==, ERR_BACKEND_NO_ERR);
+ qof_session_swap_data (fixture->session, session_2);
+ qof_session_save (session_2, NULL);
+ g_assert (session_2 != NULL);
+ g_assert_cmpint (qof_session_get_error (session_2), ==, ERR_BACKEND_NO_ERR);
+
+ // Reload the session data
+ session_3 = qof_session_new();
+ g_assert (session_3 != NULL);
+ qof_session_begin (session_3, url, TRUE, FALSE, FALSE);
+ g_assert (session_3 != NULL);
+ g_assert_cmpint (qof_session_get_error (session_3), ==, ERR_BACKEND_NO_ERR);
+ qof_session_load (session_3, NULL);
+ g_assert (session_3 != NULL);
+ g_assert_cmpint (qof_session_get_error (session_3), ==, ERR_BACKEND_NO_ERR);
+ // Compare with the original data
+ compare_books (qof_session_get_book (session_2),
+ qof_session_get_book (session_3));
+/* fixture->session belongs to the fixture and teardown() will clean it up */
+ qof_session_end (session_2);
+ qof_session_destroy (session_2);
+ qof_session_end (session_3);
+ qof_session_destroy (session_3);
+}
+
+/** Test the safe_save mechanism. Beware that this test used on its
+ * own doesn't ensure that the resave is done safely, only that the
+ * database is intact and unchanged after the save. To observe the
+ * safety one must run the test in a debugger and break after the
+ * rename step of gnc_dbi_safe_sync, then examine the database in the
+ * appropriate shell.
+ */
+static void
+test_dbi_safe_save (Fixture *fixture, gconstpointer pData)
+{
+ gchar *url = (gchar*)pData;
+ QofSession *session_1 = NULL, *session_2 = NULL;
+ QofBackend *be;
+
+ gchar *msg = "[gnc_dbi_unlock()] There was no lock entry in the Lock table";
+ gchar *log_domain = "gnc.backend.dbi";
+ guint loglevel = G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL;
+ TestErrorStruct *check = test_error_struct_new (log_domain, loglevel, msg);
+
+ if (fixture->filename)
+ url = fixture->filename;
+
+ // Load the session data
+ session_1 = qof_session_new ();
+ qof_session_begin (session_1, url, FALSE, TRUE, TRUE);
+ if (session_1 &&
+ qof_session_get_error (session_1) != ERR_BACKEND_NO_ERR)
+ {
+ g_warning ("Session Error: %d, %s", qof_session_get_error (session_1),
+ qof_session_get_error_message (session_1));
+ g_test_message ("DB Session Creation Failed");
+ g_test_fail ();
+ goto cleanup;
+ }
+ qof_session_swap_data (fixture->session, session_1);
+ qof_session_save (session_1, NULL);
+ /* Do a safe save */
+ qof_session_safe_save (session_1, NULL);
+ if (session_1 && qof_session_get_error(session_1) != ERR_BACKEND_NO_ERR)
+ {
+ g_warning ("Session Error: %s",
+ qof_session_get_error_message(session_1));
+ g_test_message ("DB Session Safe Save Failed");
+ g_test_fail ();
+ goto cleanup;
+ }
+ /* Destroy the session and reload it */
+
+ session_2 = qof_session_new ();
+ qof_session_begin (session_2, url, TRUE, FALSE, FALSE);
+ if (session_2 &&
+ qof_session_get_error (session_2) != ERR_BACKEND_NO_ERR)
+ {
+ g_warning ("Session Error: %d, %s", qof_session_get_error(session_2),
+ qof_session_get_error_message(session_2));
+ g_test_message ("DB Session re-creation Failed");
+ g_test_fail ();
+ goto cleanup;
+ }
+ qof_session_load (session_2, NULL);
+ compare_books (qof_session_get_book (session_1),
+ qof_session_get_book (session_2));
+ be = qof_book_get_backend (qof_session_get_book (session_2));
+ test_conn_index_functions (be);
+
+cleanup:
+ fixture->hdlrs = test_log_set_fatal_handler (fixture->hdlrs, check,
+ (GLogFunc)test_checked_handler);
+ if (session_2 != NULL)
+ {
+ qof_session_end (session_2);
+ qof_session_destroy (session_2);
+ }
+ if (session_1 != NULL)
+ {
+ qof_session_end (session_1);
+ qof_session_destroy (session_1);
+ }
+ return;
+}
+/* Test the gnc_dbi_load logic that forces a newer database to be
+ * opened read-only and an older one to be safe-saved. Again, it would
+ * be better to do this starting from a fresh file, but instead we're
+ * being lazy and using an existing one. */
+static void
+test_dbi_version_control (Fixture *fixture, gconstpointer pData)
+{
+ gchar *url = (gchar*)pData;
+ QofSession *sess;
+ QofBook *book;
+ QofBackend *qbe;
+ QofBackendError err;
+ gint ourversion = gnc_core_prefs_get_long_version();
+
+ // Load the session data
+ if (fixture->filename)
+ url = fixture->filename;
+ sess = qof_session_new();
+ qof_session_begin (sess, url, FALSE, TRUE, TRUE);
+ if (sess && qof_session_get_error(sess) != ERR_BACKEND_NO_ERR)
+ {
+ g_warning ("Session Error: %d, %s", qof_session_get_error(sess),
+ qof_session_get_error_message(sess));
+ g_test_message ("DB Session Creation Failed");
+ g_test_fail ();
+ goto cleanup;
+ }
+ qof_session_swap_data (fixture->session, sess);
+ qof_session_save (sess, NULL);
+ qbe = qof_session_get_backend (sess);
+ book = qof_session_get_book (sess);
+ qof_book_begin_edit (book);
+ gnc_sql_set_table_version ((GncSqlBackend*)qbe,
+ "Gnucash", GNUCASH_RESAVE_VERSION - 1);
+ qof_book_commit_edit (book);
+ qof_session_end (sess);
+ qof_session_destroy (sess);
+ sess = qof_session_new();
+ qof_session_begin (sess, url, TRUE, FALSE, FALSE);
+ qof_session_load (sess, NULL);
+ err = qof_session_pop_error (sess);
+ g_assert_cmpint (err, ==, ERR_SQL_DB_TOO_OLD);
+ qbe = qof_session_get_backend (sess);
+ book = qof_session_get_book (sess);
+ qof_book_begin_edit (book);
+ gnc_sql_set_table_version ((GncSqlBackend*)qbe,
+ "Gnucash", ourversion);
+ gnc_sql_set_table_version ((GncSqlBackend*)qbe,
+ "Gnucash-Resave", ourversion + 1);
+ qof_book_commit_edit (book);
+ qof_session_end (sess);
+ qof_session_destroy (sess);
+ sess = qof_session_new();
+ qof_session_begin (sess, url, TRUE, FALSE, FALSE);
+ qof_session_load (sess, NULL);
+ qof_session_ensure_all_data_loaded (sess);
+ err = qof_session_pop_error (sess);
+ g_assert_cmpint (err, ==, ERR_SQL_DB_TOO_NEW);
+cleanup:
+ qbe = qof_session_get_backend (sess);
+ book = qof_session_get_book (sess);
+ qof_book_begin_edit (book);
+ gnc_sql_set_table_version ((GncSqlBackend*)qbe,
+ "Gnucash-Resave", GNUCASH_RESAVE_VERSION);
+ qof_book_commit_edit (book);
+ qof_session_end (sess);
+ qof_session_destroy (sess);
+}
+
+static void
+test_dbi_business_store_and_reload (Fixture *fixture, gconstpointer pData)
+{
+ QofSession* session_2;
+ QofSession* session_3;
+ const gchar* url = (gchar*)pData;
+
+ gchar *msg = "[gnc_dbi_unlock()] There was no lock entry in the Lock table";
+ gchar *log_domain = "gnc.backend.dbi";
+ guint loglevel = G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL;
+ TestErrorStruct *check = test_error_struct_new (log_domain, loglevel, msg);
+ if (fixture->filename)
+ url = fixture->filename;
+ // Save the session data
+ session_2 = qof_session_new();
+ qof_session_begin (session_2, url, FALSE, TRUE, TRUE);
+ qof_session_swap_data (fixture->session, session_2);
+ qof_session_save (session_2, NULL);
+
+ // Reload the session data
+ session_3 = qof_session_new();
+ qof_session_begin (session_3, url, TRUE, FALSE, FALSE);
+ qof_session_load (session_3, NULL);
+
+ // Compare with the original data
+ compare_business_books (qof_session_get_book (session_2), qof_session_get_book (session_3));
+ qof_session_end (session_2);
+ qof_session_destroy (session_2);
+
+ fixture->hdlrs = test_log_set_fatal_handler (fixture->hdlrs, check,
+ (GLogFunc)test_checked_handler);
+ qof_session_end (session_3);
+ qof_session_destroy (session_3);
+}
+
+static void
+create_dbi_test_suite (gchar *dbm_name, gchar *url)
+{
+ gchar *subsuite = g_strdup_printf ("%s/%s", suitename, dbm_name);
+ GNC_TEST_ADD (subsuite, "store_and_reload", Fixture, url, setup,
+ test_dbi_store_and_reload, teardown);
+ GNC_TEST_ADD (subsuite, "safe_save", Fixture, url, setup_memory,
+ test_dbi_safe_save, teardown);
+ GNC_TEST_ADD (subsuite, "version_control", Fixture, url, setup_memory,
+ test_dbi_version_control, teardown);
+ GNC_TEST_ADD (subsuite, "business_store_and_reload", Fixture, url,
+ setup_business, test_dbi_version_control, teardown);
+g_free (subsuite);
+
+}
+
+void
+test_suite_gnc_backend_dbi (void)
+{
+ create_dbi_test_suite ("sqlite3", "sqlite3");
+ if (strlen (TEST_MYSQL_URL) > 0)
+ create_dbi_test_suite ("mysql", TEST_MYSQL_URL);
+ if (strlen (TEST_PGSQL_URL) > 0)
+ create_dbi_test_suite ("postgres", TEST_PGSQL_URL);
+
+}
Modified: gnucash/trunk/src/backend/dbi/test/test-backend-dbi.c
===================================================================
--- gnucash/trunk/src/backend/dbi/test/test-backend-dbi.c 2013-09-14 18:25:55 UTC (rev 23168)
+++ gnucash/trunk/src/backend/dbi/test/test-backend-dbi.c 2013-09-15 17:48:54 UTC (rev 23169)
@@ -26,8 +26,7 @@
#include "qof.h"
#include "cashobjects.h"
-extern void test_suite_gnc_backend_dbi_basic();
-extern void test_suite_gnc_backend_dbi_business();
+extern void test_suite_gnc_backend_dbi ();
#define GNC_LIB_NAME "gncmod-backend-dbi"
@@ -44,13 +43,7 @@
g_assert (qof_load_backend_library ("../../xml/.libs",
"gncmod-backend-xml"));
- /* Make the missing lock file warning not fatal so that it won't
- * crash during teardown.
- */
- g_log_set_fatal_mask ("gnc.backend.dbi", G_LOG_FATAL_MASK | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL);
- g_log_set_always_fatal (G_LOG_FATAL_MASK);
- test_suite_gnc_backend_dbi_basic();
- test_suite_gnc_backend_dbi_business();
+ test_suite_gnc_backend_dbi ();
return g_test_run( );
}
Deleted: gnucash/trunk/src/backend/dbi/test/test-dbi-basic.c
===================================================================
--- gnucash/trunk/src/backend/dbi/test/test-dbi-basic.c 2013-09-14 18:25:55 UTC (rev 23168)
+++ gnucash/trunk/src/backend/dbi/test/test-dbi-basic.c 2013-09-15 17:48:54 UTC (rev 23169)
@@ -1,153 +0,0 @@
-/***************************************************************************
- * test-dbi.c
- *
- * Tests saving and loading to a dbi/sqlite3 db
- *
- * Copyright (C) 2009 Phil Longstaff <plongstaff at rogers.com>
- ****************************************************************************/
-
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
- */
-
-#include "config.h"
-#include "qof.h"
-#include "cashobjects.h"
-#include "test-engine-stuff.h"
-#include "test-stuff.h"
-#include "test-dbi-stuff.h"
-#include <unittest-support.h>
-
-#include "TransLog.h"
-#include "Account.h"
-#include "Transaction.h"
-#include "Split.h"
-#include "gnc-commodity.h"
-
-#define FILE_NAME "sqlite3:///tmp/test-sqlite3-file"
-#define GNC_LIB_NAME "gncmod-backend-dbi"
-
-static QofSession*
-create_session(void)
-{
- QofSession* session;
- QofBook* book;
- Account *root, *acct1, *acct2;
- KvpFrame* frame;
- Transaction* tx;
- Split *spl1, *spl2;
- Timespec ts;
- struct timeval tv;
- gnc_commodity_table* table;
- gnc_commodity* currency;
- gchar *msg = "[gnc_dbi_unlock()] There was no lock entry in the Lock table";
- gchar *log_domain = "gnc.backend.dbi";
- guint loglevel = G_LOG_LEVEL_WARNING, hdlr;
- TestErrorStruct check = { loglevel, log_domain, msg };
- hdlr = g_log_set_handler (log_domain, loglevel,
- (GLogFunc)test_checked_handler, &check);
-
- session = qof_session_new();
- book = qof_session_get_book( session );
- root = gnc_book_get_root_account( book );
- g_log_remove_handler (log_domain, hdlr);
-
- table = gnc_commodity_table_get_table( book );
- currency = gnc_commodity_table_lookup( table, GNC_COMMODITY_NS_CURRENCY, "CAD" );
-
- acct1 = xaccMallocAccount( book );
- xaccAccountSetType( acct1, ACCT_TYPE_BANK );
- xaccAccountSetName( acct1, "Bank 1" );
- xaccAccountSetCommodity( acct1, currency );
-
- frame = qof_instance_get_slots( QOF_INSTANCE(acct1) );
- kvp_frame_set_gint64( frame, "int64-val", 100 );
- kvp_frame_set_double( frame, "double-val", 3.14159 );
- kvp_frame_set_numeric( frame, "numeric-val", gnc_numeric_zero() );
-
- time( &(tv.tv_sec) );
- tv.tv_usec = 0;
- ts.tv_sec = tv.tv_sec;
- ts.tv_nsec = 1000 * tv.tv_usec;
- kvp_frame_set_timespec( frame, "timespec-val", ts );
-
- kvp_frame_set_string( frame, "string-val", "abcdefghijklmnop" );
- kvp_frame_set_guid( frame, "guid-val", qof_instance_get_guid( QOF_INSTANCE(acct1) ) );
-
- gnc_account_append_child( root, acct1 );
-
- acct2 = xaccMallocAccount( book );
- xaccAccountSetType( acct2, ACCT_TYPE_BANK );
- xaccAccountSetName( acct2, "Bank 1" );
-
- tx = xaccMallocTransaction( book );
- xaccTransBeginEdit( tx );
- xaccTransSetCurrency( tx, currency );
- spl1 = xaccMallocSplit( book );
- xaccTransAppendSplit( tx, spl1 );
- spl2 = xaccMallocSplit( book );
- xaccTransAppendSplit( tx, spl2 );
- xaccTransCommitEdit( tx );
-
-
- return session;
-}
-
-int main (int argc, char ** argv)
-{
- gchar* filename;
- QofSession* session_1;
-
- qof_init();
- cashobjects_register();
- xaccLogDisable();
- qof_load_backend_library ("../.libs/", GNC_LIB_NAME);
-
- // Create a session with data
- session_1 = create_session();
- filename = tempnam( "/tmp", "test-sqlite3-" );
- g_test_message ( "Using filename: %s\n", filename );
- test_dbi_store_and_reload( "sqlite3", session_1, filename );
- session_1 = create_session();
- test_dbi_safe_save( "sqlite3", filename );
- test_dbi_version_control( "sqlite3", filename );
-#ifdef TEST_MYSQL_URL
- g_test_message ( "TEST_MYSQL_URL='%s'\n", TEST_MYSQL_URL );
- if ( strlen( TEST_MYSQL_URL ) > 0 )
- {
- session_1 = create_session();
- test_dbi_store_and_reload( "mysql", session_1, TEST_MYSQL_URL );
- session_1 = create_session();
- test_dbi_safe_save( "mysql", filename );
- test_dbi_version_control( "mysql", filename );
- }
-#endif
-#ifdef TEST_PGSQL_URL
- g_test_message ( "TEST_PGSQL_URL='%s'\n", TEST_PGSQL_URL );
- if ( strlen( TEST_PGSQL_URL ) > 0 )
- {
- session_1 = create_session();
- test_dbi_store_and_reload( "pgsql", session_1, TEST_PGSQL_URL );
- session_1 = create_session();
- test_dbi_safe_save( "pgsql", filename );
- test_dbi_version_control( "pgsql", filename );
- }
-#endif
- print_test_results();
- qof_close();
- exit(get_rv());
-}
-
Modified: gnucash/trunk/src/backend/dbi/test/test-dbi-business-stuff.c
===================================================================
--- gnucash/trunk/src/backend/dbi/test/test-dbi-business-stuff.c 2013-09-14 18:25:55 UTC (rev 23168)
+++ gnucash/trunk/src/backend/dbi/test/test-dbi-business-stuff.c 2013-09-15 17:48:54 UTC (rev 23169)
@@ -176,8 +176,8 @@
do_compare( book_1, book_2, GNC_ID_TAXTABLE, compare_single_taxtable, "TaxTable lists match" );
}
-static void
-compare_books( QofBook* book_1, QofBook* book_2 )
+void
+compare_business_books( QofBook* book_1, QofBook* book_2 )
{
compare_billterms( book_1, book_2 );
compare_taxtables( book_1, book_2 );
@@ -189,43 +189,3 @@
compare_vendors( book_1, book_2 );
}
-void
-test_dbi_business_store_and_reload( const gchar* driver, QofSession* session_1, const gchar* url )
-{
- QofSession* session_2;
- QofSession* session_3;
-
- gchar *msg = "[gnc_dbi_unlock()] There was no lock entry in the Lock table";
- gchar *log_domain = "gnc.backend.dbi";
- guint loglevel = G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL, hdlr;
- TestErrorStruct check = { loglevel, log_domain, msg, 0 };
- GLogFunc dhdlr = g_log_set_default_handler ((GLogFunc)test_null_handler,
- &check);
- g_test_log_set_fatal_handler ((GTestLogFatalFunc)test_checked_handler,
- &check);
-
- g_test_message ( "Testing %s\n", driver );
-
- // Save the session data
- session_2 = qof_session_new();
- qof_session_begin( session_2, url, FALSE, TRUE, TRUE );
- qof_session_swap_data( session_1, session_2 );
- qof_session_save( session_2, NULL );
-
- // Reload the session data
- session_3 = qof_session_new();
- qof_session_begin( session_3, url, TRUE, FALSE, FALSE );
- qof_session_load( session_3, NULL );
-
- // Compare with the original data
- compare_books( qof_session_get_book( session_2 ), qof_session_get_book( session_3 ) );
- qof_session_end( session_2 );
- qof_session_destroy( session_2 );
-
- hdlr = g_log_set_handler (log_domain, loglevel,
- (GLogFunc)test_checked_handler, &check);
- qof_session_end( session_3 );
- g_log_remove_handler (log_domain, hdlr);
- g_log_set_default_handler (dhdlr, NULL);
- qof_session_destroy( session_3 );
-}
Modified: gnucash/trunk/src/backend/dbi/test/test-dbi-business-stuff.h
===================================================================
--- gnucash/trunk/src/backend/dbi/test/test-dbi-business-stuff.h 2013-09-14 18:25:55 UTC (rev 23168)
+++ gnucash/trunk/src/backend/dbi/test/test-dbi-business-stuff.h 2013-09-15 17:48:54 UTC (rev 23169)
@@ -26,14 +26,5 @@
#ifndef _TEST_DBI_BUSINESS_STUFF_H_
#define _TEST_DBI_BUSINESS_STUFF_H_
-/**
- * Test storing a session contents to a db, reloading into a new session, then comparing the
- * two sessions.
- *
- * @param driver Driver name
- * @param session_1 Session to test
- * @param url Database URL
- */
-void test_dbi_business_store_and_reload( const gchar* driver, QofSession* session_1, const gchar* url );
-
+void compare_business_books( QofBook* book_1, QofBook* book_2 );
#endif
Deleted: gnucash/trunk/src/backend/dbi/test/test-dbi-business.c
===================================================================
--- gnucash/trunk/src/backend/dbi/test/test-dbi-business.c 2013-09-14 18:25:55 UTC (rev 23168)
+++ gnucash/trunk/src/backend/dbi/test/test-dbi-business.c 2013-09-15 17:48:54 UTC (rev 23169)
@@ -1,190 +0,0 @@
-/***************************************************************************
- * test-dbi-business.c
- *
- * Tests saving and loading business objects to a dbi/sqlite3 db
- *
- * Copyright (C) 2010 Phil Longstaff <plongstaff at rogers.com>
- ****************************************************************************/
-
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
- */
-
-#include "config.h"
-#include "qof.h"
-#include "cashobjects.h"
-#include "test-engine-stuff.h"
-#include "test-stuff.h"
-#include "test-dbi-business-stuff.h"
-
-#include "Account.h"
-#include <TransLog.h>
-#include "Transaction.h"
-#include "Split.h"
-#include "gnc-commodity.h"
-#include "gncAddress.h"
-#include "gncCustomer.h"
-#include "gncInvoice.h"
-
-#include "gnc-backend-sql.h"
-
-#include "gnc-address-sql.h"
-#include "gnc-bill-term-sql.h"
-#include "gnc-customer-sql.h"
-#include "gnc-employee-sql.h"
-#include "gnc-entry-sql.h"
-#include "gnc-invoice-sql.h"
-#include "gnc-job-sql.h"
-#include "gnc-order-sql.h"
-#include "gnc-owner-sql.h"
-#include "gnc-tax-table-sql.h"
-#include "gnc-vendor-sql.h"
-
-#define FILE_NAME "sqlite3:///tmp/test-sqlite3-file"
-#define GNC_LIB_NAME "gncmod-backend-dbi"
-
-static QofSession*
-create_session(void)
-{
- QofSession* session = qof_session_new();
- QofBook* book = qof_session_get_book( session );
- Account* root = gnc_book_get_root_account( book );
- Account* acct1;
- Account* acct2;
- gnc_commodity_table* table;
- gnc_commodity* currency;
- GncAddress* addr;
- GncCustomer* cust;
- GncEmployee* emp;
- GncVendor* v;
- GncInvoice* inv;
- GncJob* job;
- GncTaxTable* tt;
- GncTaxTableEntry* tte;
-
- table = gnc_commodity_table_get_table( book );
- currency = gnc_commodity_table_lookup( table, GNC_COMMODITY_NS_CURRENCY, "CAD" );
-
- acct1 = xaccMallocAccount( book );
- xaccAccountSetType( acct1, ACCT_TYPE_BANK );
- xaccAccountSetName( acct1, "Bank 1" );
- xaccAccountSetCommodity( acct1, currency );
- xaccAccountSetHidden( acct1, FALSE );
- xaccAccountSetPlaceholder( acct1, FALSE );
- gnc_account_append_child( root, acct1 );
-
- acct2 = xaccMallocAccount( book );
- xaccAccountSetType( acct2, ACCT_TYPE_BANK );
- xaccAccountSetName( acct2, "Bank 2" );
- xaccAccountSetCommodity( acct2, currency );
- xaccAccountSetHidden( acct2, FALSE );
- xaccAccountSetPlaceholder( acct2, FALSE );
- gnc_account_append_child( root, acct2 );
-
- tt = gncTaxTableCreate( book );
- gncTaxTableSetName( tt, "tt" );
- tte = gncTaxTableEntryCreate();
- gncTaxTableEntrySetAccount( tte, acct1 );
- gncTaxTableEntrySetType( tte, GNC_AMT_TYPE_VALUE );
- gncTaxTableEntrySetAmount( tte, gnc_numeric_zero() );
- gncTaxTableAddEntry( tt, tte );
- tte = gncTaxTableEntryCreate();
- gncTaxTableEntrySetAccount( tte, acct2 );
- gncTaxTableEntrySetType( tte, GNC_AMT_TYPE_PERCENT );
- gncTaxTableEntrySetAmount( tte, gnc_numeric_zero() );
- gncTaxTableAddEntry( tt, tte );
-
- cust = gncCustomerCreate( book );
- gncCustomerSetID( cust, "0001" );
- gncCustomerSetName( cust, "MyCustomer" );
- gncCustomerSetNotes( cust, "Here are some notes" );
- gncCustomerSetCurrency( cust, currency );
- addr = gncAddressCreate( book, QOF_INSTANCE(cust) );
- gncAddressSetName( addr, "theAddress" );
- gncAddressSetAddr1( addr, "Address line #1" );
- gncAddressSetAddr2( addr, "Address line #2" );
- gncAddressSetAddr3( addr, "Address line #3" );
- gncAddressSetAddr4( addr, "Address line #4" );
- gncAddressSetPhone( addr, "(123) 555-1212" );
- gncAddressSetPhone( addr, "(123) 555-2121" );
- gncAddressSetEmail( addr, "cust at mycustomer.com" );
-
- emp = gncEmployeeCreate( book );
- gncEmployeeSetID( emp, "0001" );
- gncEmployeeSetUsername( emp, "gnucash" );
- gncEmployeeSetLanguage( emp, "english" );
- gncEmployeeSetCurrency( emp, currency );
-
- return session;
-}
-
-/* Order in which business objects need to be loaded */
-static const gchar* fixed_load_order[] =
-{ GNC_ID_BILLTERM, GNC_ID_TAXTABLE, NULL };
-
-static void
-init_business_sql(void)
-{
- /* Initialize our pointers into the backend subsystem */
- gnc_address_sql_initialize();
- gnc_billterm_sql_initialize();
- gnc_customer_sql_initialize();
- gnc_employee_sql_initialize();
- gnc_entry_sql_initialize();
- gnc_invoice_sql_initialize();
- gnc_job_sql_initialize();
- gnc_order_sql_initialize();
- gnc_owner_sql_initialize();
- gnc_taxtable_sql_initialize();
- gnc_vendor_sql_initialize();
-
- gnc_sql_set_load_order( fixed_load_order );
-}
-
-int main (int argc, char ** argv)
-{
- gchar* filename;
- QofSession* session_1;
-
- qof_init();
- cashobjects_register();
- xaccLogDisable();
- qof_load_backend_library ("../.libs/", GNC_LIB_NAME);
-
- // Create a session with data
- session_1 = create_session();
- filename = tempnam( "/tmp", "test-sqlite3-" );
- g_test_message ( "Using filename: %s\n", filename );
- test_dbi_business_store_and_reload( "sqlite3", session_1, filename );
-#if 0
- g_test_message ( "TEST_MYSQL_URL='%s'\n", TEST_MYSQL_URL );
- if ( strlen( TEST_MYSQL_URL ) > 0 )
- {
- session_1 = create_session();
- test_dbi_store_and_reload( "mysql", session_1, TEST_MYSQL_URL );
- }
- g_test_message ( "TEST_PGSQL_URL='%s'\n", TEST_PGSQL_URL );
- if ( strlen( TEST_PGSQL_URL ) > 0 )
- {
- session_1 = create_session();
- test_dbi_store_and_reload( "pgsql", session_1, TEST_PGSQL_URL );
- }
-#endif
- print_test_results();
- qof_close();
- exit(get_rv());
-}
-
Modified: gnucash/trunk/src/backend/dbi/test/test-dbi-stuff.c
===================================================================
--- gnucash/trunk/src/backend/dbi/test/test-dbi-stuff.c 2013-09-14 18:25:55 UTC (rev 23168)
+++ gnucash/trunk/src/backend/dbi/test/test-dbi-stuff.c 2013-09-15 17:48:54 UTC (rev 23169)
@@ -234,7 +234,7 @@
compare_single_tx, "Transaction lists match" );
}
-static void
+void
compare_books( QofBook* book_1, QofBook* book_2 )
{
QofBackend *be = qof_book_get_backend( book_2 );
@@ -244,198 +244,3 @@
compare_sxs( book_1, book_2 );
compare_lots( book_1, book_2 );
}
-
-/* Given a synthetic session, use the same logic as
- * QofSession::save_as to save it to a specified sql url, then load it
- * back and compare. */
-void
-test_dbi_store_and_reload( const gchar* driver, QofSession* session_1, const gchar* url )
-{
- QofSession* session_2;
- QofSession* session_3;
- QofBackend *be;
-
- gchar *msg = "[gnc_dbi_unlock()] There was no lock entry in the Lock table";
- gchar *log_domain = "gnc.backend.dbi";
- guint loglevel = G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL, hdlr;
- TestErrorStruct check = { loglevel, log_domain, msg, 0 };
- GLogFunc dhdlr = g_log_set_default_handler ((GLogFunc)test_null_handler,
- &check);
- g_test_log_set_fatal_handler ((GTestLogFatalFunc)test_checked_handler,
- &check);
-
-
- g_test_message ( "Testing %s\n", driver );
-
- // Save the session data
- session_2 = qof_session_new();
- hdlr = g_log_set_handler (log_domain, loglevel,
- (GLogFunc)test_checked_handler, &check);
- qof_session_begin( session_2, url, FALSE, TRUE, TRUE );
- g_assert (session_2 != NULL);
- g_assert_cmpint (qof_session_get_error (session_2), ==, ERR_BACKEND_NO_ERR);
- qof_session_swap_data( session_1, session_2 );
- qof_session_save( session_2, NULL );
- g_assert (session_2 != NULL);
- g_assert_cmpint (qof_session_get_error (session_2), ==, ERR_BACKEND_NO_ERR);
-
- // Reload the session data
- session_3 = qof_session_new();
- g_assert (session_3 != NULL);
- qof_session_begin( session_3, url, TRUE, FALSE, FALSE );
- g_assert (session_3 != NULL);
- g_assert_cmpint (qof_session_get_error (session_3), ==, ERR_BACKEND_NO_ERR);
- qof_session_load( session_3, NULL );
- g_assert (session_3 != NULL);
- g_assert_cmpint (qof_session_get_error (session_3), ==, ERR_BACKEND_NO_ERR);
- // Compare with the original data
- compare_books (qof_session_get_book( session_2),
- qof_session_get_book( session_3));
-/* Session_1 belongs to the fixture and teardown() will clean it up */
- qof_session_end( session_2 );
- qof_session_destroy( session_2 );
- qof_session_end( session_3 );
- qof_session_destroy( session_3 );
- g_log_remove_handler (log_domain, hdlr);
- g_log_set_default_handler (dhdlr, NULL);
-}
-
-/* Given an already-created url (yeah, bad testing practice: Should
- * start fresh from a synthetic session) load and safe-save it, then
- * load it again into a new session and compare the two. Since
- * safe-save is a more-or-less atomic function call, there's no way to
- * be sure that it's actually doing what it's supposed to without
- * running this test in a debugger and stopping in the middle of the
- * safe-save and inspecting the database. */
-void
-test_dbi_safe_save( const gchar* driver, const gchar* url )
-{
- QofSession *session_1 = NULL, *session_2 = NULL;
- QofBackend *be;
-
- gchar *msg = "[gnc_dbi_unlock()] There was no lock entry in the Lock table";
- gchar *log_domain = "gnc.backend.dbi";
- guint loglevel = G_LOG_LEVEL_WARNING, hdlr;
- TestErrorStruct check = { loglevel, log_domain, msg };
-
- g_test_message ( "Testing safe save %s\n", driver );
-
- // Load the session data
- session_1 = qof_session_new();
- qof_session_begin( session_1, url, TRUE, FALSE, FALSE );
- if (session_1 && qof_session_get_error(session_1) != ERR_BACKEND_NO_ERR)
- {
- g_warning("Session Error: %d, %s", qof_session_get_error(session_1),
- qof_session_get_error_message(session_1));
- do_test( FALSE, "DB Session Creation Failed");
- goto cleanup;
- }
- qof_session_load( session_1, NULL );
- /* Do a safe save */
- qof_session_safe_save( session_1, NULL );
- if (session_1 && qof_session_get_error(session_1) != ERR_BACKEND_NO_ERR)
- {
- g_warning("Session Error: %s", qof_session_get_error_message(session_1));
- do_test( FALSE, "DB Session Safe Save Failed");
- goto cleanup;
- }
- /* Destroy the session and reload it */
-
- session_2 = qof_session_new();
- qof_session_begin( session_2, url, TRUE, FALSE, FALSE );
- if (session_2 && qof_session_get_error(session_2) != ERR_BACKEND_NO_ERR)
- {
- g_warning("Session Error: %d, %s", qof_session_get_error(session_2),
- qof_session_get_error_message(session_2));
- do_test( FALSE, "DB Session re-creation Failed");
- goto cleanup;
- }
- qof_session_load( session_2, NULL );
- compare_books( qof_session_get_book( session_1 ),
- qof_session_get_book( session_2 ) );
- be = qof_book_get_backend( qof_session_get_book( session_2 ) );
- test_conn_index_functions( be );
-
-cleanup:
- hdlr = g_log_set_handler (log_domain, loglevel,
- (GLogFunc)test_checked_handler, &check);
- if (session_2 != NULL)
- {
- qof_session_end( session_2 );
- qof_session_destroy( session_2 );
- }
- if (session_1 != NULL)
- {
- qof_session_end( session_1 );
- qof_session_destroy( session_1 );
- }
- g_log_remove_handler (log_domain, hdlr);
- return;
-}
-
-/* Test the gnc_dbi_load logic that forces a newer database to be
- * opened read-only and an older one to be safe-saved. Again, it would
- * be better to do this starting from a fresh file, but instead we're
- * being lazy and using an existing one. */
-void
-test_dbi_version_control( const gchar* driver, const gchar* url )
-{
-
- QofSession *sess;
- QofBook *book;
- QofBackend *qbe;
- QofBackendError err;
- gint ourversion = gnc_core_prefs_get_long_version();
-
- g_test_message ( "Testing safe save %s\n", driver );
-
- // Load the session data
- sess = qof_session_new();
- qof_session_begin( sess, url, TRUE, FALSE, FALSE );
- if (sess && qof_session_get_error(sess) != ERR_BACKEND_NO_ERR)
- {
- g_warning("Session Error: %d, %s", qof_session_get_error(sess),
- qof_session_get_error_message(sess));
- do_test( FALSE, "DB Session Creation Failed");
- goto cleanup;
- }
- qof_session_load( sess, NULL );
- qbe = qof_session_get_backend( sess );
- book = qof_session_get_book( sess );
- qof_book_begin_edit( book );
- gnc_sql_set_table_version( (GncSqlBackend*)qbe,
- "Gnucash", GNUCASH_RESAVE_VERSION - 1 );
- qof_book_commit_edit( book );
- qof_session_end( sess );
- qof_session_destroy( sess );
- sess = qof_session_new();
- qof_session_begin( sess, url, TRUE, FALSE, FALSE );
- qof_session_load( sess, NULL );
- err = qof_session_pop_error( sess );
- do_test( err == ERR_SQL_DB_TOO_OLD, "DB Failed to flag too old" );
- qbe = qof_session_get_backend( sess );
- book = qof_session_get_book( sess );
- qof_book_begin_edit( book );
- gnc_sql_set_table_version( (GncSqlBackend*)qbe,
- "Gnucash", ourversion );
- gnc_sql_set_table_version( (GncSqlBackend*)qbe,
- "Gnucash-Resave", ourversion + 1 );
- qof_book_commit_edit( book );
- qof_session_end( sess );
- qof_session_destroy( sess );
- sess = qof_session_new();
- qof_session_begin( sess, url, TRUE, FALSE, FALSE );
- qof_session_load( sess, NULL );
- qof_session_ensure_all_data_loaded( sess );
- err = qof_session_pop_error( sess );
- do_test( err == ERR_SQL_DB_TOO_NEW, "DB Failed to flag too new" );
-cleanup:
- qbe = qof_session_get_backend( sess );
- book = qof_session_get_book( sess );
- qof_book_begin_edit( book );
- gnc_sql_set_table_version( (GncSqlBackend*)qbe,
- "Gnucash-Resave", GNUCASH_RESAVE_VERSION );
- qof_book_commit_edit( book );
- qof_session_end( sess );
- qof_session_destroy( sess );
-}
Modified: gnucash/trunk/src/backend/dbi/test/test-dbi-stuff.h
===================================================================
--- gnucash/trunk/src/backend/dbi/test/test-dbi-stuff.h 2013-09-14 18:25:55 UTC (rev 23168)
+++ gnucash/trunk/src/backend/dbi/test/test-dbi-stuff.h 2013-09-15 17:48:54 UTC (rev 23169)
@@ -34,29 +34,8 @@
QofBook* book_2;
gboolean result;
} CompareInfoStruct;
+void compare_books( QofBook* book_1, QofBook* book_2 );
void do_compare( QofBook* book_1, QofBook* book_2, const gchar* id, QofInstanceForeachCB cb, const gchar* msg );
-/**
- * Test storing a session contents to a db, reloading into a new session, then comparing the
- * two sessions.
- *
- * @param driver Driver name
- * @param session_1 Session to test
- * @param url Database URL
- */
-void test_dbi_store_and_reload( const gchar* driver, QofSession* session_1, const gchar* url );
-/** Test the safe_save mechanism. Beware that this test used on its
- * own doesn't ensure that the resave is done safely, only that the
- * database is intact and unchanged after the save. To observe the
- * safety one must run the test in a debugger and break after the
- * rename step of gnc_dbi_safe_sync, then examine the database in the
- * appropriate shell.
- */
-void test_dbi_safe_save( const gchar* driver, const gchar* url );
-
-/** Test the version control mechanism.
- */
-void test_dbi_version_control( const gchar* driver, const gchar* url );
-
#endif
Deleted: gnucash/trunk/src/backend/dbi/test/test-dbi.c
===================================================================
--- gnucash/trunk/src/backend/dbi/test/test-dbi.c 2013-09-14 18:25:55 UTC (rev 23168)
+++ gnucash/trunk/src/backend/dbi/test/test-dbi.c 2013-09-15 17:48:54 UTC (rev 23169)
@@ -1,82 +0,0 @@
-/***************************************************************************
- * test-dbi.c
- *
- * Tests saving and loading to a dbi/sqlite3 db. The contents of an XML
- * file are read and saved to sqlite3, then the results read back and compared.
- *
- * Copyright (C) 2009 Phil Longstaff <plongstaff at rogers.com>
- ****************************************************************************/
-
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
- */
-
-#include "config.h"
-#include "qof.h"
-#include "cashobjects.h"
-#include "test-engine-stuff.h"
-#include "test-stuff.h"
-#include "test-dbi-stuff.h"
-
-#include "TransLog.h"
-#include "Account.h"
-#include "Split.h"
-#include "gnc-commodity.h"
-
-#define DBI_TEST_XML_FILENAME "test-dbi.xml"
-#define FILE_NAME "sqlite3:///tmp/test-sqlite3-file"
-#define GNC_LIB_NAME "gncmod-backend-dbi"
-
-int main (int argc, char ** argv)
-{
- gchar* filename;
- QofSession* session_1;
-
- qof_init();
- cashobjects_register();
- xaccLogDisable();
- qof_load_backend_library ("../.libs/", GNC_LIB_NAME);
-
- // Create a session with data
- session_1 = qof_session_new();
- qof_session_begin( session_1, DBI_TEST_XML_FILENAME, FALSE, FALSE, FALSE );
- qof_session_load( session_1, NULL );
-
- filename = tempnam( "/tmp", "test-sqlite3-" );
- g_test_message ( "Using filename: %s\n", filename );
- test_dbi_store_and_reload( "sqlite3", session_1, filename );
-
- g_test_message ( "TEST_MYSQL_URL='%s'\n", TEST_MYSQL_URL );
- if ( strlen( TEST_MYSQL_URL ) > 0 )
- {
- session_1 = qof_session_new();
- qof_session_begin( session_1, DBI_TEST_XML_FILENAME, FALSE, FALSE, FALSE );
- qof_session_load( session_1, NULL );
- test_dbi_store_and_reload( "mysql", session_1, TEST_MYSQL_URL );
- }
-
- g_test_message ( "TEST_PGSQL_URL='%s'\n", TEST_PGSQL_URL );
- if ( strlen( TEST_PGSQL_URL ) > 0 )
- {
- session_1 = qof_session_new();
- qof_session_begin( session_1, DBI_TEST_XML_FILENAME, FALSE, FALSE, FALSE );
- qof_session_load( session_1, NULL );
- test_dbi_store_and_reload( "pgsql", session_1, TEST_PGSQL_URL );
- }
- print_test_results();
- qof_close();
- exit(get_rv());
-}
Deleted: gnucash/trunk/src/backend/dbi/test/test-load-backend.c
===================================================================
--- gnucash/trunk/src/backend/dbi/test/test-load-backend.c 2013-09-14 18:25:55 UTC (rev 23168)
+++ gnucash/trunk/src/backend/dbi/test/test-load-backend.c 2013-09-15 17:48:54 UTC (rev 23169)
@@ -1,45 +0,0 @@
-/***************************************************************************
- * test-load-backend.c
- *
- * Replaces the guile version to test the GModule file backend loading.
- *
- * Sun Oct 9 18:58:47 2005
- * Copyright 2005 Neil Williams
- * linux at codehelp.co.uk
- ****************************************************************************/
-
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
- */
-
-#include "config.h"
-#include "qof.h"
-#include "cashobjects.h"
-#include "test-stuff.h"
-
-#define GNC_LIB_NAME "gncmod-backend-dbi"
-
-int main (int argc, char ** argv)
-{
- qof_init();
- cashobjects_register();
- do_test(
- qof_load_backend_library ("../.libs/", GNC_LIB_NAME),
- " loading gnc-backend-dbi GModule failed");
- print_test_results();
- qof_close();
- exit(get_rv());
-}
Deleted: gnucash/trunk/src/backend/dbi/test/utest-backend-dbi-basic.c
===================================================================
--- gnucash/trunk/src/backend/dbi/test/utest-backend-dbi-basic.c 2013-09-14 18:25:55 UTC (rev 23168)
+++ gnucash/trunk/src/backend/dbi/test/utest-backend-dbi-basic.c 2013-09-15 17:48:54 UTC (rev 23169)
@@ -1,88 +0,0 @@
-/*
- * utest-backend-dbi-basic.c
- *
- * Created on: 2011-04-23
- * Author: phil
- */
-
-#include "config.h"
-
-#include <glib/gstdio.h>
-
-#include "unittest-support.h"
-#include "test-stuff.h"
-#include "test-dbi-stuff.h"
-
-static const gchar* suitename = "/backend/dbi";
-void test_suite_gnc_backend_dbi_basic(void);
-
-void do_test_sqlite(void);
-void do_test_mysql(void);
-void do_test_pgsql(void);
-
-typedef struct
-{
- QofSession *session;
- gchar *filename;
-} Fixture;
-
-static void
-setup (Fixture *fixture, gconstpointer pData)
-{
- fixture->session = qof_session_new();
- /* When running distcheck the source directory is read-only, which
- * prevents creating the lock file. Force the session to get
- * around that.
- */
- qof_session_begin( fixture->session, DBI_TEST_XML_FILENAME, TRUE,
- FALSE, TRUE );
- g_assert_cmpint (qof_session_get_error (fixture->session), ==,
- ERR_BACKEND_NO_ERR);
- qof_session_load( fixture->session, NULL );
-
- fixture->filename = tempnam( "/tmp", "test-sqlite3-" );
- g_test_message ( "Using filename: %s\n", fixture->filename );
-}
-
-static void
-teardown (Fixture *fixture, gconstpointer pData)
-{
- qof_session_end (fixture->session);
- qof_session_destroy (fixture->session);
- g_unlink (fixture->filename);
-}
-
-
-static void
-test_sqlite_store_and_reload (Fixture *fixture, gconstpointer pData)
-{
- // Create a session with data
- test_dbi_store_and_reload( "sqlite3", fixture->session, fixture->filename );
-}
-
-static void
-test_mysql_store_and_reload (Fixture *fixture, gconstpointer pData)
-{
- g_assert (strlen (TEST_MYSQL_URL) > 0);
- test_dbi_store_and_reload( TEST_MYSQL_URL, fixture->session,
- fixture->filename );
-}
-
-static void
-test_pgsql_store_and_reload (Fixture *fixture, gconstpointer pData)
-{
- g_assert (strlen (TEST_PGSQL_URL) > 0);
- test_dbi_store_and_reload( TEST_PGSQL_URL, fixture->session,
- fixture->filename );
-}
-
-void
-test_suite_gnc_backend_dbi_basic(void)
-{
- GNC_TEST_ADD (suitename, "store_and_reload/sqlite", Fixture, NULL, setup, test_sqlite_store_and_reload, teardown);
- if (strlen (TEST_MYSQL_URL) > 0)
- GNC_TEST_ADD (suitename, "store_and_reload/mysql", Fixture, NULL, setup, test_mysql_store_and_reload, teardown);
- if (strlen (TEST_PGSQL_URL) > 0)
- GNC_TEST_ADD (suitename, "store_and_reload/postgres", Fixture, NULL, setup, test_pgsql_store_and_reload, teardown);
-
-}
Deleted: gnucash/trunk/src/backend/dbi/test/utest-backend-dbi-business.c
===================================================================
--- gnucash/trunk/src/backend/dbi/test/utest-backend-dbi-business.c 2013-09-14 18:25:55 UTC (rev 23168)
+++ gnucash/trunk/src/backend/dbi/test/utest-backend-dbi-business.c 2013-09-15 17:48:54 UTC (rev 23169)
@@ -1,199 +0,0 @@
-/***************************************************************************
- * test-dbi-business.c
- *
- * Tests saving and loading business objects to a dbi/sqlite3 db
- *
- * Copyright (C) 2010 Phil Longstaff <plongstaff at rogers.com>
- ****************************************************************************/
-
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
- */
-
-/*
- * utest-backend-dbi-business.c
- *
- * Created on: 2011-04-23
- * Author: phil
- */
-
-#include "config.h"
-
-#include <stdio.h>
-
-#include "unittest-support.h"
-#include "test-stuff.h"
-#include "test-dbi-stuff.h"
-
-static const gchar* suitename = "/backend/dbi";
-void test_suite_gnc_backend_dbi_business(void);
-
-void do_test_business_sqlite(void);
-
-#include "config.h"
-#include "qof.h"
-#include "cashobjects.h"
-#include "test-engine-stuff.h"
-#include "test-stuff.h"
-#include "test-dbi-business-stuff.h"
-
-#include "Account.h"
-#include <TransLog.h>
-#include "Transaction.h"
-#include "Split.h"
-#include "gnc-commodity.h"
-#include "gncAddress.h"
-#include "gncCustomer.h"
-#include "gncInvoice.h"
-
-#include "gnc-backend-sql.h"
-
-#include "gnc-address-sql.h"
-#include "gnc-bill-term-sql.h"
-#include "gnc-customer-sql.h"
-#include "gnc-employee-sql.h"
-#include "gnc-entry-sql.h"
-#include "gnc-invoice-sql.h"
-#include "gnc-job-sql.h"
-#include "gnc-order-sql.h"
-#include "gnc-owner-sql.h"
-#include "gnc-tax-table-sql.h"
-#include "gnc-vendor-sql.h"
-
-#define FILE_NAME "sqlite3:///tmp/test-sqlite3-file"
-#define GNC_LIB_NAME "gncmod-backend-dbi"
-
-static QofSession*
-create_business_session(void)
-{
- QofSession* session = qof_session_new();
- QofBook* book = qof_session_get_book( session );
- Account* root = gnc_book_get_root_account( book );
- Account* acct1;
- Account* acct2;
- gnc_commodity_table* table;
- gnc_commodity* currency;
- GncAddress* addr;
- GncCustomer* cust;
- GncEmployee* emp;
- GncTaxTable* tt;
- GncTaxTableEntry* tte;
-
- table = gnc_commodity_table_get_table( book );
- currency = gnc_commodity_table_lookup( table, GNC_COMMODITY_NS_CURRENCY, "CAD" );
-
- acct1 = xaccMallocAccount( book );
- xaccAccountSetType( acct1, ACCT_TYPE_BANK );
- xaccAccountSetName( acct1, "Bank 1" );
- xaccAccountSetCommodity( acct1, currency );
- xaccAccountSetHidden( acct1, FALSE );
- xaccAccountSetPlaceholder( acct1, FALSE );
- gnc_account_append_child( root, acct1 );
-
- acct2 = xaccMallocAccount( book );
- xaccAccountSetType( acct2, ACCT_TYPE_BANK );
- xaccAccountSetName( acct2, "Bank 2" );
- xaccAccountSetCommodity( acct2, currency );
- xaccAccountSetHidden( acct2, FALSE );
- xaccAccountSetPlaceholder( acct2, FALSE );
- gnc_account_append_child( root, acct2 );
-
- tt = gncTaxTableCreate( book );
- gncTaxTableSetName( tt, "tt" );
- tte = gncTaxTableEntryCreate();
- gncTaxTableEntrySetAccount( tte, acct1 );
- gncTaxTableEntrySetType( tte, GNC_AMT_TYPE_VALUE );
- gncTaxTableEntrySetAmount( tte, gnc_numeric_zero() );
- gncTaxTableAddEntry( tt, tte );
- tte = gncTaxTableEntryCreate();
- gncTaxTableEntrySetAccount( tte, acct2 );
- gncTaxTableEntrySetType( tte, GNC_AMT_TYPE_PERCENT );
- gncTaxTableEntrySetAmount( tte, gnc_numeric_zero() );
- gncTaxTableAddEntry( tt, tte );
-
- cust = gncCustomerCreate( book );
- gncCustomerSetID( cust, "0001" );
- gncCustomerSetName( cust, "MyCustomer" );
- gncCustomerSetNotes( cust, "Here are some notes" );
- gncCustomerSetCurrency( cust, currency );
- addr = gncAddressCreate( book, QOF_INSTANCE(cust) );
- gncAddressSetName( addr, "theAddress" );
- gncAddressSetAddr1( addr, "Address line #1" );
- gncAddressSetAddr2( addr, "Address line #2" );
- gncAddressSetAddr3( addr, "Address line #3" );
- gncAddressSetAddr4( addr, "Address line #4" );
- gncAddressSetPhone( addr, "(123) 555-1212" );
- gncAddressSetPhone( addr, "(123) 555-2121" );
- gncAddressSetEmail( addr, "cust at mycustomer.com" );
-
- emp = gncEmployeeCreate( book );
- gncEmployeeSetID( emp, "0001" );
- gncEmployeeSetUsername( emp, "gnucash" );
- gncEmployeeSetLanguage( emp, "english" );
- gncEmployeeSetCurrency( emp, currency );
-
- return session;
-}
-
-/* Order in which business objects need to be loaded */
-static const gchar* fixed_load_order[] =
-{ GNC_ID_BILLTERM, GNC_ID_TAXTABLE, NULL };
-
-G_GNUC_UNUSED static void
-init_business_sql(void)
-{
- /* Initialize our pointers into the backend subsystem */
- gnc_address_sql_initialize();
- gnc_billterm_sql_initialize();
- gnc_customer_sql_initialize();
- gnc_employee_sql_initialize();
- gnc_entry_sql_initialize();
- gnc_invoice_sql_initialize();
- gnc_job_sql_initialize();
- gnc_order_sql_initialize();
- gnc_owner_sql_initialize();
- gnc_taxtable_sql_initialize();
- gnc_vendor_sql_initialize();
-
- gnc_sql_set_load_order( fixed_load_order );
-}
-
-static gboolean handler(const gchar* log_domain, GLogLevelFlags log_level, const gchar* message, gpointer user_data)
-{
- printf("domain=%s level=%d message=%s\n", log_domain, log_level, message);
- return FALSE;
-}
-
-void
-do_test_business_sqlite(void)
-{
- gchar* filename;
- QofSession* session_1;
-
- g_test_log_set_fatal_handler(handler, 0);
-
- // Create a session with data
- session_1 = create_business_session();
- filename = tempnam( "/tmp", "test-sqlite3-" );
- g_test_message ( "Using filename: %s\n", filename );
- test_dbi_business_store_and_reload( "sqlite3", session_1, filename );
-}
-
-void
-test_suite_gnc_backend_dbi_business(void)
-{
- GNC_TEST_ADD_FUNC(suitename, "gnc dbi test sqlite (business)", do_test_business_sqlite);
-}
More information about the gnucash-changes
mailing list