xref: /aosp_15_r20/external/kmod/testsuite/test-strbuf.c (revision cc4ad7da8cefe208cb129ac2aa9a357c7c72deb2)
1*cc4ad7daSAndroid Build Coastguard Worker /*
2*cc4ad7daSAndroid Build Coastguard Worker  * Copyright (C)  2014 Intel Corporation. All rights reserved.
3*cc4ad7daSAndroid Build Coastguard Worker  *
4*cc4ad7daSAndroid Build Coastguard Worker  * This program is free software; you can redistribute it and/or
5*cc4ad7daSAndroid Build Coastguard Worker  * modify it under the terms of the GNU Lesser General Public
6*cc4ad7daSAndroid Build Coastguard Worker  * License as published by the Free Software Foundation; either
7*cc4ad7daSAndroid Build Coastguard Worker  * version 2.1 of the License, or (at your option) any later version.
8*cc4ad7daSAndroid Build Coastguard Worker  *
9*cc4ad7daSAndroid Build Coastguard Worker  * This program is distributed in the hope that it will be useful,
10*cc4ad7daSAndroid Build Coastguard Worker  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11*cc4ad7daSAndroid Build Coastguard Worker  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12*cc4ad7daSAndroid Build Coastguard Worker  * Lesser General Public License for more details.
13*cc4ad7daSAndroid Build Coastguard Worker  *
14*cc4ad7daSAndroid Build Coastguard Worker  * You should have received a copy of the GNU Lesser General Public
15*cc4ad7daSAndroid Build Coastguard Worker  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
16*cc4ad7daSAndroid Build Coastguard Worker  */
17*cc4ad7daSAndroid Build Coastguard Worker 
18*cc4ad7daSAndroid Build Coastguard Worker #include <errno.h>
19*cc4ad7daSAndroid Build Coastguard Worker #include <stddef.h>
20*cc4ad7daSAndroid Build Coastguard Worker #include <stdio.h>
21*cc4ad7daSAndroid Build Coastguard Worker #include <stdlib.h>
22*cc4ad7daSAndroid Build Coastguard Worker #include <string.h>
23*cc4ad7daSAndroid Build Coastguard Worker #include <unistd.h>
24*cc4ad7daSAndroid Build Coastguard Worker 
25*cc4ad7daSAndroid Build Coastguard Worker #include <shared/strbuf.h>
26*cc4ad7daSAndroid Build Coastguard Worker #include <shared/util.h>
27*cc4ad7daSAndroid Build Coastguard Worker 
28*cc4ad7daSAndroid Build Coastguard Worker #include "testsuite.h"
29*cc4ad7daSAndroid Build Coastguard Worker 
30*cc4ad7daSAndroid Build Coastguard Worker static const char *TEXT =
31*cc4ad7daSAndroid Build Coastguard Worker 	"this is a very long test that is longer than the size we initially se in the strbuf";
32*cc4ad7daSAndroid Build Coastguard Worker 
test_strbuf_pushchar(const struct test * t)33*cc4ad7daSAndroid Build Coastguard Worker static int test_strbuf_pushchar(const struct test *t)
34*cc4ad7daSAndroid Build Coastguard Worker {
35*cc4ad7daSAndroid Build Coastguard Worker 	struct strbuf buf;
36*cc4ad7daSAndroid Build Coastguard Worker 	char *result1, *result2;
37*cc4ad7daSAndroid Build Coastguard Worker 	const char *c;
38*cc4ad7daSAndroid Build Coastguard Worker 
39*cc4ad7daSAndroid Build Coastguard Worker 	strbuf_init(&buf);
40*cc4ad7daSAndroid Build Coastguard Worker 
41*cc4ad7daSAndroid Build Coastguard Worker 	for (c = TEXT; *c != '\0'; c++)
42*cc4ad7daSAndroid Build Coastguard Worker 		strbuf_pushchar(&buf, *c);
43*cc4ad7daSAndroid Build Coastguard Worker 
44*cc4ad7daSAndroid Build Coastguard Worker 	result1 = (char *) strbuf_str(&buf);
45*cc4ad7daSAndroid Build Coastguard Worker 	assert_return(result1 == buf.bytes, EXIT_FAILURE);
46*cc4ad7daSAndroid Build Coastguard Worker 	assert_return(streq(result1, TEXT), EXIT_FAILURE);
47*cc4ad7daSAndroid Build Coastguard Worker 	result1 = strdup(result1);
48*cc4ad7daSAndroid Build Coastguard Worker 
49*cc4ad7daSAndroid Build Coastguard Worker 	result2 = strbuf_steal(&buf);
50*cc4ad7daSAndroid Build Coastguard Worker 	assert_return(streq(result1, result2), EXIT_FAILURE);
51*cc4ad7daSAndroid Build Coastguard Worker 
52*cc4ad7daSAndroid Build Coastguard Worker 	free(result1);
53*cc4ad7daSAndroid Build Coastguard Worker 	free(result2);
54*cc4ad7daSAndroid Build Coastguard Worker 
55*cc4ad7daSAndroid Build Coastguard Worker 	return 0;
56*cc4ad7daSAndroid Build Coastguard Worker }
57*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST(test_strbuf_pushchar,
58*cc4ad7daSAndroid Build Coastguard Worker 		.description = "test strbuf_{pushchar, str, steal}");
59*cc4ad7daSAndroid Build Coastguard Worker 
test_strbuf_pushchars(const struct test * t)60*cc4ad7daSAndroid Build Coastguard Worker static int test_strbuf_pushchars(const struct test *t)
61*cc4ad7daSAndroid Build Coastguard Worker {
62*cc4ad7daSAndroid Build Coastguard Worker 	struct strbuf buf;
63*cc4ad7daSAndroid Build Coastguard Worker 	char *result1, *saveptr = NULL, *str, *result2;
64*cc4ad7daSAndroid Build Coastguard Worker 	const char *c;
65*cc4ad7daSAndroid Build Coastguard Worker 	int lastwordlen = 0;
66*cc4ad7daSAndroid Build Coastguard Worker 
67*cc4ad7daSAndroid Build Coastguard Worker 	strbuf_init(&buf);
68*cc4ad7daSAndroid Build Coastguard Worker 	str = strdup(TEXT);
69*cc4ad7daSAndroid Build Coastguard Worker 	for (c = strtok_r(str, " ", &saveptr); c != NULL;
70*cc4ad7daSAndroid Build Coastguard Worker 	     c = strtok_r(NULL, " ", &saveptr)) {
71*cc4ad7daSAndroid Build Coastguard Worker 		strbuf_pushchars(&buf, c);
72*cc4ad7daSAndroid Build Coastguard Worker 		strbuf_pushchar(&buf, ' ');
73*cc4ad7daSAndroid Build Coastguard Worker 		lastwordlen = strlen(c);
74*cc4ad7daSAndroid Build Coastguard Worker 	}
75*cc4ad7daSAndroid Build Coastguard Worker 
76*cc4ad7daSAndroid Build Coastguard Worker 	strbuf_popchar(&buf);
77*cc4ad7daSAndroid Build Coastguard Worker 	result1 = (char *) strbuf_str(&buf);
78*cc4ad7daSAndroid Build Coastguard Worker 	assert_return(result1 == buf.bytes, EXIT_FAILURE);
79*cc4ad7daSAndroid Build Coastguard Worker 	assert_return(streq(result1, TEXT), EXIT_FAILURE);
80*cc4ad7daSAndroid Build Coastguard Worker 
81*cc4ad7daSAndroid Build Coastguard Worker 	strbuf_popchars(&buf, lastwordlen);
82*cc4ad7daSAndroid Build Coastguard Worker 	result2 = strbuf_steal(&buf);
83*cc4ad7daSAndroid Build Coastguard Worker 	assert_return(!streq(TEXT, result2), EXIT_FAILURE);
84*cc4ad7daSAndroid Build Coastguard Worker 	assert_return(strncmp(TEXT, result2, strlen(TEXT) - lastwordlen) == 0,
85*cc4ad7daSAndroid Build Coastguard Worker 		      EXIT_FAILURE);
86*cc4ad7daSAndroid Build Coastguard Worker 	assert_return(result2[strlen(TEXT) - lastwordlen] == '\0',
87*cc4ad7daSAndroid Build Coastguard Worker 		      EXIT_FAILURE);
88*cc4ad7daSAndroid Build Coastguard Worker 
89*cc4ad7daSAndroid Build Coastguard Worker 	free(str);
90*cc4ad7daSAndroid Build Coastguard Worker 	free(result2);
91*cc4ad7daSAndroid Build Coastguard Worker 
92*cc4ad7daSAndroid Build Coastguard Worker 	return 0;
93*cc4ad7daSAndroid Build Coastguard Worker }
94*cc4ad7daSAndroid Build Coastguard Worker DEFINE_TEST(test_strbuf_pushchars,
95*cc4ad7daSAndroid Build Coastguard Worker 		.description = "test strbuf_{pushchars, popchar, popchars}");
96*cc4ad7daSAndroid Build Coastguard Worker 
97*cc4ad7daSAndroid Build Coastguard Worker 
98*cc4ad7daSAndroid Build Coastguard Worker TESTSUITE_MAIN();
99