From 21bce66874c961271aed9016015a8d3fdcc09279 Mon Sep 17 00:00:00 2001 From: priscilla <priscilla.huang@efrei.net> Date: Tue, 14 Mar 2023 10:08:08 -0400 Subject: update of the test TOTP but not finish --- src/testing/test_merchant_api.c | 20 +- src/testing/testing_api_cmd_pay_order.c | 22 ++ src/testing/testing_api_cmd_post_using_templates.c | 245 ++++++++++++++++++++- 3 files changed, 267 insertions(+), 20 deletions(-) diff --git a/src/testing/test_merchant_api.c b/src/testing/test_merchant_api.c index c4853fd4..9d828c12 100644 --- a/src/testing/test_merchant_api.c +++ b/src/testing/test_merchant_api.c @@ -110,13 +110,6 @@ static char *merchant_url_i1a; */ static struct GNUNET_OS_Process *merchantd; -/** - * total for totp - */ -static struct TALER_Amount *total; -enum GNUNET_Generic_ReturnValue TALER_string_to_amount ("EUR:10.0", - total); - /** * Account number of the exchange at the bank. */ @@ -1334,13 +1327,6 @@ run (void *cls, merchant_url, MHD_HTTP_OK, NULL), - TALER_TESTING_cmd_merchant_post_orders ("create-proposal-10", - merchant_url, - MHD_HTTP_OK, - "100", - GNUNET_TIME_UNIT_ZERO_TS, - GNUNET_TIME_UNIT_FOREVER_TS, - "EUR:10.0"), TALER_TESTING_cmd_merchant_post_templates ("post-templates-t1", merchant_url, "template-1", @@ -1457,15 +1443,11 @@ run (void *cls, TALER_TESTING_cmd_merchant_pay_order ("pay-100", merchant_url, MHD_HTTP_OK, - "create-proposal-100", + "using-templates-t1", "withdraw-coin-10a;withdraw-coin-10b", "EUR:5", "EUR:4.99", NULL), - TALER_build_pos_confirmation ("pos1test", - TALER_MCA_WITH_PRICE, - total, - GNUNET_TIME_timestamp_get()), TALER_TESTING_cmd_merchant_delete_template ("get-templates-empty", merchant_url, "t1", diff --git a/src/testing/testing_api_cmd_pay_order.c b/src/testing/testing_api_cmd_pay_order.c index 5ec9e46b..c1c5fc5a 100644 --- a/src/testing/testing_api_cmd_pay_order.c +++ b/src/testing/testing_api_cmd_pay_order.c @@ -91,6 +91,11 @@ struct PayState * The session for which the payment is made. */ const char *session_id; + + /** + * This variable is for the verification of the payment. + */ + const char *pos_confirmation; }; @@ -239,6 +244,23 @@ pay_cb (void *cls, if (MHD_HTTP_OK == pr->hr.http_status) { ps->merchant_sig = pr->details.success.merchant_sig; + /* + struct TALER_Amount total_amount; + const char *pos_key; + struct GNUNET_JSON_Specification spec[] = { + GNUNET_JSON_spec_string ("order_id", + &ps->proposal_reference), + GNUNET_JSON_spec_string ("pos_key", + &pos_key), + TALER_JSON_spec_amount_any ("amount", + &total_amount), + GNUNET_JSON_spec_end () + }; + + ps->pos_confirmation = TALER_build_pos_confirmation (pos_key, + TALER_MCA_WITHOUT_PRICE, + &total_amount, + GNUNET_TIME_timestamp_get());*/ // FIXME: check if pr->details.success.pos_confirmation; // for that, get pos_secret from ps->proposal_reference CMD and amount from pay/order creation cmd using traits } diff --git a/src/testing/testing_api_cmd_post_using_templates.c b/src/testing/testing_api_cmd_post_using_templates.c index 137c7df1..d8f2c0a9 100644 --- a/src/testing/testing_api_cmd_post_using_templates.c +++ b/src/testing/testing_api_cmd_post_using_templates.c @@ -43,6 +43,13 @@ struct PostUsingTemplatesState */ struct TALER_TESTING_Interpreter *is; + /** + * The (initial) POST /orders/$ID/claim operation handle. + * The logic is such that after an order creation, + * we immediately claim the order. + */ + struct TALER_MERCHANT_OrderClaimHandle *och; + /** * Base URL of the merchant serving the request. */ @@ -63,6 +70,67 @@ struct PostUsingTemplatesState */ const char *template_ref; + /** + * Order id. + */ + const char *order_id; + + /** + * The order id we expect the merchant to assign (if not NULL). + */ + const char *expected_order_id; + + /** + * Contract terms obtained from the backend. + */ + json_t *contract_terms; + + /** + * Order submitted to the backend. + */ + json_t *order_terms; + + /** + * Contract terms hash code. + */ + struct TALER_PrivateContractHashP h_contract_terms; + + /** + * Merchant signature over the orders. + */ + struct TALER_MerchantSignatureP merchant_sig; + + /** + * Merchant public key. + */ + struct TALER_MerchantPublicKeyP merchant_pub; + + /** + * The nonce. + */ + struct GNUNET_CRYPTO_EddsaPublicKey nonce; + + /** + * The claim token + */ + struct TALER_ClaimTokenP claim_token; + + /** + * Should the command also CLAIM the order? + */ + bool with_claim; + + /** + * If not NULL, the command should duplicate the request and verify the + * response is the same as in this command. + */ + const char *duplicate_of; + + /** + * Encoded key for the payment verification. + */ + const char **template_pos_key; + /** * Expected HTTP response code. */ @@ -70,6 +138,71 @@ struct PostUsingTemplatesState }; +/** + * Used to fill the "orders" CMD state with backend-provided + * values. Also double-checks that the order was correctly + * created. + * + * @param cls closure + * @param hr HTTP response we got + * @param contract_terms contract terms of this order + * @param sig merchant's signature + * @param hash hash over the contract + */ +static void +orders_claim_cb (void *cls, + const struct TALER_MERCHANT_HttpResponse *hr, + const json_t *contract_terms, + const struct TALER_MerchantSignatureP *sig, + const struct TALER_PrivateContractHashP *hash) +{ + struct PostUsingTemplatesState *tis = cls; + struct TALER_MerchantPublicKeyP merchant_pub; + const char *error_name; + unsigned int error_line; + struct GNUNET_JSON_Specification spec[] = { + GNUNET_JSON_spec_fixed_auto ("merchant_pub", + &merchant_pub), + GNUNET_JSON_spec_end () + }; + + tis->och = NULL; + if (tis->http_status != hr->http_status) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Expected status %u, got %u\n", + tis->http_status, + hr->http_status); + TALER_TESTING_FAIL (tis->is); + } + + tis->contract_terms = json_deep_copy (contract_terms); + tis->h_contract_terms = *hash; + tis->merchant_sig = *sig; + if (GNUNET_OK != + GNUNET_JSON_parse (contract_terms, + spec, + &error_name, + &error_line)) + { + char *log; + + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Parser failed on %s:%u\n", + error_name, + error_line); + log = json_dumps (tis->contract_terms, + JSON_INDENT (1)); + fprintf (stderr, + "%s\n", + log); + free (log); + TALER_TESTING_FAIL (tis->is); + } + tis->merchant_pub = merchant_pub; + TALER_TESTING_interpreter_next (tis->is); +} + /** * Callback for a POST /using-templates operation. @@ -94,6 +227,103 @@ post_using_templates_cb (void *cls, TALER_TESTING_interpreter_fail (tis->is); return; } + if (0 == tis->http_status) + { + TALER_LOG_DEBUG ("/using_templates, expected 0 status code\n"); + TALER_TESTING_interpreter_next (tis->is); + return; + } + // check the rest of the function to adapt to using_template + switch (por->hr.http_status) + { + case MHD_HTTP_OK: + if (NULL != por->details.ok.token) + tis->claim_token = *por->details.ok.token; + tis->order_id = GNUNET_strdup (por->details.ok.order_id); + if ((NULL != tis->expected_order_id) && + (0 != strcmp (por->details.ok.order_id, + tis->expected_order_id))) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Order id assigned does not match\n"); + TALER_TESTING_interpreter_fail (tis->is); + return; + } + if (NULL != tis->duplicate_of) + { + const struct TALER_TESTING_Command *order_cmd; + const struct TALER_ClaimTokenP *prev_token; + struct TALER_ClaimTokenP zero_token = {0}; + + order_cmd = TALER_TESTING_interpreter_lookup_command ( + tis->is, + tis->duplicate_of); + if (GNUNET_OK != + TALER_TESTING_get_trait_claim_token (order_cmd, + &prev_token)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Could not fetch previous order claim token\n"); + TALER_TESTING_interpreter_fail (tis->is); + return; + } + if (NULL == por->details.ok.token) + prev_token = &zero_token; + if (0 != GNUNET_memcmp (prev_token, + por->details.ok.token)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Claim tokens for identical requests do not match\n"); + TALER_TESTING_interpreter_fail (tis->is); + return; + } + } + break; + case MHD_HTTP_NOT_FOUND: + TALER_TESTING_interpreter_next (tis->is); + return; + case MHD_HTTP_GONE: + TALER_TESTING_interpreter_next (tis->is); + return; + case MHD_HTTP_CONFLICT: + TALER_TESTING_interpreter_next (tis->is); + return; + default: + { + char *s = json_dumps (por->hr.reply, + JSON_COMPACT); + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Unexpected status code from /orders: %u (%d) at %s; JSON: %s\n", + por->hr.http_status, + (int) por->hr.ec, + TALER_TESTING_interpreter_get_current_label (tis->is), + s); + GNUNET_free (s); + /** + * Not failing, as test cases are _supposed_ + * to create non 200 OK situations. + */ + TALER_TESTING_interpreter_next (tis->is); + } + return; + } + + if (! tis->with_claim) + { + TALER_TESTING_interpreter_next (tis->is); + return; + } + if (NULL == + (tis->och = TALER_MERCHANT_order_claim (tis->is->ctx, + tis->merchant_url, + tis->order_id, + &tis->nonce, + &tis->claim_token, + &orders_claim_cb, + tis))) + TALER_TESTING_FAIL (tis->is); + + /* switch (por->hr.http_status) { case MHD_HTTP_OK: @@ -109,7 +339,7 @@ post_using_templates_cb (void *cls, por->hr.http_status); break; } - TALER_TESTING_interpreter_next (tis->is); + TALER_TESTING_interpreter_next (tis->is);*/ } @@ -137,6 +367,10 @@ post_using_templates_run (void *cls, TALER_TESTING_get_trait_template_id (ref, &template_id)) TALER_TESTING_FAIL (is); + if (GNUNET_OK != + TALER_TESTING_get_trait_template_pos_key (ref, + &tis->template_pos_key)) + TALER_TESTING_FAIL (is); tis->iph = TALER_MERCHANT_using_templates_post ( is->ctx, tis->merchant_url, @@ -169,6 +403,15 @@ post_using_templates_traits (void *cls, { struct PostUsingTemplatesState *pts = cls; struct TALER_TESTING_Trait traits[] = { + TALER_TESTING_make_trait_order_id (&pts->order_id), + TALER_TESTING_make_trait_contract_terms (pts->contract_terms), + TALER_TESTING_make_trait_order_terms (pts->order_terms), + TALER_TESTING_make_trait_h_contract_terms (&pts->h_contract_terms), + TALER_TESTING_make_trait_merchant_sig (&pts->merchant_sig), + TALER_TESTING_make_trait_merchant_pub (&pts->merchant_pub), + TALER_TESTING_make_trait_claim_nonce (&pts->nonce), + TALER_TESTING_make_trait_claim_token (&pts->claim_token), + TALER_TESTING_make_trait_template_pos_key (pts->template_pos_key), // extract from template creation CMD TALER_TESTING_trait_end (), }; -- cgit v1.2.3