15bb525f4SRobert Mustacchi /*
25bb525f4SRobert Mustacchi  * This file and its contents are supplied under the terms of the
35bb525f4SRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
45bb525f4SRobert Mustacchi  * You may only use this file in accordance with the terms of version
55bb525f4SRobert Mustacchi  * 1.0 of the CDDL.
65bb525f4SRobert Mustacchi  *
75bb525f4SRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
85bb525f4SRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
95bb525f4SRobert Mustacchi  * http://www.illumos.org/license/CDDL.
105bb525f4SRobert Mustacchi  */
115bb525f4SRobert Mustacchi 
125bb525f4SRobert Mustacchi /*
13*5f977267SJason King  * Copyright 2020 Joyent, Inc.
145bb525f4SRobert Mustacchi  */
155bb525f4SRobert Mustacchi 
165bb525f4SRobert Mustacchi /*
175bb525f4SRobert Mustacchi  * Check that we properly generate basic nested arrays.
185bb525f4SRobert Mustacchi  */
195bb525f4SRobert Mustacchi 
205bb525f4SRobert Mustacchi #include "check-common.h"
215bb525f4SRobert Mustacchi 
225bb525f4SRobert Mustacchi static check_number_t check_base[] = {
235bb525f4SRobert Mustacchi 	{ "char", CTF_K_INTEGER, CTF_INT_SIGNED | CTF_INT_CHAR, 0, 8 },
245bb525f4SRobert Mustacchi 	{ "int", CTF_K_INTEGER, CTF_INT_SIGNED, 0, 32 },
255bb525f4SRobert Mustacchi 	{ "double", CTF_K_FLOAT, CTF_FP_DOUBLE, 0, 64 },
265bb525f4SRobert Mustacchi 	{ NULL }
275bb525f4SRobert Mustacchi };
285bb525f4SRobert Mustacchi 
295bb525f4SRobert Mustacchi static check_symbol_t check_syms[] = {
305bb525f4SRobert Mustacchi 	{ "a", "int [3]" },
315bb525f4SRobert Mustacchi 	{ "b", "double [42]" },
325bb525f4SRobert Mustacchi 	{ "c", "const char *[2]" },
335bb525f4SRobert Mustacchi 	{ "d", "int [4][5]" },
345bb525f4SRobert Mustacchi 	{ "e", "int [4][5][6]" },
355bb525f4SRobert Mustacchi 	{ "f", "int [4][5][6][7]" },
365bb525f4SRobert Mustacchi 	{ "g", "int [4][5][6][7][8]" },
375bb525f4SRobert Mustacchi 	{ "h", "int [4][5][6][7][8][9]" },
385bb525f4SRobert Mustacchi 	{ "i", "int [4][5][6][7][8][9][10]" },
39*5f977267SJason King 	{ "empty", "int [0]" },
405bb525f4SRobert Mustacchi 	{ NULL }
415bb525f4SRobert Mustacchi };
425bb525f4SRobert Mustacchi 
435bb525f4SRobert Mustacchi static check_descent_t check_array_a[] = {
445bb525f4SRobert Mustacchi 	{ "int [3]", CTF_K_ARRAY, "int", 3 },
455bb525f4SRobert Mustacchi 	{ "int", CTF_K_INTEGER },
465bb525f4SRobert Mustacchi 	{ NULL }
475bb525f4SRobert Mustacchi };
485bb525f4SRobert Mustacchi 
495bb525f4SRobert Mustacchi static check_descent_t check_array_b[] = {
505bb525f4SRobert Mustacchi 	{ "double [42]", CTF_K_ARRAY, "double", 42 },
515bb525f4SRobert Mustacchi 	{ "double", CTF_K_FLOAT },
525bb525f4SRobert Mustacchi 	{ NULL }
535bb525f4SRobert Mustacchi };
545bb525f4SRobert Mustacchi 
555bb525f4SRobert Mustacchi static check_descent_t check_array_c[] = {
565bb525f4SRobert Mustacchi 	{ "const char *[2]", CTF_K_ARRAY, "const char *", 2 },
575bb525f4SRobert Mustacchi 	{ "const char *", CTF_K_POINTER },
585bb525f4SRobert Mustacchi 	{ "const char", CTF_K_CONST },
595bb525f4SRobert Mustacchi 	{ "char", CTF_K_INTEGER },
605bb525f4SRobert Mustacchi 	{ NULL }
615bb525f4SRobert Mustacchi };
625bb525f4SRobert Mustacchi 
635bb525f4SRobert Mustacchi static check_descent_t check_array_i[] = {
645bb525f4SRobert Mustacchi 	{ "int [4][5][6][7][8][9][10]", CTF_K_ARRAY,
655bb525f4SRobert Mustacchi 	    "int [5][6][7][8][9][10]", 4 },
665bb525f4SRobert Mustacchi 	{ "int [5][6][7][8][9][10]", CTF_K_ARRAY, "int [6][7][8][9][10]", 5 },
675bb525f4SRobert Mustacchi 	{ "int [6][7][8][9][10]", CTF_K_ARRAY, "int [7][8][9][10]", 6 },
685bb525f4SRobert Mustacchi 	{ "int [7][8][9][10]", CTF_K_ARRAY, "int [8][9][10]", 7 },
695bb525f4SRobert Mustacchi 	{ "int [8][9][10]", CTF_K_ARRAY, "int [9][10]", 8 },
705bb525f4SRobert Mustacchi 	{ "int [9][10]", CTF_K_ARRAY, "int [10]", 9 },
715bb525f4SRobert Mustacchi 	{ "int [10]", CTF_K_ARRAY, "int", 10 },
725bb525f4SRobert Mustacchi 	{ "int", CTF_K_INTEGER },
735bb525f4SRobert Mustacchi 	{ NULL },
745bb525f4SRobert Mustacchi };
755bb525f4SRobert Mustacchi 
76*5f977267SJason King static check_descent_t check_array_empty[] = {
77*5f977267SJason King 	{ "int [0]", CTF_K_ARRAY, "int", 0 },
78*5f977267SJason King 	{ "int", CTF_K_INTEGER },
79*5f977267SJason King 	{ NULL }
80*5f977267SJason King };
81*5f977267SJason King 
825bb525f4SRobert Mustacchi static check_descent_test_t descents[] = {
835bb525f4SRobert Mustacchi 	{ "a", check_array_a },
845bb525f4SRobert Mustacchi 	{ "b", check_array_b },
855bb525f4SRobert Mustacchi 	{ "c", check_array_c },
865bb525f4SRobert Mustacchi 	{ "i", check_array_i },
87*5f977267SJason King 	{ "empty", check_array_empty },
885bb525f4SRobert Mustacchi 	{ NULL }
895bb525f4SRobert Mustacchi };
905bb525f4SRobert Mustacchi 
915bb525f4SRobert Mustacchi int
main(int argc,char * argv[])925bb525f4SRobert Mustacchi main(int argc, char *argv[])
935bb525f4SRobert Mustacchi {
945bb525f4SRobert Mustacchi 	int i, ret = 0;
955bb525f4SRobert Mustacchi 
965bb525f4SRobert Mustacchi 	if (argc < 2) {
975bb525f4SRobert Mustacchi 		errx(EXIT_FAILURE, "missing test files");
985bb525f4SRobert Mustacchi 	}
995bb525f4SRobert Mustacchi 
1005bb525f4SRobert Mustacchi 	for (i = 1; i < argc; i++) {
1015bb525f4SRobert Mustacchi 		ctf_file_t *fp;
1025bb525f4SRobert Mustacchi 		uint_t d;
1035bb525f4SRobert Mustacchi 
1045bb525f4SRobert Mustacchi 		if ((fp = ctf_open(argv[i], &ret)) == NULL) {
1055bb525f4SRobert Mustacchi 			warnx("failed to open %s: %s", argv[i],
1065bb525f4SRobert Mustacchi 			    ctf_errmsg(ret));
1075bb525f4SRobert Mustacchi 			ret = EXIT_FAILURE;
1085bb525f4SRobert Mustacchi 			continue;
1095bb525f4SRobert Mustacchi 		}
1105bb525f4SRobert Mustacchi 		if (!ctftest_check_numbers(fp, check_base))
1115bb525f4SRobert Mustacchi 			ret = EXIT_FAILURE;
1125bb525f4SRobert Mustacchi 		if (!ctftest_check_symbols(fp, check_syms))
1135bb525f4SRobert Mustacchi 			ret = EXIT_FAILURE;
1145bb525f4SRobert Mustacchi 		for (d = 0; descents[d].cdt_sym != NULL; d++) {
1155bb525f4SRobert Mustacchi 			if (!ctftest_check_descent(descents[d].cdt_sym, fp,
1166ef284f1SJohn Levon 			    descents[d].cdt_tests, B_FALSE)) {
1175bb525f4SRobert Mustacchi 				ret = EXIT_FAILURE;
1185bb525f4SRobert Mustacchi 			}
1195bb525f4SRobert Mustacchi 		}
1205bb525f4SRobert Mustacchi 		ctf_close(fp);
1215bb525f4SRobert Mustacchi 	}
1225bb525f4SRobert Mustacchi 
1235bb525f4SRobert Mustacchi 	return (ret);
1245bb525f4SRobert Mustacchi }
125