xref: /aosp_15_r20/external/virglrenderer/tests/test_virgl_strbuf.c (revision bbecb9d118dfdb95f99bd754f8fa9be01f189df3)
1*bbecb9d1SAndroid Build Coastguard Worker /**************************************************************************
2*bbecb9d1SAndroid Build Coastguard Worker  *
3*bbecb9d1SAndroid Build Coastguard Worker  * Copyright (C) 2019 Red Hat Inc.
4*bbecb9d1SAndroid Build Coastguard Worker  *
5*bbecb9d1SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
6*bbecb9d1SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
7*bbecb9d1SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
8*bbecb9d1SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9*bbecb9d1SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
10*bbecb9d1SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
11*bbecb9d1SAndroid Build Coastguard Worker  *
12*bbecb9d1SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be included
13*bbecb9d1SAndroid Build Coastguard Worker  * in all copies or substantial portions of the Software.
14*bbecb9d1SAndroid Build Coastguard Worker  *
15*bbecb9d1SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16*bbecb9d1SAndroid Build Coastguard Worker  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*bbecb9d1SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*bbecb9d1SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19*bbecb9d1SAndroid Build Coastguard Worker  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20*bbecb9d1SAndroid Build Coastguard Worker  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21*bbecb9d1SAndroid Build Coastguard Worker  * OTHER DEALINGS IN THE SOFTWARE.
22*bbecb9d1SAndroid Build Coastguard Worker  *
23*bbecb9d1SAndroid Build Coastguard Worker  **************************************************************************/
24*bbecb9d1SAndroid Build Coastguard Worker #include <check.h>
25*bbecb9d1SAndroid Build Coastguard Worker #include <stdio.h>
26*bbecb9d1SAndroid Build Coastguard Worker #include "../src/vrend_strbuf.h"
27*bbecb9d1SAndroid Build Coastguard Worker 
28*bbecb9d1SAndroid Build Coastguard Worker /* Test the vrend strbuf implementation */
29*bbecb9d1SAndroid Build Coastguard Worker 
START_TEST(strbuf_init)30*bbecb9d1SAndroid Build Coastguard Worker START_TEST(strbuf_init)
31*bbecb9d1SAndroid Build Coastguard Worker {
32*bbecb9d1SAndroid Build Coastguard Worker    struct vrend_strbuf sb;
33*bbecb9d1SAndroid Build Coastguard Worker    bool ret;
34*bbecb9d1SAndroid Build Coastguard Worker    ret = strbuf_alloc(&sb, 1024);
35*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(ret, true);
36*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(sb.alloc_size, 1024);
37*bbecb9d1SAndroid Build Coastguard Worker    strbuf_free(&sb);
38*bbecb9d1SAndroid Build Coastguard Worker }
39*bbecb9d1SAndroid Build Coastguard Worker END_TEST
40*bbecb9d1SAndroid Build Coastguard Worker 
START_TEST(strbuf_add_small_string)41*bbecb9d1SAndroid Build Coastguard Worker START_TEST(strbuf_add_small_string)
42*bbecb9d1SAndroid Build Coastguard Worker {
43*bbecb9d1SAndroid Build Coastguard Worker    struct vrend_strbuf sb;
44*bbecb9d1SAndroid Build Coastguard Worker    bool ret;
45*bbecb9d1SAndroid Build Coastguard Worker    char str[27];
46*bbecb9d1SAndroid Build Coastguard Worker    ret = strbuf_alloc(&sb, 1024);
47*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(ret, true);
48*bbecb9d1SAndroid Build Coastguard Worker 
49*bbecb9d1SAndroid Build Coastguard Worker    for (int i = 0; i < 26; i++)
50*bbecb9d1SAndroid Build Coastguard Worker       str[i] = 'a' + i;
51*bbecb9d1SAndroid Build Coastguard Worker    str[26] = 0;
52*bbecb9d1SAndroid Build Coastguard Worker    strbuf_append(&sb, str);
53*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(strbuf_get_error(&sb), false);
54*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(sb.size, strlen(sb.buf));
55*bbecb9d1SAndroid Build Coastguard Worker    strbuf_free(&sb);
56*bbecb9d1SAndroid Build Coastguard Worker }
57*bbecb9d1SAndroid Build Coastguard Worker END_TEST
58*bbecb9d1SAndroid Build Coastguard Worker 
START_TEST(strbuf_add_small_string_twice)59*bbecb9d1SAndroid Build Coastguard Worker START_TEST(strbuf_add_small_string_twice)
60*bbecb9d1SAndroid Build Coastguard Worker {
61*bbecb9d1SAndroid Build Coastguard Worker    struct vrend_strbuf sb;
62*bbecb9d1SAndroid Build Coastguard Worker    bool ret;
63*bbecb9d1SAndroid Build Coastguard Worker    char str[27];
64*bbecb9d1SAndroid Build Coastguard Worker    ret = strbuf_alloc(&sb, 1024);
65*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(ret, true);
66*bbecb9d1SAndroid Build Coastguard Worker 
67*bbecb9d1SAndroid Build Coastguard Worker    for (int i = 0; i < 26; i++)
68*bbecb9d1SAndroid Build Coastguard Worker       str[i] = 'a' + i;
69*bbecb9d1SAndroid Build Coastguard Worker    str[26] = 0;
70*bbecb9d1SAndroid Build Coastguard Worker    strbuf_append(&sb, str);
71*bbecb9d1SAndroid Build Coastguard Worker    strbuf_append(&sb, str);
72*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(strbuf_get_error(&sb), false);
73*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(strbuf_get_len(&sb), strlen(sb.buf));
74*bbecb9d1SAndroid Build Coastguard Worker    strbuf_free(&sb);
75*bbecb9d1SAndroid Build Coastguard Worker }
76*bbecb9d1SAndroid Build Coastguard Worker END_TEST
77*bbecb9d1SAndroid Build Coastguard Worker 
START_TEST(strbuf_add_large_string)78*bbecb9d1SAndroid Build Coastguard Worker START_TEST(strbuf_add_large_string)
79*bbecb9d1SAndroid Build Coastguard Worker {
80*bbecb9d1SAndroid Build Coastguard Worker    struct vrend_strbuf sb;
81*bbecb9d1SAndroid Build Coastguard Worker    bool ret;
82*bbecb9d1SAndroid Build Coastguard Worker    char str[256];
83*bbecb9d1SAndroid Build Coastguard Worker    ret = strbuf_alloc(&sb, 128);
84*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(ret, true);
85*bbecb9d1SAndroid Build Coastguard Worker 
86*bbecb9d1SAndroid Build Coastguard Worker    for (int i = 0; i < 255; i++)
87*bbecb9d1SAndroid Build Coastguard Worker       str[i] = 'a' + (i % 26);
88*bbecb9d1SAndroid Build Coastguard Worker    str[255] = 0;
89*bbecb9d1SAndroid Build Coastguard Worker    strbuf_append(&sb, str);
90*bbecb9d1SAndroid Build Coastguard Worker 
91*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(strbuf_get_error(&sb), false);
92*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(strbuf_get_len(&sb), strlen(sb.buf));
93*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(sb.alloc_size, 128 + STRBUF_MIN_MALLOC);
94*bbecb9d1SAndroid Build Coastguard Worker    strbuf_free(&sb);
95*bbecb9d1SAndroid Build Coastguard Worker }
96*bbecb9d1SAndroid Build Coastguard Worker END_TEST
97*bbecb9d1SAndroid Build Coastguard Worker 
START_TEST(strbuf_add_huge_string)98*bbecb9d1SAndroid Build Coastguard Worker START_TEST(strbuf_add_huge_string)
99*bbecb9d1SAndroid Build Coastguard Worker {
100*bbecb9d1SAndroid Build Coastguard Worker    struct vrend_strbuf sb;
101*bbecb9d1SAndroid Build Coastguard Worker    bool ret;
102*bbecb9d1SAndroid Build Coastguard Worker    char str[2048];
103*bbecb9d1SAndroid Build Coastguard Worker    ret = strbuf_alloc(&sb, 128);
104*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(ret, true);
105*bbecb9d1SAndroid Build Coastguard Worker 
106*bbecb9d1SAndroid Build Coastguard Worker    for (int i = 0; i < 2047; i++)
107*bbecb9d1SAndroid Build Coastguard Worker       str[i] = 'a' + (i % 26);
108*bbecb9d1SAndroid Build Coastguard Worker    str[2047] = 0;
109*bbecb9d1SAndroid Build Coastguard Worker    strbuf_append(&sb, str);
110*bbecb9d1SAndroid Build Coastguard Worker 
111*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(strbuf_get_error(&sb), false);
112*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(strbuf_get_len(&sb), strlen(sb.buf));
113*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(sb.alloc_size, 2048);
114*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_ge(sb.alloc_size, strbuf_get_len(&sb) + 1);
115*bbecb9d1SAndroid Build Coastguard Worker    strbuf_free(&sb);
116*bbecb9d1SAndroid Build Coastguard Worker }
117*bbecb9d1SAndroid Build Coastguard Worker END_TEST
118*bbecb9d1SAndroid Build Coastguard Worker 
START_TEST(strbuf_test_boundary)119*bbecb9d1SAndroid Build Coastguard Worker START_TEST(strbuf_test_boundary)
120*bbecb9d1SAndroid Build Coastguard Worker {
121*bbecb9d1SAndroid Build Coastguard Worker    struct vrend_strbuf sb;
122*bbecb9d1SAndroid Build Coastguard Worker    bool ret;
123*bbecb9d1SAndroid Build Coastguard Worker    char str[128];
124*bbecb9d1SAndroid Build Coastguard Worker    ret = strbuf_alloc(&sb, 128);
125*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(ret, true);
126*bbecb9d1SAndroid Build Coastguard Worker 
127*bbecb9d1SAndroid Build Coastguard Worker    for (int i = 0; i < 127; i++)
128*bbecb9d1SAndroid Build Coastguard Worker       str[i] = 'a' + (i % 26);
129*bbecb9d1SAndroid Build Coastguard Worker    str[127] = 0;
130*bbecb9d1SAndroid Build Coastguard Worker    strbuf_append(&sb, str);
131*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(strbuf_get_error(&sb), false);
132*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(strbuf_get_len(&sb), strlen(sb.buf));
133*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(sb.alloc_size, 128);
134*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_ge(sb.alloc_size, strbuf_get_len(&sb) + 1);
135*bbecb9d1SAndroid Build Coastguard Worker    strbuf_free(&sb);
136*bbecb9d1SAndroid Build Coastguard Worker }
137*bbecb9d1SAndroid Build Coastguard Worker END_TEST
138*bbecb9d1SAndroid Build Coastguard Worker 
START_TEST(strbuf_test_boundary2)139*bbecb9d1SAndroid Build Coastguard Worker START_TEST(strbuf_test_boundary2)
140*bbecb9d1SAndroid Build Coastguard Worker {
141*bbecb9d1SAndroid Build Coastguard Worker    struct vrend_strbuf sb;
142*bbecb9d1SAndroid Build Coastguard Worker    bool ret;
143*bbecb9d1SAndroid Build Coastguard Worker    char str[513];
144*bbecb9d1SAndroid Build Coastguard Worker    ret = strbuf_alloc(&sb, 1024);
145*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(ret, true);
146*bbecb9d1SAndroid Build Coastguard Worker 
147*bbecb9d1SAndroid Build Coastguard Worker    for (int i = 0; i < 512; i++)
148*bbecb9d1SAndroid Build Coastguard Worker       str[i] = 'a' + (i % 26);
149*bbecb9d1SAndroid Build Coastguard Worker    str[512] = 0;
150*bbecb9d1SAndroid Build Coastguard Worker    strbuf_append(&sb, str);
151*bbecb9d1SAndroid Build Coastguard Worker    strbuf_append(&sb, str);
152*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(strbuf_get_error(&sb), false);
153*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(strbuf_get_len(&sb), strlen(sb.buf));
154*bbecb9d1SAndroid Build Coastguard Worker    /* we should have 512 + 512 + 1 at least */
155*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_ge(sb.alloc_size, strbuf_get_len(&sb) + 1);
156*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_gt(sb.alloc_size, 1024);
157*bbecb9d1SAndroid Build Coastguard Worker 
158*bbecb9d1SAndroid Build Coastguard Worker    strbuf_free(&sb);
159*bbecb9d1SAndroid Build Coastguard Worker }
160*bbecb9d1SAndroid Build Coastguard Worker END_TEST
161*bbecb9d1SAndroid Build Coastguard Worker 
START_TEST(strbuf_test_appendf)162*bbecb9d1SAndroid Build Coastguard Worker START_TEST(strbuf_test_appendf)
163*bbecb9d1SAndroid Build Coastguard Worker {
164*bbecb9d1SAndroid Build Coastguard Worker    struct vrend_strbuf sb;
165*bbecb9d1SAndroid Build Coastguard Worker    bool ret;
166*bbecb9d1SAndroid Build Coastguard Worker    ret = strbuf_alloc(&sb, 1024);
167*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(ret, true);
168*bbecb9d1SAndroid Build Coastguard Worker    strbuf_appendf(&sb, "%d", 5);
169*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_str_eq(sb.buf, "5");
170*bbecb9d1SAndroid Build Coastguard Worker    strbuf_free(&sb);
171*bbecb9d1SAndroid Build Coastguard Worker }
172*bbecb9d1SAndroid Build Coastguard Worker END_TEST
173*bbecb9d1SAndroid Build Coastguard Worker 
START_TEST(strbuf_test_appendf_str)174*bbecb9d1SAndroid Build Coastguard Worker START_TEST(strbuf_test_appendf_str)
175*bbecb9d1SAndroid Build Coastguard Worker {
176*bbecb9d1SAndroid Build Coastguard Worker    struct vrend_strbuf sb;
177*bbecb9d1SAndroid Build Coastguard Worker    bool ret;
178*bbecb9d1SAndroid Build Coastguard Worker    ret = strbuf_alloc(&sb, 1024);
179*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(ret, true);
180*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(sb.external_buffer, false);
181*bbecb9d1SAndroid Build Coastguard Worker    strbuf_appendf(&sb, "%s5", "hello");
182*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_str_eq(sb.buf, "hello5");
183*bbecb9d1SAndroid Build Coastguard Worker    strbuf_free(&sb);
184*bbecb9d1SAndroid Build Coastguard Worker }
185*bbecb9d1SAndroid Build Coastguard Worker END_TEST
186*bbecb9d1SAndroid Build Coastguard Worker 
187*bbecb9d1SAndroid Build Coastguard Worker 
START_TEST(strbuf_test_fixed_string)188*bbecb9d1SAndroid Build Coastguard Worker START_TEST(strbuf_test_fixed_string)
189*bbecb9d1SAndroid Build Coastguard Worker {
190*bbecb9d1SAndroid Build Coastguard Worker    struct vrend_strbuf sb;
191*bbecb9d1SAndroid Build Coastguard Worker    bool ret;
192*bbecb9d1SAndroid Build Coastguard Worker    char buf[1024];
193*bbecb9d1SAndroid Build Coastguard Worker    ret = strbuf_alloc_fixed(&sb, buf, 1024);
194*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(ret, true);
195*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(sb.external_buffer, true);
196*bbecb9d1SAndroid Build Coastguard Worker    strbuf_appendf(&sb, "%s5", "hello");
197*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_str_eq(sb.buf, "hello5");
198*bbecb9d1SAndroid Build Coastguard Worker    strbuf_free(&sb);
199*bbecb9d1SAndroid Build Coastguard Worker }
200*bbecb9d1SAndroid Build Coastguard Worker END_TEST
201*bbecb9d1SAndroid Build Coastguard Worker 
202*bbecb9d1SAndroid Build Coastguard Worker 
init_suite(void)203*bbecb9d1SAndroid Build Coastguard Worker static Suite *init_suite(void)
204*bbecb9d1SAndroid Build Coastguard Worker {
205*bbecb9d1SAndroid Build Coastguard Worker   Suite *s;
206*bbecb9d1SAndroid Build Coastguard Worker   TCase *tc_core;
207*bbecb9d1SAndroid Build Coastguard Worker 
208*bbecb9d1SAndroid Build Coastguard Worker   s = suite_create("vrend_strbuf");
209*bbecb9d1SAndroid Build Coastguard Worker   tc_core = tcase_create("strbuf");
210*bbecb9d1SAndroid Build Coastguard Worker 
211*bbecb9d1SAndroid Build Coastguard Worker   suite_add_tcase(s, tc_core);
212*bbecb9d1SAndroid Build Coastguard Worker 
213*bbecb9d1SAndroid Build Coastguard Worker   tcase_add_test(tc_core, strbuf_init);
214*bbecb9d1SAndroid Build Coastguard Worker   tcase_add_test(tc_core, strbuf_add_small_string);
215*bbecb9d1SAndroid Build Coastguard Worker   tcase_add_test(tc_core, strbuf_add_small_string_twice);
216*bbecb9d1SAndroid Build Coastguard Worker   tcase_add_test(tc_core, strbuf_add_large_string);
217*bbecb9d1SAndroid Build Coastguard Worker   tcase_add_test(tc_core, strbuf_add_huge_string);
218*bbecb9d1SAndroid Build Coastguard Worker   tcase_add_test(tc_core, strbuf_test_boundary);
219*bbecb9d1SAndroid Build Coastguard Worker   tcase_add_test(tc_core, strbuf_test_boundary2);
220*bbecb9d1SAndroid Build Coastguard Worker   tcase_add_test(tc_core, strbuf_test_appendf);
221*bbecb9d1SAndroid Build Coastguard Worker   tcase_add_test(tc_core, strbuf_test_appendf_str);
222*bbecb9d1SAndroid Build Coastguard Worker   tcase_add_test(tc_core, strbuf_test_fixed_string);
223*bbecb9d1SAndroid Build Coastguard Worker   return s;
224*bbecb9d1SAndroid Build Coastguard Worker }
225*bbecb9d1SAndroid Build Coastguard Worker 
main(void)226*bbecb9d1SAndroid Build Coastguard Worker int main(void)
227*bbecb9d1SAndroid Build Coastguard Worker {
228*bbecb9d1SAndroid Build Coastguard Worker    Suite *s;
229*bbecb9d1SAndroid Build Coastguard Worker    SRunner *sr;
230*bbecb9d1SAndroid Build Coastguard Worker    int number_failed;
231*bbecb9d1SAndroid Build Coastguard Worker 
232*bbecb9d1SAndroid Build Coastguard Worker    s = init_suite();
233*bbecb9d1SAndroid Build Coastguard Worker    sr = srunner_create(s);
234*bbecb9d1SAndroid Build Coastguard Worker 
235*bbecb9d1SAndroid Build Coastguard Worker    srunner_run_all(sr, CK_NORMAL);
236*bbecb9d1SAndroid Build Coastguard Worker    number_failed = srunner_ntests_failed(sr);
237*bbecb9d1SAndroid Build Coastguard Worker    srunner_free(sr);
238*bbecb9d1SAndroid Build Coastguard Worker    return number_failed == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
239*bbecb9d1SAndroid Build Coastguard Worker }
240