/* This file is part of GNUnet (C) 2015, 2016 GNUnet e.V. GNUnet is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . SPDX-License-Identifier: AGPL3.0-or-later */ /** * @file json/test_json.c * @brief Tests for JSON conversion functions * @author Christian Grothoff */ #include "platform.h" #include "gnunet_util_lib.h" #include "gnunet_json_lib.h" /** * Test absolute time conversion from/to JSON. * * @return 0 on success */ static int test_abs_time () { json_t *j; struct GNUNET_TIME_Absolute a1; struct GNUNET_TIME_Absolute a2; struct GNUNET_JSON_Specification s1[] = { GNUNET_JSON_spec_absolute_time ( NULL, &a2), GNUNET_JSON_spec_end () }; struct GNUNET_JSON_Specification s2[] = { GNUNET_JSON_spec_absolute_time ( NULL, &a2), GNUNET_JSON_spec_end () }; a1 = GNUNET_TIME_absolute_get (); GNUNET_TIME_round_abs (&a1); j = GNUNET_JSON_from_time_abs (a1); GNUNET_assert (NULL != j); GNUNET_assert (GNUNET_OK == GNUNET_JSON_parse (j, s1, NULL, NULL)); GNUNET_assert (a1.abs_value_us == a2.abs_value_us); json_decref (j); a1 = GNUNET_TIME_UNIT_FOREVER_ABS; j = GNUNET_JSON_from_time_abs (a1); GNUNET_assert (NULL != j); GNUNET_assert (GNUNET_OK == GNUNET_JSON_parse (j, s2, NULL, NULL)); GNUNET_assert (a1.abs_value_us == a2.abs_value_us); json_decref (j); return 0; } /** * Test relative time conversion from/to JSON. * * @return 0 on success */ static int test_rel_time () { json_t *j; struct GNUNET_TIME_Relative r1; struct GNUNET_TIME_Relative r2; struct GNUNET_JSON_Specification s1[] = { GNUNET_JSON_spec_relative_time ( NULL, &r2), GNUNET_JSON_spec_end () }; struct GNUNET_JSON_Specification s2[] = { GNUNET_JSON_spec_relative_time ( NULL, &r2), GNUNET_JSON_spec_end () }; r1 = GNUNET_TIME_UNIT_SECONDS; j = GNUNET_JSON_from_time_rel (r1); GNUNET_assert (NULL != j); GNUNET_assert (GNUNET_OK == GNUNET_JSON_parse (j, s1, NULL, NULL)); GNUNET_assert (r1.rel_value_us == r2.rel_value_us); json_decref (j); r1 = GNUNET_TIME_UNIT_FOREVER_REL; j = GNUNET_JSON_from_time_rel (r1); GNUNET_assert (NULL != j); GNUNET_assert (GNUNET_OK == GNUNET_JSON_parse (j, s2, NULL, NULL)); GNUNET_assert (r1.rel_value_us == r2.rel_value_us); json_decref (j); return 0; } /** * Test raw (binary) conversion from/to JSON. * * @return 0 on success */ static int test_raw () { char blob[256]; unsigned int i; json_t *j; for (i = 0; i <= 256; i++) { char blob2[256]; struct GNUNET_JSON_Specification spec[] = { GNUNET_JSON_spec_fixed (NULL, blob2, i), GNUNET_JSON_spec_end () }; memset (blob, i, i); j = GNUNET_JSON_from_data (blob, i); GNUNET_assert (NULL != j); GNUNET_assert (GNUNET_OK == GNUNET_JSON_parse (j, spec, NULL, NULL)); GNUNET_assert (0 == memcmp (blob, blob2, i)); } return 0; } /** * Test rsa conversions from/to JSON. * * @return 0 on success */ static int test_rsa () { struct GNUNET_CRYPTO_RsaPublicKey *pub; struct GNUNET_CRYPTO_RsaPublicKey *pub2; struct GNUNET_JSON_Specification pspec[] = { GNUNET_JSON_spec_rsa_public_key (NULL, &pub2), GNUNET_JSON_spec_end () }; struct GNUNET_CRYPTO_RsaSignature *sig; struct GNUNET_CRYPTO_RsaSignature *sig2; struct GNUNET_JSON_Specification sspec[] = { GNUNET_JSON_spec_rsa_signature (NULL, &sig2), GNUNET_JSON_spec_end () }; struct GNUNET_CRYPTO_RsaPrivateKey *priv; struct GNUNET_HashCode msg; json_t *jp; json_t *js; priv = GNUNET_CRYPTO_rsa_private_key_create (1024); pub = GNUNET_CRYPTO_rsa_private_key_get_public (priv); memset (&msg, 42, sizeof(msg)); sig = GNUNET_CRYPTO_rsa_sign_fdh (priv, &msg); GNUNET_assert (NULL != (jp = GNUNET_JSON_from_rsa_public_key (pub))); GNUNET_assert (NULL != (js = GNUNET_JSON_from_rsa_signature (sig))); GNUNET_assert (GNUNET_OK == GNUNET_JSON_parse (jp, pspec, NULL, NULL)); GNUNET_assert (GNUNET_OK == GNUNET_JSON_parse (js, sspec, NULL, NULL)); GNUNET_break (0 == GNUNET_CRYPTO_rsa_signature_cmp (sig, sig2)); GNUNET_break (0 == GNUNET_CRYPTO_rsa_public_key_cmp (pub, pub2)); GNUNET_CRYPTO_rsa_signature_free (sig); GNUNET_CRYPTO_rsa_signature_free (sig2); GNUNET_CRYPTO_rsa_private_key_free (priv); GNUNET_CRYPTO_rsa_public_key_free (pub); GNUNET_CRYPTO_rsa_public_key_free (pub2); return 0; } /** * Test rsa conversions from/to JSON. * * @return 0 on success */ static int test_boolean () { int b1; int b2; json_t *json; struct GNUNET_JSON_Specification pspec[] = { GNUNET_JSON_spec_boolean ("b1", &b1), GNUNET_JSON_spec_boolean ("b2", &b2), GNUNET_JSON_spec_end () }; json = json_object (); json_object_set_new (json, "b1", json_true ()); json_object_set_new (json, "b2", json_false ()); GNUNET_assert (GNUNET_OK == GNUNET_JSON_parse (json, pspec, NULL, NULL)); GNUNET_assert (GNUNET_YES == b1); GNUNET_assert (GNUNET_NO == b2); json_object_set_new (json, "b1", json_integer (42)); GNUNET_assert (GNUNET_OK != GNUNET_JSON_parse (json, pspec, NULL, NULL)); return 0; } int main (int argc, const char *const argv[]) { GNUNET_log_setup ("test-json", "WARNING", NULL); if (0 != test_abs_time ()) return 1; if (0 != test_rel_time ()) return 1; if (0 != test_raw ()) return 1; if (0 != test_rsa ()) return 1; if (0 != test_boolean ()) return 1; /* FIXME: test EdDSA signature conversion... */ return 0; } /* end of test_json.c */