diff options
| author | Evan Benn <evanbenn@chromium.org> | 2022-11-04 17:00:40 +1100 | 
|---|---|---|
| committer | Anastasia Klimchuk <aklm@chromium.org> | 2022-12-09 00:28:36 +0000 | 
| commit | 819c27507466a0dcd836d7deebe0775b8f3f5e96 (patch) | |
| tree | bd821da7850ef10c12eac94717cc5ca68ade747f /tests | |
| parent | bcaaae15ae65fe8b2f0c2f9cb55c777a57eb5de4 (diff) | |
| download | flashrom-819c27507466a0dcd836d7deebe0775b8f3f5e96.tar.gz flashrom-819c27507466a0dcd836d7deebe0775b8f3f5e96.tar.bz2 flashrom-819c27507466a0dcd836d7deebe0775b8f3f5e96.zip | |
tests: Detect llvm coverage run and redirect to real I/O functions
Code coverage writes data to disk, we need to use real io functions at
this point so that the data is really written.
BUG=b:187647884
BRANCH=None
TEST=llvm-profdata merge -sparse default.profraw -o default.profdata
TEST=llvm-cov show ./flashrom_unit_tests
-instr-profile=default.profdata --format=html --output-dir=.
Change-Id: I21cc1d631e92fa19006b967e85676f108e80b307
Signed-off-by: Evan Benn <evanbenn@chromium.org>
Reviewed-on: https://review.coreboot.org/c/flashrom/+/69267
Reviewed-by: Anastasia Klimchuk <aklm@chromium.org>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/io_real.c | 17 | ||||
| -rw-r--r-- | tests/tests.c | 2 | ||||
| -rw-r--r-- | tests/wraps.h | 2 | 
3 files changed, 20 insertions, 1 deletions
| diff --git a/tests/io_real.c b/tests/io_real.c index 9f9e9d6d..429027fb 100644 --- a/tests/io_real.c +++ b/tests/io_real.c @@ -25,6 +25,12 @@ static int io_real_open(void *state, const char *pathname, int flags, mode_t mod  	return __real_open(pathname, flags, mode);  } +static FILE *io_real_fopen(void *state, const char *pathname, const char *mode) +{ +	LOG_ME; +	return __real_fopen(pathname, mode); +} +  static FILE *io_real_fdopen(void *state, int fd, const char *mode)  {  	LOG_ME; @@ -36,13 +42,21 @@ static size_t io_real_fwrite(void *state, const void *ptr, size_t size, size_t n  	return __real_fwrite(ptr, size, nmemb, fp);  } +static int io_real_fclose(void *state, FILE *fp) +{ +	LOG_ME; +	return __real_fclose(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_fopen = io_real_fopen,  	.iom_fwrite = io_real_fwrite,  	.iom_fdopen = io_real_fdopen, +	.iom_fclose = io_real_fclose,  };  /* Return 0 if string ends with suffix. */ @@ -58,6 +72,7 @@ static int check_suffix(const char *string, const char *suffix)  void maybe_unmock_io(const char *pathname)  {  	const char *gcov_suffix = ".gcda"; -	if (!check_suffix(pathname, gcov_suffix)) +	const char *llvm_cov_suffix = ".profraw"; +	if (!check_suffix(pathname, gcov_suffix) || !check_suffix(pathname, llvm_cov_suffix))  		io_mock_register(&real_io);  } diff --git a/tests/tests.c b/tests/tests.c index b11f6421..a1dcacae 100644 --- a/tests/tests.c +++ b/tests/tests.c @@ -170,6 +170,7 @@ int __wrap_read(int fd, void *buf, size_t sz)  FILE *__wrap_fopen(const char *pathname, const char *mode)  {  	LOG_ME; +	maybe_unmock_io(pathname);  	if (get_io() && get_io()->iom_fopen)  		return get_io()->iom_fopen(get_io()->state, pathname, mode);  	return not_null(); @@ -178,6 +179,7 @@ FILE *__wrap_fopen(const char *pathname, const char *mode)  FILE *__wrap_fopen64(const char *pathname, const char *mode)  {  	LOG_ME; +	maybe_unmock_io(pathname);  	if (get_io() && get_io()->iom_fopen)  		return get_io()->iom_fopen(get_io()->state, pathname, mode);  	return not_null(); diff --git a/tests/wraps.h b/tests/wraps.h index 92b0c42c..6cc95677 100644 --- a/tests/wraps.h +++ b/tests/wraps.h @@ -36,6 +36,7 @@ int __wrap_ioctl(int fd, unsigned long int request, ...);  int __wrap_write(int fd, const void *buf, size_t sz);  int __wrap_read(int fd, void *buf, size_t sz);  FILE *__wrap_fopen(const char *pathname, const char *mode); +FILE *__real_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); @@ -59,6 +60,7 @@ int __wrap_setvbuf(FILE *fp, char *buf, int type, size_t size);  int __wrap_fprintf(FILE *fp, const char *fmt, ...);  int __wrap___vfprintf_chk(FILE *fp, const char *fmt, va_list args);  int __wrap_fclose(FILE *fp); +int __real_fclose(FILE *fp);  int __wrap_feof(FILE *fp);  int __wrap_ferror(FILE *fp);  void __wrap_clearerr(FILE *fp); | 
