mirror of
				https://review.coreboot.org/flashrom.git
				synced 2025-11-04 07:00:39 +01:00 
			
		
		
		
	tests: Redirect to real I/O to support coverage run
Implement a check that redirects mock io functions to the real implementations. Real I/O functions are needed for the coverage tool to be able to create and write files. BUG=None BRANCH=None TEST=None Change-Id: I0817fce6ea0f53a4c127794a0d8246504675f805 Signed-off-by: Evan Benn <evanbenn@chromium.org> Reviewed-on: https://review.coreboot.org/c/flashrom/+/69539 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Anastasia Klimchuk <aklm@chromium.org>
This commit is contained in:
		
				
					committed by
					
						
						Anastasia Klimchuk
					
				
			
			
				
	
			
			
			
						parent
						
							da6d28f2d1
						
					
				
				
					commit
					2c3bbd91e4
				
			
							
								
								
									
										63
									
								
								tests/io_real.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								tests/io_real.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the flashrom project.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright 2022 Google LLC
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; version 2 of the License.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "io_mock.h"
 | 
			
		||||
#include "wraps.h"
 | 
			
		||||
 | 
			
		||||
#include "io_real.h"
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
static int io_real_open(void *state, const char *pathname, int flags, mode_t mode)
 | 
			
		||||
{
 | 
			
		||||
	LOG_ME;
 | 
			
		||||
	return __real_open(pathname, flags, mode);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static FILE *io_real_fdopen(void *state, int fd, const char *mode)
 | 
			
		||||
{
 | 
			
		||||
	LOG_ME;
 | 
			
		||||
	return __real_fdopen(fd, mode);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static size_t io_real_fwrite(void *state, const void *ptr, size_t size, size_t nmemb, FILE *fp)
 | 
			
		||||
{
 | 
			
		||||
	return __real_fwrite(ptr, size, nmemb, fp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Mock ios that defer to the real io functions.
 | 
			
		||||
 * These exist so that code coverage can print to real files on disk.
 | 
			
		||||
 */
 | 
			
		||||
static const struct io_mock real_io = {
 | 
			
		||||
	.iom_open = io_real_open,
 | 
			
		||||
	.iom_fwrite = io_real_fwrite,
 | 
			
		||||
	.iom_fdopen = io_real_fdopen,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Return 0 if string ends with suffix. */
 | 
			
		||||
static int check_suffix(const char *string, const char *suffix)
 | 
			
		||||
{
 | 
			
		||||
	int len_l = strlen(string);
 | 
			
		||||
	int len_r = strlen(suffix);
 | 
			
		||||
	if (len_l > len_r)
 | 
			
		||||
		return strcmp(string + len_l - len_r, suffix);
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void maybe_unmock_io(const char *pathname)
 | 
			
		||||
{
 | 
			
		||||
	const char *gcov_suffix = ".gcda";
 | 
			
		||||
	if (!check_suffix(pathname, gcov_suffix))
 | 
			
		||||
		io_mock_register(&real_io);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										24
									
								
								tests/io_real.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								tests/io_real.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the flashrom project.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright 2022 Google LLC
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; version 2 of the License.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef IO_REAL_H
 | 
			
		||||
#define IO_REAL_H
 | 
			
		||||
 | 
			
		||||
/* Detect file io that should not be mocked, for example code coverage writing
 | 
			
		||||
 * gcda files. Call io_mock_register with functions that defer to real io.
 | 
			
		||||
 */
 | 
			
		||||
void maybe_unmock_io(const char* pathname);
 | 
			
		||||
 | 
			
		||||
#endif /* IO_REAL_H */
 | 
			
		||||
@@ -23,6 +23,7 @@ test_srcs = files(
 | 
			
		||||
  'chip.c',
 | 
			
		||||
  'chip_wp.c',
 | 
			
		||||
  'selfcheck.c',
 | 
			
		||||
  'io_real.c',
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
if not programmer.get('dummy').get('active')
 | 
			
		||||
 
 | 
			
		||||
@@ -29,6 +29,7 @@ uintptr_t __wrap_pcidev_readbar(void *dev, int bar);
 | 
			
		||||
void __wrap_sio_write(uint16_t port, uint8_t reg, uint8_t data);
 | 
			
		||||
uint8_t __wrap_sio_read(uint16_t port, uint8_t reg);
 | 
			
		||||
int __wrap_open(const char *pathname, int flags, ...);
 | 
			
		||||
int __real_open(const char *pathname, int flags, ...);
 | 
			
		||||
int __wrap_open64(const char *pathname, int flags, ...);
 | 
			
		||||
int __wrap___open64_2(const char *pathname, int flags, ...);
 | 
			
		||||
int __wrap_ioctl(int fd, unsigned long int request, ...);
 | 
			
		||||
@@ -37,6 +38,7 @@ int __wrap_read(int fd, void *buf, size_t sz);
 | 
			
		||||
FILE *__wrap_fopen(const char *pathname, const char *mode);
 | 
			
		||||
FILE *__wrap_fopen64(const char *pathname, const char *mode);
 | 
			
		||||
FILE *__wrap_fdopen(int fd, const char *mode);
 | 
			
		||||
FILE *__real_fdopen(int fd, const char *mode);
 | 
			
		||||
int __wrap_stat(const char *path, void *buf);
 | 
			
		||||
int __wrap_stat64(const char *path, void *buf);
 | 
			
		||||
int __wrap___xstat(const char *path, void *buf);
 | 
			
		||||
@@ -49,6 +51,7 @@ char *__wrap_fgets(char *buf, int len, FILE *fp);
 | 
			
		||||
char *__wrap___fgets_chk(char *buf, int len, FILE *fp);
 | 
			
		||||
size_t __wrap_fread(void *ptr, size_t size, size_t nmemb, FILE *fp);
 | 
			
		||||
size_t __wrap_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *fp);
 | 
			
		||||
size_t __real_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *fp);
 | 
			
		||||
int __wrap_fflush(FILE *fp);
 | 
			
		||||
int __wrap_fileno(FILE *fp);
 | 
			
		||||
int __wrap_fsync(int fd);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user