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 */