Browse code

test for FILDES

git-svn: trunk@4797

Török Edvin authored on 2009/02/17 03:27:03
Showing 2 changed files
... ...
@@ -1,3 +1,7 @@
1
+Mon Feb 16 16:15:21 EET 2009 (edwin)
2
+------------------------------------
3
+ * unit_tests/check_clamd.c: test for FILDES
4
+
1 5
 Mon Feb 16 14:08:50 EET 2009 (edwin)
2 6
 ------------------------------------
3 7
  * clamd/server-th.c, clamd/session.c, unit_tests/check_clamd.c: add
... ...
@@ -21,6 +21,7 @@
21 21
 #include "checks_common.h"
22 22
 #include "libclamav/version.h"
23 23
 #include "libclamav/cltypes.h"
24
+#include "shared/fdpassing.h"
24 25
 
25 26
 #ifdef CHECK_HAVE_LOOPS
26 27
 
... ...
@@ -147,8 +148,8 @@ static void *recvfull(int sd, size_t *len)
147 147
 	fail_unless_fmt(rc != -1, "recv() failed: %s\n", strerror(errno));
148 148
 	off += rc;
149 149
     } while (rc);
150
-    buf[*len] = '\0';
151 150
     *len = off;
151
+    buf[*len] = '\0';
152 152
     return buf;
153 153
 }
154 154
 
... ...
@@ -166,8 +167,8 @@ static void test_command(const char *cmd, size_t len, const char *extra, const c
166 166
 
167 167
     recvdata = recvfull(sockd, &len);
168 168
 
169
-    fail_unless_fmt(len == expect_len, "Reply has wrong size: %lu, expected %lu, reply: %s\n",
170
-		    len, expect_len, recvdata);
169
+    fail_unless_fmt(len == expect_len, "Reply has wrong size: %lu, expected %lu, reply: %s, expected: %s\n",
170
+		    len, expect_len, recvdata, expect);
171 171
 
172 172
     rc = memcmp(recvdata, expect, expect_len);
173 173
     fail_unless_fmt(!rc, "Wrong reply for command %s: |%s|, expected: |%s|\n", cmd, recvdata, expect);
... ...
@@ -225,7 +226,7 @@ END_TEST
225 225
 #define EXPECT_INSTREAM "stream: ClamAV-Test-File.UNOFFICIAL FOUND\n"
226 226
 
227 227
 #define STATS_REPLY "POOLS: 1\n\nSTATE: VALID PRIMARY\n"
228
-START_TEST (tc_stats)
228
+START_TEST (test_stats)
229 229
 {
230 230
     char *recvdata;
231 231
     size_t len = strlen("nSTATS\n");
... ...
@@ -250,7 +251,7 @@ START_TEST (tc_stats)
250 250
 }
251 251
 END_TEST
252 252
 
253
-START_TEST (tc_instream)
253
+START_TEST (test_instream)
254 254
 {
255 255
     int fd, nread, rc;
256 256
     struct stat stbuf;
... ...
@@ -294,6 +295,94 @@ START_TEST (tc_instream)
294 294
 }
295 295
 END_TEST
296 296
 
297
+static void tst_fildes(const char *cmd, size_t len, int fd,
298
+			const char *expect, size_t expect_len, int closefd)
299
+{
300
+    struct msghdr msg;
301
+    struct cmsghdr *cmsg;
302
+    unsigned char fdbuf[CMSG_SPACE(sizeof(int))];
303
+    char dummy[] = "";
304
+    off_t pos;
305
+    struct iovec iov[1];
306
+    char *recvdata, *p;
307
+    int rc;
308
+
309
+    conn_setup();
310
+
311
+    iov[0].iov_base = dummy;
312
+    iov[0].iov_len = 1;
313
+
314
+    memset(&msg, 0, sizeof(msg));
315
+    msg.msg_control = fdbuf;
316
+    msg.msg_iov = iov;
317
+    msg.msg_iovlen = 1;
318
+    msg.msg_controllen = CMSG_LEN(sizeof(int));
319
+
320
+    cmsg = CMSG_FIRSTHDR(&msg);
321
+    cmsg->cmsg_len = CMSG_LEN(sizeof(int));
322
+    cmsg->cmsg_level = SOL_SOCKET;
323
+    cmsg->cmsg_type = SCM_RIGHTS;
324
+    *(int *)CMSG_DATA(cmsg) = fd;
325
+
326
+    fail_unless_fmt(write(sockd, cmd, len) == len, "Failed to write: %s\n", strerror(errno));
327
+
328
+    rc = sendmsg(sockd, &msg, 0);
329
+    fail_unless_fmt(rc != -1, "Failed to sendmsg: %s\n", strerror(errno));
330
+
331
+    if (closefd)
332
+	close(fd);
333
+
334
+    recvdata = recvfull(sockd, &len);
335
+    p = strchr(recvdata, ':');
336
+
337
+    fail_unless_fmt(!!p, "Reply doesn't contain ':' : %s\n", recvdata);
338
+    *p++ = '\0';
339
+
340
+    fail_unless_fmt(sscanf(recvdata, "fd[%u]", &rc) == 1, "Reply doesn't contain fd: %s\n", recvdata);
341
+
342
+    len -= p - recvdata;
343
+    fail_unless_fmt(len == expect_len, "Reply has wrong size: %lu, expected %lu, reply: %s, expected: %s\n",
344
+		    len, expect_len, p, expect);
345
+
346
+    rc = memcmp(p, expect, expect_len);
347
+    fail_unless_fmt(!rc, "Wrong reply for command %s: |%s|, expected: |%s|\n", cmd, p, expect);
348
+    free(recvdata);
349
+    conn_teardown();
350
+}
351
+
352
+#define FOUNDFDREPLY " ClamAV-Test-File.UNOFFICIAL FOUND"
353
+#define CLEANFDREPLY " OK"
354
+
355
+START_TEST (test_fildes)
356
+{
357
+    char nreply[BUFSIZ];
358
+    int fd = open(SCANFILE, O_RDONLY);
359
+
360
+    snprintf(nreply, sizeof(nreply), "%s\n", FOUNDFDREPLY);
361
+
362
+    fail_unless_fmt(fd != -1, "Failed to open: %s\n", strerror(errno));
363
+
364
+    tst_fildes("FILDES\n", strlen("FILDES\n"), fd, nreply, strlen(nreply), 0);
365
+    tst_fildes("nFILDES\n", strlen("nFILDES\n"), fd, nreply, strlen(nreply), 0);
366
+    tst_fildes("zFILDES", sizeof("zFILDES"), fd, FOUNDFDREPLY, sizeof(FOUNDFDREPLY), 0);
367
+
368
+    close(fd);
369
+
370
+    snprintf(nreply, sizeof(nreply), "%s\n", CLEANFDREPLY);
371
+
372
+    fd = open(CLEANFILE, O_RDONLY);
373
+    fail_unless_fmt(fd != -1, "Failed to open: %s\n", strerror(errno));
374
+
375
+    tst_fildes("FILDES\n", strlen("FILDES\n"), fd, nreply, strlen(nreply), 0);
376
+    tst_fildes("nFILDES\n", strlen("nFILDES\n"), fd, nreply, strlen(nreply), 0);
377
+    tst_fildes("zFILDES", sizeof("zFILDES"), fd, CLEANFDREPLY, sizeof(CLEANFDREPLY), 0);
378
+
379
+    snprintf(nreply, sizeof(nreply), "%s\n", FOUNDFDREPLY);
380
+    fd = open(SCANFILE, O_RDONLY);
381
+    fail_unless_fmt(fd != -1, "Failed to open: %s\n", strerror(errno));
382
+    tst_fildes("FILDES\n", strlen("FILDES\n"), fd, nreply, strlen(nreply), 1);
383
+}
384
+END_TEST
297 385
 
298 386
 static Suite *test_clamd_suite(void)
299 387
 {
... ...
@@ -303,8 +392,9 @@ static Suite *test_clamd_suite(void)
303 303
     tcase_add_unchecked_fixture(tc_commands, commands_setup, commands_teardown);
304 304
     tcase_add_loop_test(tc_commands, test_basic_commands, 0, sizeof(basic_tests)/sizeof(basic_tests[0]));
305 305
     tcase_add_loop_test(tc_commands, test_compat_commands, 0, sizeof(basic_tests)/sizeof(basic_tests[0]));
306
-    tcase_add_test(tc_commands, tc_instream);
307
-    tcase_add_test(tc_commands, tc_stats);
306
+    tcase_add_test(tc_commands, test_fildes);
307
+    tcase_add_test(tc_commands, test_stats);
308
+    tcase_add_test(tc_commands, test_instream);
308 309
     return s;
309 310
 }
310 311