91 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			91 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Copyright (c) 2016, Xilinx Inc. and Contributors. All rights reserved.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * SPDX-License-Identifier: BSD-3-Clause
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <metal/errno.h>
							 | 
						||
| 
								 | 
							
								#include <stdio.h>
							 | 
						||
| 
								 | 
							
								#include <stdlib.h>
							 | 
						||
| 
								 | 
							
								#include <string.h>
							 | 
						||
| 
								 | 
							
								#include "metal-test.h"
							 | 
						||
| 
								 | 
							
								#include <metal/compiler.h>
							 | 
						||
| 
								 | 
							
								#include <metal/sys.h>
							 | 
						||
| 
								 | 
							
								#include <metal/utilities.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static METAL_DECLARE_LIST(test_cases);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Not every enviornment has strerror() implemented.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#ifdef NOT_HAVE_STRERROR
							 | 
						||
| 
								 | 
							
								char metal_weak *strerror(int errnum)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									static char errstr[33];
							 | 
						||
| 
								 | 
							
									int i, j;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (errnum < 0)
							 | 
						||
| 
								 | 
							
										return NULL;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									i = 0;
							 | 
						||
| 
								 | 
							
									while (errnum) {
							 | 
						||
| 
								 | 
							
										int digit = errnum % 10;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										errstr[i++] = '0' + (char)digit;
							 | 
						||
| 
								 | 
							
										errnum /= 10;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									errstr[i] = '\0';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									j = i - 1;
							 | 
						||
| 
								 | 
							
									for (i = 0; i < j; i++, j--) {
							 | 
						||
| 
								 | 
							
										char *tmp = &errstr[i];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										errstr[i] = errstr[j];
							 | 
						||
| 
								 | 
							
										errstr[j] = *tmp;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return errstr;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void metal_add_test_case(struct metal_test_case *test_case)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									metal_list_add_tail(&test_cases, &test_case->node);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int metal_tests_run(struct metal_init_params *params)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									struct metal_init_params dparams = METAL_INIT_DEFAULTS;
							 | 
						||
| 
								 | 
							
									struct metal_test_case *test_case;
							 | 
						||
| 
								 | 
							
									struct metal_list *node;
							 | 
						||
| 
								 | 
							
									int error, errors = 0;
							 | 
						||
| 
								 | 
							
									const char *dots = "..................................";
							 | 
						||
| 
								 | 
							
									const char *pad;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (!params)
							 | 
						||
| 
								 | 
							
										params = &dparams;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									params->log_level = METAL_LOG_DEBUG;
							 | 
						||
| 
								 | 
							
									error = metal_init(params);
							 | 
						||
| 
								 | 
							
									if (error)
							 | 
						||
| 
								 | 
							
										return error;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									metal_list_for_each(&test_cases, node) {
							 | 
						||
| 
								 | 
							
										test_case = metal_container_of(node, struct metal_test_case,
							 | 
						||
| 
								 | 
							
													       node);
							 | 
						||
| 
								 | 
							
										pad = dots + strlen(test_case->name);
							 | 
						||
| 
								 | 
							
										metal_log(METAL_LOG_INFO,"running [%s]\n", test_case->name);
							 | 
						||
| 
								 | 
							
										error = test_case->test();
							 | 
						||
| 
								 | 
							
										metal_log(METAL_LOG_INFO,"result [%s]%s %s%s%s\n",
							 | 
						||
| 
								 | 
							
										       test_case->name, pad,
							 | 
						||
| 
								 | 
							
										       error ? "fail" : "pass",
							 | 
						||
| 
								 | 
							
										       error ? " - error: " : "",
							 | 
						||
| 
								 | 
							
										       error ? strerror(-error) : "");
							 | 
						||
| 
								 | 
							
										if (error)
							 | 
						||
| 
								 | 
							
											errors++;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									metal_finish();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return errors;
							 | 
						||
| 
								 | 
							
								}
							 |