chiark / gitweb /
machinectl: fix typo
[elogind.git] / src / test / test-ring.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4   This file is part of systemd.
5
6   Copyright 2014 David Herrmann <dh.herrmann@gmail.com>
7
8   systemd is free software; you can redistribute it and/or modify it
9   under the terms of the GNU Lesser General Public License as published by
10   the Free Software Foundation; either version 2.1 of the License, or
11   (at your option) any later version.
12
13   systemd is distributed in the hope that it will be useful, but
14   WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16   Lesser General Public License for more details.
17
18   You should have received a copy of the GNU Lesser General Public License
19   along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #include <string.h>
23 #include <unistd.h>
24 #include <fcntl.h>
25 #include <locale.h>
26 #include <errno.h>
27
28 #include "def.h"
29 #include "ring.h"
30 #include "util.h"
31
32 static void test_ring(void) {
33         static const char buf[8192];
34         Ring r;
35         size_t l;
36         struct iovec vec[2];
37         int s;
38
39         zero(r);
40
41         l = ring_peek(&r, vec);
42         assert_se(l == 0);
43
44         s = ring_push(&r, buf, 2048);
45         assert_se(!s);
46         assert_se(ring_get_size(&r) == 2048);
47
48         l = ring_peek(&r, vec);
49         assert_se(l == 1);
50         assert_se(vec[0].iov_len == 2048);
51         assert_se(!memcmp(vec[0].iov_base, buf, vec[0].iov_len));
52         assert_se(ring_get_size(&r) == 2048);
53
54         ring_pull(&r, 2048);
55         assert_se(ring_get_size(&r) == 0);
56
57         l = ring_peek(&r, vec);
58         assert_se(l == 0);
59         assert_se(ring_get_size(&r) == 0);
60
61         s = ring_push(&r, buf, 2048);
62         assert_se(!s);
63         assert_se(ring_get_size(&r) == 2048);
64
65         l = ring_peek(&r, vec);
66         assert_se(l == 1);
67         assert_se(vec[0].iov_len == 2048);
68         assert_se(!memcmp(vec[0].iov_base, buf, vec[0].iov_len));
69         assert_se(ring_get_size(&r) == 2048);
70
71         s = ring_push(&r, buf, 1);
72         assert_se(!s);
73         assert_se(ring_get_size(&r) == 2049);
74
75         l = ring_peek(&r, vec);
76         assert_se(l == 2);
77         assert_se(vec[0].iov_len == 2048);
78         assert_se(vec[1].iov_len == 1);
79         assert_se(!memcmp(vec[0].iov_base, buf, vec[0].iov_len));
80         assert_se(!memcmp(vec[1].iov_base, buf, vec[1].iov_len));
81         assert_se(ring_get_size(&r) == 2049);
82
83         ring_pull(&r, 2048);
84         assert_se(ring_get_size(&r) == 1);
85
86         l = ring_peek(&r, vec);
87         assert_se(l == 1);
88         assert_se(vec[0].iov_len == 1);
89         assert_se(!memcmp(vec[0].iov_base, buf, vec[0].iov_len));
90         assert_se(ring_get_size(&r) == 1);
91
92         ring_pull(&r, 1);
93         assert_se(ring_get_size(&r) == 0);
94
95         s = ring_push(&r, buf, 2048);
96         assert_se(!s);
97         assert_se(ring_get_size(&r) == 2048);
98
99         s = ring_push(&r, buf, 2049);
100         assert_se(!s);
101         assert_se(ring_get_size(&r) == 4097);
102
103         l = ring_peek(&r, vec);
104         assert_se(l == 1);
105         assert_se(vec[0].iov_len == 4097);
106         assert_se(!memcmp(vec[0].iov_base, buf, vec[0].iov_len));
107         assert_se(ring_get_size(&r) == 4097);
108
109         ring_pull(&r, 1);
110         assert_se(ring_get_size(&r) == 4096);
111
112         s = ring_push(&r, buf, 4096);
113         assert_se(!s);
114         assert_se(ring_get_size(&r) == 8192);
115
116         l = ring_peek(&r, vec);
117         assert_se(l == 2);
118         assert_se(vec[0].iov_len == 8191);
119         assert_se(vec[1].iov_len == 1);
120         assert_se(!memcmp(vec[0].iov_base, buf, vec[0].iov_len));
121         assert_se(!memcmp(vec[1].iov_base, buf, vec[1].iov_len));
122         assert_se(ring_get_size(&r) == 8192);
123
124         ring_clear(&r);
125         assert_se(ring_get_size(&r) == 0);
126 }
127
128 int main(int argc, char *argv[]) {
129         log_parse_environment();
130         log_open();
131
132         test_ring();
133
134         return 0;
135 }