When running multiple tests, e.g. by using unit-tests target, it is hard to differentiate, which output comes from which file and/or configuration. This patch makes the output easier to analyze and understand by using new wrapper macro cb_run_group_tests(). This macro uses __TEST_NAME__ value (containing test path and Makefile test name) as a group name when calling cmocka group runner. Example: Test path: tests/lib/ Makefile test name: cbmem_stage_cache-test Test group array name: tests Result: tests/lib/cbmem_stage_cache-test(tests) Signed-off-by: Jakub Czapiga <jacz@semihalf.com> Change-Id: I4fd936d00d77cbe2637b857ba03b4a208428ea0d Reviewed-on: https://review.coreboot.org/c/coreboot/+/57144 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Paul Fagerburg <pfagerburg@chromium.org> Reviewed-by: Julius Werner <jwerner@chromium.org>
		
			
				
	
	
		
			131 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* SPDX-License-Identifier: GPL-2.0-only */
 | 
						|
 | 
						|
#include "../lib/cbmem_console.c"
 | 
						|
 | 
						|
#include <inttypes.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <string.h>
 | 
						|
#include <tests/test.h>
 | 
						|
 | 
						|
 | 
						|
#if ENV_ROMSTAGE_OR_BEFORE
 | 
						|
/* Weak references have to be here, so TEST_REGION macro will work properly */
 | 
						|
__weak extern u8 _preram_cbmem_console[];
 | 
						|
__weak extern u8 _epreram_cbmem_console[];
 | 
						|
 | 
						|
#define PRERAM_CBMEM_CONSOLE_SIZE (1 * KiB)
 | 
						|
TEST_REGION(preram_cbmem_console, PRERAM_CBMEM_CONSOLE_SIZE);
 | 
						|
#endif
 | 
						|
 | 
						|
/* Disable init hooks. This test does not need them. */
 | 
						|
void cbmem_run_init_hooks(int is_recovery)
 | 
						|
{
 | 
						|
	(void)is_recovery;
 | 
						|
}
 | 
						|
 | 
						|
int setup_cbmemc(void **state)
 | 
						|
{
 | 
						|
	cbmemc_init();
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
int teardown_cbmemc(void **state)
 | 
						|
{
 | 
						|
	current_console->size = 0;
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
void test_cbmemc_init(void **state)
 | 
						|
{
 | 
						|
	cbmemc_init();
 | 
						|
 | 
						|
	/* Check if console structure was created. */
 | 
						|
	assert_non_null(current_console);
 | 
						|
}
 | 
						|
 | 
						|
void test_cbmemc_tx_byte(void **state)
 | 
						|
{
 | 
						|
	int i;
 | 
						|
	u32 cursor;
 | 
						|
	const unsigned char data[] = "Random testing string\n"
 | 
						|
				"`1234567890-=~!@#$%^&*()_+\n"
 | 
						|
				"abcdefghijklmnopqrstuvwxyz\n"
 | 
						|
				"ABCDEFGHIJKLMNOPQRSTUVWXYZ\n";
 | 
						|
 | 
						|
	for (i = 0; i < ARRAY_SIZE(data); ++i)
 | 
						|
		cbmemc_tx_byte(data[i]);
 | 
						|
 | 
						|
	cursor = current_console->cursor & CURSOR_MASK;
 | 
						|
 | 
						|
	assert_int_equal(ARRAY_SIZE(data), cursor);
 | 
						|
 | 
						|
	/* Check if all characters were added correctly. */
 | 
						|
	assert_memory_equal(data, current_console->body, ARRAY_SIZE(data));
 | 
						|
}
 | 
						|
 | 
						|
void test_cbmemc_tx_byte_overflow(void **state)
 | 
						|
{
 | 
						|
	int i;
 | 
						|
	u32 cursor;
 | 
						|
	u32 flags;
 | 
						|
	const uint32_t console_size = current_console->size;
 | 
						|
	const unsigned char data[] = "Another random string\n"
 | 
						|
				"abcdefghijklmnopqrstuvwxyz\n"
 | 
						|
				"ABCDEFGHIJKLMNOPQRSTUVWXYZ\n"
 | 
						|
				"`1234567890-=~!@#$%^&*()_+\n";
 | 
						|
	const int data_size = ARRAY_SIZE(data) - 1;
 | 
						|
	const int data_stream_length = console_size + data_size;
 | 
						|
	const int overflow_bytes = data_stream_length % console_size;
 | 
						|
	unsigned char *check_buffer =
 | 
						|
			(unsigned char *)malloc(sizeof(unsigned char) * console_size);
 | 
						|
 | 
						|
	/* Fill console buffer */
 | 
						|
	for (i = 0; i < console_size; ++i)
 | 
						|
		cbmemc_tx_byte(data[i % data_size]);
 | 
						|
 | 
						|
	/* Store buffer for checking */
 | 
						|
	memcpy(check_buffer, current_console->body, console_size);
 | 
						|
 | 
						|
	assert_memory_equal(current_console->body, data, overflow_bytes);
 | 
						|
 | 
						|
	/* Add more data to console buffer to override older bytes */
 | 
						|
	for (; i < data_stream_length; ++i)
 | 
						|
		cbmemc_tx_byte(data[i % data_size]);
 | 
						|
 | 
						|
	cursor = current_console->cursor & CURSOR_MASK;
 | 
						|
	flags = current_console->cursor & ~CURSOR_MASK;
 | 
						|
 | 
						|
	/* Check if there was a overflow in buffer */
 | 
						|
	assert_int_equal(OVERFLOW, flags & OVERFLOW);
 | 
						|
 | 
						|
	/* Check if cursor got back to the beginning of a buffer */
 | 
						|
	assert_int_equal(data_size, cursor);
 | 
						|
 | 
						|
	/* Check if overflow buffer was overwritten */
 | 
						|
	assert_memory_not_equal(current_console->body,
 | 
						|
			data,
 | 
						|
			overflow_bytes);
 | 
						|
 | 
						|
	/* Check if rest of the buffer contents, that should not be overridden,
 | 
						|
	 * is the same.
 | 
						|
	 */
 | 
						|
	assert_memory_equal(¤t_console->body[overflow_bytes],
 | 
						|
			check_buffer + overflow_bytes,
 | 
						|
			console_size - overflow_bytes);
 | 
						|
 | 
						|
	free(check_buffer);
 | 
						|
}
 | 
						|
 | 
						|
int main(void)
 | 
						|
{
 | 
						|
	const struct CMUnitTest tests[] = {
 | 
						|
		cmocka_unit_test_teardown(test_cbmemc_init, teardown_cbmemc),
 | 
						|
		cmocka_unit_test_setup_teardown(test_cbmemc_tx_byte,
 | 
						|
						setup_cbmemc, teardown_cbmemc),
 | 
						|
		cmocka_unit_test_setup_teardown(test_cbmemc_tx_byte_overflow,
 | 
						|
						setup_cbmemc, teardown_cbmemc),
 | 
						|
	};
 | 
						|
 | 
						|
	return cb_run_group_tests(tests, NULL, NULL);
 | 
						|
}
 |