Daniel Campello has uploaded this change for review. ( https://review.coreboot.org/c/flashrom/+/63227 )
Change subject: tests: assert pathname and flags when calling open() ......................................................................
tests: assert pathname and flags when calling open()
With this change the wrappers for mock and friends are able to take an optional io_mock_open_state struct to assert expected pathnames and flags whenever an open operation is called.
Based partially on https://review.coreboot.org/c/flashrom/+/62319/5
BUG=b:227404721,b:217629892,b:215255210 TEST=./test_build.sh; FEATURES=test emerge-amd64-generic flashrom BRANCH=none
Signed-off-by: Daniel Campello campello@chromium.org Co-Author: Edward O'Callaghan quasisec@google.com Change-Id: Ib46ca5b854c8453ec02ae09f3151cd4d25f988eb --- M tests/io_mock.h M tests/lifecycle.c M tests/tests.c 3 files changed, 36 insertions(+), 17 deletions(-)
git pull ssh://review.coreboot.org:29418/flashrom refs/changes/27/63227/1
diff --git a/tests/io_mock.h b/tests/io_mock.h index f8f75ad..5d9bd0d 100644 --- a/tests/io_mock.h +++ b/tests/io_mock.h @@ -60,6 +60,15 @@ /* Always return success for tests. */ #define S_ISREG(x) 0
+/* Maximum number of open to mock. */ +#define MAX_MOCK_OPEN 2 + +struct io_mock_open_state { + unsigned int noc; + const char *paths[MAX_MOCK_OPEN]; + int flags[MAX_MOCK_OPEN]; +}; + struct io_mock { void *state;
@@ -105,6 +114,8 @@ size_t (*fread)(void *state, void *buf, size_t size, size_t len, FILE *fp); int (*fprintf)(void *state, FILE *fp, const char *fmt, va_list args); int (*fclose)(void *state, FILE *fp); + + struct io_mock_open_state *open_state; };
void io_mock_register(const struct io_mock *io); diff --git a/tests/lifecycle.c b/tests/lifecycle.c index c37f3b9..fe63883 100644 --- a/tests/lifecycle.c +++ b/tests/lifecycle.c @@ -370,13 +370,6 @@ #endif }
-static int realtek_mst_open(void *state, const char *pathname, int flags) -{ - assert_string_equal(pathname, "/dev/i2c-254"); - assert_int_equal(flags & O_RDWR, O_RDWR); - return MOCK_FD; -} - static int realtek_mst_ioctl(void *state, int fd, unsigned long request, va_list args) { assert_int_equal(fd, MOCK_FD); @@ -406,11 +399,16 @@ void realtek_mst_basic_lifecycle_test_success(void **state) { #if CONFIG_REALTEK_MST_I2C_SPI == 1 + struct io_mock_open_state realtek_mst_open_state = { + .noc = 0, + .paths = {"/dev/i2c-254"}, + .flags = {O_RDWR}, + }; const struct io_mock realtek_mst_io = { - .open = realtek_mst_open, .ioctl = realtek_mst_ioctl, .read = realtek_mst_read, .write = realtek_mst_write, + .open_state = &realtek_mst_open_state, }; io_mock_register(&realtek_mst_io);
diff --git a/tests/tests.c b/tests/tests.c index f32c14d..bfe8b91 100644 --- a/tests/tests.c +++ b/tests/tests.c @@ -74,28 +74,38 @@ return (uint8_t)mock(); }
+static int wrap_open_and_friends(const char *pathname, int flags) +{ + if (get_io() && get_io()->open) + return get_io()->open(get_io()->state, pathname, flags); + if (get_io() && get_io()->open_state) { + struct io_mock_open_state *io_state = get_io()->open_state; + unsigned int open_state_flags; + assert_true(io_state->noc < MAX_MOCK_OPEN); + assert_string_equal(pathname, io_state->paths[io_state->noc]); + open_state_flags = io_state->flags[io_state->noc]; + assert_int_equal(flags & open_state_flags, open_state_flags); + io_state->noc++; // proceed to the next path upon next call. + } + return MOCK_FD; +} + int __wrap_open(const char *pathname, int flags) { LOG_ME; - if (get_io() && get_io()->open) - return get_io()->open(get_io()->state, pathname, flags); - return MOCK_FD; + return wrap_open_and_friends(pathname, flags); }
int __wrap_open64(const char *pathname, int flags) { LOG_ME; - if (get_io() && get_io()->open) - return get_io()->open(get_io()->state, pathname, flags); - return MOCK_FD; + return wrap_open_and_friends(pathname, flags); }
int __wrap___open64_2(const char *pathname, int flags) { LOG_ME; - if (get_io() && get_io()->open) - return get_io()->open(get_io()->state, pathname, flags); - return MOCK_FD; + return wrap_open_and_friends(pathname, flags); }
int __wrap_ioctl(int fd, unsigned long int request, ...)