]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-data-fd-util.c
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
8 #include "data-fd-util.h"
10 #include "memory-util.h"
11 #include "process-util.h"
13 #include "random-util.h"
15 static void test_acquire_data_fd_one(unsigned flags
) {
16 char wbuffer
[196*1024 - 7];
17 char rbuffer
[sizeof(wbuffer
)];
20 fd
= acquire_data_fd_full("foo", 3, flags
);
24 assert_se(read(fd
, rbuffer
, sizeof(rbuffer
)) == 3);
25 ASSERT_STREQ(rbuffer
, "foo");
29 fd
= acquire_data_fd_full("", SIZE_MAX
, flags
);
33 assert_se(read(fd
, rbuffer
, sizeof(rbuffer
)) == 0);
34 ASSERT_STREQ(rbuffer
, "");
38 random_bytes(wbuffer
, sizeof(wbuffer
));
40 fd
= acquire_data_fd_full(wbuffer
, sizeof(wbuffer
), flags
);
44 assert_se(read(fd
, rbuffer
, sizeof(rbuffer
)) == sizeof(rbuffer
));
45 assert_se(memcmp(rbuffer
, wbuffer
, sizeof(rbuffer
)) == 0);
50 TEST(acquire_data_fd
) {
51 test_acquire_data_fd_one(0);
52 test_acquire_data_fd_one(ACQUIRE_NO_DEV_NULL
);
53 test_acquire_data_fd_one(ACQUIRE_NO_MEMFD
);
54 test_acquire_data_fd_one(ACQUIRE_NO_DEV_NULL
|ACQUIRE_NO_MEMFD
);
55 test_acquire_data_fd_one(ACQUIRE_NO_PIPE
);
56 test_acquire_data_fd_one(ACQUIRE_NO_DEV_NULL
|ACQUIRE_NO_PIPE
);
57 test_acquire_data_fd_one(ACQUIRE_NO_MEMFD
|ACQUIRE_NO_PIPE
);
58 test_acquire_data_fd_one(ACQUIRE_NO_DEV_NULL
|ACQUIRE_NO_MEMFD
|ACQUIRE_NO_PIPE
);
59 test_acquire_data_fd_one(ACQUIRE_NO_DEV_NULL
|ACQUIRE_NO_MEMFD
|ACQUIRE_NO_PIPE
|ACQUIRE_NO_TMPFILE
);
62 static void assert_equal_fd(int fd1
, int fd2
) {
64 uint8_t a
[4096], b
[4096];
67 x
= read(fd1
, a
, sizeof(a
));
70 y
= read(fd2
, b
, sizeof(b
));
78 assert_se(memcmp(a
, b
, x
) == 0);
83 _cleanup_close_
int fd1
= -EBADF
, fd2
= -EBADF
;
84 _cleanup_close_pair_
int sfd
[2] = EBADF_PAIR
;
85 _cleanup_(sigkill_waitp
) pid_t pid
= -1;
88 fd1
= open("/etc/fstab", O_RDONLY
|O_CLOEXEC
);
91 fd2
= copy_data_fd(fd1
);
94 assert_se(lseek(fd1
, 0, SEEK_SET
) == 0);
95 assert_equal_fd(fd1
, fd2
);
98 fd1
= safe_close(fd1
);
99 fd2
= safe_close(fd2
);
101 fd1
= acquire_data_fd("hallo");
104 fd2
= copy_data_fd(fd1
);
108 fd1
= acquire_data_fd("hallo");
111 assert_equal_fd(fd1
, fd2
);
113 fd1
= safe_close(fd1
);
114 fd2
= safe_close(fd2
);
116 assert_se(socketpair(AF_UNIX
, SOCK_STREAM
|SOCK_CLOEXEC
, 0, sfd
) >= 0);
118 r
= safe_fork("(sd-pipe)", FORK_RESET_SIGNALS
|FORK_DEATHSIG_SIGTERM
|FORK_LOG
, &pid
);
124 sfd
[0] = safe_close(sfd
[0]);
126 for (uint64_t i
= 0; i
< 1536*1024 / sizeof(uint64_t); i
++)
127 assert_se(write(sfd
[1], &i
, sizeof(i
)) == sizeof(i
));
129 sfd
[1] = safe_close(sfd
[1]);
134 sfd
[1] = safe_close(sfd
[1]);
136 fd2
= copy_data_fd(sfd
[0]);
140 for (uint64_t i
= 0; i
< 1536*1024 / sizeof(uint64_t); i
++) {
141 assert_se(read(fd2
, &j
, sizeof(j
)) == sizeof(j
));
145 assert_se(read(fd2
, &j
, sizeof(j
)) == 0);
148 DEFINE_TEST_MAIN(LOG_DEBUG
);