From fe5ae96d6609f25ef217f6d2e87fca8c6be96d39 Mon Sep 17 00:00:00 2001 From: Rafael Antognolli Date: Tue, 16 Jul 2019 10:28:25 -0700 Subject: [PATCH] intel/genxml: Add basic infra for encoding/decoding unit tests. Adding option to print quiet. v2: Add license header. Reviewed-by: Lionel Landwerlin --- src/intel/common/meson.build | 30 ++++++++ src/intel/common/tests/gentest.xml | 12 ++++ src/intel/common/tests/genxml_test.c | 103 +++++++++++++++++++++++++++ src/intel/genxml/meson.build | 2 + 4 files changed, 147 insertions(+) create mode 100644 src/intel/common/tests/gentest.xml create mode 100644 src/intel/common/tests/genxml_test.c diff --git a/src/intel/common/meson.build b/src/intel/common/meson.build index 540d78f90b5..61fd35d5ef8 100644 --- a/src/intel/common/meson.build +++ b/src/intel/common/meson.build @@ -64,3 +64,33 @@ if install_intel_gpu_tests ) endforeach endif + +if with_tests + gentest_xml = files('tests/gentest.xml') + _name = 'gentest_pack.h' + gentest_pack = custom_target( + _name, + input : [gen_pack_header_py, gentest_xml], + output : _name, + command : [prog_python, '@INPUT@'], + capture : true, + ) + + genxml_path = join_paths(meson.source_root(), + '@0@'.format(gentest_xml[0])) + + test( + 'genxml_test', + executable( + 'genxml_test', + ['tests/genxml_test.c', gentest_pack], + include_directories : [inc_common, inc_intel], + link_with : [libintel_common, libmesa_util], + c_args : [ + '-DGENXML_PATH="@0@"'.format(genxml_path) + ], + ), + args : ['-quiet'], + suite : ['intel'], + ) +endif diff --git a/src/intel/common/tests/gentest.xml b/src/intel/common/tests/gentest.xml new file mode 100644 index 00000000000..249ebad612b --- /dev/null +++ b/src/intel/common/tests/gentest.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/intel/common/tests/genxml_test.c b/src/intel/common/tests/genxml_test.c new file mode 100644 index 00000000000..85002929fca --- /dev/null +++ b/src/intel/common/tests/genxml_test.c @@ -0,0 +1,103 @@ +/* + * Copyright © 2019 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include +#include +#include "gen_decoder.h" + +static bool quiet = false; + +struct test_address { + uint64_t offset; +}; + +__attribute__((unused)) static uint64_t +_test_combine_address(void *data, void *location, + struct test_address address, uint32_t delta) +{ + return address.offset + delta; +} + +#define __gen_user_data void +#define __gen_combine_address _test_combine_address +#define __gen_address_type struct test_address + +#include "gentest_pack.h" + +static void +test_struct(struct gen_spec *spec) { + /* Fill struct fields and tag */ + struct GEN9_TEST_STRUCT test1 = { + .number1 = 5, + .number2 = 1234, + }; + + for (int i = 0; i < 4; i++) { + test1.byte[i] = i * 10 + 5; + } + + /* Pack struct into a dw array */ + uint32_t dw[GEN9_TEST_STRUCT_length]; + GEN9_TEST_STRUCT_pack(NULL, dw, &test1); + + /* Now decode the packed struct, and make sure it matches the original */ + struct gen_group *group; + group = gen_spec_find_struct(spec, "TEST_STRUCT"); + + assert(group != NULL); + + if (!quiet) { + printf("\nTEST_STRUCT:\n"); + gen_print_group(stdout, group, 0, dw, 0, false); + } + + struct gen_field_iterator iter; + gen_field_iterator_init(&iter, group, dw, 0, false); + + while (gen_field_iterator_next(&iter)) { + int idx; + if (strcmp(iter.name, "number1") == 0) { + uint16_t number = iter.raw_value; + assert(number == test1.number1); + } else if (strcmp(iter.name, "number2") == 0) { + uint16_t number = iter.raw_value; + assert(number == test1.number2); + } else if (sscanf(iter.name, "byte[%d]", &idx) == 1) { + uint8_t number = iter.raw_value; + assert(number == test1.byte[idx]); + } + } +} + +int main(int argc, char **argv) +{ + struct gen_spec *spec = gen_spec_load_filename(GENXML_PATH); + + if (argc > 1 && strcmp(argv[1], "-quiet") == 0) + quiet = true; + + test_struct(spec); + + return 0; +} diff --git a/src/intel/genxml/meson.build b/src/intel/genxml/meson.build index 343b4fcc45f..10d3149b8f5 100644 --- a/src/intel/genxml/meson.build +++ b/src/intel/genxml/meson.build @@ -58,4 +58,6 @@ foreach f : gen_xml_files ) endforeach +gen_pack_header_py = files('gen_pack_header.py') + idep_genxml = declare_dependency(sources : [gen_xml_pack, genX_bits_h, genX_xml_h]) -- 2.30.2