LCOV - code coverage report
Current view: top level - test - test-fdset.c (source / functions) Hit Total Coverage
Test: main_coverage.info Lines: 145 145 100.0 %
Date: 2019-08-22 15:41:25 Functions: 10 10 100.0 %

          Line data    Source code
       1             : /* SPDX-License-Identifier: LGPL-2.1+ */
       2             : 
       3             : #include <fcntl.h>
       4             : #include <unistd.h>
       5             : 
       6             : #include "fd-util.h"
       7             : #include "fdset.h"
       8             : #include "macro.h"
       9             : #include "tmpfile-util.h"
      10             : #include "util.h"
      11             : 
      12           1 : static void test_fdset_new_fill(void) {
      13           1 :         int fd = -1;
      14           1 :         _cleanup_fdset_free_ FDSet *fdset = NULL;
      15           1 :         char name[] = "/tmp/test-fdset_new_fill.XXXXXX";
      16             : 
      17           1 :         fd = mkostemp_safe(name);
      18           1 :         assert_se(fd >= 0);
      19           1 :         assert_se(fdset_new_fill(&fdset) >= 0);
      20           1 :         assert_se(fdset_contains(fdset, fd));
      21             : 
      22           1 :         unlink(name);
      23           1 : }
      24             : 
      25           1 : static void test_fdset_put_dup(void) {
      26           1 :         _cleanup_close_ int fd = -1;
      27           1 :         int copyfd = -1;
      28           1 :         _cleanup_fdset_free_ FDSet *fdset = NULL;
      29           1 :         char name[] = "/tmp/test-fdset_put_dup.XXXXXX";
      30             : 
      31           1 :         fd = mkostemp_safe(name);
      32           1 :         assert_se(fd >= 0);
      33             : 
      34           1 :         fdset = fdset_new();
      35           1 :         assert_se(fdset);
      36           1 :         copyfd = fdset_put_dup(fdset, fd);
      37           1 :         assert_se(copyfd >= 0 && copyfd != fd);
      38           1 :         assert_se(fdset_contains(fdset, copyfd));
      39           1 :         assert_se(!fdset_contains(fdset, fd));
      40             : 
      41           1 :         unlink(name);
      42           1 : }
      43             : 
      44           1 : static void test_fdset_cloexec(void) {
      45           1 :         int fd = -1;
      46           1 :         _cleanup_fdset_free_ FDSet *fdset = NULL;
      47           1 :         int flags = -1;
      48           1 :         char name[] = "/tmp/test-fdset_cloexec.XXXXXX";
      49             : 
      50           1 :         fd = mkostemp_safe(name);
      51           1 :         assert_se(fd >= 0);
      52             : 
      53           1 :         fdset = fdset_new();
      54           1 :         assert_se(fdset);
      55           1 :         assert_se(fdset_put(fdset, fd));
      56             : 
      57           1 :         assert_se(fdset_cloexec(fdset, false) >= 0);
      58           1 :         flags = fcntl(fd, F_GETFD);
      59           1 :         assert_se(flags >= 0);
      60           1 :         assert_se(!(flags & FD_CLOEXEC));
      61             : 
      62           1 :         assert_se(fdset_cloexec(fdset, true) >= 0);
      63           1 :         flags = fcntl(fd, F_GETFD);
      64           1 :         assert_se(flags >= 0);
      65           1 :         assert_se(flags & FD_CLOEXEC);
      66             : 
      67           1 :         unlink(name);
      68           1 : }
      69             : 
      70           1 : static void test_fdset_close_others(void) {
      71           1 :         int fd = -1;
      72           1 :         int copyfd = -1;
      73           1 :         _cleanup_fdset_free_ FDSet *fdset = NULL;
      74           1 :         int flags = -1;
      75           1 :         char name[] = "/tmp/test-fdset_close_others.XXXXXX";
      76             : 
      77           1 :         fd = mkostemp_safe(name);
      78           1 :         assert_se(fd >= 0);
      79             : 
      80           1 :         fdset = fdset_new();
      81           1 :         assert_se(fdset);
      82           1 :         copyfd = fdset_put_dup(fdset, fd);
      83           1 :         assert_se(copyfd >= 0);
      84             : 
      85           1 :         assert_se(fdset_close_others(fdset) >= 0);
      86           1 :         flags = fcntl(fd, F_GETFD);
      87           1 :         assert_se(flags < 0);
      88           1 :         flags = fcntl(copyfd, F_GETFD);
      89           1 :         assert_se(flags >= 0);
      90             : 
      91           1 :         unlink(name);
      92           1 : }
      93             : 
      94           1 : static void test_fdset_remove(void) {
      95           1 :         _cleanup_close_ int fd = -1;
      96           1 :         FDSet *fdset = NULL;
      97           1 :         char name[] = "/tmp/test-fdset_remove.XXXXXX";
      98             : 
      99           1 :         fd = mkostemp_safe(name);
     100           1 :         assert_se(fd >= 0);
     101             : 
     102           1 :         fdset = fdset_new();
     103           1 :         assert_se(fdset);
     104           1 :         assert_se(fdset_put(fdset, fd) >= 0);
     105           1 :         assert_se(fdset_remove(fdset, fd) >= 0);
     106           1 :         assert_se(!fdset_contains(fdset, fd));
     107           1 :         fdset_free(fdset);
     108             : 
     109           1 :         assert_se(fcntl(fd, F_GETFD) >= 0);
     110             : 
     111           1 :         unlink(name);
     112           1 : }
     113             : 
     114           1 : static void test_fdset_iterate(void) {
     115           1 :         int fd = -1;
     116           1 :         FDSet *fdset = NULL;
     117           1 :         char name[] = "/tmp/test-fdset_iterate.XXXXXX";
     118             :         Iterator i;
     119           1 :         int c = 0;
     120             :         int a;
     121             : 
     122           1 :         fd = mkostemp_safe(name);
     123           1 :         assert_se(fd >= 0);
     124             : 
     125           1 :         fdset = fdset_new();
     126           1 :         assert_se(fdset);
     127           1 :         assert_se(fdset_put(fdset, fd) >= 0);
     128           1 :         assert_se(fdset_put(fdset, fd) >= 0);
     129           1 :         assert_se(fdset_put(fdset, fd) >= 0);
     130             : 
     131           2 :         FDSET_FOREACH(a, fdset, i) {
     132           1 :                 c++;
     133           1 :                 assert_se(a == fd);
     134             :         }
     135           1 :         assert_se(c == 1);
     136             : 
     137           1 :         fdset_free(fdset);
     138             : 
     139           1 :         unlink(name);
     140           1 : }
     141             : 
     142           1 : static void test_fdset_isempty(void) {
     143             :         int fd;
     144           1 :         _cleanup_fdset_free_ FDSet *fdset = NULL;
     145           1 :         char name[] = "/tmp/test-fdset_isempty.XXXXXX";
     146             : 
     147           1 :         fd = mkostemp_safe(name);
     148           1 :         assert_se(fd >= 0);
     149             : 
     150           1 :         fdset = fdset_new();
     151           1 :         assert_se(fdset);
     152             : 
     153           1 :         assert_se(fdset_isempty(fdset));
     154           1 :         assert_se(fdset_put(fdset, fd) >= 0);
     155           1 :         assert_se(!fdset_isempty(fdset));
     156             : 
     157           1 :         unlink(name);
     158           1 : }
     159             : 
     160           1 : static void test_fdset_steal_first(void) {
     161             :         int fd;
     162           1 :         _cleanup_fdset_free_ FDSet *fdset = NULL;
     163           1 :         char name[] = "/tmp/test-fdset_steal_first.XXXXXX";
     164             : 
     165           1 :         fd = mkostemp_safe(name);
     166           1 :         assert_se(fd >= 0);
     167             : 
     168           1 :         fdset = fdset_new();
     169           1 :         assert_se(fdset);
     170             : 
     171           1 :         assert_se(fdset_steal_first(fdset) < 0);
     172           1 :         assert_se(fdset_put(fdset, fd) >= 0);
     173           1 :         assert_se(fdset_steal_first(fdset) == fd);
     174           1 :         assert_se(fdset_steal_first(fdset) < 0);
     175           1 :         assert_se(fdset_put(fdset, fd) >= 0);
     176             : 
     177           1 :         unlink(name);
     178           1 : }
     179             : 
     180           1 : static void test_fdset_new_array(void) {
     181           1 :         int fds[] = {10, 11, 12, 13};
     182           1 :         _cleanup_fdset_free_ FDSet *fdset = NULL;
     183             : 
     184           1 :         assert_se(fdset_new_array(&fdset, fds, 4) >= 0);
     185           1 :         assert_se(fdset_size(fdset) == 4);
     186           1 :         assert_se(fdset_contains(fdset, 10));
     187           1 :         assert_se(fdset_contains(fdset, 11));
     188           1 :         assert_se(fdset_contains(fdset, 12));
     189           1 :         assert_se(fdset_contains(fdset, 13));
     190           1 : }
     191             : 
     192           1 : int main(int argc, char *argv[]) {
     193           1 :         test_fdset_new_fill();
     194           1 :         test_fdset_put_dup();
     195           1 :         test_fdset_cloexec();
     196           1 :         test_fdset_close_others();
     197           1 :         test_fdset_remove();
     198           1 :         test_fdset_iterate();
     199           1 :         test_fdset_isempty();
     200           1 :         test_fdset_steal_first();
     201           1 :         test_fdset_new_array();
     202             : 
     203           1 :         return 0;
     204             : }

Generated by: LCOV version 1.14