VirtualBox

source: vbox/trunk/src/VBox/Runtime/testcase/tstRTStrAlloc.cpp@ 49788

Last change on this file since 49788 was 45241, checked in by vboxsync, 12 years ago

tstRTStrAlloc: ensure we call RTStrAAppendExN() really with size_t parameters!

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.9 KB
Line 
1/* $Id: tstRTStrAlloc.cpp 45241 2013-03-28 16:25:41Z vboxsync $ */
2/** @file
3 * IPRT Testcase - String allocation APIs and related manipulators.
4 */
5
6/*
7 * Copyright (C) 2010 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27/*******************************************************************************
28* Header Files *
29*******************************************************************************/
30#include <iprt/string.h>
31
32#include <iprt/asm.h>
33#include <iprt/err.h>
34#include <iprt/test.h>
35
36
37/**
38 * Basic API checks.
39 * We'll return if any of these fails.
40 */
41static void tst1(void)
42{
43 RTTestISub("Basics");
44 char *psz;
45 int rc = VINF_SUCCESS;
46
47 /* RTStrAlloc */
48 RTTESTI_CHECK(psz = RTStrAlloc(0));
49 RTTESTI_CHECK(psz && !*psz);
50 RTStrFree(psz);
51
52 RTTESTI_CHECK(psz = RTStrAlloc(1));
53 RTTESTI_CHECK(psz && !*psz);
54 RTStrFree(psz);
55
56 RTTESTI_CHECK(psz = RTStrAlloc(128));
57 RTTESTI_CHECK(psz && !*psz);
58 RTStrFree(psz);
59
60 /* RTStrAllocEx */
61 psz = (char*)"asdfasdf";
62 RTTESTI_CHECK_RC(RTStrAllocEx(&psz, 0), VINF_SUCCESS);
63 RTTESTI_CHECK(psz && !*psz);
64 RTStrFree(psz);
65
66 RTTESTI_CHECK_RC(RTStrAllocEx(&psz, 1), VINF_SUCCESS);
67 RTTESTI_CHECK(psz && !*psz);
68 RTStrFree(psz);
69
70 RTTESTI_CHECK_RC(RTStrAllocEx(&psz, 128), VINF_SUCCESS);
71 RTTESTI_CHECK(psz && !*psz);
72 RTStrFree(psz);
73
74 /* RTStrRealloc */
75 psz = NULL;
76 RTTESTI_CHECK_RC(RTStrRealloc(&psz, 10), VINF_SUCCESS);
77 RTTESTI_CHECK(psz && !psz[0]);
78 RTTESTI_CHECK(psz && !psz[9]);
79 RTStrFree(psz);
80
81 psz = NULL;
82 RTTESTI_CHECK_RC(RTStrRealloc(&psz, 0), VINF_SUCCESS);
83 RTTESTI_CHECK(!psz);
84
85 psz = NULL;
86 RTTESTI_CHECK_RC(RTStrRealloc(&psz, 128), VINF_SUCCESS);
87 RTTESTI_CHECK(psz && !psz[0]);
88 RTTESTI_CHECK(psz && !psz[127]);
89 if (psz)
90 {
91 memset(psz, 'a', 127);
92 RTTESTI_CHECK_RC(rc = RTStrRealloc(&psz, 160), VINF_SUCCESS);
93 if (RT_SUCCESS(rc) && psz)
94 {
95 RTTESTI_CHECK(!psz[127]);
96 RTTESTI_CHECK(!psz[159]);
97 RTTESTI_CHECK(ASMMemIsAll8(psz, 127, 'a') == NULL);
98 memset(psz, 'b', 159);
99
100 RTTESTI_CHECK_RC(rc = RTStrRealloc(&psz, 79), VINF_SUCCESS);
101 if (RT_SUCCESS(rc))
102 {
103 RTTESTI_CHECK(!psz[78]);
104 RTTESTI_CHECK(ASMMemIsAll8(psz, 78, 'b') == NULL);
105
106 RTTESTI_CHECK_RC(rc = RTStrRealloc(&psz, 0), VINF_SUCCESS);
107 RTTESTI_CHECK(!psz);
108 }
109 }
110 }
111 RTStrFree(psz);
112
113 /* RTStrDup */
114 RTTESTI_CHECK(psz = RTStrDup(""));
115 RTTESTI_CHECK(psz && *psz == '\0');
116 RTStrFree(psz);
117
118 RTTESTI_CHECK(psz = RTStrDup("abcdefghijklmnop"));
119 RTTESTI_CHECK(!RTStrCmp(psz, "abcdefghijklmnop"));
120 RTStrFree(psz);
121
122 /* RTStrDupEx */
123 psz = NULL;
124 RTTESTI_CHECK_RC(RTStrDupEx(&psz, ""), VINF_SUCCESS);
125 RTTESTI_CHECK(RT_FAILURE(rc) || *psz == '\0');
126 if (RT_SUCCESS(rc))
127 RTStrFree(psz);
128
129 psz = (char*)"asdfasdfasdfasdf";
130 RTTESTI_CHECK_RC(rc = RTStrDupEx(&psz, "abcdefghijklmnop"), VINF_SUCCESS);
131 RTTESTI_CHECK(RT_FAILURE(rc) || !RTStrCmp(psz, "abcdefghijklmnop"));
132 if (RT_SUCCESS(rc))
133 RTStrFree(psz);
134
135 /* RTStrDupN */
136 RTTESTI_CHECK(psz = RTStrDupN("abcdefg", 3));
137 RTTESTI_CHECK(!RTStrCmp(psz, "abc"));
138 RTStrFree(psz);
139
140 RTTESTI_CHECK(psz = RTStrDupN("abc", 100000));
141 RTTESTI_CHECK(!RTStrCmp(psz, "abc"));
142 RTStrFree(psz);
143
144 RTTESTI_CHECK(psz = RTStrDupN("abc", 0));
145 RTTESTI_CHECK(psz && *psz == '\0');
146 RTStrFree(psz);
147
148 /* RTStrAAppend */
149 RTTESTI_CHECK(psz = RTStrDup("abc"));
150 RTTESTI_CHECK_RC(RTStrAAppend(&psz, "def"), VINF_SUCCESS);
151 RTTESTI_CHECK(!RTStrCmp(psz, "abcdef"));
152 RTStrFree(psz);
153
154 RTTESTI_CHECK(psz = RTStrDup("abc"));
155 RTTESTI_CHECK_RC(RTStrAAppend(&psz, ""), VINF_SUCCESS);
156 RTTESTI_CHECK(!RTStrCmp(psz, "abc"));
157 RTTESTI_CHECK_RC(RTStrAAppend(&psz, NULL), VINF_SUCCESS);
158 RTTESTI_CHECK(!RTStrCmp(psz, "abc"));
159 RTStrFree(psz);
160
161 psz = NULL;
162 RTTESTI_CHECK_RC(RTStrAAppend(&psz, "xyz"), VINF_SUCCESS);
163 RTTESTI_CHECK(!RTStrCmp(psz, "xyz"));
164 RTStrFree(psz);
165
166 /* RTStrAAppendN */
167 RTTESTI_CHECK(psz = RTStrDup("abc"));
168 RTTESTI_CHECK_RC(RTStrAAppendN(&psz, "def", 1), VINF_SUCCESS);
169 RTTESTI_CHECK(!RTStrCmp(psz, "abcd"));
170 RTStrFree(psz);
171
172 RTTESTI_CHECK(psz = RTStrDup("abc"));
173 RTTESTI_CHECK_RC(RTStrAAppendN(&psz, "", 0), VINF_SUCCESS);
174 RTTESTI_CHECK(!RTStrCmp(psz, "abc"));
175 RTTESTI_CHECK_RC(RTStrAAppendN(&psz, "", RTSTR_MAX), VINF_SUCCESS);
176 RTTESTI_CHECK(!RTStrCmp(psz, "abc"));
177 RTTESTI_CHECK_RC(RTStrAAppendN(&psz, NULL, 0), VINF_SUCCESS);
178 RTTESTI_CHECK(!RTStrCmp(psz, "abc"));
179 RTStrFree(psz);
180
181 psz = NULL;
182 RTTESTI_CHECK_RC(RTStrAAppendN(&psz, "abc", 2), VINF_SUCCESS);
183 RTTESTI_CHECK(!RTStrCmp(psz, "ab"));
184 RTTESTI_CHECK_RC(RTStrAAppendN(&psz, "cdefghijklm", 1), VINF_SUCCESS);
185 RTTESTI_CHECK(!RTStrCmp(psz, "abc"));
186 RTTESTI_CHECK_RC(RTStrAAppendN(&psz, "defghijklm", RTSTR_MAX), VINF_SUCCESS);
187 RTTESTI_CHECK(!RTStrCmp(psz, "abcdefghijklm"));
188 RTStrFree(psz);
189
190 /* RTStrAAppendExN / RTStrAAppendExNV */
191 psz = NULL;
192 RTTESTI_CHECK_RC(RTStrAAppendExN(&psz, 5, "a", (size_t)1, "bc", (size_t)1, "cdefg", RTSTR_MAX, "hijkl", (size_t)2, "jklmnopqrstuvwxyz", RTSTR_MAX), VINF_SUCCESS);
193 RTTESTI_CHECK(!RTStrCmp(psz, "abcdefghijklmnopqrstuvwxyz"));
194 RTTESTI_CHECK_RC(RTStrAAppendExN(&psz, 0), VINF_SUCCESS);
195 RTTESTI_CHECK(!RTStrCmp(psz, "abcdefghijklmnopqrstuvwxyz"));
196 RTTESTI_CHECK_RC(RTStrAAppendExN(&psz, 2, NULL, (size_t)0, "", (size_t)0), VINF_SUCCESS);
197 RTTESTI_CHECK(!RTStrCmp(psz, "abcdefghijklmnopqrstuvwxyz"));
198 RTTESTI_CHECK_RC(RTStrAAppendExN(&psz, 1, "-", (size_t)1), VINF_SUCCESS);
199 RTTESTI_CHECK(!RTStrCmp(psz, "abcdefghijklmnopqrstuvwxyz-"));
200 RTStrFree(psz);
201
202 /* RTStrATruncate */
203 psz = NULL;
204 RTTESTI_CHECK_RC(RTStrATruncate(&psz, 0), VINF_SUCCESS);
205 RTTESTI_CHECK(!psz);
206
207 RTTESTI_CHECK(psz = RTStrDup(""));
208 RTTESTI_CHECK_RC(RTStrATruncate(&psz, 0), VINF_SUCCESS);
209 RTStrFree(psz);
210
211 RTTESTI_CHECK(psz = RTStrDup("1234567890"));
212 RTTESTI_CHECK_RC(RTStrATruncate(&psz, 5), VINF_SUCCESS);
213 RTTESTI_CHECK(!RTStrCmp(psz, "12345"));
214 RTStrFree(psz);
215
216 psz = NULL;
217 for (uint32_t i = 0; i < 128; i++)
218 RTTESTI_CHECK_RC_RETV(RTStrAAppend(&psz, "abcdefghijklmnopqrstuvwxyz"), VINF_SUCCESS);
219 RTTESTI_CHECK_RC(RTStrATruncate(&psz, sizeof("abcdefghijklmnopqrstuvwxyz") - 1), VINF_SUCCESS);
220 RTTESTI_CHECK(!RTStrCmp(psz, "abcdefghijklmnopqrstuvwxyz"));
221 RTTESTI_CHECK_RC(RTStrATruncate(&psz, 6), VINF_SUCCESS);
222 RTTESTI_CHECK(!RTStrCmp(psz, "abcdef"));
223 RTTESTI_CHECK_RC(RTStrATruncate(&psz, 1), VINF_SUCCESS);
224 RTTESTI_CHECK(!RTStrCmp(psz, "a"));
225 RTTESTI_CHECK_RC(RTStrATruncate(&psz, 0), VINF_SUCCESS);
226 RTTESTI_CHECK(!RTStrCmp(psz, ""));
227 RTStrFree(psz);
228
229}
230
231
232int main()
233{
234 RTTEST hTest;
235 int rc = RTTestInitAndCreate("tstRTStrAlloc", &hTest);
236 if (rc)
237 return rc;
238 RTTestBanner(hTest);
239
240 tst1();
241
242 return RTTestSummaryAndDestroy(hTest);
243}
244
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette