exchange

Base system with REST service to issue digital coins, run by the payment service provider
Log | Files | Refs | Submodules | README | LICENSE

test_sq.c (6792B)


      1 /*
      2   This file is part of TALER
      3   Copyright (C) 2020 Taler Systems SA
      4 
      5   TALER is free software; you can redistribute it and/or modify it under the
      6   terms of the GNU General Public License as published by the Free Software
      7   Foundation; either version 3, or (at your option) any later version.
      8 
      9   TALER is distributed in the hope that it will be useful, but WITHOUT ANY
     10   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
     11   A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
     12 
     13   You should have received a copy of the GNU General Public License along with
     14   TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
     15 */
     16 /**
     17  * @file sq/test_sq.c
     18  * @brief Tests for SQLite3 convenience API
     19  * @author Jonathan Buchanan
     20  */
     21 #include "taler/platform.h"
     22 #include "taler/taler_sq_lib.h"
     23 
     24 
     25 /**
     26  * Run actual test queries.
     27  *
     28  * @return 0 on success
     29  */
     30 static int
     31 run_queries (sqlite3 *db)
     32 {
     33   struct TALER_Amount hamount;
     34   struct TALER_AmountNBO namount;
     35   json_t *json;
     36   sqlite3_stmt *test_insert;
     37   sqlite3_stmt *test_select;
     38   struct GNUNET_SQ_PrepareStatement ps[] = {
     39     GNUNET_SQ_make_prepare ("INSERT INTO test_sq ("
     40                             " hamount_val"
     41                             ",hamount_frac"
     42                             ",namount_val"
     43                             ",namount_frac"
     44                             ",json"
     45                             ") VALUES "
     46                             "($1, $2, $3, $4, $5)",
     47                             &test_insert),
     48     GNUNET_SQ_make_prepare ("SELECT"
     49                             " hamount_val"
     50                             ",hamount_frac"
     51                             ",namount_val"
     52                             ",namount_frac"
     53                             ",json"
     54                             " FROM test_sq",
     55                             &test_select),
     56     GNUNET_SQ_PREPARE_END
     57   };
     58   int ret = 0;
     59 
     60   GNUNET_assert (GNUNET_OK ==
     61                  TALER_string_to_amount ("EUR:1.23",
     62                                          &hamount));
     63   TALER_amount_hton (&namount,
     64                      &hamount);
     65   json = json_object ();
     66   GNUNET_assert (NULL != json);
     67   GNUNET_assert (0 ==
     68                  json_object_set_new (json,
     69                                       "foo",
     70                                       json_integer (42)));
     71   GNUNET_assert (NULL != json);
     72   GNUNET_assert (GNUNET_OK ==
     73                  GNUNET_SQ_prepare (db,
     74                                     ps));
     75 
     76   {
     77     struct GNUNET_SQ_QueryParam params_insert[] = {
     78       TALER_SQ_query_param_amount (&hamount),
     79       TALER_SQ_query_param_amount_nbo (&namount),
     80       TALER_SQ_query_param_json (json),
     81       GNUNET_SQ_query_param_end
     82     };
     83     GNUNET_SQ_reset (db,
     84                      test_insert);
     85     GNUNET_assert (GNUNET_OK == GNUNET_SQ_bind (test_insert,
     86                                                 params_insert));
     87     GNUNET_assert (SQLITE_DONE == sqlite3_step (test_insert));
     88     sqlite3_finalize (test_insert);
     89   }
     90 
     91   {
     92     struct TALER_Amount result_amount;
     93     struct TALER_AmountNBO nresult_amount;
     94     struct TALER_Amount nresult_amount_converted;
     95     json_t *result_json;
     96     struct GNUNET_SQ_QueryParam params_select[] = {
     97       GNUNET_SQ_query_param_end
     98     };
     99     struct GNUNET_SQ_ResultSpec results_select[] = {
    100       TALER_SQ_result_spec_amount ("EUR",
    101                                    &result_amount),
    102       TALER_SQ_result_spec_amount_nbo ("EUR",
    103                                        &nresult_amount),
    104       TALER_SQ_result_spec_json (&result_json),
    105       GNUNET_SQ_result_spec_end
    106     };
    107 
    108     GNUNET_SQ_reset (db,
    109                      test_select);
    110     GNUNET_assert (GNUNET_OK == GNUNET_SQ_bind (test_select,
    111                                                 params_select));
    112     GNUNET_assert (SQLITE_ROW == sqlite3_step (test_select));
    113 
    114     GNUNET_assert (GNUNET_OK == GNUNET_SQ_extract_result (test_select,
    115                                                           results_select));
    116     TALER_amount_ntoh (&nresult_amount_converted,
    117                        &nresult_amount);
    118     if ((GNUNET_OK != TALER_amount_cmp_currency (&hamount,
    119                                                  &result_amount)) ||
    120         (0 != TALER_amount_cmp (&hamount,
    121                                 &result_amount)) ||
    122         (GNUNET_OK != TALER_amount_cmp_currency (&hamount,
    123                                                  &nresult_amount_converted)) ||
    124         (0 != TALER_amount_cmp (&hamount,
    125                                 &nresult_amount_converted)) ||
    126         (1 != json_equal (json,
    127                           result_json)) )
    128     {
    129       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
    130                   "Result from database doesn't match input\n");
    131       ret = 1;
    132     }
    133     GNUNET_SQ_cleanup_result (results_select);
    134     sqlite3_finalize (test_select);
    135   }
    136   json_decref (json);
    137 
    138   return ret;
    139 }
    140 
    141 
    142 int
    143 main (int argc,
    144       const char *const argv[])
    145 {
    146   struct GNUNET_SQ_ExecuteStatement es[] = {
    147     GNUNET_SQ_make_execute ("CREATE TEMPORARY TABLE IF NOT EXISTS test_sq ("
    148                             " hamount_val INT8 NOT NULL"
    149                             ",hamount_frac INT8 NOT NULL"
    150                             ",namount_val INT8 NOT NULL"
    151                             ",namount_frac INT8 NOT NULL"
    152                             ",json VARCHAR NOT NULL"
    153                             ")"),
    154     GNUNET_SQ_EXECUTE_STATEMENT_END
    155   };
    156   sqlite3 *db;
    157   int ret;
    158 
    159   (void) argc;
    160   (void) argv;
    161   GNUNET_log_setup ("test-pq",
    162                     "WARNING",
    163                     NULL);
    164 
    165   if (SQLITE_OK != sqlite3_open ("talercheck.db",
    166                                  &db))
    167   {
    168     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
    169                 "Failed to open SQLite3 database\n");
    170     return 77;
    171   }
    172 
    173   if (GNUNET_OK != GNUNET_SQ_exec_statements (db,
    174                                               es))
    175   {
    176     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
    177                 "Failed to create new table\n");
    178     if ((SQLITE_OK != sqlite3_close (db)) ||
    179         (0 != unlink ("talercheck.db")))
    180     {
    181       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
    182                   "Failed to close db or unlink\n");
    183     }
    184     return 1;
    185   }
    186 
    187   ret = run_queries (db);
    188 
    189   if (SQLITE_OK !=
    190       sqlite3_exec (db,
    191                     "DROP TABLE test_sq",
    192                     NULL, NULL, NULL))
    193   {
    194     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
    195                 "Failed to drop table\n");
    196     ret = 1;
    197   }
    198 
    199   if (SQLITE_OK != sqlite3_close (db))
    200   {
    201     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
    202                 "Failed to close database\n");
    203     ret = 1;
    204   }
    205   if (0 != unlink ("talercheck.db"))
    206   {
    207     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
    208                 "Failed to unlink test database file\n");
    209     ret = 1;
    210   }
    211   return ret;
    212 }
    213 
    214 
    215 /* end of sq/test_sq.c */