chiark / gitweb /
c553729f4ba560380ac00205cd07fda92e022ba4
[elogind.git] / src / test / test-io-util.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 /***
3   This file is part of systemd.
4
5   Copyright 2010 Lennart Poettering
6 ***/
7
8 #include <fcntl.h>
9 #include <stdlib.h>
10 #include <unistd.h>
11
12 #include "alloc-util.h"
13 #include "fd-util.h"
14 #include "io-util.h"
15 #include "macro.h"
16
17 static void test_sparse_write_one(int fd, const char *buffer, size_t n) {
18         char check[n];
19
20         assert_se(lseek(fd, 0, SEEK_SET) == 0);
21         assert_se(ftruncate(fd, 0) >= 0);
22         assert_se(sparse_write(fd, buffer, n, 4) == (ssize_t) n);
23
24         assert_se(lseek(fd, 0, SEEK_CUR) == (off_t) n);
25         assert_se(ftruncate(fd, n) >= 0);
26
27         assert_se(lseek(fd, 0, SEEK_SET) == 0);
28         assert_se(read(fd, check, n) == (ssize_t) n);
29
30         assert_se(memcmp(buffer, check, n) == 0);
31 }
32
33 static void test_sparse_write(void) {
34         const char test_a[] = "test";
35         const char test_b[] = "\0\0\0\0test\0\0\0\0";
36         const char test_c[] = "\0\0test\0\0\0\0";
37         const char test_d[] = "\0\0test\0\0\0test\0\0\0\0test\0\0\0\0\0test\0\0\0test\0\0\0\0test\0\0\0\0\0\0\0\0";
38         const char test_e[] = "test\0\0\0\0test";
39         _cleanup_close_ int fd = -1;
40         char fn[] = "/tmp/sparseXXXXXX";
41
42         fd = mkostemp(fn, O_CLOEXEC);
43         assert_se(fd >= 0);
44         unlink(fn);
45
46         test_sparse_write_one(fd, test_a, sizeof(test_a));
47         test_sparse_write_one(fd, test_b, sizeof(test_b));
48         test_sparse_write_one(fd, test_c, sizeof(test_c));
49         test_sparse_write_one(fd, test_d, sizeof(test_d));
50         test_sparse_write_one(fd, test_e, sizeof(test_e));
51 }
52
53 int main(void) {
54         test_sparse_write();
55
56         return 0;
57 }