123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- /* Copyright (c) 2013, Vsevolod Stakhov
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL AUTHOR BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
- #include "../src/config.h"
- #include "../src/rcl/rcl.h"
- #include "../src/main.h"
- #include "tests.h"
-
- const gchar *rcl_test_valid[] = {
- /* Json like */
- "{"
- "\"key1\": value;"
- "\"key1\": value2;"
- "\"key1\": \"value;\""
- "}\n",
- /* Nginx like */
- "section1 { param1 = value; param2 = value, "
- "section3 {param = value; param2 = value, param3 = [\"value1\", value2, 100500]}}\n"
- "section2 { param1 = {key = value}, param1 = [\"key\"]}",
- /* Numbers */
- "key = 1s\n"
- "key2 = 1min\n"
- "key3 = 1kb\n"
- "key4 = 5M\n"
- "key5 = 10mS\n"
- "key6 = 10y\n",
- /* Strings */
- "key = \"some string\";"
- "key1 = /some/path;"
- "key3 = 111some,"
- "key4: s1,"
- "\"key5\": \"\\n\\r123\"",
- /* Macros */
- "section1 {key = value; section {\n"
- "param = \"value\";\n"
- "param2 = value\n"
- "array = [ 1, 1mb, test]}\n"
- ".includes \"./test.cfg\"}",
- NULL
- };
-
- static const gchar test_pubkey[] = ""
- "-----BEGIN PUBLIC KEY-----\n"
- "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlhk2u5nbTVgEskmS+qZcAj339\n"
- "bLwEK/TXdd0G3d4BVKpF712frw+YwetRdmRRYL5EdjiF01Bv3s6QmsThAJX/li/c\n"
- "Q15YFxhvq9DZ0qJmL7e1NzORo6m/WLRK9wxWA+PXSvSUKrlZ3kt9ygD4z5QZ3/td\n"
- "qil9VM6Mz7P1HJ0KywIDAQAB\n"
- "-----END PUBLIC KEY-----\n";
-
- void
- rspamd_rcl_test_func (void)
- {
- struct rspamd_cl_parser *parser, *parser2;
- rspamd_cl_object_t *obj;
- const gchar **cur;
- guchar *emitted;
- GError *err = NULL;
- struct timespec start, end;
- gdouble seconds;
-
- cur = rcl_test_valid;
- while (*cur != NULL) {
- parser = rspamd_cl_parser_new (RSPAMD_CL_FLAG_KEY_LOWERCASE);
- rspamd_cl_pubkey_add (parser, test_pubkey, sizeof (test_pubkey) - 1, &err);
- g_assert_no_error (err);
- g_assert (parser != NULL);
- rspamd_cl_parser_add_chunk (parser, *cur, strlen (*cur), &err);
- g_assert_no_error (err);
- obj = rspamd_cl_parser_get_object (parser, &err);
- g_assert_no_error (err);
- /* Test config emitting */
- emitted = rspamd_cl_object_emit (obj, RSPAMD_CL_EMIT_CONFIG);
- g_assert (emitted != NULL);
- msg_debug ("got config output: %s", emitted);
- parser2 = rspamd_cl_parser_new (RSPAMD_CL_FLAG_KEY_LOWERCASE);
- g_assert (parser2 != NULL);
- rspamd_cl_parser_add_chunk (parser2, emitted, strlen (emitted), &err);
- g_assert_no_error (err);
- rspamd_cl_parser_free (parser2);
- g_free (emitted);
- /* Test json emitted */
- emitted = rspamd_cl_object_emit (obj, RSPAMD_CL_EMIT_JSON);
- g_assert (emitted != NULL);
- msg_debug ("got json output: %s", emitted);
- parser2 = rspamd_cl_parser_new (RSPAMD_CL_FLAG_KEY_LOWERCASE);
- g_assert (parser2 != NULL);
- rspamd_cl_parser_add_chunk (parser2, emitted, strlen (emitted), &err);
- g_assert_no_error (err);
- rspamd_cl_parser_free (parser2);
- g_free (emitted);
- /* Compact json */
- emitted = rspamd_cl_object_emit (obj, RSPAMD_CL_EMIT_JSON_COMPACT);
- g_assert (emitted != NULL);
- msg_debug ("got json compacted output: %s", emitted);
- parser2 = rspamd_cl_parser_new (RSPAMD_CL_FLAG_KEY_LOWERCASE);
- g_assert (parser2 != NULL);
- rspamd_cl_parser_add_chunk (parser2, emitted, strlen (emitted), &err);
- g_assert_no_error (err);
- rspamd_cl_parser_free (parser2);
- g_free (emitted);
-
- /* Cleanup */
- rspamd_cl_parser_free (parser);
- rspamd_cl_obj_unref (obj);
- cur ++;
- }
-
- /* Load a big json */
- parser = rspamd_cl_parser_new (RSPAMD_CL_FLAG_KEY_LOWERCASE);
- clock_gettime (CLOCK_MONOTONIC, &start);
- rspamd_cl_parser_add_file (parser, "./rcl_test.json", &err);
- g_assert_no_error (err);
- obj = rspamd_cl_parser_get_object (parser, &err);
- g_assert_no_error (err);
- clock_gettime (CLOCK_MONOTONIC, &end);
- seconds = (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) / 1000000000.;
- msg_info ("parsed json in %.4f seconds", seconds);
- /* Test config emitting */
- clock_gettime (CLOCK_MONOTONIC, &start);
- emitted = rspamd_cl_object_emit (obj, RSPAMD_CL_EMIT_CONFIG);
- g_assert (emitted != NULL);
- clock_gettime (CLOCK_MONOTONIC, &end);
- seconds = (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) / 1000000000.;
- msg_info ("emitted object in %.4f seconds", seconds);
- rspamd_cl_parser_free (parser);
- rspamd_cl_obj_unref (obj);
- }
|