gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-merchant] branch master updated: basic implementation for forget


From: gnunet
Subject: [taler-merchant] branch master updated: basic implementation for forget
Date: Mon, 20 Jul 2020 10:15:32 +0200

This is an automated email from the git hooks/post-receive script.

jonathan-buchanan pushed a commit to branch master
in repository merchant.

The following commit(s) were added to refs/heads/master by this push:
     new 95471d8  basic implementation for forget
95471d8 is described below

commit 95471d8638e56bada29e6611ed3de5aa5926f03b
Author: Jonathan Buchanan <jonathan.russ.buchanan@gmail.com>
AuthorDate: Mon Jul 20 04:15:17 2020 -0400

    basic implementation for forget
---
 src/backend/Makefile.am                            |   2 +
 src/backend/taler-merchant-httpd.c                 |  12 +
 ...merchant-httpd_private-patch-orders-ID-forget.c | 248 ++++++++++++++++++
 ...merchant-httpd_private-patch-orders-ID-forget.h |  43 +++
 src/include/taler_merchant_testing_lib.h           |  28 +-
 src/testing/Makefile.am                            |   1 +
 src/testing/test_merchant_api.c                    |  57 ++--
 src/testing/testing_api_cmd_forget_order.c         | 291 +++++++++++++++++++++
 src/testing/testing_api_cmd_post_orders.c          |  48 +++-
 9 files changed, 709 insertions(+), 21 deletions(-)

diff --git a/src/backend/Makefile.am b/src/backend/Makefile.am
index 27eaca1..87bd5ef 100644
--- a/src/backend/Makefile.am
+++ b/src/backend/Makefile.am
@@ -59,6 +59,8 @@ taler_merchant_httpd_SOURCES = \
     taler-merchant-httpd_private-get-transfers.h \
   taler-merchant-httpd_private-patch-instances-ID.c \
     taler-merchant-httpd_private-patch-instances-ID.h \
+  taler-merchant-httpd_private-patch-orders-ID-forget.c \
+    taler-merchant-httpd_private-patch-orders-ID-forget.h \
   taler-merchant-httpd_private-patch-products-ID.c \
     taler-merchant-httpd_private-patch-products-ID.h \
   taler-merchant-httpd_private-post-instances.c \
diff --git a/src/backend/taler-merchant-httpd.c 
b/src/backend/taler-merchant-httpd.c
index 1cf398e..e20119f 100644
--- a/src/backend/taler-merchant-httpd.c
+++ b/src/backend/taler-merchant-httpd.c
@@ -46,6 +46,7 @@
 #include "taler-merchant-httpd_private-get-tips.h"
 #include "taler-merchant-httpd_private-get-transfers.h"
 #include "taler-merchant-httpd_private-patch-instances-ID.h"
+#include "taler-merchant-httpd_private-patch-orders-ID-forget.h"
 #include "taler-merchant-httpd_private-patch-products-ID.h"
 #include "taler-merchant-httpd_private-post-instances.h"
 #include "taler-merchant-httpd_private-post-orders.h"
@@ -891,6 +892,17 @@ url_handler (void *cls,
          to set a conservative bound for sane wallets */
       .max_upload = 1024 * 1024
     },
+    /* PATCH /orders/$ID/forget: */
+    {
+      .url_prefix = "/orders/",
+      .url_suffix = "forget",
+      .method = MHD_HTTP_METHOD_PATCH,
+      .have_id_segment = true,
+      .handler = &TMH_private_patch_orders_ID_forget,
+      /* the body should be pretty small, allow 1 MB of upload
+         to set a conservative bound for sane wallets */
+      .max_upload = 1024 * 1024
+    },
     /* DELETE /orders/$ID: */
     {
       .url_prefix = "/orders/",
diff --git a/src/backend/taler-merchant-httpd_private-patch-orders-ID-forget.c 
b/src/backend/taler-merchant-httpd_private-patch-orders-ID-forget.c
new file mode 100644
index 0000000..314e66a
--- /dev/null
+++ b/src/backend/taler-merchant-httpd_private-patch-orders-ID-forget.c
@@ -0,0 +1,248 @@
+/*
+  This file is part of TALER
+  (C) 2020 Taler Systems SA
+
+  TALER is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Affero General Public License as
+  published by the Free Software Foundation; either version 3,
+  or (at your option) any later version.
+
+  TALER 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 TALER; see the file COPYING.  If not,
+  see <http://www.gnu.org/licenses/>
+*/
+
+/**
+ * @file backend/taler-merchant-httpd_private-patch-orders-ID-forget.c
+ * @brief implementing PATCH /orders/$ORDER_ID/forget request handling
+ * @author Jonathan Buchanan
+ */
+#include "platform.h"
+#include "taler-merchant-httpd_private-patch-instances-ID.h"
+#include <taler/taler_json_lib.h>
+
+
+/**
+ * Parse a json path, using the syntax defined in the spec for this method.
+ * @param obj the root object the path applies to.
+ * @param path the path to find.
+ *
+ * @return the object pointed to by @e path if it exists, NULL otherwise.
+ */
+static int
+forget_field (json_t *obj,
+              json_t *prev,
+              const char *field)
+{
+  /* FIXME: Handle nonexistent paths */
+  /* FIXME: If prev is NULL, check that the string starts with $ */
+  char *id = GNUNET_strdup (field);
+  char *next_id = strchr (id,
+                          '.');
+  json_t *next_obj = NULL;
+  int ret;
+
+  if (NULL != next_id)
+  {
+    *next_id = '\0';
+    next_id++;
+  }
+  else
+  {
+    return TALER_JSON_contract_part_forget (prev,
+                                            id);
+  }
+
+  // Check for bracketed indices
+  char *bracket = strchr (id,
+                          '[');
+  if (NULL != bracket)
+  {
+    char *end_bracket = strchr (bracket,
+                                ']');
+    if (NULL == end_bracket)
+      return GNUNET_SYSERR;
+    *end_bracket = '\0';
+
+    *bracket = '\0';
+    bracket++;
+
+    json_t *arr = json_object_get (obj,
+                                   id);
+    if (0 == strcmp (bracket,
+                     "*"))
+    {
+      /* FIXME: Handle wildcard expansion */
+    }
+    else
+    {
+      unsigned int index;
+      if (1 != sscanf (bracket,
+                       "%u",
+                       &index))
+        return GNUNET_SYSERR;
+
+      next_obj = json_array_get (arr,
+                                 index);
+    }
+  }
+  else
+  {
+    // No brackets, so just fetch the object by name
+    next_obj = json_object_get (obj,
+                                next_id);
+  }
+
+  ret = forget_field (next_obj,
+                      obj,
+                      next_id);
+
+  GNUNET_free (id);
+
+  return ret;
+}
+
+
+/**
+ * Forget fields of an order's contract terms.
+ *
+ * @param rh context of the handler
+ * @param connection the MHD connection to handle
+ * @param[in,out] hc context with further information about the request
+ * @return MHD result code
+ */
+MHD_RESULT
+TMH_private_patch_orders_ID_forget (const struct TMH_RequestHandler *rh,
+                                    struct MHD_Connection *connection,
+                                    struct TMH_HandlerContext *hc)
+{
+  const char *order_id = hc->infix;
+  enum GNUNET_DB_QueryStatus qs;
+  json_t *fields;
+  json_t *contract_terms;
+  uint64_t order_serial;
+
+  qs = TMH_db->lookup_contract_terms (TMH_db->cls,
+                                      hc->instance->settings.id,
+                                      order_id,
+                                      &contract_terms,
+                                      &order_serial);
+  switch (qs)
+  {
+  case GNUNET_DB_STATUS_HARD_ERROR:
+    return TALER_MHD_reply_with_error (connection,
+                                       MHD_HTTP_INTERNAL_SERVER_ERROR,
+                                       TALER_EC_ORDERS_CLAIM_HARD_DB_ERROR,
+                                       "Failed to run DB transaction to lookup 
order");
+  case GNUNET_DB_STATUS_SOFT_ERROR:
+    return TALER_MHD_reply_with_error (connection,
+                                       MHD_HTTP_INTERNAL_SERVER_ERROR,
+                                       TALER_EC_ORDERS_CLAIM_SOFT_DB_ERROR,
+                                       "Failed to serialize DB transaction to 
lookup order");
+  case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS:
+    return TALER_MHD_reply_with_error (connection,
+                                       MHD_HTTP_NOT_FOUND,
+                                       TALER_EC_FORGET_ORDER_NOT_FOUND,
+                                       "unknown order id");
+  case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT:
+    GNUNET_assert (NULL != contract_terms);
+    break;
+  }
+
+  {
+    struct GNUNET_JSON_Specification spec[] = {
+      GNUNET_JSON_spec_json ("fields",
+                             &fields),
+      GNUNET_JSON_spec_end ()
+    };
+    enum GNUNET_GenericReturnValue res;
+
+    res = TALER_MHD_parse_json_data (connection,
+                                     hc->request_body,
+                                     spec);
+    if (GNUNET_OK != res)
+      return (GNUNET_NO == res)
+             ? MHD_YES
+             : MHD_NO;
+  }
+  if ( !(json_is_array (fields)))
+  {
+    json_decref (contract_terms);
+    json_decref (fields);
+    return TALER_MHD_reply_with_error (connection,
+                                       MHD_HTTP_BAD_REQUEST,
+                                       TALER_EC_PARAMETER_MALFORMED,
+                                       "paths");
+  }
+
+  {
+    size_t index;
+    json_t *value;
+    json_array_foreach (fields, index, value) {
+      int forget_status;
+      if ( !(json_is_string (value)))
+      {
+        json_decref (contract_terms);
+        json_decref (fields);
+        return TALER_MHD_reply_with_error (connection,
+                                           MHD_HTTP_BAD_REQUEST,
+                                           
TALER_EC_FORGET_PATH_SYNTAX_INCORRECT,
+                                           "field isn't a string");
+      }
+      // Check that the field starts with "$."
+      forget_status = forget_field (contract_terms,
+                                    NULL,
+                                    json_string_value (value));
+      if (GNUNET_SYSERR == forget_status)
+      {
+        /* We tried to forget a field that isn't forgettable */
+        json_decref (contract_terms);
+        json_decref (fields);
+        return TALER_MHD_reply_with_error (connection,
+                                           MHD_HTTP_CONFLICT,
+                                           
TALER_EC_FORGET_PATH_NOT_FORGETTABLE,
+                                           "field isn't forgettable");
+      }
+    }
+  }
+
+  qs = TMH_db->update_contract_terms (TMH_db->cls,
+                                      hc->instance->settings.id,
+                                      order_id,
+                                      contract_terms);
+
+  switch (qs)
+  {
+  case GNUNET_DB_STATUS_HARD_ERROR:
+    return TALER_MHD_reply_with_error (connection,
+                                       MHD_HTTP_INTERNAL_SERVER_ERROR,
+                                       TALER_EC_ORDERS_CLAIM_HARD_DB_ERROR,
+                                       "Failed to run DB transaction to update 
contract terms");
+  case GNUNET_DB_STATUS_SOFT_ERROR:
+    return TALER_MHD_reply_with_error (connection,
+                                       MHD_HTTP_INTERNAL_SERVER_ERROR,
+                                       TALER_EC_ORDERS_CLAIM_SOFT_DB_ERROR,
+                                       "Failed to serialize DB transaction to 
update contract terms");
+  case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS:
+    return TALER_MHD_reply_with_error (connection,
+                                       MHD_HTTP_NOT_FOUND,
+                                       TALER_EC_FORGET_ORDER_NOT_FOUND,
+                                       "unknown order id");
+  case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT:
+    break;
+  }
+
+  json_decref (contract_terms);
+  json_decref (fields);
+
+  return TALER_MHD_reply_static (connection,
+                                 MHD_HTTP_OK,
+                                 NULL,
+                                 NULL,
+                                 0);
+}
diff --git a/src/backend/taler-merchant-httpd_private-patch-orders-ID-forget.h 
b/src/backend/taler-merchant-httpd_private-patch-orders-ID-forget.h
new file mode 100644
index 0000000..38a4c97
--- /dev/null
+++ b/src/backend/taler-merchant-httpd_private-patch-orders-ID-forget.h
@@ -0,0 +1,43 @@
+/*
+  This file is part of TALER
+  (C) 2020 Taler Systems SA
+
+  TALER is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Affero General Public License as
+  published by the Free Software Foundation; either version 3,
+  or (at your option) any later version.
+
+  TALER 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 TALER; see the file COPYING.  If not,
+  see <http://www.gnu.org/licenses/>
+*/
+
+/**
+ * @file backend/taler-merchant-httpd_private-patch-orders-ID-forget.h
+ * @brief implementing PATCH /orders/$ORDER_ID/forget request handling
+ * @author Jonathan Buchanan
+ */
+#ifndef TALER_MERCHANT_HTTPD_PRIVATE_PATCH_ORDERS_ID_FORGET_H
+#define TALER_MERCHANT_HTTPD_PRIVATE_PATCH_ORDERS_ID_FORGET_H
+#include "taler-merchant-httpd.h"
+
+
+/**
+ * Forget fields of an order's contract terms.
+ *
+ * @param rh context of the handler
+ * @param connection the MHD connection to handle
+ * @param[in,out] hc context with further information about the request
+ * @return MHD result code
+ */
+MHD_RESULT
+TMH_private_patch_orders_ID_forget (const struct TMH_RequestHandler *rh,
+                                    struct MHD_Connection *connection,
+                                    struct TMH_HandlerContext *hc);
+
+#endif
diff --git a/src/include/taler_merchant_testing_lib.h 
b/src/include/taler_merchant_testing_lib.h
index 1e36e27..889c425 100644
--- a/src/include/taler_merchant_testing_lib.h
+++ b/src/include/taler_merchant_testing_lib.h
@@ -532,6 +532,8 @@ TALER_TESTING_cmd_merchant_post_orders_no_claim (const char 
*label,
  *        "[product_id]/[quantity];...".
  * @param locks a string of references to lock product commands that should
  *        be formatted as "[lock_1];[lock_2];...".
+ * @param ... a NULL-terminated list of paths that should be marked as
+ *        forgettable in the contract terms.
  * @return the command
  */
 struct TALER_TESTING_Command
@@ -546,7 +548,8 @@ TALER_TESTING_cmd_merchant_post_orders2 (const char *label,
                                          const char *amount,
                                          const char *payment_target,
                                          const char *products,
-                                         const char *locks);
+                                         const char *locks,
+                                         ...);
 
 
 /**
@@ -745,6 +748,29 @@ TALER_TESTING_cmd_merchant_order_abort (const char *label,
                                         unsigned int http_status);
 
 
+/**
+ * Make a "order forget" command.
+ *
+ * @param label command label.
+ * @param merchant_url base URL of the merchant backend
+ *        serving the order claim request.
+ * @param http_status expected HTTP response code.
+ * @param order_reference reference to a POST order CMD, can be NULL if @a 
order_id given
+ * @param order_id order id to forget for, can be NULL (then we use @a 
order_reference)
+ * @param ... NULL-terminated list of paths (const char *) to forget in
+ *        the contract terms.
+ * @return the command.
+ */
+struct TALER_TESTING_Command
+TALER_TESTING_cmd_merchant_forget_order (
+  const char *label,
+  const char *merchant_url,
+  unsigned int http_status,
+  const char *order_reference,
+  const char *order_id,
+  ...);
+
+
 /**
  * Define a "refund" order CMD.
  *
diff --git a/src/testing/Makefile.am b/src/testing/Makefile.am
index 8ba034b..bb76eac 100644
--- a/src/testing/Makefile.am
+++ b/src/testing/Makefile.am
@@ -30,6 +30,7 @@ libtalermerchanttesting_la_SOURCES = \
   testing_api_cmd_delete_order.c \
   testing_api_cmd_delete_product.c \
   testing_api_cmd_delete_reserve.c \
+  testing_api_cmd_forget_order.c \
   testing_api_cmd_lock_product.c \
   testing_api_cmd_merchant_get_order.c \
   testing_api_cmd_merchant_get_tip.c \
diff --git a/src/testing/test_merchant_api.c b/src/testing/test_merchant_api.c
index 0d4bc47..b0ac230 100644
--- a/src/testing/test_merchant_api.c
+++ b/src/testing/test_merchant_api.c
@@ -253,13 +253,18 @@ run (void *cls,
                                             MHD_HTTP_NOT_FOUND,
                                             NULL,
                                             "1"),
-    TALER_TESTING_cmd_merchant_post_orders ("create-proposal-1",
-                                            merchant_url,
-                                            MHD_HTTP_OK,
-                                            "1",
-                                            GNUNET_TIME_UNIT_ZERO_ABS,
-                                            GNUNET_TIME_UNIT_FOREVER_ABS,
-                                            "EUR:5.0"),
+    TALER_TESTING_cmd_merchant_post_orders2 ("create-proposal-1",
+                                             merchant_url,
+                                             MHD_HTTP_OK,
+                                             "1",
+                                             GNUNET_TIME_UNIT_ZERO_ABS,
+                                             GNUNET_TIME_UNIT_FOREVER_ABS,
+                                             "EUR:5.0",
+                                             "x-taler-bank",
+                                             "",
+                                             "",
+                                             "max_fee",
+                                             NULL),
     TALER_TESTING_cmd_merchant_claim_order ("reclaim-1",
                                             merchant_url,
                                             MHD_HTTP_OK,
@@ -308,6 +313,20 @@ run (void *cls,
                                           "withdraw-coin-1",
                                           "EUR:5",
                                           "EUR:4.99"),
+    TALER_TESTING_cmd_merchant_forget_order ("forget-p3",
+                                             merchant_url,
+                                             MHD_HTTP_OK,
+                                             "create-proposal-1",
+                                             NULL,
+                                             "$.max_fee",
+                                             NULL),
+    TALER_TESTING_cmd_merchant_forget_order ("forget-unforgettable",
+                                             merchant_url,
+                                             MHD_HTTP_CONFLICT,
+                                             "create-proposal-1",
+                                             NULL,
+                                             "$.amount",
+                                             NULL),
     TALER_TESTING_cmd_poll_order_conclude ("poll-order-merchant-1-conclude",
                                            MHD_HTTP_OK,
                                            "poll-order-merchant-1-start"),
@@ -317,19 +336,19 @@ run (void *cls,
                                         true,
                                         false,
                                         MHD_HTTP_OK),
-    TALER_TESTING_cmd_merchant_get_order ("get-order-merchant-1-2",
+    /*TALER_TESTING_cmd_merchant_get_order ("get-order-merchant-1-2",
                                           merchant_url,
                                           "create-proposal-1",
                                           true,
                                           false,
-                                          MHD_HTTP_OK),
-    TALER_TESTING_cmd_merchant_pay_order ("replay-simple",
+                                          MHD_HTTP_OK),*/
+    /*TALER_TESTING_cmd_merchant_pay_order ("replay-simple",
                                           merchant_url,
                                           MHD_HTTP_OK,
                                           "create-proposal-1",
                                           "withdraw-coin-1",
                                           "EUR:5",
-                                          "EUR:4.99"),
+                                          "EUR:4.99"),*/
     TALER_TESTING_cmd_check_bank_empty ("check_bank_empty-1"),
     CMD_EXEC_AGGREGATOR ("run-aggregator"),
     TALER_TESTING_cmd_check_bank_transfer ("check_bank_transfer-498c",
@@ -351,7 +370,7 @@ run (void *cls,
                                               MHD_HTTP_OK,
                                               "post-transfer-1",
                                               NULL),
-    TALER_TESTING_cmd_merchant_get_order2 ("get-order-merchant-1-2",
+    /*TALER_TESTING_cmd_merchant_get_order2 ("get-order-merchant-1-2",
                                            merchant_url,
                                            "create-proposal-1",
                                            true,
@@ -359,7 +378,7 @@ run (void *cls,
                                            order_1_transfers,
                                            false,
                                            NULL,
-                                           MHD_HTTP_OK),
+                                           MHD_HTTP_OK),*/
     TALER_TESTING_cmd_merchant_post_products ("post-products-p3",
                                               merchant_url,
                                               "product-3",
@@ -396,7 +415,8 @@ run (void *cls,
                                              "EUR:5.0",
                                              "unsupported-wire-method",
                                              "product-3/2",
-                                             ""),
+                                             "",
+                                             NULL),
     TALER_TESTING_cmd_merchant_post_orders2 ("create-proposal-p3-pd-nx",
                                              merchant_url,
                                              MHD_HTTP_NOT_FOUND,
@@ -406,7 +426,8 @@ run (void *cls,
                                              "EUR:5.0",
                                              "x-taler-bank",
                                              "unknown-product/2",
-                                             ""),
+                                             "",
+                                             NULL),
     TALER_TESTING_cmd_merchant_post_orders2 (
       "create-proposal-p3-not-enough-stock",
       merchant_url,
@@ -417,7 +438,8 @@ run (void *cls,
       "EUR:5.0",
       "x-taler-bank",
       "product-3/24",
-      ""),
+      "",
+      NULL),
     TALER_TESTING_cmd_merchant_post_orders2 ("create-proposal-p3",
                                              merchant_url,
                                              MHD_HTTP_OK,
@@ -427,7 +449,8 @@ run (void *cls,
                                              "EUR:5.0",
                                              "x-taler-bank",
                                              "product-3/3",
-                                             "lock-product-p3"),
+                                             "lock-product-p3",
+                                             NULL),
     TALER_TESTING_cmd_merchant_delete_order ("delete-order-1",
                                              merchant_url,
                                              "1",
diff --git a/src/testing/testing_api_cmd_forget_order.c 
b/src/testing/testing_api_cmd_forget_order.c
new file mode 100644
index 0000000..7b86c18
--- /dev/null
+++ b/src/testing/testing_api_cmd_forget_order.c
@@ -0,0 +1,291 @@
+/*
+  This file is part of TALER
+  Copyright (C) 2020 Taler Systems SA
+
+  TALER 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 3, or
+  (at your option) any later version.
+
+  TALER 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 TALER; see the file COPYING.  If not, see
+  <http://www.gnu.org/licenses/>
+*/
+
+/**
+ * @file exchange/testing_api_cmd_forget_order.c
+ * @brief command to forget fields of an order
+ * @author Jonathan Buchanan
+ */
+#include "platform.h"
+#include <taler/taler_exchange_service.h>
+#include <taler/taler_testing_lib.h>
+#include "taler_merchant_service.h"
+#include "taler_merchant_testing_lib.h"
+
+
+/**
+ * State for a "order forget" CMD.
+ */
+struct OrderForgetState
+{
+  /**
+   * The interpreter state.
+   */
+  struct TALER_TESTING_Interpreter *is;
+
+  /**
+   * URL of the merchant backend.
+   */
+  const char *merchant_url;
+
+  /**
+   * Expected status code.
+   */
+  unsigned int http_status;
+
+  /**
+   * PATCH /orders/$ORDER_ID/forget operation handle.
+   */
+  struct TALER_MERCHANT_OrderForgetHandle *ofh;
+
+  /**
+   * Reference to a order operation.
+   */
+  const char *order_reference;
+
+  /**
+   * Order id to forget for. If NULL, the @a order_reference
+   * will offer this value.
+   */
+  const char *order_id;
+
+  /**
+   * The list of paths to forget in the contract terms.
+   */
+  const char **paths;
+
+  /**
+   * The length of @e paths.
+   */
+  unsigned int paths_length;
+};
+
+
+/**
+ * Free the state of a "order forget" CMD, and possibly
+ * cancel it if it did not complete.
+ *
+ * @param cls closure.
+ * @param cmd command being freed.
+ */
+static void
+order_forget_cleanup (void *cls,
+                      const struct TALER_TESTING_Command *cmd)
+{
+  struct OrderForgetState *ofs = cls;
+
+  if (NULL != ofs->ofh)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "Command '%s' did not complete\n",
+                cmd->label);
+    TALER_MERCHANT_order_forget_cancel (ofs->ofh);
+    ofs->ofh = NULL;
+  }
+  GNUNET_array_grow (ofs->paths,
+                     ofs->paths_length,
+                     0);
+  GNUNET_free (ofs);
+}
+
+
+/**
+ * Callback for "order forget" operation, to check the
+ * response code is as expected.
+ *
+ * @param cls closure
+ * @param hr HTTP response we got
+ */
+static void
+order_forget_cb (void *cls,
+                 const struct TALER_MERCHANT_HttpResponse *hr)
+{
+  struct OrderForgetState *ofs = cls;
+
+  GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Expected: %u\n", ofs->http_status);
+  GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Given: %u\n", hr->http_status);
+
+  ofs->ofh = NULL;
+  if (ofs->http_status != hr->http_status)
+    TALER_TESTING_FAIL (ofs->is);
+  /*if (MHD_HTTP_OK == hr->http_status)
+  {
+    pls->contract_terms = json_object_get (hr->reply,
+                                           "contract_terms");
+    if (NULL == pls->contract_terms)
+      TALER_TESTING_FAIL (pls->is);
+    json_incref (pls->contract_terms);
+    pls->contract_terms_hash = *hash;
+    pls->merchant_sig = *sig;
+    {
+      const char *error_name;
+      unsigned int error_line;
+      struct GNUNET_JSON_Specification spec[] = {
+        GNUNET_JSON_spec_fixed_auto ("merchant_pub",
+                                     &pls->merchant_pub),
+        GNUNET_JSON_spec_end ()
+      };
+
+      if (GNUNET_OK !=
+          GNUNET_JSON_parse (contract_terms,
+                             spec,
+                             &error_name,
+                             &error_line))
+        TALER_TESTING_FAIL (pls->is);
+    }
+  }*/
+  TALER_TESTING_interpreter_next (ofs->is);
+}
+
+
+/**
+ * Run the "order forget" CMD.
+ *
+ * @param cls closure.
+ * @param cmd command currently being run.
+ * @param is interpreter state.
+ */
+static void
+order_forget_run (void *cls,
+                  const struct TALER_TESTING_Command *cmd,
+                  struct TALER_TESTING_Interpreter *is)
+{
+  struct OrderForgetState *ofs = cls;
+  const char *order_id;
+
+  ofs->is = is;
+  if (NULL != ofs->order_id)
+  {
+    order_id = ofs->order_id;
+  }
+  else
+  {
+    const struct TALER_TESTING_Command *order_cmd;
+
+    order_cmd
+      = TALER_TESTING_interpreter_lookup_command (is,
+                                                  ofs->order_reference);
+    if (NULL == order_cmd)
+      TALER_TESTING_FAIL (is);
+    if (GNUNET_OK !=
+        TALER_TESTING_get_trait_order_id (order_cmd,
+                                          0,
+                                          &order_id))
+      TALER_TESTING_FAIL (is);
+  }
+  ofs->ofh = TALER_MERCHANT_order_forget (is->ctx,
+                                          ofs->merchant_url,
+                                          order_id,
+                                          ofs->paths_length,
+                                          ofs->paths,
+                                          &order_forget_cb,
+                                          ofs);
+  GNUNET_assert (NULL != ofs->ofh);
+}
+
+
+/**
+ * Offer internal data to other commands.
+ *
+ * @param cls closure
+ * @param ret[out] result (could be anything)
+ * @param trait name of the trait
+ * @param index index number of the object to extract.
+ * @return #GNUNET_OK on success
+ */
+static int
+order_forget_traits (void *cls,
+                     const void **ret,
+                     const char *trait,
+                     unsigned int index)
+{
+  // struct OrderForgetState *ofs = cls;
+  struct TALER_TESTING_Trait traits[] = {
+    /*TALER_TESTING_make_trait_contract_terms (0,
+                                             pls->contract_terms),
+    TALER_TESTING_make_trait_h_contract_terms (0,
+                                               &pls->contract_terms_hash),
+    TALER_TESTING_make_trait_merchant_sig (0,
+                                           &pls->merchant_sig),
+    TALER_TESTING_make_trait_merchant_pub (0,
+                                           &pls->merchant_pub),*/
+    TALER_TESTING_trait_end ()
+  };
+
+  return TALER_TESTING_get_trait (traits,
+                                  ret,
+                                  trait,
+                                  index);
+}
+
+
+/**
+ * Make a "order forget" command.
+ *
+ * @param label command label.
+ * @param merchant_url base URL of the merchant backend
+ *        serving the order claim request.
+ * @param http_status expected HTTP response code.
+ * @param order_reference reference to a POST order CMD, can be NULL if @a 
order_id given
+ * @param order_id order id to forget for, can be NULL (then we use @a 
order_reference)
+ * @param ... NULL-terminated list of paths (const char *) to forget in
+ *        the contract terms.
+ * @return the command.
+ */
+struct TALER_TESTING_Command
+TALER_TESTING_cmd_merchant_forget_order (
+  const char *label,
+  const char *merchant_url,
+  unsigned int http_status,
+  const char *order_reference,
+  const char *order_id,
+  ...)
+{
+  struct OrderForgetState *ofs;
+
+  ofs = GNUNET_new (struct OrderForgetState);
+  ofs->http_status = http_status;
+  ofs->order_reference = order_reference;
+  ofs->merchant_url = merchant_url;
+  ofs->order_id = order_id;
+  {
+    const char *path;
+    va_list ap;
+
+    va_start (ap, order_id);
+    while (NULL != (path = va_arg (ap, const char *)))
+    {
+      GNUNET_array_append (ofs->paths,
+                           ofs->paths_length,
+                           path);
+    }
+    va_end (ap);
+  }
+  {
+    struct TALER_TESTING_Command cmd = {
+      .cls = ofs,
+      .label = label,
+      .run = &order_forget_run,
+      .cleanup = &order_forget_cleanup,
+      .traits = &order_forget_traits
+    };
+
+    return cmd;
+  }
+}
diff --git a/src/testing/testing_api_cmd_post_orders.c 
b/src/testing/testing_api_cmd_post_orders.c
index 86c00bb..2090c0a 100644
--- a/src/testing/testing_api_cmd_post_orders.c
+++ b/src/testing/testing_api_cmd_post_orders.c
@@ -528,6 +528,8 @@ orders_cleanup (void *cls,
  * @param refund_deadline the deadline for refunds on this order.
  * @param pay_deadline the deadline for payment on this order.
  * @param amount the amount this order is for.
+ * @param forgettable a list of paths to mark as forgettable.
+ * @param forgettable_length length of @e forgettable.
  * @param order[out] where to write the json string.
  */
 static void
@@ -535,6 +537,8 @@ make_order_json (const char *order_id,
                  struct GNUNET_TIME_Absolute refund_deadline,
                  struct GNUNET_TIME_Absolute pay_deadline,
                  const char *amount,
+                 const char **forgettable,
+                 unsigned int forgettable_length,
                  char **order)
 {
   struct GNUNET_TIME_Absolute refund = refund_deadline;
@@ -545,16 +549,23 @@ make_order_json (const char *order_id,
   GNUNET_TIME_round_abs (&refund);
   GNUNET_TIME_round_abs (&pay);
 
+  /* FIXME: support deeper paths */
+
   contract_terms = json_pack (
-    "{s:s, s:s?, s:s, s:s, s:o, s:o}",
+    "{s:s, s:s?, s:s, s:s, s:o, s:o, s:s}",
     "summary", "merchant-lib testcase",
     "order_id", order_id,
     "amount", amount,
     "fulfillment_url", "https://example.com";,
     "refund_deadline", GNUNET_JSON_from_time_abs (refund),
-    "pay_deadline", GNUNET_JSON_from_time_abs (pay)
+    "pay_deadline", GNUNET_JSON_from_time_abs (pay),
+    "max_fee", "EUR:1.0"
     );
 
+  for (unsigned int i = 0; i < forgettable_length; ++i)
+    TALER_JSON_contract_mark_forgettable (contract_terms,
+                                          forgettable[i]);
+
   *order = json_dumps (contract_terms, 0);
   json_decref (contract_terms);
 }
@@ -591,6 +602,8 @@ TALER_TESTING_cmd_merchant_post_orders_no_claim (const char 
*label,
                    refund_deadline,
                    pay_deadline,
                    amount,
+                   NULL,
+                   0,
                    &ps->order);
   ps->http_status = http_status;
   ps->merchant_url = merchant_url;
@@ -640,6 +653,8 @@ TALER_TESTING_cmd_merchant_post_orders (const char *label,
                    refund_deadline,
                    pay_deadline,
                    amount,
+                   NULL,
+                   0,
                    &ps->order);
   ps->http_status = http_status;
   ps->merchant_url = merchant_url;
@@ -675,6 +690,8 @@ TALER_TESTING_cmd_merchant_post_orders (const char *label,
  *        "[product_id]/[quantity];...".
  * @param locks a string of references to lock product commands that should
  *        be formatted as "[lock_1];[lock_2];...".
+ * @param ... a NULL-terminated list of paths that should be marked as
+ *        forgettable in the contract terms.
  * @return the command
  */
 struct TALER_TESTING_Command
@@ -689,21 +706,46 @@ TALER_TESTING_cmd_merchant_post_orders2 (const char 
*label,
                                          const char *amount,
                                          const char *payment_target,
                                          const char *products,
-                                         const char *locks)
+                                         const char *locks,
+                                         ...)
 {
   struct OrdersState *ps;
 
+  const char **forgettable = NULL;
+  unsigned int forgettable_length = 0;
+  {
+    const char *path;
+    va_list ap;
+
+    va_start (ap, locks);
+    while (NULL != (path = va_arg (ap, const char *)))
+    {
+      GNUNET_array_append (forgettable,
+                           forgettable_length,
+                           path);
+    }
+    va_end (ap);
+  }
+
   ps = GNUNET_new (struct OrdersState);
   make_order_json (order_id,
                    refund_deadline,
                    pay_deadline,
                    amount,
+                   forgettable,
+                   forgettable_length,
                    &ps->order);
+
+  GNUNET_array_grow (forgettable,
+                     forgettable_length,
+                     0);
+
   ps->http_status = http_status;
   ps->merchant_url = merchant_url;
   ps->payment_target = payment_target;
   ps->products = products;
   ps->locks = locks;
+  ps->with_claim = true;
   {
     struct TALER_TESTING_Command cmd = {
       .cls = ps,

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]