diff options
author | Christophe Genevey Metat <genevey.christophe@gmail.com> | 2016-05-24 16:16:41 +0000 |
---|---|---|
committer | Christophe Genevey Metat <genevey.christophe@gmail.com> | 2016-05-24 16:16:41 +0000 |
commit | b2bbad6a70f3d7e089b14f282dd8e6a4dfe6ce46 (patch) | |
tree | 8ea05556a7415041e5b417f7e9dae02a915c3d6f /src/my/test_my.c | |
parent | 52aa7299f2c3a9f9e80b366ca9068a6edf3b9bab (diff) |
test case for mysql
Diffstat (limited to 'src/my/test_my.c')
-rw-r--r-- | src/my/test_my.c | 327 |
1 files changed, 327 insertions, 0 deletions
diff --git a/src/my/test_my.c b/src/my/test_my.c new file mode 100644 index 0000000000..1ab6ef1b77 --- /dev/null +++ b/src/my/test_my.c @@ -0,0 +1,327 @@ +/* + This file is part of GNUnet + Copyright (C) 2016 GNUnet e.V. + + GNUnet 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. + + GNUnet 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 GNUnet; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ +/** + * @file my/test_my.c + * @brief Tests for convenience MySQL database + * @author Christophe Genevey + */ +#include "platform.h" +#include <mysql/mysql.h> +#include "gnunet_my_lib.h" + +/** + * Setup prepared statements. + * + * @param mysql connection handle to initialize + * @return + #GNUNET_OK on success + #GNUNET_SYSERR on failure + */ +static int +mysql_prepare (MYSQL * mysql) +{ + MYSQL_RES *result; + MYSQL_STMT *stmt; + + stmt = mysql_stmt_init (mysql); +#define PREPARE (name, sql, ...) + do + { + result = mysql_stmt_prepare(stmt, name, sql, __VA_ARGS__); + if (result) + { + GNUNET_break (0); + mysql_stmt_free_result (stmt); + result = NULL; + return GNUNET_SYSERR; + } + mysql_stmt_free_result (stmt); + result = NULL; + } while (0); + + PREPARE ("test_insert", + "INSERT INTO test_my (" + "pub" + ",sig" + ",abs_time" + ",forever" + ",hash" + ",vsize" + ",u16" + ",u32" + ",u64" + ") VALUES " + "($1, $2, $3, $4, $5, $6, + $7, $8, $9);", + 9, NULL); + + PREPARE ("test_select", + "SELECT" + "pub" + ",sig" + ",abs_time" + ",forever" + ",hash" + ",vsize" + ",u16" + ",u32" + ",u64" + " FROM test_my" + " ORDER BY abs_time DESC" + " LIMIT 1;", + 0, NULL); + return GNUNET_OK; +#undef PREPARE +} + +/** + * Run actual test queries. + * + * @param mysql coonection handle to initialize + * @return 0 on succes + */ +static int +run_queries (MYSQL * mysql) +{ + struct GNUNET_CRYPTO_RsaPublicKey *pub; + struct GNUNET_CRYPTO_RsaPublicKey *pub2 = NULL; + struct GNUNET_CRYPTO_RsaSignature *sig; + struct GNUNET_CRYPTO_RsaSignature *sig2 = NULL; + struct GNUNET_TIME_Absolute abs_time = GNUNET_TIME_absolute_get () ; + struct GNUNET_TIME_Absolute abs_time2; + struct GNUNET_TIME_Absolute forever = GNUNET_TIME_UNIT_FOREVER_ABS; + struct GNUNET_TIME_Absolute forever2; + struct GNUNET_HashCode hc; + struct GNUNET_HashCode hc2; + MYSQL_RES * result; + int ret; + struct GNUNET_CRYPTO_RsaPrivateKey *priv; + const char msg[] = "hello"; + void *msg2; + struct GNUNET_HashCode hmsg; + size_t msg2_len; + uint16_t u16; + uint16_t u162; + uint32_t u32; + uint32_t u322; + uint64_t u64; + uint64_t u642; + + priv = GNUNET_CRYPTO_rsa_private_key_create (1024); + pub = GNUNET_CRYPTO_rsa_private_key_get_public (priv); + memset (&hmsg, 42, sizeof (hmsg)); + sig = GNUNET_CRYPTO_rsa_sign_fdh (priv, + &hmsg); + u16 = 16; + u32 = 32; + u64 = 64; + + { + struct GNUNET_MY_QueryParam params_insert[] = { + GNUNET_MY_query_param_rsa_public_key (pub), + GNUNET_MY_query_param_rsa_signature (sig), + GNUNET_MY_query_param_absolute_time (&abs_time), + GNUNET_MY_query_param_absolute_time (&forever), + GNUNET_MY_query_param_auto_from_type (&hc), + GNUNET_MY_query_param_fixed_size (msg, strlen (msg)), + GNUNET_MY_query_param_uint16 (&u16), + GNUNET_MY_query_param_uint32 (&u32), + GNUNET_MY_query_param_uint64 (&u64), + GNUNET_MY_query_param_end + }; + + struct GNUNET_MY_QueryParam params_select[] = { + GNUNET_MY_query_param_end + }; + + struct GNUNET_MY_ResultSpec results_select[] = { + GNUNET_MY_result_spec_rsa_public_key ("pub", &pub2), + GNUNET_MY_result_spec_rsa_signature ("sig", &sig2), + GNUNET_MY_result_spec_absolute_time ("abs_time", &abs_time2), + GNUNET_MY_result_spec_absolute_time ("forever", &forever2), + GNUNET_MY_result_spec_auto_from_type ("hash", &hc2), + GNUNET_MY_result_spec_variable_size ("vsize", &msg2, &msg2_len), + GNUNET_MY_result_spec_uint16 ("u16", &u162), + GNUNET_MY_result_spec_uint32 ("u32", &u322), + GNUNET_MY_result_spec_uint64 ("u64", &u642), + GNUNET_MY_result_epc_end + }; + + if(GNUNET_MY_exec_prepared ( mysql, + "test_insert", + params_insert)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Database failure: \n"); + + //free result + + GNUNET_CRYPTO_rsa_signature_free (sig); + GNUNET_CRYPTO_rsa_private_key_free (priv); + GNUNET_CYPTO_rsa_public_key_free (pub); + return 1; + } + + //free result + + result = GNUNET_MY_exec_prepared (mysql, "test_select", params_select); +/* if(1 != mysql_fetch_length (result)) + { + GNUNET_break (0); + GNUNET_CRYPTO_rsa_signature_free (sig); + GNUNET_CRYPTO_rsa_private_key_free (priv); + GNUNET_CRYPTO_rsa_public_key_free (pub); + + return 1; + } +*/ + if (GNUNET_MY_exec_prepared (mysql + , "test_select" + , params_select)) + { + GNUNET_break (0); + GNUNET_CRYPTO_rsa_signature_free (sig); + GNUNET_CRYPTO_rsa_private_key_free (priv); + GNUNET_CRYPTO_rsa_public_key_free (pub); + + return 1; + } + + + ret = GNUNET_MY_extract_result (result, + results_select, + 0); + GNUNET_break (GNUNET_YES == ret); + GNUNET_break (abs_time.abs_value_us == abs_time2.abs_value_us); + GNUNET_break (forever.abs_value_us == forever2.abs_value_us); + GNUNET_break (0 == + memcmp (&hc, + &hc2, + sizeof (struct GNUNET_HashCode))); + GNUNET_break (0 == + GNUNET_CRYPTO_rsa_signature_cmp (sig, + sig2)); + GNUNET_break (0 == + GNUNET_CRYPTO_rsa_public_key_cmp (pub, + pub2)); + GNUNET_break (strlen (msg) == msg2_len); + GNUNET_break (0 == + strncmp (msg, + msg2, + msg2_len)); + GNUNET_break (16 == u162); + GNUNET_break (32 == u322); + GNUNET_break (64 == u642); + } + + GNUNET_CRYPTO_rsa_signature_free (sig); + GNUNET_CRYPTO_rsa_private_key_free (priv); + GNUNET_CRYPTO_rsa_public_key_free (pub); + + if (GNUNET_OK != ret) + return 1; + return 0; +} + + +int +main (int argc, const char * const argv[]) +{ + + MYSQL *mysql; +// MYSQL_RES *result; + + int ret; + + char *hote = ""; + char *pseudo = ""; + char *mdp = ""; + char *database = ""; + + mysql_init (mysql); + + mysql_options (mysql, + MYSQL_READ_DEFAULT_GROUP, + NULL); + + GNUNET_log_setup ( "test-my", + "WARNING", + NULL); + + if (! mysql_real_connect (mysql + ,hote + ,pseudo + ,mdp,database + ,0 + ,NULL + ,0 + )) + { + fprintf( stderr, + "Cannot run test, database connection failed : %s\n", + mysql_error (mysql)); + GNUNET_break (0); + + return 0; + } + + if (mysql_query (mysql, "CREATE TABLE test_my(" + "pub INT" + ", sig INT" + ", abs_time BIGINT" + ", forever BIGINT" + ", hash INT" + ", vsize VARCHAR" + ", u16 SMALLINT" + ", u32 INT" + ", u64 BIGINT" + ")")) + { + fprintf (stderr, + "Failed to create table : %s\n", + mysql_error (mysql)); + + mysql_close (mysql); + return 1; + } + + if (GNUNET_OK != + mysql_prepare (mysql)) + { + GNUNET_break (0) ; + mysql_close (mysql); + return 1; + } + + ret = run_queries (mysql); + + if (mysql_query (mysql, + "DROP TABLE test_my;")) + { + fprintf (stderr, "Failed to drop table : %s\n", + mysql_error (mysql)); + mysql_close (mysql); + return 1; + } + + mysql_close (mysql); + + return ret; +} |