VirtualBox

source: vbox/trunk/src/VBox/Runtime/testcase/tstRTStrCatCopy.cpp@ 66404

Last change on this file since 66404 was 62477, checked in by vboxsync, 8 years ago

(C) 2016

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.0 KB
Line 
1/* $Id: tstRTStrCatCopy.cpp 62477 2016-07-22 18:27:37Z vboxsync $ */
2/** @file
3 * IPRT Testcase - String Concatenation and Copy.
4 */
5
6/*
7 * Copyright (C) 2010-2016 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/test.h>
34
35
36static void testCopy1(RTTEST hTest)
37{
38 RTTestISub("RTStrCopy");
39
40 char *pszBuf4H = (char *)RTTestGuardedAllocHead(hTest, 4);
41 char *pszBuf4T = (char *)RTTestGuardedAllocTail(hTest, 4);
42 RTTESTI_CHECK_RC(RTStrCopy(pszBuf4H, 4, "abc"), VINF_SUCCESS);
43 RTTESTI_CHECK(strcmp(pszBuf4H, "abc") == 0);
44 RTTESTI_CHECK_RC(RTStrCopy(pszBuf4T, 4, "abc"), VINF_SUCCESS);
45 RTTESTI_CHECK(strcmp(pszBuf4T, "abc") == 0);
46
47 RT_BZERO(pszBuf4H, 4); RT_BZERO(pszBuf4T, 4);
48 RTTESTI_CHECK_RC(RTStrCopy(pszBuf4H, 4, "abcd"), VERR_BUFFER_OVERFLOW);
49 RTTESTI_CHECK(strcmp(pszBuf4H, "abc") == 0);
50 RTTESTI_CHECK_RC(RTStrCopy(pszBuf4T, 4, "abcd"), VERR_BUFFER_OVERFLOW);
51 RTTESTI_CHECK(strcmp(pszBuf4T, "abc") == 0);
52}
53
54
55static void testCopyEx1(RTTEST hTest)
56{
57 RTTestISub("RTStrCopyEx");
58
59 char *pszBuf4H = (char *)RTTestGuardedAllocHead(hTest, 4);
60 char *pszBuf4T = (char *)RTTestGuardedAllocTail(hTest, 4);
61 RTTESTI_CHECK_RC(RTStrCopyEx(pszBuf4H, 4, "abc", RTSTR_MAX), VINF_SUCCESS);
62 RTTESTI_CHECK(strcmp(pszBuf4H, "abc") == 0);
63 RTTESTI_CHECK_RC(RTStrCopyEx(pszBuf4T, 4, "abc", RTSTR_MAX), VINF_SUCCESS);
64 RTTESTI_CHECK(strcmp(pszBuf4T, "abc") == 0);
65
66 RT_BZERO(pszBuf4H, 4); RT_BZERO(pszBuf4T, 4);
67 RTTESTI_CHECK_RC(RTStrCopyEx(pszBuf4H, 4, "abcd", RTSTR_MAX), VERR_BUFFER_OVERFLOW);
68 RTTESTI_CHECK(strcmp(pszBuf4H, "abc") == 0);
69 RTTESTI_CHECK_RC(RTStrCopyEx(pszBuf4T, 4, "abcd", RTSTR_MAX), VERR_BUFFER_OVERFLOW);
70 RTTESTI_CHECK(strcmp(pszBuf4T, "abc") == 0);
71
72 RT_BZERO(pszBuf4H, 4); RT_BZERO(pszBuf4T, 4);
73 RTTESTI_CHECK_RC(RTStrCopyEx(pszBuf4H, 4, "abcd", 3), VINF_SUCCESS);
74 RTTESTI_CHECK(strcmp(pszBuf4H, "abc") == 0);
75 RTTESTI_CHECK_RC(RTStrCopyEx(pszBuf4T, 4, "abcd", 3), VINF_SUCCESS);
76 RTTESTI_CHECK(strcmp(pszBuf4T, "abc") == 0);
77
78 RT_BZERO(pszBuf4H, 4); RT_BZERO(pszBuf4T, 4);
79 RTTESTI_CHECK_RC(RTStrCopyEx(pszBuf4H, 4, "abcd", 2), VINF_SUCCESS);
80 RTTESTI_CHECK(strcmp(pszBuf4H, "ab") == 0);
81 RTTESTI_CHECK_RC(RTStrCopyEx(pszBuf4T, 4, "abcd", 2), VINF_SUCCESS);
82 RTTESTI_CHECK(strcmp(pszBuf4T, "ab") == 0);
83}
84
85
86static void testCat1(RTTEST hTest)
87{
88 RTTestISub("RTStrCat");
89
90 char *pszBuf4H = (char *)RTTestGuardedAllocHead(hTest, 4);
91 char *pszBuf4T = (char *)RTTestGuardedAllocTail(hTest, 4);
92 memset(pszBuf4T, 0xff, 4); *pszBuf4T = '\0';
93 RTTESTI_CHECK_RC(RTStrCat(pszBuf4H, 4, "abc"), VINF_SUCCESS);
94 RTTESTI_CHECK(strcmp(pszBuf4H, "abc") == 0);
95 memset(pszBuf4H, 0xff, 4); *pszBuf4H = '\0';
96 RTTESTI_CHECK_RC(RTStrCat(pszBuf4T, 4, "abc"), VINF_SUCCESS);
97 RTTESTI_CHECK(strcmp(pszBuf4T, "abc") == 0);
98
99 memset(pszBuf4T, 0xff, 4); strcpy(pszBuf4T, "a");
100 memset(pszBuf4H, 0xff, 4); strcpy(pszBuf4H, "a");
101 RTTESTI_CHECK_RC(RTStrCat(pszBuf4H, 4, "bc"), VINF_SUCCESS);
102 RTTESTI_CHECK(strcmp(pszBuf4H, "abc") == 0);
103 RTTESTI_CHECK_RC(RTStrCat(pszBuf4T, 4, "bc"), VINF_SUCCESS);
104 RTTESTI_CHECK(strcmp(pszBuf4T, "abc") == 0);
105
106 memset(pszBuf4T, 0xff, 4); strcpy(pszBuf4T, "ab");
107 memset(pszBuf4H, 0xff, 4); strcpy(pszBuf4H, "ab");
108 RTTESTI_CHECK_RC(RTStrCat(pszBuf4H, 4, "c"), VINF_SUCCESS);
109 RTTESTI_CHECK(strcmp(pszBuf4H, "abc") == 0);
110 RTTESTI_CHECK_RC(RTStrCat(pszBuf4T, 4, "c"), VINF_SUCCESS);
111 RTTESTI_CHECK(strcmp(pszBuf4T, "abc") == 0);
112
113 memset(pszBuf4T, 0xff, 4); strcpy(pszBuf4T, "abc");
114 memset(pszBuf4H, 0xff, 4); strcpy(pszBuf4H, "abc");
115 RTTESTI_CHECK_RC(RTStrCat(pszBuf4H, 4, ""), VINF_SUCCESS);
116 RTTESTI_CHECK(strcmp(pszBuf4H, "abc") == 0);
117 RTTESTI_CHECK_RC(RTStrCat(pszBuf4T, 4, ""), VINF_SUCCESS);
118 RTTESTI_CHECK(strcmp(pszBuf4T, "abc") == 0);
119
120 memset(pszBuf4T, 0xff, 4); strcpy(pszBuf4T, "");
121 memset(pszBuf4H, 0xff, 4); strcpy(pszBuf4H, "");
122 RTTESTI_CHECK_RC(RTStrCat(pszBuf4H, 4, "abcd"), VERR_BUFFER_OVERFLOW);
123 RTTESTI_CHECK(strcmp(pszBuf4H, "abc") == 0);
124 RTTESTI_CHECK_RC(RTStrCat(pszBuf4T, 4, "abcd"), VERR_BUFFER_OVERFLOW);
125 RTTESTI_CHECK(strcmp(pszBuf4T, "abc") == 0);
126
127 memset(pszBuf4T, 0xff, 4); strcpy(pszBuf4T, "ab");
128 memset(pszBuf4H, 0xff, 4); strcpy(pszBuf4H, "ab");
129 RTTESTI_CHECK_RC(RTStrCat(pszBuf4H, 4, "cd"), VERR_BUFFER_OVERFLOW);
130 RTTESTI_CHECK(strcmp(pszBuf4H, "abc") == 0);
131 RTTESTI_CHECK_RC(RTStrCat(pszBuf4T, 4, "cd"), VERR_BUFFER_OVERFLOW);
132 RTTESTI_CHECK(strcmp(pszBuf4T, "abc") == 0);
133
134 memset(pszBuf4T, 0xff, 4); strcpy(pszBuf4T, "abc");
135 memset(pszBuf4H, 0xff, 4); strcpy(pszBuf4H, "abc");
136 RTTESTI_CHECK_RC(RTStrCat(pszBuf4H, 4, "d"), VERR_BUFFER_OVERFLOW);
137 RTTESTI_CHECK(strcmp(pszBuf4H, "abc") == 0);
138 RTTESTI_CHECK_RC(RTStrCat(pszBuf4T, 4, "d"), VERR_BUFFER_OVERFLOW);
139 RTTESTI_CHECK(strcmp(pszBuf4T, "abc") == 0);
140}
141
142
143static void testCatEx1(RTTEST hTest)
144{
145 RTTestISub("RTStrCatEx");
146
147 char *pszBuf4H = (char *)RTTestGuardedAllocHead(hTest, 4);
148 char *pszBuf4T = (char *)RTTestGuardedAllocTail(hTest, 4);
149 memset(pszBuf4T, 0xff, 4); *pszBuf4T = '\0';
150 RTTESTI_CHECK_RC(RTStrCatEx(pszBuf4H, 4, "abc", RTSTR_MAX), VINF_SUCCESS);
151 RTTESTI_CHECK(strcmp(pszBuf4H, "abc") == 0);
152 memset(pszBuf4H, 0xff, 4); *pszBuf4H = '\0';
153 RTTESTI_CHECK_RC(RTStrCatEx(pszBuf4T, 4, "abc", RTSTR_MAX), VINF_SUCCESS);
154 RTTESTI_CHECK(strcmp(pszBuf4T, "abc") == 0);
155
156 memset(pszBuf4T, 0xff, 4); strcpy(pszBuf4T, "a");
157 memset(pszBuf4H, 0xff, 4); strcpy(pszBuf4H, "a");
158 RTTESTI_CHECK_RC(RTStrCatEx(pszBuf4H, 4, "bc", 2), VINF_SUCCESS);
159 RTTESTI_CHECK(strcmp(pszBuf4H, "abc") == 0);
160 RTTESTI_CHECK_RC(RTStrCatEx(pszBuf4T, 4, "bc", 2), VINF_SUCCESS);
161 RTTESTI_CHECK(strcmp(pszBuf4T, "abc") == 0);
162
163 memset(pszBuf4T, 0xff, 4); strcpy(pszBuf4T, "ab");
164 memset(pszBuf4H, 0xff, 4); strcpy(pszBuf4H, "ab");
165 RTTESTI_CHECK_RC(RTStrCatEx(pszBuf4H, 4, "c", 1), VINF_SUCCESS);
166 RTTESTI_CHECK(strcmp(pszBuf4H, "abc") == 0);
167 RTTESTI_CHECK_RC(RTStrCatEx(pszBuf4T, 4, "c", 1), VINF_SUCCESS);
168 RTTESTI_CHECK(strcmp(pszBuf4T, "abc") == 0);
169
170 memset(pszBuf4T, 0xff, 4); strcpy(pszBuf4T, "abc");
171 memset(pszBuf4H, 0xff, 4); strcpy(pszBuf4H, "abc");
172 RTTESTI_CHECK_RC(RTStrCatEx(pszBuf4H, 4, "defg", 0), VINF_SUCCESS);
173 RTTESTI_CHECK(strcmp(pszBuf4H, "abc") == 0);
174 RTTESTI_CHECK_RC(RTStrCatEx(pszBuf4T, 4, "defg", 0), VINF_SUCCESS);
175 RTTESTI_CHECK(strcmp(pszBuf4T, "abc") == 0);
176
177 memset(pszBuf4T, 0xff, 4); strcpy(pszBuf4T, "");
178 memset(pszBuf4H, 0xff, 4); strcpy(pszBuf4H, "");
179 RTTESTI_CHECK_RC(RTStrCatEx(pszBuf4H, 4, "abcd", 4), VERR_BUFFER_OVERFLOW);
180 RTTESTI_CHECK(strcmp(pszBuf4H, "abc") == 0);
181 RTTESTI_CHECK_RC(RTStrCatEx(pszBuf4T, 4, "abcd", 4), VERR_BUFFER_OVERFLOW);
182 RTTESTI_CHECK(strcmp(pszBuf4T, "abc") == 0);
183
184 memset(pszBuf4T, 0xff, 4); strcpy(pszBuf4T, "ab");
185 memset(pszBuf4H, 0xff, 4); strcpy(pszBuf4H, "ab");
186 RTTESTI_CHECK_RC(RTStrCatEx(pszBuf4H, 4, "cdefg", 2), VERR_BUFFER_OVERFLOW);
187 RTTESTI_CHECK(strcmp(pszBuf4H, "abc") == 0);
188 RTTESTI_CHECK_RC(RTStrCatEx(pszBuf4T, 4, "cdefg", 2), VERR_BUFFER_OVERFLOW);
189 RTTESTI_CHECK(strcmp(pszBuf4T, "abc") == 0);
190
191 memset(pszBuf4T, 0xff, 4); strcpy(pszBuf4T, "abc");
192 memset(pszBuf4H, 0xff, 4); strcpy(pszBuf4H, "abc");
193 RTTESTI_CHECK_RC(RTStrCatEx(pszBuf4H, 4, "de", 1), VERR_BUFFER_OVERFLOW);
194 RTTESTI_CHECK(strcmp(pszBuf4H, "abc") == 0);
195 RTTESTI_CHECK_RC(RTStrCatEx(pszBuf4T, 4, "de", 1), VERR_BUFFER_OVERFLOW);
196 RTTESTI_CHECK(strcmp(pszBuf4T, "abc") == 0);
197}
198
199
200
201int main()
202{
203 RTTEST hTest;
204 RTEXITCODE rcExit = RTTestInitAndCreate("tstRTStrCatCopy", &hTest);
205 if (rcExit != RTEXITCODE_SUCCESS)
206 return rcExit;
207
208 testCopy1(hTest);
209 testCopyEx1(hTest);
210 testCat1(hTest);
211 testCatEx1(hTest);
212
213 return RTTestSummaryAndDestroy(hTest);
214}
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