]>
git.ipfire.org Git - thirdparty/kmod.git/blob - testsuite/test-strbuf.c
1 // SPDX-License-Identifier: LGPL-2.1-or-later
3 * Copyright (C) 2014 Intel Corporation. All rights reserved.
12 #include <shared/strbuf.h>
13 #include <shared/util.h>
15 #include "testsuite.h"
17 static const char *TEXT
=
18 "this is a very long test that is longer than the size we initially se in the strbuf";
20 static int test_strbuf_pushchar(void)
22 _cleanup_strbuf_
struct strbuf buf
;
28 for (c
= TEXT
; *c
!= '\0'; c
++)
29 strbuf_pushchar(&buf
, *c
);
31 result
= strbuf_str(&buf
);
32 assert_return(result
== buf
.bytes
, EXIT_FAILURE
);
33 assert_return(streq(result
, TEXT
), EXIT_FAILURE
);
37 DEFINE_TEST(test_strbuf_pushchar
, .description
= "test strbuf_{pushchar, str, steal}");
39 static int test_strbuf_pushchars(void)
41 _cleanup_strbuf_
struct strbuf buf
;
43 char *saveptr
= NULL
, *str
;
45 size_t lastwordlen
= 0;
49 for (c
= strtok_r(str
, " ", &saveptr
); c
!= NULL
;
50 c
= strtok_r(NULL
, " ", &saveptr
)) {
51 strbuf_pushchars(&buf
, c
);
52 strbuf_pushchar(&buf
, ' ');
53 lastwordlen
= strlen(c
);
57 * Replace the last space char, which also guarantees there's at least 1 char
58 * available for the '\0' added by strbuf_str() so result1 == buf.bytes should be
62 result
= strbuf_str(&buf
);
63 assert_return(result
== buf
.bytes
, EXIT_FAILURE
);
64 assert_return(streq(result
, TEXT
), EXIT_FAILURE
);
66 strbuf_popchars(&buf
, lastwordlen
);
67 result
= strbuf_str(&buf
);
68 assert_return(!streq(TEXT
, result
), EXIT_FAILURE
);
69 assert_return(strncmp(TEXT
, result
, strlen(TEXT
) - lastwordlen
) == 0,
71 assert_return(result
[strlen(TEXT
) - lastwordlen
] == '\0', EXIT_FAILURE
);
77 DEFINE_TEST(test_strbuf_pushchars
,
78 .description
= "test strbuf_{pushchars, popchar, popchars}");
80 static int test_strbuf_with_stack(void)
82 const char test
[] = "test-something-small";
83 const char *stack_buf
;
85 DECLARE_STRBUF_WITH_STACK(buf
, 256);
86 DECLARE_STRBUF_WITH_STACK(buf2
, sizeof(test
) + 1);
87 DECLARE_STRBUF_WITH_STACK(buf3
, sizeof(test
) + 1);
89 strbuf_pushchars(&buf
, test
);
90 assert_return(streq(test
, strbuf_str(&buf
)), EXIT_FAILURE
);
92 assert_return(streq(test
, p
), EXIT_FAILURE
);
94 strbuf_pushchars(&buf2
, test
);
95 assert_return(streq(test
, strbuf_str(&buf2
)), EXIT_FAILURE
);
96 /* It fits on stack, but when we steal, we get a copy on heap */
97 p
= strbuf_str(&buf2
);
98 assert_return(streq(test
, p
), EXIT_FAILURE
);
101 * Check assumption about buffer being on stack vs heap is indeed valid.
102 * Not to be done in real code.
105 stack_buf
= buf3
.bytes
;
106 strbuf_pushchars(&buf3
, test
);
107 assert_return(stack_buf
== buf3
.bytes
, EXIT_FAILURE
);
109 assert_return(streq(test
, strbuf_str(&buf3
)), EXIT_FAILURE
);
110 assert_return(stack_buf
== buf3
.bytes
, EXIT_FAILURE
);
112 strbuf_pushchars(&buf3
, "-overflow");
113 assert_return(stack_buf
!= buf3
.bytes
, EXIT_FAILURE
);
117 DEFINE_TEST(test_strbuf_with_stack
, .description
= "test strbuf with stack");
119 static int test_strbuf_with_heap(void)
121 DECLARE_STRBUF(heapbuf
);
123 assert_return(heapbuf
.bytes
== NULL
, EXIT_FAILURE
);
124 assert_return(heapbuf
.size
== 0, EXIT_FAILURE
);
125 assert_return(heapbuf
.used
== 0, EXIT_FAILURE
);
126 strbuf_pushchars(&heapbuf
, "-overflow");
127 assert_return(heapbuf
.bytes
!= NULL
, EXIT_FAILURE
);
128 assert_return(heapbuf
.size
!= 0, EXIT_FAILURE
);
129 assert_return(heapbuf
.used
!= 0, EXIT_FAILURE
);
133 DEFINE_TEST(test_strbuf_with_heap
, .description
= "test strbuf with heap only");
135 static int test_strbuf_pushmem(void)
137 _cleanup_strbuf_
struct strbuf buf
;
140 strbuf_pushmem(&buf
, "", 0);
141 strbuf_pushmem(&buf
, TEXT
, strlen(TEXT
) + 1);
143 assert_return(streq(TEXT
, strbuf_str(&buf
)), EXIT_FAILURE
);
147 DEFINE_TEST(test_strbuf_pushmem
, .description
= "test strbuf_reserve");
149 static int test_strbuf_used(void)
151 _cleanup_strbuf_
struct strbuf buf
;
154 assert_return(strbuf_used(&buf
) == 0, EXIT_FAILURE
);
156 strbuf_pushchars(&buf
, TEXT
);
157 assert_return(strbuf_used(&buf
) == strlen(TEXT
), EXIT_FAILURE
);
159 strbuf_pushchar(&buf
, 'a');
160 strbuf_popchar(&buf
);
161 assert_return(strbuf_used(&buf
) == strlen(TEXT
), EXIT_FAILURE
);
163 assert_return(streq(TEXT
, strbuf_str(&buf
)), EXIT_FAILURE
);
164 assert_return(strbuf_used(&buf
) == strlen(TEXT
), EXIT_FAILURE
);
166 strbuf_pushchar(&buf
, '\0');
167 assert_return(streq(TEXT
, strbuf_str(&buf
)), EXIT_FAILURE
);
168 assert_return(strbuf_used(&buf
) == strlen(TEXT
) + 1, EXIT_FAILURE
);
172 DEFINE_TEST(test_strbuf_used
, .description
= "test strbuf_used");
174 static int test_strbuf_shrink_to(void)
176 _cleanup_strbuf_
struct strbuf buf
;
179 strbuf_shrink_to(&buf
, 0);
180 assert_return(strbuf_used(&buf
) == 0, EXIT_FAILURE
);
182 strbuf_pushchars(&buf
, TEXT
);
183 strbuf_shrink_to(&buf
, strlen(TEXT
) - 1);
184 assert_return(strbuf_used(&buf
) == strlen(TEXT
) - 1, EXIT_FAILURE
);
188 DEFINE_TEST(test_strbuf_shrink_to
, .description
= "test strbuf_shrink_to");
190 static int xfail_strbuf_shrink_to(void)
192 _cleanup_strbuf_
struct strbuf buf
;
195 strbuf_pushchar(&buf
, '/');
197 /* This should crash on assert */
198 strbuf_shrink_to(&buf
, 2);
202 DEFINE_TEST(xfail_strbuf_shrink_to
, .description
= "xfail strbuf_shrink_to",
203 .expected_fail
= true);