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.c878
1 files changed, 507 insertions, 371 deletions
diff --git a/src/backenddb/test_merchantdb.c b/src/backenddb/test_merchantdb.c
index 9940c5ea..d45089a0 100644
--- a/src/backenddb/test_merchantdb.c
+++ b/src/backenddb/test_merchantdb.c
@@ -363,8 +363,8 @@ run_test_instances (struct TestInstances_Closure *cls)
/* Test update instance */
cls->is.name = "Test - updated";
- if (0 > plugin->update_instance (plugin->cls,
- &cls->is))
+ if (1 != plugin->update_instance (plugin->cls,
+ &cls->is))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Update instance failed\n");
@@ -436,40 +436,62 @@ test_instances (void *cls)
}
-/**
- * Number of products detected.
- */
-static int product_count;
+static void
+free_product (struct TALER_MERCHANTDB_ProductDetails *pd)
+{
+ if (NULL != pd->description)
+ GNUNET_free (pd->description);
+ if (NULL != pd->description_i18n)
+ json_decref (pd->description_i18n);
+ if (NULL != pd->unit)
+ GNUNET_free (pd->unit);
+ if (NULL != pd->image)
+ json_decref (pd->image);
+ if (NULL != pd->address)
+ json_decref (pd->address);
+}
/**
- * An array of product ids found from the lookup method.
+ * Closure for testing product lookup
*/
-static char *products_found[8];
+struct TestLookupProducts_Closure
+{
+ /**
+ * Number of product ids to compare to
+ */
+ unsigned int products_to_cmp_length;
+ /**
+ * Pointer to array of product ids
+ */
+ const char **product_ids_to_cmp;
-static void
-free_product (struct TALER_MERCHANTDB_ProductDetails *pd)
-{
- GNUNET_free (pd->description);
- json_decref (pd->description_i18n);
- GNUNET_free (pd->unit);
- json_decref (pd->image);
- json_decref (pd->address);
-}
+ /**
+ * Pointer to array of number of matches for each product
+ */
+ unsigned int *results_matching;
+
+ /**
+ * Total number of results returned
+ */
+ unsigned int results_length;
+};
static void
lookup_products_cb (void *cls,
const char *product_id)
{
- product_count += 1;
- if (8 >= product_count)
+ if (cls == NULL)
+ return;
+ struct TestLookupProducts_Closure *cmp = cls;
+ cmp->results_length += 1;
+ for (unsigned int i = 0; cmp->products_to_cmp_length > i; ++i)
{
- products_found[product_count - 1] =
- GNUNET_malloc (sizeof(char) * (strlen (product_id) + 1));
- strcpy (products_found[product_count - 1],
- product_id);
+ if (0 == strcmp (cmp->product_ids_to_cmp[i],
+ product_id))
+ cmp->results_matching[i] += 1;
}
}
@@ -508,14 +530,13 @@ test_insert_product (const char *is,
const char *pd_id,
const struct TALER_MERCHANTDB_ProductDetails *pd)
{
- if (0 > plugin->insert_product (plugin->cls,
- is,
- pd_id,
- pd))
+ if (1 != plugin->insert_product (plugin->cls,
+ is,
+ pd_id,
+ pd))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Insert product failed\n");
- plugin->drop_tables (plugin->cls);
return 1;
}
return 0;
@@ -525,18 +546,69 @@ test_insert_product (const char *is,
static int
test_lookup_product (const char *is,
const char *pd_id,
- struct TALER_MERCHANTDB_ProductDetails *pd)
+ const struct TALER_MERCHANTDB_ProductDetails *to_cmp)
{
+ struct TALER_MERCHANTDB_ProductDetails lookup_result;
if (0 > plugin->lookup_product (plugin->cls,
is,
pd_id,
- pd))
+ &lookup_result))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Lookup product failed\n");
- plugin->drop_tables (plugin->cls);
+ free_product (&lookup_result);
+ return 1;
+ }
+ if (0 != check_products_equal (&lookup_result,
+ to_cmp))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Lookup product failed: incorrect product returned\n");
+ free_product (&lookup_result);
+ return 1;
+ }
+ free_product (&lookup_result);
+ return 0;
+}
+
+
+static int
+test_lookup_products (const char *is,
+ unsigned int products_length,
+ const char **product_ids)
+{
+ struct TestLookupProducts_Closure cls;
+ cls.products_to_cmp_length = products_length;
+ cls.product_ids_to_cmp = product_ids;
+ unsigned int results_matching[products_length];
+ for (unsigned int i = 0; products_length > i; ++i)
+ results_matching[i] = 0;
+ cls.results_matching = results_matching;
+ cls.results_length = 0;
+ if (0 > plugin->lookup_products (plugin->cls,
+ is,
+ &lookup_products_cb,
+ &cls))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Lookup products failed\n");
+ return 1;
+ }
+ if (products_length != cls.results_length)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Lookup products failed: incorrect number of results\n");
return 1;
}
+ for (unsigned int i = 0; products_length > i; ++i)
+ {
+ if (1 != cls.results_matching[i])
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Lookup products failed: mismatched data\n");
+ return 1;
+ }
+ }
return 0;
}
@@ -559,239 +631,227 @@ test_delete_product (const char *is,
/**
- * Function that tests products.
- *
- * @param cls closure with config
+ * Closure for product tests.
*/
-static int
-test_products (void *cls)
+struct TestProducts_Closure
{
- /* Test making an instance */
+ /**
+ * The instance settings
+ */
+ struct TALER_MERCHANTDB_InstanceSettings is;
+
+ /**
+ * The instance public key
+ */
struct TALER_MerchantPublicKeyP merchant_pub;
+
+ /**
+ * The instance private key
+ */
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 ("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_ ();
- TEST_RET_ON_FAIL (test_insert_instance (&merchant_pub,
- &merchant_priv,
- &is));
-
- /* Test creating a product */
- struct TALER_MERCHANTDB_ProductDetails pd;
- pd.description = "This is a test product";
- pd.description_i18n = json_array ();
- pd.unit = "boxes";
- TALER_string_to_amount ("EUR:120.40",
- &pd.price);
- pd.taxes = json_array ();
- pd.total_stock = 55;
- pd.total_sold = 0;
- pd.total_lost = 0;
- pd.image = json_array ();
- pd.address = json_array ();
- pd.next_restock = GNUNET_TIME_absolute_get_zero_ ();
- TEST_RET_ON_FAIL (test_insert_product ("test_instance_0",
- "is_0_pd_0",
- &pd));
+
+ /**
+ * The array of products
+ */
+ struct TALER_MERCHANTDB_ProductDetails products[2];
+
+ /**
+ * The array of product ids
+ */
+ const char *product_ids[2];
+};
+
+
+/**
+ * Sets up the data structures used in the product tests
+ */
+static void
+pre_test_products (struct TestProducts_Closure *cls)
+{
+ /* Instance */
+ GNUNET_CRYPTO_eddsa_key_create (&cls->merchant_priv.eddsa_priv);
+ GNUNET_CRYPTO_eddsa_key_get_public (&cls->merchant_priv.eddsa_priv,
+ &cls->merchant_pub.eddsa_pub);
+ cls->is.id = "test_inst_products";
+ cls->is.name = "Test";
+ cls->is.address = json_array ();
+ GNUNET_assert (NULL != cls->is.address);
+ GNUNET_assert (0 == json_array_append (cls->is.address,
+ json_string ("123 Example St")));
+ cls->is.jurisdiction = json_array ();
+ GNUNET_assert (NULL != cls->is.jurisdiction);
+ GNUNET_assert (0 == json_array_append (cls->is.jurisdiction,
+ json_string ("Ohio")));
+ GNUNET_assert (GNUNET_OK ==
+ TALER_string_to_amount ("EUR:1200.40",
+ &cls->is.default_max_deposit_fee));
+ GNUNET_assert (GNUNET_OK ==
+ TALER_string_to_amount ("EUR:1200.40",
+ &cls->is.default_max_wire_fee));
+ cls->is.default_wire_fee_amortization = 1;
+ cls->is.default_wire_transfer_delay = GNUNET_TIME_relative_get_minute_ ();
+ cls->is.default_pay_delay = GNUNET_TIME_relative_get_second_ ();
+
+ /* Products */
+ cls->product_ids[0] = "test_products_pd_0";
+ cls->products[0].description = "This is a test product";
+ cls->products[0].description_i18n = json_array ();
+ GNUNET_assert (NULL != cls->products[0].description_i18n);
+ cls->products[0].unit = "boxes";
+ GNUNET_assert (GNUNET_OK ==
+ TALER_string_to_amount ("EUR:120.40",
+ &cls->products[0].price));
+ cls->products[0].taxes = json_array ();
+ GNUNET_assert (NULL != cls->products[0].taxes);
+ cls->products[0].total_stock = 55;
+ cls->products[0].total_sold = 0;
+ cls->products[0].total_lost = 0;
+ cls->products[0].image = json_array ();
+ GNUNET_assert (NULL != cls->products[0].image);
+ cls->products[0].address = json_array ();
+ GNUNET_assert (NULL != cls->products[0].address);
+ cls->products[0].next_restock = GNUNET_TIME_absolute_get_zero_ ();
+
+ cls->product_ids[1] = "test_products_pd_1";
+ cls->products[1].description = "This is a another test product";
+ cls->products[1].description_i18n = json_array ();
+ GNUNET_assert (NULL != cls->products[1].description_i18n);
+ cls->products[1].unit = "cans";
+ GNUNET_assert (GNUNET_OK ==
+ TALER_string_to_amount ("EUR:4.95",
+ &cls->products[1].price));
+ cls->products[1].taxes = json_array ();
+ GNUNET_assert (NULL != cls->products[1].taxes);
+ cls->products[1].total_stock = 5001;
+ cls->products[1].total_sold = 0;
+ cls->products[1].total_lost = 0;
+ cls->products[1].image = json_array ();
+ GNUNET_assert (NULL != cls->products[1].image);
+ cls->products[1].address = json_array ();
+ GNUNET_assert (NULL != cls->products[1].address);
+ cls->products[1].next_restock = GNUNET_TIME_absolute_get_zero_ ();
+}
+
+
+/**
+ * Handles all teardown after testing
+ */
+static void
+post_test_products (struct TestProducts_Closure *cls)
+{
+ /* Cleanup instance */
+ json_decref (cls->is.address);
+ json_decref (cls->is.jurisdiction);
+
+ /* Cleanup products */
+ json_decref (cls->products[0].description_i18n);
+ json_decref (cls->products[0].taxes);
+ json_decref (cls->products[0].image);
+ json_decref (cls->products[0].address);
+
+ json_decref (cls->products[1].description_i18n);
+ json_decref (cls->products[1].taxes);
+ json_decref (cls->products[1].image);
+ json_decref (cls->products[1].address);
+}
+
+
+static int
+run_test_products (struct TestProducts_Closure *cls)
+{
+ /* Insert the instance */
+ TEST_RET_ON_FAIL (test_insert_instance (&cls->merchant_pub,
+ &cls->merchant_priv,
+ &cls->is));
+
+ /* Test inserting a product */
+ TEST_RET_ON_FAIL (test_insert_product (cls->is.id,
+ cls->product_ids[0],
+ &cls->products[0]));
/* Test lookup of individual products */
- struct TALER_MERCHANTDB_ProductDetails lookup_pd;
- TEST_RET_ON_FAIL (test_lookup_product ("test_instance_0",
- "is_0_pd_0",
- &lookup_pd));
- if (0 != check_products_equal (&pd,
- &lookup_pd))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Lookup product failed: incorrect product returned\n");
- plugin->drop_tables (plugin->cls);
- return 1;
- }
- free_product (&lookup_pd);
+ TEST_RET_ON_FAIL (test_lookup_product (cls->is.id,
+ cls->product_ids[0],
+ &cls->products[0]));
/* Make sure it fails correctly for products that don't exist */
- if (0 != plugin->lookup_product (plugin->cls,
- "test_instance_0",
- "fictional_product",
- &lookup_pd))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Lookup product failed: product returned where there was none\n");
- plugin->drop_tables (plugin->cls);
- return 1;
- }
/* Test product update */
- pd.description = "This is a test product that has been updated!";
- if (0 > plugin->update_product (plugin->cls,
- "test_instance_0",
- "is_0_pd_0",
- &pd))
+ cls->products[0].description =
+ "This is a test product that has been updated!";
+ if (1 != plugin->update_product (plugin->cls,
+ cls->is.id,
+ cls->product_ids[0],
+ &cls->products[0]))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Update product failed\n");
- plugin->drop_tables (plugin->cls);
return 1;
}
- TEST_RET_ON_FAIL (test_lookup_product ("test_instance_0",
- "is_0_pd_0",
- &lookup_pd));
- if (0 != check_products_equal (&pd,
- &lookup_pd))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Update product failed: lookup returns old product\n");
- plugin->drop_tables (plugin->cls);
- return 1;
- }
- free_product (&lookup_pd);
+ TEST_RET_ON_FAIL (test_lookup_product (cls->is.id,
+ cls->product_ids[0],
+ &cls->products[0]));
/* Test collective product lookup */
- struct TALER_MERCHANTDB_ProductDetails pd1 = pd;
- pd1.description = "This is another product.";
- pd1.unit = "cans";
- TALER_string_to_amount ("EUR:4.95",
- &pd1.price);
- TEST_RET_ON_FAIL (test_insert_product ("test_instance_0",
- "is_0_pd_1",
- &pd1));
- product_count = 0;
- if (0 > plugin->lookup_products (plugin->cls,
- "test_instance_0",
- &lookup_products_cb,
- cls))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Lookup products failed\n");
- plugin->drop_tables (plugin->cls);
- return 1;
- }
- if (2 != product_count)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Lookup products failed: incorrect number of products found\n");
- plugin->drop_tables (plugin->cls);
- return 1;
- }
- if (! (((0 == strcmp ("is_0_pd_0",
- products_found[0])) &&
- (0 == strcmp ("is_0_pd_1",
- products_found[1]))) ||
- ((0 == strcmp ("is_0_pd_1",
- products_found[0])) &&
- (0 == strcmp ("is_0_pd_0",
- products_found[1])))))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Lookup products failed: incorrect product ids found\n");
- plugin->drop_tables (plugin->cls);
- return 1;
- }
- GNUNET_free (products_found[0]);
- GNUNET_free (products_found[1]);
+ TEST_RET_ON_FAIL (test_insert_product (cls->is.id,
+ cls->product_ids[1],
+ &cls->products[1]));
+ TEST_RET_ON_FAIL (test_lookup_products (cls->is.id,
+ 2,
+ cls->product_ids));
/* Test product deletion */
- TEST_RET_ON_FAIL (test_delete_product ("test_instance_0",
- "is_0_pd_0"));
- product_count = 0;
- if (0 > plugin->lookup_products (plugin->cls,
- "test_instance_0",
- &lookup_products_cb,
- cls))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Lookup products failed\n");
- plugin->drop_tables (plugin->cls);
- return 1;
- }
- GNUNET_free (products_found[0]);
- if (1 != product_count)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Lookup products/delete product failed: incorrect number of products after deletion\n");
- plugin->drop_tables (plugin->cls);
- return 1;
- }
- TEST_RET_ON_FAIL (test_delete_product ("test_instance_0",
- "is_0_pd_1"));
- product_count = 0;
- if (0 > plugin->lookup_products (plugin->cls,
- "test_instance_0",
- &lookup_products_cb,
- cls))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Lookup products failed\n");
- plugin->drop_tables (plugin->cls);
- return 1;
- }
- if (0 != product_count)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Lookup products/delete product failed: incorrect number of products after deletion\n");
- plugin->drop_tables (plugin->cls);
- return 1;
- }
-
- 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 */
- /*
- if (0 > plugin->purge_instance(plugin->cls,
- "test_instance_0")) {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Purge instance failed\n");
- plugin->drop_tables (plugin->cls);
- return 1;
- }*/json_decref (is.address);
- json_decref (is.jurisdiction);
+ TEST_RET_ON_FAIL (test_delete_product (cls->is.id,
+ cls->product_ids[1]));
+ TEST_RET_ON_FAIL (test_lookup_products (cls->is.id,
+ 1,
+ cls->product_ids));
+ TEST_RET_ON_FAIL (test_delete_product (cls->is.id,
+ cls->product_ids[0]));
+ TEST_RET_ON_FAIL (test_lookup_products (cls->is.id,
+ 0,
+ NULL));
return 0;
}
-/**
- * Number of orders detected.
- */
-static int order_count;
+static int
+test_products (void *cls)
+{
+ struct TestProducts_Closure test_cls;
+ pre_test_products (&test_cls);
+ int test_result = run_test_products (&test_cls);
+ post_test_products (&test_cls);
+ return test_result;
+}
/**
- * An array of order ids found from the lookup method.
+ * Closure for testing order lookup
*/
-static char *orders_found[8];
-
+struct TestLookupOrders_Closure
+{
+ /**
+ * Number of orders to compare to
+ */
+ unsigned int orders_to_cmp_length;
-/**
- * An array of order serials found from the lookup method.
- */
-static uint64_t order_serials[8];
+ /**
+ * Pointer to (ordered) array of order ids
+ */
+ const char **order_ids_to_cmp;
+ /**
+ * Pointer to array of bools indicating matches in the correct index
+ */
+ bool *results_match;
-/**
- * An array of order timestamps found from the lookup method.
- */
-static struct GNUNET_TIME_Absolute order_timestamps[8];
+ /**
+ * Total number of results returned
+ */
+ unsigned int results_length;
+};
static void
@@ -800,15 +860,19 @@ lookup_orders_cb (void *cls,
uint64_t order_serial,
struct GNUNET_TIME_Absolute timestamp)
{
- order_count += 1;
- if (8 >= order_count)
+ if (cls == NULL)
+ return;
+ struct TestLookupOrders_Closure *cmp = cls;
+ unsigned int i = cmp->results_length;
+ cmp->results_length += 1;
+ if (cmp->orders_to_cmp_length > i)
{
- orders_found[order_count - 1] =
- GNUNET_malloc (sizeof(char) * (strlen (order_id) + 1));
- strcpy (orders_found[order_count - 1],
- order_id);
- order_serials[order_count - 1] = order_serial;
- order_timestamps[order_count - 1] = timestamp;
+ /* Compare the orders */
+ if (0 == strcmp (cmp->order_ids_to_cmp[i],
+ order_id))
+ cmp->results_match[i] = true;
+ else
+ cmp->results_match[i] = false;
}
}
@@ -819,15 +883,14 @@ test_insert_order (const char *instance_id,
struct GNUNET_TIME_Absolute pay_deadline,
const json_t *contract_terms)
{
- if (0 > plugin->insert_order (plugin->cls,
- instance_id,
- order_id,
- pay_deadline,
- contract_terms))
+ if (1 != plugin->insert_order (plugin->cls,
+ instance_id,
+ order_id,
+ pay_deadline,
+ contract_terms))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Insert order failed\n");
- plugin->drop_tables (plugin->cls);
return 1;
}
return 0;
@@ -837,37 +900,71 @@ test_insert_order (const char *instance_id,
static int
test_lookup_order (const char *is,
const char *od,
- json_t **contract_terms)
+ const json_t *contract_to_cmp)
{
+ json_t *lookup_terms = NULL;
if (0 > plugin->lookup_order (plugin->cls,
is,
od,
- contract_terms))
+ &lookup_terms))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Lookup order failed\n");
- plugin->drop_tables (plugin->cls);
+ if (NULL != lookup_terms)
+ json_decref (lookup_terms);
+ return 1;
+ }
+ if (1 != json_equal (contract_to_cmp,
+ lookup_terms))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Lookup order failed: incorrect order returned\n");
+ if (NULL != lookup_terms)
+ json_decref (lookup_terms);
return 1;
}
+ json_decref (lookup_terms);
return 0;
}
static int
test_lookup_orders (const char *is,
- const struct TALER_MERCHANTDB_OrderFilter *of)
+ const struct TALER_MERCHANTDB_OrderFilter *of,
+ unsigned int orders_length,
+ const char **order_ids_to_cmp)
{
+ struct TestLookupOrders_Closure cls;
+ cls.orders_to_cmp_length = orders_length;
+ cls.order_ids_to_cmp = order_ids_to_cmp;
+ bool results_match[orders_length];
+ cls.results_match = results_match;
+ cls.results_length = 0;
if (0 > plugin->lookup_orders (plugin->cls,
is,
of,
&lookup_orders_cb,
- NULL))
+ &cls))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Lookup orders failed\n");
- plugin->drop_tables (plugin->cls);
return 1;
}
+ if (orders_length != cls.results_length)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Lookup orders failed: incorrect number of results\n");
+ return 1;
+ }
+ for (unsigned int i = 0; orders_length > i; ++i)
+ {
+ if (false == cls.results_match[i])
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Lookup orders failed: mismatched data\n");
+ return 1;
+ }
+ }
return 0;
}
@@ -882,7 +979,6 @@ test_delete_order (const char *is,
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Delete order failed\n");
- plugin->drop_tables (plugin->cls);
return 1;
}
return 0;
@@ -890,80 +986,136 @@ test_delete_order (const char *is,
/**
- * Function that tests orders.
- *
- * @param cls closure with config
+ * Container for order data
*/
-static int
-test_orders (void *cls)
+struct OrderData
{
+ /**
+ * The id of the order
+ */
+ const char *id;
+
+ /**
+ * The pay deadline for the order
+ */
+ struct GNUNET_TIME_Absolute pay_deadline;
+
+ /**
+ * The contract of the order
+ */
+ json_t *contract;
+};
+
+
+/**
+ * Closure for order tests.
+ */
+struct TestOrders_Closure
+{
+ /**
+ * The instance settings
+ */
+ struct TALER_MERCHANTDB_InstanceSettings is;
+
+ /**
+ * The instance public key
+ */
struct TALER_MerchantPublicKeyP merchant_pub;
+
+ /**
+ * The instance private key
+ */
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_2";
- 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 ("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_ ();
- TEST_RET_ON_FAIL (test_insert_instance (&merchant_pub,
- &merchant_priv,
- &is));
-
- /* Test insert order */
- struct GNUNET_TIME_Absolute time_0 = GNUNET_TIME_absolute_get_zero_ ();
- json_t *terms_0 = json_array ();
- json_array_append (terms_0,
- json_string ("contract"));
- TEST_RET_ON_FAIL (test_insert_order ("test_instance_2",
- "is_2_or_0",
- time_0,
- terms_0));
+
+ /**
+ * The array of orders
+ */
+ struct OrderData orders[2];
+
+};
+
+
+static void
+pre_test_orders (struct TestOrders_Closure *cls)
+{
+ /* Instance */
+ GNUNET_CRYPTO_eddsa_key_create (&cls->merchant_priv.eddsa_priv);
+ GNUNET_CRYPTO_eddsa_key_get_public (&cls->merchant_priv.eddsa_priv,
+ &cls->merchant_pub.eddsa_pub);
+ cls->is.id = "test_inst_orders";
+ cls->is.name = "Test";
+ cls->is.address = json_array ();
+ GNUNET_assert (NULL != cls->is.address);
+ GNUNET_assert (0 == json_array_append (cls->is.address,
+ json_string ("123 Example St")));
+ cls->is.jurisdiction = json_array ();
+ GNUNET_assert (NULL != cls->is.jurisdiction);
+ GNUNET_assert (0 == json_array_append (cls->is.jurisdiction,
+ json_string ("Ohio")));
+ GNUNET_assert (GNUNET_OK ==
+ TALER_string_to_amount ("EUR:1200.40",
+ &cls->is.default_max_deposit_fee));
+ GNUNET_assert (GNUNET_OK ==
+ TALER_string_to_amount ("EUR:1200.40",
+ &cls->is.default_max_wire_fee));
+ cls->is.default_wire_fee_amortization = 1;
+ cls->is.default_wire_transfer_delay = GNUNET_TIME_relative_get_minute_ ();
+ cls->is.default_pay_delay = GNUNET_TIME_relative_get_second_ ();
+
+ /* Orders */
+ cls->orders[0].id = "test_orders_od_0";
+ cls->orders[0].pay_deadline = GNUNET_TIME_absolute_get_zero_ ();
+ cls->orders[0].contract = json_array ();
+ GNUNET_assert (NULL != cls->orders[0].contract);
+ GNUNET_assert (0 == json_array_append (cls->orders[0].contract,
+ json_string ("Dummy contract")));
+
+ cls->orders[1].id = "test_orders_od_1";
+ cls->orders[1].pay_deadline = GNUNET_TIME_absolute_get_zero_ ();
+ cls->orders[1].contract = json_array ();
+ GNUNET_assert (NULL != cls->orders[1].contract);
+ GNUNET_assert (0 == json_array_append (cls->orders[1].contract,
+ json_string ("Second contract")));
+}
+
+
+static void
+post_test_orders (struct TestOrders_Closure *cls)
+{
+ json_decref (cls->is.address);
+ json_decref (cls->is.jurisdiction);
+
+ json_decref (cls->orders[0].contract);
+ json_decref (cls->orders[1].contract);
+}
+
+
+static int
+run_test_orders (struct TestOrders_Closure *cls)
+{
+ /* Insert the instance */
+ TEST_RET_ON_FAIL (test_insert_instance (&cls->merchant_pub,
+ &cls->merchant_priv,
+ &cls->is));
+
+ /* Test inserting an order */
+ TEST_RET_ON_FAIL (test_insert_order (cls->is.id,
+ cls->orders[0].id,
+ cls->orders[0].pay_deadline,
+ cls->orders[0].contract));
/* Test lookup order */
- json_t *lookup_terms;
- TEST_RET_ON_FAIL (test_lookup_order ("test_instance_2",
- "is_2_or_0",
- &lookup_terms));
- if (1 != json_equal (terms_0,
- lookup_terms))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Lookup order failed: contract terms returned do not match\n");
- plugin->drop_tables (plugin->cls);
- return 1;
- }
- json_decref (lookup_terms);
+ TEST_RET_ON_FAIL (test_lookup_order (cls->is.id,
+ cls->orders[0].id,
+ cls->orders[0].contract));
- /* Make sure it fails correctly for products that don't exist */
- if (0 != plugin->lookup_order (plugin->cls,
- "test_instance_2",
- "fictional_order",
- &lookup_terms))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Lookup order failed: order returned where there was none\n");
- plugin->drop_tables (plugin->cls);
- return 1;
- }
+ /* Make sure it fails correctly for nonexistent orders */
- /* Test lookups for multiple orders */
- TEST_RET_ON_FAIL (test_insert_order ("test_instance_2",
- "is_2_or_1",
- time_0,
- terms_0));
+ /* Test lookups on multiple orders */
+ TEST_RET_ON_FAIL (test_insert_order (cls->is.id,
+ cls->orders[1].id,
+ cls->orders[1].pay_deadline,
+ cls->orders[1].contract));
struct TALER_MERCHANTDB_OrderFilter filter;
filter.paid = TALER_MERCHANTDB_YNA_ALL;
filter.refunded = TALER_MERCHANTDB_YNA_ALL;
@@ -971,69 +1123,53 @@ test_orders (void *cls)
filter.date = GNUNET_TIME_absolute_get_zero_ ();
filter.start_row = 0;
filter.delta = 8;
- order_count = 0;
- TEST_RET_ON_FAIL (test_lookup_orders ("test_instance_2",
- &filter));
- if (2 != order_count)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Lookup orders failed: incorrect number of orders found\n");
- plugin->drop_tables (plugin->cls);
- return 1;
- }
- if (! (((0 == strcmp ("is_2_or_0",
- orders_found[0])) &&
- (0 == strcmp ("is_2_or_1",
- orders_found[1]))) ||
- ((0 == strcmp ("is_2_or_1",
- orders_found[0])) &&
- (0 == strcmp ("is_2_or_0",
- orders_found[1])))))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Lookup orders failed: incorrect order ids found\n");
- plugin->drop_tables (plugin->cls);
- return 1;
- }
- GNUNET_free (orders_found[0]);
- GNUNET_free (orders_found[1]);
+ const char *order_id_list[2] = {
+ cls->orders[0].id,
+ cls->orders[1].id
+ };
+ TEST_RET_ON_FAIL (test_lookup_orders (cls->is.id,
+ &filter,
+ 2,
+ order_id_list));
/* Test delete order */
- TEST_RET_ON_FAIL (test_delete_order ("test_instance_2",
- "is_2_or_0"));
- order_count = 0;
- TEST_RET_ON_FAIL (test_lookup_orders ("test_instance_2",
- &filter));
- if (1 != order_count)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Delete order failed: order still present in database\n");
- plugin->drop_tables (plugin->cls);
- return 1;
- }
- GNUNET_free (orders_found[0]);
+ TEST_RET_ON_FAIL (test_delete_order (cls->is.id,
+ cls->orders[1].id));
+ TEST_RET_ON_FAIL (test_lookup_orders (cls->is.id,
+ &filter,
+ 1,
+ order_id_list));
+ TEST_RET_ON_FAIL (test_delete_order (cls->is.id,
+ cls->orders[0].id));
+ TEST_RET_ON_FAIL (test_lookup_orders (cls->is.id,
+ &filter,
+ 0,
+ NULL));
return 0;
}
+static int
+test_orders (void *cls)
+{
+ struct TestOrders_Closure test_cls;
+ pre_test_orders (&test_cls);
+ int test_result = run_test_orders (&test_cls);
+ post_test_orders (&test_cls);
+ return test_result;
+}
+
+
/**
- * Function that runs all tests and returns upon error.
+ * Function that runs all tests and returns 1 upon error, 0 on success.
*/
static int
run_tests (void *cls)
{
- /* Test instances */
- if (0 != test_instances (cls))
- return 1;
-
- /* Test products */
- if (0 != test_products (cls))
- return 1;
-
- /* Test orders */
- if (0 != test_orders (cls))
- return 1;
+ TEST_RET_ON_FAIL (test_instances (cls));
+ TEST_RET_ON_FAIL (test_products (cls));
+ TEST_RET_ON_FAIL (test_orders (cls));
return 0;
}