]> granicus.if.org Git - libevent/commitdiff
a simple test for evbuffer_add_file
authorNiels Provos <provos@gmail.com>
Fri, 13 Feb 2009 01:42:59 +0000 (01:42 +0000)
committerNiels Provos <provos@gmail.com>
Fri, 13 Feb 2009 01:42:59 +0000 (01:42 +0000)
svn:r1122

test/regress.h
test/regress_buffer.c
test/regress_main.c

index 5326288c26cfb046d8f7a58b93a8d3bf46a53508..16ede4e850d24b72c0b369708000a54a9a7a1165 100644 (file)
@@ -56,6 +56,8 @@ extern int called;
 extern struct event_base *global_base;
 extern int in_legacy_test_wrapper;
 
+evutil_socket_t regress_make_tmpfile(const void *data, size_t datalen);
+
 extern const struct testcase_setup_t legacy_setup;
 void run_legacy_test_fn(void *ptr);
 
index a7e5b5bc8347c16322cbb34f56faa32fb8b93350..1fda858c5c0b13b5d25c82b063275d3220771619 100644 (file)
@@ -263,6 +263,41 @@ test_evbuffer_reference(void *ptr)
        evbuffer_free(src);
 }
 
+static void
+test_evbuffer_add_file(void *ptr)
+{
+       struct evbuffer *src = evbuffer_new();
+       const char *data = "this is what we add as file system data.";
+       const char *compare;
+       evutil_socket_t fd, pair[2];
+
+       if (evutil_socketpair(AF_UNIX, SOCK_STREAM, 0, pair) == -1)
+               tt_abort_msg("socketpair failed");
+
+       fd = regress_make_tmpfile(data, strlen(data));
+
+       tt_assert(fd != -1);
+
+       tt_assert(evbuffer_add_file(src, fd, 0, strlen(data)) != -1);
+
+       evbuffer_validate(src);
+
+       while (evbuffer_write(src, pair[0]) > 0) {
+               evbuffer_validate(src);
+       }
+
+       tt_assert(evbuffer_read(src, pair[1], strlen(data)) == strlen(data));
+       compare = (char *)evbuffer_pullup(src, strlen(data));
+       tt_assert(compare != NULL);
+       if (memcmp(compare, data, strlen(data)))
+               tt_abort_msg("Data from add_file differs.");
+
+ end:
+       EVUTIL_CLOSESOCKET(pair[0]);
+       EVUTIL_CLOSESOCKET(pair[1]);
+       evbuffer_free(src);
+}
+
 static void
 test_evbuffer_readln(void *ptr)
 {
@@ -743,6 +778,10 @@ struct testcase_t evbuffer_testcases[] = {
        { "callbacks", test_evbuffer_callbacks, 0, NULL, NULL },
        { "add_reference", test_evbuffer_add_reference, 0, NULL, NULL },
        { "prepend", test_evbuffer_prepend, 0, NULL, NULL },
+#ifndef WIN32
+       /* TODO: need a temp file implementation for Windows */
+       { "add_file", test_evbuffer_add_file, 0, NULL, NULL },
+#endif
 
        END_OF_TESTCASES
 };
index 562c16dbc3cfa60b65366ac234ba4220f7831e78..e7939bd9f7530f516b118f4c8a69b78514728e52 100644 (file)
@@ -89,6 +89,30 @@ static void dnslogcb(int w, const char *m)
         TT_BLATHER((m));
 }
 
+/* creates a temporary file with the data in it */
+evutil_socket_t
+regress_make_tmpfile(const void *data, size_t datalen)
+{
+#ifndef WIN32
+       char tmpfilename[32];
+       strcpy(tmpfilename, "/tmp/eventtmp.XXXX");
+       int fd = mkstemp(tmpfilename);
+       if (fd == -1)
+               return (-1);
+       if (write(fd, data, datalen) != datalen) {
+               close(fd);
+               return (-1);
+       }
+       lseek(fd, 0, SEEK_SET);
+       /* remove it from the file system */
+       unlink(tmpfilename);
+       return (fd);
+#else
+       /* we need a windows implementation here */
+       return (-1);
+#endif
+}
+
 /* The "data" for a legacy test is just a pointer to the void fn(void)
    function implementing the test case.  We need to set up some globals,
    though, since that's where legacy tests expect to find a socketpair