diff options
Diffstat (limited to 'fluent-bit/lib/avro/tests/test_avro_1379.c')
-rw-r--r-- | fluent-bit/lib/avro/tests/test_avro_1379.c | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/fluent-bit/lib/avro/tests/test_avro_1379.c b/fluent-bit/lib/avro/tests/test_avro_1379.c new file mode 100644 index 00000000..bfd77dc8 --- /dev/null +++ b/fluent-bit/lib/avro/tests/test_avro_1379.c @@ -0,0 +1,129 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to you under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +#include "avro.h" +#include "avro_private.h" +#include <stdio.h> +#include <stdlib.h> + +static const char *schema_json = + "{" + " \"type\": \"record\"," + " \"name\": \"test\"," + " \"fields\": [" + " { \"name\": \"i\", \"type\": \"int\" }," + " { \"name\": \"l\", \"type\": \"long\" }," + " { \"name\": \"s\", \"type\": \"string\" }," + " {" + " \"name\": \"subrec\"," + " \"type\": {" + " \"type\": \"record\"," + " \"name\": \"sub\"," + " \"fields\": [" + " { \"name\": \"f\", \"type\": \"float\" }," + " { \"name\": \"d\", \"type\": \"double\" }" + " ]" + " }" + " }" + " ]" + "}"; + +static void +populate_complex_record(avro_value_t *p_val) +{ + avro_value_t field; + + avro_value_get_by_index(p_val, 0, &field, NULL); + avro_value_set_int(&field, 42); + + avro_value_get_by_index(p_val, 1, &field, NULL); + avro_value_set_long(&field, 4242); + + avro_wrapped_buffer_t wbuf; + avro_wrapped_buffer_new_string(&wbuf, "Follow your bliss."); + avro_value_get_by_index(p_val, 2, &field, NULL); + avro_value_give_string_len(&field, &wbuf); + + avro_value_t subrec; + avro_value_get_by_index(p_val, 3, &subrec, NULL); + + avro_value_get_by_index(&subrec, 0, &field, NULL); + avro_value_set_float(&field, 3.14159265); + + avro_value_get_by_index(&subrec, 1, &field, NULL); + avro_value_set_double(&field, 2.71828183); +} + +int main(void) +{ + int rval = 0; + size_t len; + static char buf[4096]; + avro_writer_t writer; + avro_file_writer_t file_writer; + avro_file_reader_t file_reader; + const char *outpath = "test-1379.avro"; + + avro_schema_t schema = NULL; + avro_schema_error_t error = NULL; + check(rval, avro_schema_from_json(schema_json, strlen(schema_json), &schema, &error)); + + avro_value_iface_t *iface = avro_generic_class_from_schema(schema); + + avro_value_t val; + avro_generic_value_new(iface, &val); + + avro_value_t out; + avro_generic_value_new(iface, &out); + + /* create the val */ + avro_value_reset(&val); + populate_complex_record(&val); + + /* create the writers */ + writer = avro_writer_memory(buf, sizeof(buf)); + check(rval, avro_file_writer_create(outpath, schema, &file_writer)); + + fprintf(stderr, "Writing to buffer\n"); + check(rval, avro_value_write(writer, &val)); + + fprintf(stderr, "Writing buffer to %s " + "using avro_file_writer_append_encoded()\n", outpath); + len = avro_writer_tell(writer); + check(rval, avro_file_writer_append_encoded(file_writer, buf, len)); + check(rval, avro_file_writer_close(file_writer)); + + check(rval, avro_file_reader(outpath, &file_reader)); + fprintf(stderr, "Re-reading value to verify\n"); + check(rval, avro_file_reader_read_value(file_reader, &out)); + fprintf(stderr, "Verifying value..."); + if (!avro_value_equal(&val, &out)) { + fprintf(stderr, "fail!\n"); + exit(EXIT_FAILURE); + } + fprintf(stderr, "ok\n"); + check(rval, avro_file_reader_close(file_reader)); + remove(outpath); + + avro_writer_free(writer); + avro_value_decref(&out); + avro_value_decref(&val); + avro_value_iface_decref(iface); + avro_schema_decref(schema); + + exit(EXIT_SUCCESS); +} |