Browse Source

Test ExtORPort cookie initialization when file writing is broken.

George Kadianakis 10 years ago
parent
commit
c5269a59b0
3 changed files with 27 additions and 5 deletions
  1. 3 3
      src/common/util.c
  2. 3 2
      src/common/util.h
  3. 21 0
      src/test/test_extorport.c

+ 3 - 3
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 <b>len</b> bytes, starting at <b>str</b>. */
-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));

+ 3 - 2
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 {

+ 21 - 0
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