|
|
#include "../../unity/unity.h" |
|
|
|
|
|
#include <stdio.h> |
|
|
#include <stdlib.h> |
|
|
#include <string.h> |
|
|
#include <unistd.h> |
|
|
#include <fcntl.h> |
|
|
#include <errno.h> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static char *make_tempfile_with_content(const char *content) |
|
|
{ |
|
|
char tmpl[] = "/tmp/od_read_char_test_XXXXXX"; |
|
|
int fd = mkstemp(tmpl); |
|
|
TEST_ASSERT_TRUE_MESSAGE(fd >= 0, "mkstemp failed"); |
|
|
|
|
|
if (content && content[0] != '\0') { |
|
|
size_t len = strlen(content); |
|
|
ssize_t wr = write(fd, content, len); |
|
|
TEST_ASSERT_EQUAL_INT_MESSAGE((int)len, (int)wr, "write failed"); |
|
|
} |
|
|
close(fd); |
|
|
|
|
|
char *path = (char *)malloc(strlen(tmpl) + 1); |
|
|
TEST_ASSERT_NOT_NULL(path); |
|
|
strcpy(path, tmpl); |
|
|
return path; |
|
|
} |
|
|
|
|
|
|
|
|
static void close_stream_if_open(void) |
|
|
{ |
|
|
if (in_stream != NULL) { |
|
|
|
|
|
(void)check_and_close(0); |
|
|
} |
|
|
} |
|
|
|
|
|
void setUp(void) { |
|
|
|
|
|
close_stream_if_open(); |
|
|
|
|
|
|
|
|
static const char *empty_list[] = { NULL }; |
|
|
file_list = empty_list; |
|
|
} |
|
|
|
|
|
void tearDown(void) { |
|
|
|
|
|
close_stream_if_open(); |
|
|
} |
|
|
|
|
|
|
|
|
void test_read_char_single_byte(void) |
|
|
{ |
|
|
char *p = make_tempfile_with_content("Z"); |
|
|
|
|
|
const char *flist[] = { p, NULL }; |
|
|
file_list = flist; |
|
|
|
|
|
|
|
|
TEST_ASSERT_TRUE(open_next_file()); |
|
|
|
|
|
int ch = 0; |
|
|
TEST_ASSERT_TRUE(read_char(&ch)); |
|
|
TEST_ASSERT_EQUAL_INT('Z', ch); |
|
|
|
|
|
|
|
|
close_stream_if_open(); |
|
|
unlink(p); |
|
|
free(p); |
|
|
} |
|
|
|
|
|
|
|
|
void test_read_char_three_bytes(void) |
|
|
{ |
|
|
char *p = make_tempfile_with_content("ABC"); |
|
|
|
|
|
const char *flist[] = { p, NULL }; |
|
|
file_list = flist; |
|
|
|
|
|
TEST_ASSERT_TRUE(open_next_file()); |
|
|
|
|
|
int ch = 0; |
|
|
TEST_ASSERT_TRUE(read_char(&ch)); |
|
|
TEST_ASSERT_EQUAL_INT('A', ch); |
|
|
TEST_ASSERT_TRUE(read_char(&ch)); |
|
|
TEST_ASSERT_EQUAL_INT('B', ch); |
|
|
TEST_ASSERT_TRUE(read_char(&ch)); |
|
|
TEST_ASSERT_EQUAL_INT('C', ch); |
|
|
|
|
|
|
|
|
|
|
|
close_stream_if_open(); |
|
|
unlink(p); |
|
|
free(p); |
|
|
} |
|
|
|
|
|
|
|
|
void test_read_char_eof_no_next_file(void) |
|
|
{ |
|
|
char *p = make_tempfile_with_content(""); |
|
|
|
|
|
const char *flist[] = { p, NULL }; |
|
|
file_list = flist; |
|
|
|
|
|
TEST_ASSERT_TRUE(open_next_file()); |
|
|
|
|
|
int ch = 123; |
|
|
TEST_ASSERT_TRUE(read_char(&ch)); |
|
|
TEST_ASSERT_EQUAL_INT(EOF, ch); |
|
|
|
|
|
|
|
|
ch = 456; |
|
|
TEST_ASSERT_TRUE(read_char(&ch)); |
|
|
TEST_ASSERT_EQUAL_INT(EOF, ch); |
|
|
|
|
|
close_stream_if_open(); |
|
|
unlink(p); |
|
|
free(p); |
|
|
} |
|
|
|
|
|
|
|
|
void test_read_char_transition_to_next_file(void) |
|
|
{ |
|
|
char *p1 = make_tempfile_with_content("A"); |
|
|
char *p2 = make_tempfile_with_content("B"); |
|
|
|
|
|
const char *flist[] = { p1, p2, NULL }; |
|
|
file_list = flist; |
|
|
|
|
|
TEST_ASSERT_TRUE(open_next_file()); |
|
|
|
|
|
int ch = 0; |
|
|
|
|
|
TEST_ASSERT_TRUE(read_char(&ch)); |
|
|
TEST_ASSERT_EQUAL_INT('A', ch); |
|
|
|
|
|
|
|
|
ch = 0; |
|
|
TEST_ASSERT_TRUE(read_char(&ch)); |
|
|
TEST_ASSERT_EQUAL_INT('B', ch); |
|
|
|
|
|
|
|
|
ch = 0; |
|
|
TEST_ASSERT_TRUE(read_char(&ch)); |
|
|
TEST_ASSERT_EQUAL_INT(EOF, ch); |
|
|
|
|
|
close_stream_if_open(); |
|
|
unlink(p1); |
|
|
unlink(p2); |
|
|
free(p1); |
|
|
free(p2); |
|
|
} |
|
|
|
|
|
|
|
|
void test_read_char_with_null_stream(void) |
|
|
{ |
|
|
|
|
|
close_stream_if_open(); |
|
|
static const char *empty_list[] = { NULL }; |
|
|
file_list = empty_list; |
|
|
|
|
|
int ch = 0; |
|
|
TEST_ASSERT_TRUE(read_char(&ch)); |
|
|
TEST_ASSERT_EQUAL_INT(EOF, ch); |
|
|
} |
|
|
|
|
|
int main(void) |
|
|
{ |
|
|
UNITY_BEGIN(); |
|
|
RUN_TEST(test_read_char_single_byte); |
|
|
RUN_TEST(test_read_char_three_bytes); |
|
|
RUN_TEST(test_read_char_eof_no_next_file); |
|
|
RUN_TEST(test_read_char_transition_to_next_file); |
|
|
RUN_TEST(test_read_char_with_null_stream); |
|
|
return UNITY_END(); |
|
|
} |