test-ostream-file.c revision cd07d97b7da550b52d60e3020f64821f7e35ceaa
2a90d8a14b0e7cc1508814bc87d3dfa598ef46a8Timo Sirainen/* Copyright (c) 2009-2016 Dovecot authors, see the included COPYING file */
ad49932dae8ba31e07544b66bbc4f4de707a751cTimo Sirainenstatic void test_ostream_file_random_once(void)
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen char buf[MAX_BUFSIZE*4], buf2[MAX_BUFSIZE*4], randbuf[MAX_BUFSIZE];
2a90d8a14b0e7cc1508814bc87d3dfa598ef46a8Timo Sirainen fd = safe_mkstemp(path, 0600, (uid_t)-1, (gid_t)-1);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen i_fatal("safe_mkstemp(%s) failed: %m", str_c(path));
2a90d8a14b0e7cc1508814bc87d3dfa598ef46a8Timo Sirainen output = o_stream_create_fd(fd, MAX_BUFSIZE, FALSE);
ad49932dae8ba31e07544b66bbc4f4de707a751cTimo Sirainen test_assert(o_stream_send(output, buf, size) > 0);
9f431ccfb6932746db56245c8a3d3415717ef545Timo Sirainen for (i = 0; i < 10; i++) {
a7bee3930831a9261fa6180d02af29c484d862e9Timo Sirainen test_assert(o_stream_pwrite(output, randbuf, size, offset) == 0);
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen unsigned int i;
657afb33796f8216c568ad813627da89970760beTimo Sirainenstatic void test_ostream_file_send_istream_file(void)
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen /* temp file istream */
9398c0935613ba038cf2275ff66c43b25092cfd0Timo Sirainen fd = open(".temp.istream", O_RDWR | O_CREAT | O_TRUNC, 0600);
9398c0935613ba038cf2275ff66c43b25092cfd0Timo Sirainen test_assert(write(fd, "1234567890", 10) == 10);
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen /* temp file ostream */
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen fd = open(".temp.ostream", O_RDWR | O_CREAT | O_TRUNC, 0600);
9398c0935613ba038cf2275ff66c43b25092cfd0Timo Sirainen /* test that writing works between two files */
9398c0935613ba038cf2275ff66c43b25092cfd0Timo Sirainen test_assert(o_stream_send_istream(output, input2) > 0);
397165dbd694272487e29c8d48d619822da52abcTimo Sirainen test_assert(pread(fd, buf, sizeof(buf), 0) == 4 &&
9398c0935613ba038cf2275ff66c43b25092cfd0Timo Sirainen /* test that writing works within the same file */
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen /* forwards: 4567 -> 4677 */
70c181da837ed85fc5b0426c010b65609bda5329Timo Sirainen test_assert(o_stream_send_istream(output, input2) > 0);
70c181da837ed85fc5b0426c010b65609bda5329Timo Sirainen test_assert(pread(fd, buf, sizeof(buf), 0) == 4 &&
9398c0935613ba038cf2275ff66c43b25092cfd0Timo Sirainen /* backwards: 1234 -> 11234 */
9398c0935613ba038cf2275ff66c43b25092cfd0Timo Sirainen test_assert(o_stream_send_istream(output, input) > 0);
70c181da837ed85fc5b0426c010b65609bda5329Timo Sirainen test_assert(pread(fd, buf, sizeof(buf), 0) == 5 &&
70c181da837ed85fc5b0426c010b65609bda5329Timo Sirainenstatic void test_ostream_file_send_istream_sendfile(void)
70c181da837ed85fc5b0426c010b65609bda5329Timo Sirainen test_begin("ostream file send istream sendfile()");
9398c0935613ba038cf2275ff66c43b25092cfd0Timo Sirainen /* temp file istream */
9398c0935613ba038cf2275ff66c43b25092cfd0Timo Sirainen fd = open(".temp.istream", O_RDWR | O_CREAT | O_TRUNC, 0600);
2cfe9983ce7a6280636ee12beccc2e865111967bTimo Sirainen test_assert(write(fd, "abcdefghij", 10) == 10);
2a90d8a14b0e7cc1508814bc87d3dfa598ef46a8Timo Sirainen /* temp socket ostream */
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen i_assert(socketpair(AF_UNIX, SOCK_STREAM, 0, sock_fd) == 0);
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen output = o_stream_create_fd(sock_fd[0], 0, TRUE);
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen /* test that sendfile() works */
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen test_assert(o_stream_send_istream(output, input2) > 0);
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen test_assert(read(sock_fd[1], buf, sizeof(buf)) == 4 &&