gnunet-svn
[Top][All Lists]
Advanced

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

[taler-exchange] branch master updated: implement forgettable contract t


From: gnunet
Subject: [taler-exchange] branch master updated: implement forgettable contract terms core logic (#6365)
Date: Thu, 16 Jul 2020 14:35:51 +0200

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

grothoff pushed a commit to branch master
in repository exchange.

The following commit(s) were added to refs/heads/master by this push:
     new c326a5bd implement forgettable contract terms core logic (#6365)
c326a5bd is described below

commit c326a5bd9d74a599c967a2ad49536110d054a846
Author: Christian Grothoff <christian@grothoff.org>
AuthorDate: Thu Jul 16 14:30:14 2020 +0200

    implement forgettable contract terms core logic (#6365)
---
 src/json/json.c      | 34 +++++++++++++++++++------
 src/json/test_json.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 97 insertions(+), 7 deletions(-)

diff --git a/src/json/json.c b/src/json/json.c
index 4874f0c2..9ee1628e 100644
--- a/src/json/json.c
+++ b/src/json/json.c
@@ -41,8 +41,11 @@ dump_and_hash (const json_t *json,
   char *wire_enc;
   size_t len;
 
+  GNUNET_break (NULL != json);
   if (NULL == (wire_enc = json_dumps (json,
-                                      JSON_COMPACT | JSON_SORT_KEYS)))
+                                      JSON_ENCODE_ANY
+                                      | JSON_COMPACT
+                                      | JSON_SORT_KEYS)))
   {
     GNUNET_break (0);
     return GNUNET_SYSERR;
@@ -116,7 +119,7 @@ forget (const json_t *in)
     }
     return ret;
   }
-  if (! json_is_object (in))
+  if (json_is_object (in))
   {
     json_t *ret;
     const char *key;
@@ -147,6 +150,23 @@ forget (const json_t *in)
         continue; /* skip! */
       if (rx == value)
         continue; /* skip! */
+      if ( (NULL != rx) &&
+           (NULL !=
+            json_object_get (rx,
+                             key)) )
+      {
+        if (0 !=
+            json_object_set_new (ret,
+                                 key,
+                                 json_null ()))
+        {
+          GNUNET_break (0);
+          json_decref (ret);
+          json_decref (rx);
+          return NULL;
+        }
+        continue; /* already forgotten earlier */
+      }
       t = forget (value);
       if (NULL == t)
       {
@@ -208,7 +228,6 @@ forget (const json_t *in)
           json_decref (rx);
           return NULL;
         }
-
       }
       else
       {
@@ -225,10 +244,11 @@ forget (const json_t *in)
         }
       }
     } /* json_object_foreach */
-    if (0 !=
-        json_object_set_new (ret,
-                             "_forgotten",
-                             rx))
+    if ( (NULL != rx) &&
+         (0 !=
+          json_object_set_new (ret,
+                               "_forgotten",
+                               rx)) )
     {
       GNUNET_break (0);
       json_decref (ret);
diff --git a/src/json/test_json.c b/src/json/test_json.c
index 2e7aba50..e876d95d 100644
--- a/src/json/test_json.c
+++ b/src/json/test_json.c
@@ -56,6 +56,74 @@ test_amount (void)
 }
 
 
+static int
+test_contract ()
+{
+  struct GNUNET_HashCode h1;
+  struct GNUNET_HashCode h2;
+  json_t *c1;
+  json_t *c2;
+  json_t *c3;
+
+  c1 = json_pack ("{s:s, s:{s:s, s:{s:s}}}",
+                  "k1", "v1",
+                  "k2", "n1", "n2",
+                  /***/ "_forgettable", "n1", "salt");
+  GNUNET_assert (NULL != c1);
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_JSON_contract_mark_forgettable (c1,
+                                                       "k1"));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_JSON_contract_hash (c1,
+                                           &h1));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_JSON_contract_part_forget (c1,
+                                                  "k1"));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_JSON_contract_hash (c1,
+                                           &h2));
+  json_decref (c1);
+  if (0 !=
+      GNUNET_memcmp (&h1,
+                     &h2))
+  {
+    GNUNET_break (0);
+    return 1;
+  }
+  c2 = json_pack ("{s:s}",
+                  "n1", "n2");
+  GNUNET_assert (NULL != c2);
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_JSON_contract_mark_forgettable (c2,
+                                                       "n1"));
+  c3 = json_pack ("{s:s, s:o}",
+                  "k1", "v1",
+                  "k2", c2);
+  GNUNET_assert (NULL != c3);
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_JSON_contract_mark_forgettable (c3,
+                                                       "k1"));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_JSON_contract_hash (c3,
+                                           &h1));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_JSON_contract_part_forget (c2,
+                                                  "n1"));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_JSON_contract_hash (c3,
+                                           &h2));
+  json_decref (c3);
+  if (0 !=
+      GNUNET_memcmp (&h1,
+                     &h2))
+  {
+    GNUNET_break (0);
+    return 1;
+  }
+  return 0;
+}
+
+
 int
 main (int argc,
       const char *const argv[])
@@ -67,6 +135,8 @@ main (int argc,
                     NULL);
   if (0 != test_amount ())
     return 1;
+  if (0 != test_contract ())
+    return 2;
   return 0;
 }
 

-- 
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]