blob: 122672b41b4ff018804dc9fdcf5ee83f5babe528 [file] [log] [blame]
#include <stdarg.h>
#include <setjmp.h>
#include <stddef.h>
#include <stdint.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <cmocka.h>
int __real_open(const char*, mode_t);
int __real_close(int);
int __real_stat(const char*, struct stat *);
ssize_t __real_read(int, void*, size_t);
/* syscalls to mock */
int __wrap_open(const char *path, mode_t mode)
{
check_expected(path);
mode_t m = mock_type(mode_t);
mode_t a = mode & m;
assert_int_equal(a, m);
int retval = mock_type(int);
/* fake open if retval > 0 */
if (retval > 0)
return retval;
return __real_open(path, mode);
}
int __wrap_close(int fd)
{
check_expected(fd);
int retval = mock_type(int);
if (retval != 0)
return __real_close(fd);
return retval;
}
int __wrap_ioctl(int fd, int req, ...)
{
assert_true(fd > 0);
check_expected(req);
int retval = mock_type(int);
void *expected_arg = mock_type(void*);
size_t expected_len = mock_type(size_t);
if (expected_arg == NULL)
return retval;
va_list ap;
va_start(ap, req);
void *arg = va_arg(ap, void *);
va_end(ap);
assert_non_null(arg);
assert_memory_equal(expected_arg, arg, expected_len);
return retval;
}
int __wrap_stat(const char *path, struct stat *buf)
{
check_expected(path);
assert_non_null(buf);
return mock_type(int);
}
int __wrap_read(int fd, char *buf, size_t len)
{
assert_true(fd > 0);
assert_non_null(buf);
check_expected(len);
int retval = mock_type(int);
int real = mock_type(int);
if (real)
return __real_read(fd, buf, len);
return retval;
}
int __wrap_write(int fd, char *buf, size_t len)
{
assert_true(fd > 0);
assert_non_null(buf);
void *expected_buf = mock_type(void*);
size_t expected_len = mock_type(size_t);
assert_int_equal(expected_len, len);
assert_memory_equal(expected_buf, buf, expected_len);
return mock_type(int);
}
off_t __wrap_lseek(int fd, off_t seek, int whence)
{
assert_true(fd > 0);
check_expected(seek);
check_expected(whence);
return mock_type(off_t);
}
#define expect_open(X,Y,Z) do { \
expect_string(__wrap_open, path, X);\
will_return(__wrap_open, Y);\
will_return(__wrap_open, Z);\
} while(0);
#define expect_close(X,Y) do { \
expect_value(__wrap_close, fd, X);\
will_return(__wrap_close, Y);\
} while(0);
#define expect_ioctl(W,X,Y,Z) do { \
expect_value(__wrap_ioctl, req, (int)W);\
will_return(__wrap_ioctl, X);\
will_return(__wrap_ioctl, Y);\
will_return(__wrap_ioctl, Z);\
} while(0);
#define expect_ioctl_short(X,Y) do { \
expect_value(__wrap_ioctl, req, (int)X);\
will_return(__wrap_ioctl, Y);\
will_return(__wrap_ioctl, NULL);\
will_return(__wrap_ioctl, 0);\
} while(0);
#define expect_stat(X,Y) do { \
expect_string(__wrap_stat, path, X);\
will_return(__wrap_stat, Y);\
} while(0);
#define expect_write(X,Y,Z) do { \
will_return(__wrap_write, X);\
will_return(__wrap_write, Y);\
will_return(__wrap_write, Z);\
} while(0);
#define expect_lseek(X,Y,Z) do { \
expect_value(__wrap_lseek, seek, X);\
expect_value(__wrap_lseek, whence, Y);\
will_return(__wrap_lseek, Z);\
} while(0);
#define expect_read(X,Y) do { \
expect_value(__wrap_read, len, X);\
will_return(__wrap_read, Y);\
will_return(__wrap_read, 0);\
} while(0);
#define expect_read_real(X,Y) do { \
expect_value(__wrap_read, len, X);\
will_return(__wrap_read, Y);\
will_return(__wrap_read, 1);\
} while(0);