diff --git a/src/common/util.c b/src/common/util.c index 0e8d34eafd..a4c2ef4c24 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -2216,9 +2216,9 @@ write_bytes_to_file_impl(const char *fname, const char *str, size_t len, /** As write_str_to_file, but does not assume a NUL-terminated * string. Instead, we write len bytes, starting at str. */ -int -write_bytes_to_file(const char *fname, const char *str, size_t len, - int bin) +MOCK_IMPL(int, +write_bytes_to_file,(const char *fname, const char *str, size_t len, + int bin)) { return write_bytes_to_file_impl(fname, str, len, OPEN_FLAGS_REPLACE|(bin?O_BINARY:O_TEXT)); diff --git a/src/common/util.h b/src/common/util.h index 0a8e4a23fc..8dfb2de5fc 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -355,8 +355,9 @@ FILE *fdopen_file(open_file_t *file_data); int finish_writing_to_file(open_file_t *file_data); int abort_writing_to_file(open_file_t *file_data); int write_str_to_file(const char *fname, const char *str, int bin); -int write_bytes_to_file(const char *fname, const char *str, size_t len, - int bin); +MOCK_DECL(int, +write_bytes_to_file,(const char *fname, const char *str, size_t len, + int bin)); /** An ad-hoc type to hold a string of characters and a count; used by * write_chunks_to_file. */ typedef struct sized_chunk_t { diff --git a/src/test/test_extorport.c b/src/test/test_extorport.c index a3ccc412ab..7e38ba57dc 100644 --- a/src/test/test_extorport.c +++ b/src/test/test_extorport.c @@ -149,6 +149,18 @@ test_ext_or_write_command(void *arg) UNMOCK(connection_write_to_buf_impl_); } +static int +write_bytes_to_file_fail(const char *fname, const char *str, size_t len, + int bin) +{ + (void) fname; + (void) str; + (void) len; + (void) bin; + + return -1; +} + static void test_ext_or_init_auth(void *arg) { @@ -177,6 +189,14 @@ test_ext_or_init_auth(void *arg) tt_str_op(cp, ==, fn); tor_free(cp); + /* Test the initialization function with a broken + write_bytes_to_file(). See if the problem is handled properly. */ + MOCK(write_bytes_to_file, write_bytes_to_file_fail); + tt_int_op(-1, ==, init_ext_or_cookie_authentication(1)); + tt_int_op(ext_or_auth_cookie_is_set, ==, 0); + UNMOCK(write_bytes_to_file); + + /* Now do the actual initialization. */ tt_int_op(0, ==, init_ext_or_cookie_authentication(1)); tt_int_op(ext_or_auth_cookie_is_set, ==, 1); cp = read_file_to_str(fn, RFTS_BIN, &st); @@ -193,6 +213,7 @@ test_ext_or_init_auth(void *arg) done: tor_free(cp); + ext_orport_free_all(); } static void