mirror of
https://review.coreboot.org/flashrom.git
synced 2025-04-27 23:22:37 +02:00
tests: Emulate multithreading environment for unit tests
The main purpose of this patch is to run unit tests on BSD family of OSes. The root cause is `fileno` syscall which is a macro that can be expanded to either a function call (for multi-threaded environment) or to inline code (for single-threaded environment). Said inline code accesses private field of file descriptor, and this construction is impossible to mock in unit tests. Multi- threaded environment has `fileno` as a function, which can be mocked in unit tests. On other OSes the patch just creates a thread which is doing nothing. We avoid adding pre-processor conditionals since the cost is small. Tested on FreeBSD 13.1-RELEASE-p6 GENERIC amd64 NetBSD 9.2 (GENERIC) amd64 OpenBSD 7.2 GENERIC#7 amd64 DragonFly v6.4.0-RELEASE x86_64 Ubuntu 22.04.1 x86_64 Change-Id: I3d65c125183e60037ad07b9d54b8fffdece5a4e8 Signed-off-by: Anastasia Klimchuk <aklm@chromium.org> Reviewed-on: https://review.coreboot.org/c/flashrom/+/74157 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Peter Marheine <pmarheine@chromium.org> Reviewed-by: Thomas Heijligen <src@posteo.de>
This commit is contained in:
parent
256b041480
commit
7348eb3320
@ -113,6 +113,8 @@ mocks = [
|
|||||||
'-Wl,--gc-sections',
|
'-Wl,--gc-sections',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
threads_dep = dependency('threads')
|
||||||
|
|
||||||
flashrom_tests = executable('flashrom_unit_tests',
|
flashrom_tests = executable('flashrom_unit_tests',
|
||||||
test_srcs,
|
test_srcs,
|
||||||
c_args : [
|
c_args : [
|
||||||
@ -123,7 +125,7 @@ flashrom_tests = executable('flashrom_unit_tests',
|
|||||||
],
|
],
|
||||||
export_dynamic : true,
|
export_dynamic : true,
|
||||||
link_args : mocks + link_args,
|
link_args : mocks + link_args,
|
||||||
dependencies : [cmocka_dep, flashrom_test_dep],
|
dependencies : [cmocka_dep, flashrom_test_dep, threads_dep],
|
||||||
)
|
)
|
||||||
test('cmocka test flashrom', flashrom_tests)
|
test('cmocka test flashrom', flashrom_tests)
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
void *not_null(void)
|
void *not_null(void)
|
||||||
{
|
{
|
||||||
@ -385,26 +386,32 @@ unsigned int __wrap_INL(unsigned short port)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void *doing_nothing(void *vargp) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
|
||||||
/*
|
|
||||||
* Pretending to be a multithreaded environment so that `fileno`
|
|
||||||
* is called as a function (and not as a macro).
|
|
||||||
* fileno macro in FreeBSD is expanded into inline access of
|
|
||||||
* private field of file descriptor, which is impossible to mock.
|
|
||||||
* Calling fileno as a function allows the test to mock it.
|
|
||||||
*/
|
|
||||||
__isthreaded = 1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (argc > 1)
|
if (argc > 1)
|
||||||
cmocka_set_test_filter(argv[1]);
|
cmocka_set_test_filter(argv[1]);
|
||||||
|
|
||||||
cmocka_set_message_output(CM_OUTPUT_STDOUT);
|
cmocka_set_message_output(CM_OUTPUT_STDOUT);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Creating new thread which is doing nothing, to trigger __isthreaded being 1.
|
||||||
|
* This is a workaround for BSD family. In multi-threaded environment fileno
|
||||||
|
* macro is expanded into a function which is possible to mock in unit tests.
|
||||||
|
* Without this workaround, on a single-thread environment, fileno macro is
|
||||||
|
* expanded into an inline access of a private field of a file descriptor,
|
||||||
|
* which is impossible to mock.
|
||||||
|
*
|
||||||
|
* In other OSes this is just creating a thread which is doing nothing.
|
||||||
|
*/
|
||||||
|
pthread_t thread_id;
|
||||||
|
pthread_create(&thread_id, NULL, doing_nothing, NULL);
|
||||||
|
|
||||||
const struct CMUnitTest helpers_tests[] = {
|
const struct CMUnitTest helpers_tests[] = {
|
||||||
cmocka_unit_test(address_to_bits_test_success),
|
cmocka_unit_test(address_to_bits_test_success),
|
||||||
cmocka_unit_test(bitcount_test_success),
|
cmocka_unit_test(bitcount_test_success),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user