VirtualBox

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

Last change on this file since 59983 was 59747, checked in by vboxsync, 9 years ago

iprt/asm.h: Cleaned up the ASMMemIsAll8/U32 mess and implmeneted the former in assembly. (Found inverted usage due to bad naming in copyUtf8Block, but it is fortunately an unused method.) Replaces the complicated ASMBitFirstSet based scanning in RTSgBufIsZero with a simple call to the new ASMMemIsZero function.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.1 KB
Line 
1/* $Id: tstRTStrAlloc.cpp 59747 2016-02-19 23:18:18Z vboxsync $ */
2/** @file
3 * IPRT Testcase - String allocation APIs and related manipulators.
4 */
5
6/*
7 * Copyright (C) 2010-2015 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/*********************************************************************************************************************************
29* Header Files *
30*********************************************************************************************************************************/
31#include <iprt/string.h>
32
33#include <iprt/asm.h>
34#include <iprt/err.h>
35#include <iprt/test.h>
36
37
38/**
39 * Basic API checks.
40 * We'll return if any of these fails.
41 */
42static void tst1(void)
43{
44 RTTestISub("Basics");
45 char *psz;
46 int rc = VINF_SUCCESS;
47
48 /* RTStrAlloc */
49 RTTESTI_CHECK(psz = RTStrAlloc(0));
50 RTTESTI_CHECK(psz && !*psz);
51 RTStrFree(psz);
52
53 RTTESTI_CHECK(psz = RTStrAlloc(1));
54 RTTESTI_CHECK(psz && !*psz);
55 RTStrFree(psz);
56
57 RTTESTI_CHECK(psz = RTStrAlloc(128));
58 RTTESTI_CHECK(psz && !*psz);
59 RTStrFree(psz);
60
61 /* RTStrAllocEx */
62 psz = (char*)"asdfasdf";
63 RTTESTI_CHECK_RC(RTStrAllocEx(&psz, 0), VINF_SUCCESS);
64 RTTESTI_CHECK(psz && !*psz);
65 RTStrFree(psz);
66
67 RTTESTI_CHECK_RC(RTStrAllocEx(&psz, 1), VINF_SUCCESS);
68 RTTESTI_CHECK(psz && !*psz);
69 RTStrFree(psz);
70
71 RTTESTI_CHECK_RC(RTStrAllocEx(&psz, 128), VINF_SUCCESS);
72 RTTESTI_CHECK(psz && !*psz);
73 RTStrFree(psz);
74
75 /* RTStrRealloc */
76 psz = NULL;
77 RTTESTI_CHECK_RC(RTStrRealloc(&psz, 10), VINF_SUCCESS);
78 RTTESTI_CHECK(psz && !psz[0]);
79 RTTESTI_CHECK(psz && !psz[9]);
80 RTStrFree(psz);
81
82 psz = NULL;
83 RTTESTI_CHECK_RC(RTStrRealloc(&psz, 0), VINF_SUCCESS);
84 RTTESTI_CHECK(!psz);
85
86 psz = NULL;
87 RTTESTI_CHECK_RC(RTStrRealloc(&psz, 128), VINF_SUCCESS);
88 RTTESTI_CHECK(psz && !psz[0]);
89 RTTESTI_CHECK(psz && !psz[127]);
90 if (psz)
91 {
92 memset(psz, 'a', 127);
93 RTTESTI_CHECK_RC(rc = RTStrRealloc(&psz, 160), VINF_SUCCESS);
94 if (RT_SUCCESS(rc) && psz)
95 {
96 RTTESTI_CHECK(!psz[127]);
97 RTTESTI_CHECK(!psz[159]);
98 RTTESTI_CHECK(ASMMemIsAllU8(psz, 127, 'a'));
99 memset(psz, 'b', 159);
100
101 RTTESTI_CHECK_RC(rc = RTStrRealloc(&psz, 79), VINF_SUCCESS);
102 if (RT_SUCCESS(rc))
103 {
104 RTTESTI_CHECK(!psz[78]);
105 RTTESTI_CHECK(ASMMemIsAllU8(psz, 78, 'b'));
106
107 RTTESTI_CHECK_RC(rc = RTStrRealloc(&psz, 0), VINF_SUCCESS);
108 RTTESTI_CHECK(!psz);
109 }
110 }
111 }
112 RTStrFree(psz);
113
114 /* RTStrDup */
115 RTTESTI_CHECK(psz = RTStrDup(""));
116 RTTESTI_CHECK(psz && *psz == '\0');
117 RTStrFree(psz);
118
119 RTTESTI_CHECK(psz = RTStrDup("abcdefghijklmnop"));
120 RTTESTI_CHECK(!RTStrCmp(psz, "abcdefghijklmnop"));
121 RTStrFree(psz);
122
123 /* RTStrDupEx */
124 psz = NULL;
125 RTTESTI_CHECK_RC(RTStrDupEx(&psz, ""), VINF_SUCCESS);
126 RTTESTI_CHECK(RT_FAILURE(rc) || *psz == '\0');
127 if (RT_SUCCESS(rc))
128 RTStrFree(psz);
129
130 psz = (char*)"asdfasdfasdfasdf";
131 RTTESTI_CHECK_RC(rc = RTStrDupEx(&psz, "abcdefghijklmnop"), VINF_SUCCESS);
132 RTTESTI_CHECK(RT_FAILURE(rc) || !RTStrCmp(psz, "abcdefghijklmnop"));
133 if (RT_SUCCESS(rc))
134 RTStrFree(psz);
135
136 /* RTStrDupN */
137 RTTESTI_CHECK(psz = RTStrDupN("abcdefg", 3));
138 RTTESTI_CHECK(!RTStrCmp(psz, "abc"));
139 RTStrFree(psz);
140
141 RTTESTI_CHECK(psz = RTStrDupN("abc", 100000));
142 RTTESTI_CHECK(!RTStrCmp(psz, "abc"));
143 RTStrFree(psz);
144
145 RTTESTI_CHECK(psz = RTStrDupN("abc", 0));
146 RTTESTI_CHECK(psz && *psz == '\0');
147 RTStrFree(psz);
148
149 /* RTStrAAppend */
150 RTTESTI_CHECK(psz = RTStrDup("abc"));
151 RTTESTI_CHECK_RC(RTStrAAppend(&psz, "def"), VINF_SUCCESS);
152 RTTESTI_CHECK(!RTStrCmp(psz, "abcdef"));
153 RTStrFree(psz);
154
155 RTTESTI_CHECK(psz = RTStrDup("abc"));
156 RTTESTI_CHECK_RC(RTStrAAppend(&psz, ""), VINF_SUCCESS);
157 RTTESTI_CHECK(!RTStrCmp(psz, "abc"));
158 RTTESTI_CHECK_RC(RTStrAAppend(&psz, NULL), VINF_SUCCESS);
159 RTTESTI_CHECK(!RTStrCmp(psz, "abc"));
160 RTStrFree(psz);
161
162 psz = NULL;
163 RTTESTI_CHECK_RC(RTStrAAppend(&psz, "xyz"), VINF_SUCCESS);
164 RTTESTI_CHECK(!RTStrCmp(psz, "xyz"));
165 RTStrFree(psz);
166
167 /* RTStrAAppendN */
168 RTTESTI_CHECK(psz = RTStrDup("abc"));
169 RTTESTI_CHECK_RC(RTStrAAppendN(&psz, "def", 1), VINF_SUCCESS);
170 RTTESTI_CHECK(!RTStrCmp(psz, "abcd"));
171 RTStrFree(psz);
172
173 RTTESTI_CHECK(psz = RTStrDup("abc"));
174 RTTESTI_CHECK_RC(RTStrAAppendN(&psz, "", 0), VINF_SUCCESS);
175 RTTESTI_CHECK(!RTStrCmp(psz, "abc"));
176 RTTESTI_CHECK_RC(RTStrAAppendN(&psz, "", RTSTR_MAX), VINF_SUCCESS);
177 RTTESTI_CHECK(!RTStrCmp(psz, "abc"));
178 RTTESTI_CHECK_RC(RTStrAAppendN(&psz, NULL, 0), VINF_SUCCESS);
179 RTTESTI_CHECK(!RTStrCmp(psz, "abc"));
180 RTStrFree(psz);
181
182 psz = NULL;
183 RTTESTI_CHECK_RC(RTStrAAppendN(&psz, "abc", 2), VINF_SUCCESS);
184 RTTESTI_CHECK(!RTStrCmp(psz, "ab"));
185 RTTESTI_CHECK_RC(RTStrAAppendN(&psz, "cdefghijklm", 1), VINF_SUCCESS);
186 RTTESTI_CHECK(!RTStrCmp(psz, "abc"));
187 RTTESTI_CHECK_RC(RTStrAAppendN(&psz, "defghijklm", RTSTR_MAX), VINF_SUCCESS);
188 RTTESTI_CHECK(!RTStrCmp(psz, "abcdefghijklm"));
189 RTStrFree(psz);
190
191 /* RTStrAAppendExN / RTStrAAppendExNV */
192 psz = NULL;
193 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);
194 RTTESTI_CHECK(!RTStrCmp(psz, "abcdefghijklmnopqrstuvwxyz"));
195 RTTESTI_CHECK_RC(RTStrAAppendExN(&psz, 0), VINF_SUCCESS);
196 RTTESTI_CHECK(!RTStrCmp(psz, "abcdefghijklmnopqrstuvwxyz"));
197 RTTESTI_CHECK_RC(RTStrAAppendExN(&psz, 2, NULL, (size_t)0, "", (size_t)0), VINF_SUCCESS);
198 RTTESTI_CHECK(!RTStrCmp(psz, "abcdefghijklmnopqrstuvwxyz"));
199 RTTESTI_CHECK_RC(RTStrAAppendExN(&psz, 1, "-", (size_t)1), VINF_SUCCESS);
200 RTTESTI_CHECK(!RTStrCmp(psz, "abcdefghijklmnopqrstuvwxyz-"));
201 RTStrFree(psz);
202
203 /* RTStrATruncate */
204 psz = NULL;
205 RTTESTI_CHECK_RC(RTStrATruncate(&psz, 0), VINF_SUCCESS);
206 RTTESTI_CHECK(!psz);
207
208 RTTESTI_CHECK(psz = RTStrDup(""));
209 RTTESTI_CHECK_RC(RTStrATruncate(&psz, 0), VINF_SUCCESS);
210 RTStrFree(psz);
211
212 RTTESTI_CHECK(psz = RTStrDup("1234567890"));
213 RTTESTI_CHECK_RC(RTStrATruncate(&psz, 5), VINF_SUCCESS);
214 RTTESTI_CHECK(!RTStrCmp(psz, "12345"));
215 RTStrFree(psz);
216
217 psz = NULL;
218 for (uint32_t i = 0; i < 128; i++)
219 RTTESTI_CHECK_RC_RETV(RTStrAAppend(&psz, "abcdefghijklmnopqrstuvwxyz"), VINF_SUCCESS);
220 RTTESTI_CHECK_RC(RTStrATruncate(&psz, sizeof("abcdefghijklmnopqrstuvwxyz") - 1), VINF_SUCCESS);
221 RTTESTI_CHECK(!RTStrCmp(psz, "abcdefghijklmnopqrstuvwxyz"));
222 RTTESTI_CHECK_RC(RTStrATruncate(&psz, 6), VINF_SUCCESS);
223 RTTESTI_CHECK(!RTStrCmp(psz, "abcdef"));
224 RTTESTI_CHECK_RC(RTStrATruncate(&psz, 1), VINF_SUCCESS);
225 RTTESTI_CHECK(!RTStrCmp(psz, "a"));
226 RTTESTI_CHECK_RC(RTStrATruncate(&psz, 0), VINF_SUCCESS);
227 RTTESTI_CHECK(!RTStrCmp(psz, ""));
228 RTStrFree(psz);
229
230}
231
232
233int main()
234{
235 RTTEST hTest;
236 int rc = RTTestInitAndCreate("tstRTStrAlloc", &hTest);
237 if (rc)
238 return rc;
239 RTTestBanner(hTest);
240
241 tst1();
242
243 return RTTestSummaryAndDestroy(hTest);
244}
245
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