diff options
author | meejah <meejah@meejah.ca> | 2012-09-12 13:26:34 -0600 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2012-09-17 10:02:24 -0400 |
commit | d64bf286a175f590fc07f51f49584cf246eac9b2 (patch) | |
tree | 54374a24ab830b07ba7bbb9b2e50c2938fe38349 /src/test | |
parent | 99cb9696ac617a42a78d9ebfa3f169fd8e4a3d88 (diff) | |
download | tor-d64bf286a175f590fc07f51f49584cf246eac9b2.tar.gz tor-d64bf286a175f590fc07f51f49584cf246eac9b2.zip |
Handle FIFOs in read_file_to_str
add read_file_to_str_until_eof which is used by read_file_to_str
if the file happens to be a FIFO.
change file_status() to return FN_FILE if st_mode matches S_IFIFO
(on not-windows) so that init_key_from_file() will read from a FIFO.
Diffstat (limited to 'src/test')
-rw-r--r-- | src/test/test_util.c | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/src/test/test_util.c b/src/test/test_util.c index 64976f3390..cc3a03f84f 100644 --- a/src/test/test_util.c +++ b/src/test/test_util.c @@ -19,6 +19,117 @@ #endif static void +test_util_read_file_fifo_tiny_limit(void *arg) +{ +#ifndef _WIN32 + char *fifo_name = NULL; + char *str = NULL; + int fd = -1; + int read_fd = -1; + size_t sz; + (void)arg; + + fifo_name = tor_strdup(get_fname("tor_test_fifo_tiny")); + fd = open(fifo_name, O_WRONLY | O_CREAT, 0600); + test_neq(fd, -1); + test_eq(write(fd, "short", 6), 6); + close(fd); + + // purposely set limit shorter than what we wrote to the FIFO to + // test the maximum, and that it puts the NUL in the right spot + + read_fd = open(fifo_name, O_RDONLY); + str = read_file_to_str_until_eof(read_fd, 4, &sz); + close(read_fd); + + test_eq(str[0], 's'); + test_eq(str[1], 'h'); + test_eq(str[2], 'o'); + test_eq(str[3], 'r'); + test_eq(str[4], '\0'); + + done: + unlink(fifo_name); + tor_free(fifo_name); + tor_free(str); +#endif +} + +static void +test_util_read_file_fifo_two_loops(void *arg) +{ +#ifndef _WIN32 + char *fifo_name = NULL; + char *str = NULL; + char data[2048]; + int i = 0; + int fd = -1; + int read_fd = -1; + size_t sz; + (void)arg; + + while (i < 2048) { + data[i] = (char)(i & 0xff); + ++i; + } + + // write more than 1024 bytes to the FIFO to test two passes through + // the loop in the method; if the re-alloc size is changed this + // should be updated as well. + + fifo_name = tor_strdup(get_fname("tor_fifo_test_2k")); + fd = open(fifo_name, O_WRONLY | O_CREAT, 0600); + test_neq(fd, -1); + test_eq(write(fd, data, 2048), 2048); + close(fd); + + read_fd = open(fifo_name, O_RDONLY); + str = read_file_to_str_until_eof(read_fd, 1024*1024, &sz); + close(read_fd); + + for (i = 0; i < 2048; ++i) { + test_eq(str[i], (char)(i & 0xff)); + } + + done: + unlink(fifo_name); + tor_free(fifo_name); + tor_free(str); +#endif +} + +static void +test_util_read_file_fifo_zero_bytes(void *arg) +{ +#ifndef _WIN32 + char *fifo_name = NULL; + char *str = NULL; + int fd = -1; + int read_fd = -1; + size_t sz; + (void)arg; + + fifo_name = tor_strdup(get_fname("tor_fifo_test_zero_bytes")); + // zero-byte fifo + fd = open(fifo_name, O_WRONLY | O_CREAT, 0600); + test_neq(fd, -1); + close(fd); + + read_fd = open(fifo_name, O_RDONLY); + str = read_file_to_str_until_eof(read_fd, 1024, &sz); + close(read_fd); + + test_neq(str, NULL); + test_eq(str[0], '\0'); + + done: + unlink(fifo_name); + tor_free(fifo_name); + tor_free(str); +#endif +} + +static void test_util_time(void) { struct timeval start, end; @@ -3191,6 +3302,9 @@ struct testcase_t util_tests[] = { UTIL_TEST(envnames, 0), UTIL_TEST(make_environment, 0), UTIL_TEST(set_env_var_in_sl, 0), + UTIL_TEST(read_file_fifo_tiny_limit, 0), + UTIL_TEST(read_file_fifo_two_loops, 0), + UTIL_TEST(read_file_fifo_zero_bytes, 0), END_OF_TESTCASES }; |