gnunet-svn
[Top][All Lists]
Advanced

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

[taler-exchange] branch master updated (f934a81d -> 04d4922d)


From: gnunet
Subject: [taler-exchange] branch master updated (f934a81d -> 04d4922d)
Date: Fri, 17 Apr 2020 16:20:02 +0200

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

marcello pushed a change to branch master
in repository exchange.

    from f934a81d fix ftbfs
     new 4f713b40 Prepare and launch Nexus for tests.
     new 04d4922d fix nexus-test return code

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 src/include/taler_testing_lib.h        |  31 +++++
 src/testing/Makefile.am                |   9 ++
 src/testing/test_bank_api.c            |  42 +++++-
 src/testing/test_bank_api_nexus.conf   |  17 +++
 src/testing/testing_api_helpers_bank.c | 244 +++++++++++++++++++++++++++++++++
 5 files changed, 338 insertions(+), 5 deletions(-)
 create mode 100644 src/testing/test_bank_api_nexus.conf

diff --git a/src/include/taler_testing_lib.h b/src/include/taler_testing_lib.h
index dcdbb3c1..1194cb4b 100644
--- a/src/include/taler_testing_lib.h
+++ b/src/include/taler_testing_lib.h
@@ -810,6 +810,21 @@ struct GNUNET_OS_Process *
 TALER_TESTING_run_bank (const char *config_filename,
                         const char *bank_url);
 
+/**
+ * Start the (nexus) bank process.  Assume the port
+ * is available and the database is clean.  Use the "prepare
+ * bank" function to do such tasks.  This function is also
+ * responsible to create the exchange EBICS subscriber at
+ * the nexus.
+ *
+ * @param bank_url base URL of the bank, used by `wget' to check
+ *        that the bank was started right.
+ * @return the process, or NULL if the process could not
+ *         be started.
+ */
+struct GNUNET_OS_Process *
+TALER_TESTING_run_nexus (const struct TALER_TESTING_BankConfiguration *bc);
+
 /**
  * Runs the Fakebank by guessing / extracting the portnumber
  * from the base URL.
@@ -839,6 +854,22 @@ TALER_TESTING_prepare_bank (const char *config_filename,
                             const char *config_section,
                             struct TALER_TESTING_BankConfiguration *bc);
 
+/**
+ * Prepare the Nexus execution.  Check if the port is available
+ * and delete old database.
+ *
+ * @param config_filename configuration file name.
+ * @param reset_db should we reset the bank's database
+ * @param config_section section of the configuration with the exchange's 
account
+ * @param[out] bc set to the bank's configuration data
+ * @return the base url, or NULL upon errors.  Must be freed
+ *         by the caller.
+ */
+int
+TALER_TESTING_prepare_nexus (const char *config_filename,
+                             int reset_db,
+                             const char *config_section,
+                             struct TALER_TESTING_BankConfiguration *bc);
 
 /**
  * Look for substring in a programs' name.
diff --git a/src/testing/Makefile.am b/src/testing/Makefile.am
index bf8117b3..d73e89b3 100644
--- a/src/testing/Makefile.am
+++ b/src/testing/Makefile.am
@@ -118,6 +118,7 @@ check_PROGRAMS = \
   test_auditor_api_version \
   test_bank_api_with_fakebank \
   test_bank_api_with_pybank \
+  test_bank_api_with_nexus \
   test_exchange_api \
   test_exchange_api_keys_cherry_picking \
   test_exchange_api_revocation \
@@ -160,6 +161,14 @@ test_auditor_api_version_LDADD = \
   -lgnunetutil \
   -ljansson
 
+test_bank_api_with_nexus_SOURCES = \
+  test_bank_api.c
+test_bank_api_with_nexus_LDADD = \
+  libtalertesting.la \
+  -ltalerexchange \
+  -lgnunetutil \
+  $(top_builddir)/src/bank-lib/libtalerbank.la
+
 test_bank_api_with_fakebank_SOURCES = \
   test_bank_api.c
 test_bank_api_with_fakebank_LDADD = \
diff --git a/src/testing/test_bank_api.c b/src/testing/test_bank_api.c
index b0b61a16..2a709fb1 100644
--- a/src/testing/test_bank_api.c
+++ b/src/testing/test_bank_api.c
@@ -35,6 +35,7 @@
 
 #define CONFIG_FILE_FAKEBANK "test_bank_api_fakebank.conf"
 #define CONFIG_FILE_PYBANK "test_bank_api_pybank.conf"
+#define CONFIG_FILE_NEXUS "test_bank_api_nexus.conf"
 
 /**
  * Bank configuration data.
@@ -141,8 +142,8 @@ int
 main (int argc,
       char *const *argv)
 {
-  const char *cfgfilename;
   int rv;
+  const char *cfgfile;
 
   /* These environment variables get in the way... */
   unsetenv ("XDG_DATA_HOME");
@@ -150,12 +151,13 @@ main (int argc,
   GNUNET_log_setup ("test-bank-api",
                     "DEBUG",
                     NULL);
+
   with_fakebank = TALER_TESTING_has_in_name (argv[0],
                                              "_with_fakebank");
   if (GNUNET_YES == with_fakebank)
   {
     TALER_LOG_DEBUG ("Running against the Fakebank.\n");
-    cfgfilename = CONFIG_FILE_FAKEBANK;
+    cfgfile = CONFIG_FILE_FAKEBANK;
     if (GNUNET_OK !=
         TALER_TESTING_prepare_fakebank (CONFIG_FILE_FAKEBANK,
                                         "exchange-account-2",
@@ -165,10 +167,11 @@ main (int argc,
       return 77;
     }
   }
-  else
+  else if (GNUNET_YES == TALER_TESTING_has_in_name (argv[0],
+                                                    "_with_pybank"))
   {
     TALER_LOG_DEBUG ("Running against the Pybank.\n");
-    cfgfilename = CONFIG_FILE_PYBANK;
+    cfgfile = CONFIG_FILE_FAKEBANK;
     if (GNUNET_OK !=
         TALER_TESTING_prepare_bank (CONFIG_FILE_PYBANK,
                                     GNUNET_YES,
@@ -186,9 +189,38 @@ main (int argc,
       GNUNET_break (0);
       return 77;
     }
+  } else if (GNUNET_YES == TALER_TESTING_has_in_name (argv[0],
+                                                      "_with_nexus")) 
+  {
+    TALER_LOG_DEBUG ("Running against Nexus.\n");
+    cfgfile = CONFIG_FILE_FAKEBANK;
+    if (GNUNET_OK != TALER_TESTING_prepare_nexus (CONFIG_FILE_NEXUS,
+                                                  GNUNET_YES,
+                                                  "exchange-account-2",
+                                                  &bc))
+    {
+      GNUNET_break (0);
+      return 77;
+    }
+    if (NULL == (bankd = TALER_TESTING_run_nexus (&bc)))
+    {
+      GNUNET_break (0);
+      return 77;
+    }
+    GNUNET_OS_process_kill (bankd,
+                            SIGKILL);
+    GNUNET_OS_process_wait (bankd);
+    GNUNET_OS_process_destroy (bankd);
+    return 0;
   }
+  else
+  {
+    GNUNET_break (0);
+    return 77;
+  }
+
   if (GNUNET_OK !=
-      GNUNET_CONFIGURATION_parse_and_run (cfgfilename,
+      GNUNET_CONFIGURATION_parse_and_run (cfgfile,
                                           &setup_with_cfg,
                                           NULL))
     rv = 1;
diff --git a/src/testing/test_bank_api_nexus.conf 
b/src/testing/test_bank_api_nexus.conf
new file mode 100644
index 00000000..4635b210
--- /dev/null
+++ b/src/testing/test_bank_api_nexus.conf
@@ -0,0 +1,17 @@
+# This file is in the public domain.
+
+[taler]
+currency = KUDOS
+
+[exchange-account-2]
+PAYTO_URI = payto://iban/IBAN/UNUSED
+METHOD = x-taler-bank
+WIRE_GATEWAY_URL = http://localhost:5001/taler
+WIRE_GATEWAY_AUTH_METHOD = basic
+USERNAME = Exchange
+PASSWORD = x
+
+[bank]
+# not (!) used by the nexus, only by the helper
+# check to make sure the port is free for the nexus.
+HTTP_PORT = 5001 
diff --git a/src/testing/testing_api_helpers_bank.c 
b/src/testing/testing_api_helpers_bank.c
index bdbefe65..e8476d30 100644
--- a/src/testing/testing_api_helpers_bank.c
+++ b/src/testing/testing_api_helpers_bank.c
@@ -100,6 +100,100 @@ TALER_TESTING_has_in_name (const char *prog,
 }
 
 
+/**
+ * Start the (nexus) bank process.  Assume the port
+ * is available and the database is clean.  Use the "prepare
+ * bank" function to do such tasks.  This function is also
+ * responsible to create the exchange EBICS subscriber at
+ * the nexus.
+ *
+ * @param config_filename configuration filename.  Used to 
+ * @return the process, or NULL if the process could not
+ *         be started.
+ */
+struct GNUNET_OS_Process *
+TALER_TESTING_run_nexus (const struct TALER_TESTING_BankConfiguration *bc)
+{
+  struct GNUNET_OS_Process *bank_proc;
+  unsigned int iter;
+  char *curl_check_cmd;
+  char *curl_cmd;
+  char *post_body;
+  char *register_url;
+
+  bank_proc = GNUNET_OS_start_process
+                (GNUNET_NO,
+                GNUNET_OS_INHERIT_STD_NONE,
+                NULL, NULL, NULL,
+                "nexus",
+                "nexus",
+                NULL);
+  if (NULL == bank_proc)
+  {
+    BANK_FAIL ();
+  }
+  GNUNET_asprintf (&curl_check_cmd,
+                   "curl -s %s",
+                   bc->exchange_auth.wire_gateway_url);
+
+  /* give child time to start and bind against the socket */
+  fprintf (stderr,
+           "Waiting for `nexus' to be ready (via %s)\n", curl_check_cmd);
+  iter = 0;
+  do
+  {
+    if (10 == iter)
+    {
+      fprintf (
+        stderr,
+        "Failed to launch `nexus'\n");
+      GNUNET_OS_process_kill (bank_proc,
+                              SIGTERM);
+      GNUNET_OS_process_wait (bank_proc);
+      GNUNET_OS_process_destroy (bank_proc);
+      GNUNET_free (curl_check_cmd);
+      BANK_FAIL ();
+    }
+    fprintf (stderr, ".");
+    sleep (1);
+    iter++;
+  }
+  while (0 != system (curl_check_cmd));
+
+  GNUNET_asprintf (&post_body,
+                   "{ \
+                   \"ebicsURL\": \"http://mock\";, \
+                   \"userID\": \"mock\", \
+                   \"partnerID\": \"mock\", \
+                   \"hostID\": \"mock\", \
+                   \"password\": \"%s\"}",
+                   bc->exchange_auth.details.basic.password);
+  GNUNET_asprintf (&register_url,
+                   "http://localhost:5001/ebics/%s/subscribers";,
+                   bc->exchange_auth.details.basic.username);
+  GNUNET_asprintf (&curl_cmd,
+                   "curl -d'%s' -H'Content-Type: application/json' %s",
+                   post_body,
+                   register_url);
+
+  if (0 != system (curl_cmd))
+  {
+    GNUNET_free (curl_check_cmd);
+    GNUNET_free (curl_cmd);
+    GNUNET_free (post_body);
+    GNUNET_free (register_url);
+    BANK_FAIL (); // includes logging and return (!)
+  }
+
+  GNUNET_free (curl_check_cmd);
+  GNUNET_free (curl_cmd);
+  GNUNET_free (post_body);
+  GNUNET_free (register_url);
+  fprintf (stderr, "\n");
+
+  return bank_proc;
+}
+
 /**
  * Start the (Python) bank process.  Assume the port
  * is available and the database is clean.  Use the "prepare
@@ -216,6 +310,156 @@ TALER_TESTING_run_bank (const char *config_filename,
 
 }
 
+/**
+ * Prepare the Nexus execution.  Check if the port is available
+ * and delete old database.
+ *
+ * @param config_filename configuration file name.
+ * @param reset_db should we reset the bank's database
+ * @param config_section section of the configuration with the exchange's 
account
+ * @param[out] bc set to the bank's configuration data
+ * @return the base url, or NULL upon errors.  Must be freed
+ *         by the caller.
+ */
+int
+TALER_TESTING_prepare_nexus (const char *config_filename,
+                             int reset_db,
+                             const char *config_section,
+                             struct TALER_TESTING_BankConfiguration *bc)
+{
+  struct GNUNET_CONFIGURATION_Handle *cfg;
+  unsigned long long port;
+  struct GNUNET_OS_Process *dbreset_proc;
+  enum GNUNET_OS_ProcessStatusType type;
+  unsigned long code;
+  char *database = NULL; // silence compiler
+  char *exchange_payto_uri;
+
+  cfg = GNUNET_CONFIGURATION_create ();
+
+  if (GNUNET_OK !=
+      GNUNET_CONFIGURATION_load (cfg, config_filename))
+  {
+    GNUNET_CONFIGURATION_destroy (cfg);
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+
+  if (GNUNET_OK !=
+      GNUNET_CONFIGURATION_get_value_string (cfg,
+                                             config_section,
+                                             "PAYTO_URI",
+                                             &exchange_payto_uri))
+  {
+    GNUNET_log_config_missing (GNUNET_ERROR_TYPE_WARNING,
+                               config_section,
+                               "PAYTO_URI");
+    GNUNET_CONFIGURATION_destroy (cfg);
+    return GNUNET_SYSERR;
+  }
+
+  if (GNUNET_OK !=
+      GNUNET_CONFIGURATION_get_value_number (cfg,
+                                             "bank",
+                                             "HTTP_PORT",
+                                             &port))
+  {
+    GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
+                               "bank",
+                               "HTTP_PORT");
+    GNUNET_CONFIGURATION_destroy (cfg);
+    GNUNET_free (database);
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+
+  if (GNUNET_OK !=
+      GNUNET_NETWORK_test_port_free (IPPROTO_TCP,
+                                     (uint16_t) port))
+  {
+    fprintf (stderr,
+             "Required port %llu not available, skipping.\n",
+             port);
+    GNUNET_break (0);
+    GNUNET_free (database);
+    GNUNET_CONFIGURATION_destroy (cfg);
+    return GNUNET_SYSERR;
+  }
+
+  /* DB preparation */
+  if (GNUNET_YES == reset_db)
+  {
+    if (NULL ==
+        (dbreset_proc = GNUNET_OS_start_process (
+           GNUNET_NO,
+           GNUNET_OS_INHERIT_STD_NONE,
+           NULL, NULL, NULL,
+           "rm",
+           "rm",
+           "-f",
+           "libeufin-nexus.sqlite3", NULL)))
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                  "Failed to invoke db-removal command.\n");
+      GNUNET_free (database);
+      GNUNET_CONFIGURATION_destroy (cfg);
+      return GNUNET_SYSERR;
+    }
+    if (GNUNET_SYSERR ==
+        GNUNET_OS_process_wait_status (dbreset_proc,
+                                       &type,
+                                       &code))
+    {
+      GNUNET_OS_process_destroy (dbreset_proc);
+      GNUNET_break (0);
+      GNUNET_CONFIGURATION_destroy (cfg);
+      return GNUNET_SYSERR;
+    }
+    if ( (type == GNUNET_OS_PROCESS_EXITED) &&
+         (0 != code) )
+    {
+      fprintf (stderr,
+               "db-removal command was unsuccessful\n");
+      GNUNET_break (0);
+      GNUNET_CONFIGURATION_destroy (cfg);
+      return GNUNET_SYSERR;
+    }
+    if ( (type != GNUNET_OS_PROCESS_EXITED) ||
+         (0 != code) )
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                  "Unexpected error running `rm libeufin-nexus.sqlite3'!\n");
+      GNUNET_break (0);
+      GNUNET_CONFIGURATION_destroy (cfg);
+      return GNUNET_SYSERR;
+    }
+    GNUNET_OS_process_destroy (dbreset_proc);
+  }
+  if (GNUNET_OK !=
+      TALER_BANK_auth_parse_cfg (cfg,
+                                 config_section,
+                                 &bc->exchange_auth))
+  {
+    GNUNET_break (0);
+    GNUNET_CONFIGURATION_destroy (cfg);
+    return GNUNET_SYSERR;
+  }
+  GNUNET_CONFIGURATION_destroy (cfg);
+  bc->exchange_payto = exchange_payto_uri;
+  bc->user42_payto = "payto://x-taler-bank/localhost/42";
+  bc->user43_payto = "payto://x-taler-bank/localhost/43";
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+              "Relying on nexus %s on port %u\n",
+              bc->exchange_auth.wire_gateway_url,
+              (unsigned int) port);
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO, "exchange payto: %s\n",
+              bc->exchange_payto);
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO, "user42_payto: %s\n",
+              bc->user42_payto);
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO, "user42_payto: %s\n",
+              bc->user43_payto);
+  return GNUNET_OK;
+}
 
 /**
  * Prepare the bank execution.  Check if the port is available

-- 
To stop receiving notification emails like this one, please contact
address@hidden.



reply via email to

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