summaryrefslogtreecommitdiff
path: root/src/backenddb/test_merchantdb.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backenddb/test_merchantdb.c')
-rw-r--r--src/backenddb/test_merchantdb.c313
1 files changed, 264 insertions, 49 deletions
diff --git a/src/backenddb/test_merchantdb.c b/src/backenddb/test_merchantdb.c
index 30a0d883..4d2b66b1 100644
--- a/src/backenddb/test_merchantdb.c
+++ b/src/backenddb/test_merchantdb.c
@@ -41,7 +41,40 @@ static struct TALER_MERCHANTDB_Plugin *plugin;
*/
static int instance_count;
-void
+/**
+ * An array of instance settings found from the lookup method.
+ */
+static struct TALER_MERCHANTDB_InstanceSettings instances_found[8];
+
+static void
+copy_instance (struct TALER_MERCHANTDB_InstanceSettings *dest,
+ const struct TALER_MERCHANTDB_InstanceSettings *src)
+{
+ dest->id = GNUNET_malloc (sizeof(char) * (strlen (src->id) + 1));
+ strcpy (dest->id, src->id);
+ dest->name = GNUNET_malloc (sizeof(char) * (strlen (src->name) + 1));
+ strcpy (dest->name, src->name);
+ dest->address = json_copy (src->address);
+ dest->jurisdiction = json_copy (src->jurisdiction);
+ dest->default_max_deposit_fee = src->default_max_deposit_fee;
+ dest->default_max_wire_fee = src->default_max_wire_fee;
+ dest->default_wire_fee_amortization = src->default_wire_fee_amortization;
+ dest->default_wire_transfer_delay = src->default_wire_transfer_delay;
+ dest->default_pay_delay = src->default_pay_delay;
+}
+
+
+static void
+free_instance (struct TALER_MERCHANTDB_InstanceSettings *is)
+{
+ GNUNET_free (is->id);
+ GNUNET_free (is->name);
+ json_decref (is->address);
+ json_decref (is->jurisdiction);
+}
+
+
+static void
lookup_instances_cb (void *cls,
const struct TALER_MerchantPublicKeyP *merchant_pub,
const struct TALER_MerchantPrivateKeyP *merchant_priv,
@@ -50,12 +83,42 @@ lookup_instances_cb (void *cls,
const struct TALER_MERCHANTDB_AccountDetails accounts[])
{
instance_count += 1;
+ if (8 > instance_count)
+ {
+ /* Duplicate the instance settings */
+ copy_instance (&instances_found[instance_count - 1], is);
+ }
}
-int
-check_products_equal (struct TALER_MERCHANTDB_ProductDetails *a,
- struct TALER_MERCHANTDB_ProductDetails *b)
+static int
+check_instances_equal (const struct TALER_MERCHANTDB_InstanceSettings *a,
+ const struct TALER_MERCHANTDB_InstanceSettings *b)
+{
+ if ((0 != strcmp (a->id, b->id)) ||
+ (0 != strcmp (a->name, b->name)) ||
+ (1 != json_equal (a->address, b->address)) ||
+ (1 != json_equal (a->jurisdiction, b->jurisdiction)) ||
+ (GNUNET_OK != TALER_amount_cmp_currency (&a->default_max_deposit_fee,
+ &b->default_max_deposit_fee)) ||
+ (0 != TALER_amount_cmp (&a->default_max_deposit_fee,
+ &b->default_max_deposit_fee)) ||
+ (GNUNET_OK != TALER_amount_cmp_currency (&a->default_max_wire_fee,
+ &b->default_max_wire_fee)) ||
+ (0 != TALER_amount_cmp (&a->default_max_wire_fee,
+ &b->default_max_wire_fee)) ||
+ (a->default_wire_fee_amortization != b->default_wire_fee_amortization) ||
+ (a->default_wire_transfer_delay.rel_value_us !=
+ b->default_wire_transfer_delay.rel_value_us) ||
+ (a->default_pay_delay.rel_value_us != b->default_pay_delay.rel_value_us))
+ return 1;
+ return 0;
+}
+
+
+static int
+check_products_equal (const struct TALER_MERCHANTDB_ProductDetails *a,
+ const struct TALER_MERCHANTDB_ProductDetails *b)
{
if ((0 != strcmp (a->description, b->description)) ||
(1 != json_equal (a->description_i18n, b->description_i18n)) ||
@@ -75,44 +138,29 @@ check_products_equal (struct TALER_MERCHANTDB_ProductDetails *a,
/**
- * Main function that will be run by the scheduler.
+ * Function that tests instances.
*
* @param cls closure with config
*/
-static void
-run (void *cls)
+static int
+test_instances (void *cls)
{
- struct GNUNET_CONFIGURATION_Handle *cfg = cls;
- /* Data for 'store_payment()' */
-
- /* Load the plugin */
- if (NULL == (plugin = TALER_MERCHANTDB_plugin_load (cfg)))
- {
- result = 77;
- return;
- }
-
- /* Run the preflight */
- plugin->preflight (plugin->cls);
-
/* Test lookup instances- there should be nothing here */
instance_count = 0;
if (0 > plugin->lookup_instances (plugin->cls, false,
- lookup_instances_cb, cls))
+ &lookup_instances_cb, cls))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Lookup instances failed\n");
- result = 1;
- plugin->drop_tables (plugin->cls); /* Try to drop tables if possible to clean up for the next test */
- return;
+ plugin->drop_tables (plugin->cls); /* Try to drop tables if possible to clean up for the next test */
+ return 1;
}
if (instance_count != 0)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Non-zero number of instances found after initialization\n");
- result = 1;
plugin->drop_tables (plugin->cls);
- return;
+ return 1;
}
/* Test making an instance */
@@ -122,14 +170,14 @@ run (void *cls)
GNUNET_CRYPTO_eddsa_key_get_public (&merchant_priv.eddsa_priv,
&merchant_pub.eddsa_pub);
struct TALER_MERCHANTDB_InstanceSettings is;
- is.id = "test_instance_0";
+ is.id = "test_inst";
is.name = "Test";
is.address = json_array ();
json_array_append (is.address, json_string ("123 Example St"));
is.jurisdiction = json_array ();
json_array_append (is.jurisdiction, json_string ("Ohio"));
- TALER_string_to_amount ("USD:1200.40", &is.default_max_deposit_fee);
- TALER_string_to_amount ("USD:1200.40", &is.default_max_wire_fee);
+ TALER_string_to_amount ("EUR:1200.40", &is.default_max_deposit_fee);
+ TALER_string_to_amount ("EUR:1200.40", &is.default_max_wire_fee);
is.default_wire_fee_amortization = 1;
is.default_wire_transfer_delay = GNUNET_TIME_relative_get_minute_ ();
is.default_pay_delay = GNUNET_TIME_relative_get_second_ ();
@@ -138,29 +186,35 @@ run (void *cls)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Instance insertion failed\n");
- result = 1;
plugin->drop_tables (plugin->cls);
- return;
+ return 1;
}
/* Test lookup instances- is our new instance there? */
instance_count = 0;
if (0 > plugin->lookup_instances (plugin->cls, false,
- lookup_instances_cb, cls))
+ &lookup_instances_cb, cls))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Lookup instances failed\n");
- result = 1;
plugin->drop_tables (plugin->cls);
- return;
+ return 1;
}
if (instance_count != 1)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Instance count doesn't match number of instances inserted\n");
- result = 1;
- return;
+ plugin->drop_tables (plugin->cls);
+ return 1;
}
+ if (0 != check_instances_equal (&is, &instances_found[0]))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Lookup instance failed: incorrect instance returned\n");
+ plugin->drop_tables (plugin->cls);
+ return 1;
+ }
+ free_instance (&instances_found[0]);
/* Test update instance */
is.name = "Test - updated";
@@ -168,9 +222,129 @@ run (void *cls)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Update instance failed\n");
+ plugin->drop_tables (plugin->cls);
+ return 1;
+ }
+ instance_count = 0;
+ if (0 > plugin->lookup_instances (plugin->cls, false,
+ &lookup_instances_cb, cls))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Lookup instances failed\n");
+ plugin->drop_tables (plugin->cls);
+ return 1;
+ }
+ if (instance_count != 1)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Update instance failed: Instance count doesn't match number of instances inserted/updated\n");
+ plugin->drop_tables (plugin->cls);
+ return 1;
+ }
+ if (0 != check_instances_equal (&is, &instances_found[0]))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Update instance failed: result from lookup doesn't match\n");
+ plugin->drop_tables (plugin->cls);
+ return 1;
+ }
+ free_instance (&instances_found[0]);
+
+ /* Test instance private key deletion */
+ if (0 > plugin->delete_instance_private_key (plugin->cls, "test_inst"))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Delete instance private key failed\n");
+ plugin->drop_tables (plugin->cls);
+ return 1;
+ }
+ instance_count = 0;
+ if (0 > plugin->lookup_instances (plugin->cls, true,
+ &lookup_instances_cb, cls))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Lookup instances failed\n");
+ plugin->drop_tables (plugin->cls);
+ return 1;
+ }
+ if (0 != instance_count)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Lookup instances failed: instance without private key not excluded when only counting active instances\n");
+ plugin->drop_tables (plugin->cls);
+ return 1;
+ }
+ instance_count = 0;
+ if (0 > plugin->lookup_instances (plugin->cls, false,
+ &lookup_instances_cb, cls))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Lookup instances failed\n");
+ plugin->drop_tables (plugin->cls);
+ return 1;
+ }
+ if (1 != instance_count)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Lookup instances failed: instance without private key not included when counting all instances\n");
+ plugin->drop_tables (plugin->cls);
+ return 1;
+ }
+ /* Delete the instance we just copied */
+ free_instance (&instances_found[0]);
+
+ /* Test instance deletion */
+ /* This test currently FAILS */
+ /*instance_count = 0;
+ if (0 > plugin->purge_instance (plugin->cls, "test_inst"))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Purge instance failed\n");
result = 1;
plugin->drop_tables (plugin->cls);
return;
+ }*/
+
+ json_decref (is.address);
+ json_decref (is.jurisdiction);
+
+ return 0;
+}
+
+
+/**
+ * Function that tests products.
+ *
+ * @param cls closure with config
+ */
+static int
+test_products (void *cls)
+{
+ /* Test making an instance */
+ struct TALER_MerchantPublicKeyP merchant_pub;
+ struct TALER_MerchantPrivateKeyP merchant_priv;
+ GNUNET_CRYPTO_eddsa_key_create (&merchant_priv.eddsa_priv);
+ GNUNET_CRYPTO_eddsa_key_get_public (&merchant_priv.eddsa_priv,
+ &merchant_pub.eddsa_pub);
+ struct TALER_MERCHANTDB_InstanceSettings is;
+ is.id = "test_instance_0";
+ is.name = "Test";
+ is.address = json_array ();
+ json_array_append (is.address, json_string ("123 Example St"));
+ is.jurisdiction = json_array ();
+ json_array_append (is.jurisdiction, json_string ("Ohio"));
+ TALER_string_to_amount ("USD:1200.40", &is.default_max_deposit_fee);
+ TALER_string_to_amount ("USD:1200.40", &is.default_max_wire_fee);
+ is.default_wire_fee_amortization = 1;
+ is.default_wire_transfer_delay = GNUNET_TIME_relative_get_minute_ ();
+ is.default_pay_delay = GNUNET_TIME_relative_get_second_ ();
+ if (0 > plugin->insert_instance (plugin->cls, &merchant_pub, &merchant_priv,
+ &is))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Instance insertion failed\n");
+ plugin->drop_tables (plugin->cls);
+ return 1;
}
/* Test creating a product */
@@ -186,26 +360,24 @@ run (void *cls)
pd.image = json_array ();
pd.address = json_array ();
pd.next_restock = GNUNET_TIME_absolute_get_zero_ ();
- if (0 > plugin->insert_product (plugin->cls, "test_instance_0", "is_0_pd_0",
+ if (0 > plugin->insert_product (plugin->cls, "test_instance_1", "is_0_pd_0",
&pd))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Insert product failed\n");
- result = 1;
plugin->drop_tables (plugin->cls);
- return;
+ return 1;
}
/* Test lookup of individual products */
struct TALER_MERCHANTDB_ProductDetails lookup_pd;
- if (0 > plugin->lookup_product (plugin->cls, "test_instance_0", "is_0_pd_0",
+ if (0 > plugin->lookup_product (plugin->cls, "test_instance_1", "is_0_pd_0",
&lookup_pd))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Lookup product failed\n");
- result = 1;
plugin->drop_tables (plugin->cls);
- return;
+ return 1;
}
/* This test currently FAILS */
/*if (0 != check_products_equal(&pd, &lookup_pd)) {
@@ -217,27 +389,30 @@ run (void *cls)
}*/
/* Make sure it fails correctly for products that don't exist */
- if (0 != plugin->lookup_product (plugin->cls, "test_instance_0",
+ if (0 != plugin->lookup_product (plugin->cls, "test_instance_1",
"fictional_product", &lookup_pd))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Lookup product failed: product returned where there was none\n");
- result = 1;
plugin->drop_tables (plugin->cls);
- return;
+ return 1;
}
/* Test product deletion */
- if (0 > plugin->delete_product (plugin->cls, "test_instance_0", "is_0_pd_0"))
+ if (0 > plugin->delete_product (plugin->cls, "test_instance_1", "is_0_pd_0"))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Delete product failed\n");
- result = 1;
plugin->drop_tables (plugin->cls);
- return;
+ return 1;
}
- /* Test instance deletion */
+ json_decref (pd.description_i18n);
+ json_decref (pd.taxes);
+ json_decref (pd.image);
+ json_decref (pd.address);
+
+ /* Clean up: delete the instance */
/* This test currently FAILS */
/*instance_count = 0;
if (0 > plugin->purge_instance(plugin->cls, "t")) {
@@ -248,6 +423,44 @@ run (void *cls)
return;
}*/
+ json_decref (is.address);
+ json_decref (is.jurisdiction);
+
+ return 0;
+}
+
+
+/**
+ * Main function that will be run by the scheduler.
+ *
+ * @param cls closure with config
+ */
+static void
+run (void *cls)
+{
+ struct GNUNET_CONFIGURATION_Handle *cfg = cls;
+ /* Data for 'store_payment()' */
+
+ /* Load the plugin */
+ if (NULL == (plugin = TALER_MERCHANTDB_plugin_load (cfg)))
+ {
+ result = 77;
+ return;
+ }
+
+ /* Run the preflight */
+ plugin->preflight (plugin->cls);
+
+ /* Test instances */
+ result = test_instances (cls);
+ if (0 != result)
+ return;
+
+ /* Test products */
+ result = test_products (cls);
+ if (0 != result)
+ return;
+
/* Test dropping tables */
if (GNUNET_OK != plugin->drop_tables (plugin->cls))
{
@@ -261,6 +474,8 @@ run (void *cls)
TALER_MERCHANTDB_plugin_unload (plugin);
if (NULL == (plugin = TALER_MERCHANTDB_plugin_load (cfg)))
{
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Plugin unload failed\n");
result = 77;
return;
}