VirtualBox

source: vbox/trunk/src/VBox/Runtime/testcase/tstRTEnv.cpp@ 80827

最後變更 在這個檔案從80827是 80827,由 vboxsync 提交於 6 年 前

IPRT: Added RTEnvCreateEx and RTEnvCreateChangeRecordEx so flags can be specified when creating custom environments. Defined one flag RTENV_CREATE_F_ALLOW_EQUAL_FIRST_IN_VAR for accomodating windows style environment variables (used for CWD by driver letter). The flag is set by default on windows hosts, however it does not work for the default environment due to CRT limitations.

  • 屬性 svn:eol-style 設為 native
  • 屬性 svn:keywords 設為 Id Revision
檔案大小: 12.1 KB
 
1/* $Id: tstRTEnv.cpp 80827 2019-09-16 14:04:02Z vboxsync $ */
2/** @file
3 * IPRT Testcase - Environment.
4 */
5
6/*
7 * Copyright (C) 2007-2019 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.alldomusa.eu.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/env.h>
32#include <iprt/err.h>
33#include <iprt/string.h>
34#include <iprt/test.h>
35
36
37int main()
38{
39 RTTEST hTest;
40 RTEXITCODE rcExit = RTTestInitAndCreate("tstRTEnv", &hTest);
41 if (rcExit != RTEXITCODE_SUCCESS)
42 return rcExit;
43 RTTestBanner(hTest);
44
45#define CHECK(expr) RTTEST_CHECK(hTest, expr)
46#define CHECK_RC(expr, rc) RTTEST_CHECK_RC(hTest, expr, rc)
47#define CHECK_STR(str1, str2) do { if (strcmp(str1, str2)) { RTTestFailed(hTest, "line %u: '%s' != '%s' (*)", __LINE__, str1, str2); } } while (0)
48
49 RTTestSub(hTest, "Basics");
50
51 /*
52 * Try mess around with the path a bit.
53 */
54#ifdef RT_OS_WINDOWS
55 static const char * const k_pszPathVar = "Path";
56#else
57 static const char * const k_pszPathVar = "PATH";
58#endif
59 static const char * const k_pszNonExistantVar = "IPRT_I_DON_T_EXIST";
60
61 CHECK(RTEnvExist(k_pszPathVar));
62 CHECK(RTEnvExistEx(RTENV_DEFAULT, k_pszPathVar));
63 CHECK(!RTEnvExist(k_pszNonExistantVar));
64 CHECK(!RTEnvExistEx(RTENV_DEFAULT, k_pszNonExistantVar));
65
66 CHECK(RTEnvGet(k_pszPathVar) != NULL);
67 char szBuf[8192];
68 size_t cch;
69 CHECK_RC(RTEnvGetEx(RTENV_DEFAULT, k_pszPathVar, NULL, 0, &cch), VINF_SUCCESS);
70 CHECK(cch < sizeof(szBuf));
71 CHECK_RC(RTEnvGetEx(RTENV_DEFAULT, k_pszPathVar, szBuf, sizeof(szBuf), &cch), VINF_SUCCESS);
72 CHECK_RC(RTEnvGetEx(RTENV_DEFAULT, k_pszPathVar, szBuf, sizeof(szBuf), NULL), VINF_SUCCESS);
73 CHECK_RC(RTEnvGetEx(RTENV_DEFAULT, k_pszPathVar, szBuf, 1, &cch), VERR_BUFFER_OVERFLOW);
74 CHECK_RC(RTEnvGetEx(RTENV_DEFAULT, k_pszPathVar, szBuf, 1, NULL), VERR_BUFFER_OVERFLOW);
75
76 /* ditto for a clone. */
77 RTENV Env;
78 CHECK_RC(RTEnvClone(&Env, RTENV_DEFAULT), VINF_SUCCESS);
79
80 CHECK(RTEnvExistEx(Env, k_pszPathVar));
81 CHECK(!RTEnvExistEx(Env, k_pszNonExistantVar));
82
83 CHECK_RC(RTEnvGetEx(Env, k_pszPathVar, NULL, 0, &cch), VINF_SUCCESS);
84 CHECK(cch < sizeof(szBuf));
85 CHECK_RC(RTEnvGetEx(Env, k_pszPathVar, szBuf, sizeof(szBuf), &cch), VINF_SUCCESS);
86 CHECK_RC(RTEnvGetEx(Env, k_pszPathVar, szBuf, sizeof(szBuf), NULL), VINF_SUCCESS);
87 CHECK_RC(RTEnvGetEx(Env, k_pszPathVar, szBuf, 1, &cch), VERR_BUFFER_OVERFLOW);
88 CHECK_RC(RTEnvGetEx(Env, k_pszPathVar, szBuf, 1, NULL), VERR_BUFFER_OVERFLOW);
89
90 /*
91 * Set and Unset
92 */
93 CHECK_RC(RTEnvSetEx(RTENV_DEFAULT, "IPRTMyNewVar", "MyValue1"), VINF_SUCCESS);
94 CHECK_RC(RTEnvGetEx(RTENV_DEFAULT, "IPRTMyNewVar", szBuf, sizeof(szBuf), &cch), VINF_SUCCESS);
95 CHECK_STR(szBuf, "MyValue1");
96 CHECK_RC(RTEnvSetEx(RTENV_DEFAULT, "IPRTMyNewVar", "MyValue2"), VINF_SUCCESS);
97 CHECK_RC(RTEnvGetEx(RTENV_DEFAULT, "IPRTMyNewVar", szBuf, sizeof(szBuf), &cch), VINF_SUCCESS);
98 CHECK_STR(szBuf, "MyValue2");
99
100 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar", "MyValue1"), VINF_SUCCESS);
101 CHECK_RC(RTEnvGetEx(Env, "IPRTMyNewVar", szBuf, sizeof(szBuf), &cch), VINF_SUCCESS);
102 CHECK_STR(szBuf, "MyValue1");
103 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar", "MyValue2"), VINF_SUCCESS);
104 CHECK_RC(RTEnvGetEx(Env, "IPRTMyNewVar", szBuf, sizeof(szBuf), &cch), VINF_SUCCESS);
105 CHECK_STR(szBuf, "MyValue2");
106
107 CHECK_RC(RTEnvUnsetEx(Env, "IPRTMyNewVar"), VINF_SUCCESS);
108 CHECK_RC(RTEnvGetEx(Env, "IPRTMyNewVar", szBuf, sizeof(szBuf), &cch), VERR_ENV_VAR_NOT_FOUND);
109 CHECK_RC(RTEnvUnsetEx(Env, "IPRTMyNewVar"), VINF_ENV_VAR_NOT_FOUND);
110
111 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar0", "MyValue0"), VINF_SUCCESS);
112 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar1", "MyValue1"), VINF_SUCCESS);
113 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar2", "MyValue2"), VINF_SUCCESS);
114 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar3", "MyValue3"), VINF_SUCCESS);
115 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar4", "MyValue4"), VINF_SUCCESS);
116 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar5", "MyValue5"), VINF_SUCCESS);
117 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar6", "MyValue6"), VINF_SUCCESS);
118 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar7", "MyValue7"), VINF_SUCCESS);
119 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar8", "MyValue8"), VINF_SUCCESS);
120 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar9", "MyValue9"), VINF_SUCCESS);
121 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar10", "MyValue10"), VINF_SUCCESS);
122 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar11", "MyValue11"), VINF_SUCCESS);
123 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar12", "MyValue12"), VINF_SUCCESS);
124 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar13", "MyValue13"), VINF_SUCCESS);
125 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar14", "MyValue14"), VINF_SUCCESS);
126 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar15", "MyValue15"), VINF_SUCCESS);
127 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar16", "MyValue16"), VINF_SUCCESS);
128 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar17", "MyValue17"), VINF_SUCCESS);
129 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar18", "MyValue18"), VINF_SUCCESS);
130 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar19", "MyValue19"), VINF_SUCCESS);
131 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar20", "MyValue20"), VINF_SUCCESS);
132 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar21", "MyValue21"), VINF_SUCCESS);
133 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar22", "MyValue22"), VINF_SUCCESS);
134 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar23", "MyValue23"), VINF_SUCCESS);
135 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar24", "MyValue24"), VINF_SUCCESS);
136 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar25", "MyValue25"), VINF_SUCCESS);
137 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar26", "MyValue26"), VINF_SUCCESS);
138 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar27", "MyValue27"), VINF_SUCCESS);
139 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar28", "MyValue28"), VINF_SUCCESS);
140 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar29", "MyValue29"), VINF_SUCCESS);
141 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar30", "MyValue30"), VINF_SUCCESS);
142 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar31", "MyValue31"), VINF_SUCCESS);
143 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar32", "MyValue32"), VINF_SUCCESS);
144 CHECK_RC(RTEnvSetEx(Env, "IPRTMyNewVar33", "MyValue33"), VINF_SUCCESS);
145 CHECK_RC(RTEnvGetEx(Env, "IPRTMyNewVar30", szBuf, sizeof(szBuf), &cch), VINF_SUCCESS);
146 CHECK_STR(szBuf, "MyValue30");
147 CHECK_RC(RTEnvGetEx(Env, "IPRTMyNewVar31", szBuf, sizeof(szBuf), &cch), VINF_SUCCESS);
148 CHECK_STR(szBuf, "MyValue31");
149 CHECK_RC(RTEnvGetEx(Env, "IPRTMyNewVar32", szBuf, sizeof(szBuf), &cch), VINF_SUCCESS);
150 CHECK_STR(szBuf, "MyValue32");
151 CHECK_RC(RTEnvGetEx(Env, "IPRTMyNewVar33", szBuf, sizeof(szBuf), &cch), VINF_SUCCESS);
152 CHECK_STR(szBuf, "MyValue33");
153
154 CHECK_RC(RTEnvUnsetEx(Env, "IPRTMyNewVar33"), VINF_SUCCESS);
155 CHECK(!RTEnvExistEx(Env, "IPRTMyNewVar33"));
156 CHECK_RC(RTEnvGetEx(Env, "IPRTMyNewVar33", szBuf, sizeof(szBuf), &cch), VERR_ENV_VAR_NOT_FOUND);
157 CHECK_RC(RTEnvGetEx(Env, "IPRTMyNewVar32", szBuf, sizeof(szBuf), &cch), VINF_SUCCESS);
158 CHECK_STR(szBuf, "MyValue32");
159 CHECK_RC(RTEnvGetEx(Env, "IPRTMyNewVar15", szBuf, sizeof(szBuf), &cch), VINF_SUCCESS);
160 CHECK_STR(szBuf, "MyValue15");
161
162 CHECK_RC(RTEnvUnsetEx(Env, "IPRTMyNewVar3"), VINF_SUCCESS);
163 CHECK(!RTEnvExistEx(Env, "IPRTMyNewVar3"));
164 CHECK_RC(RTEnvGetEx(Env, "IPRTMyNewVar3", szBuf, sizeof(szBuf), &cch), VERR_ENV_VAR_NOT_FOUND);
165 CHECK_RC(RTEnvGetEx(Env, "IPRTMyNewVar32", szBuf, sizeof(szBuf), &cch), VINF_SUCCESS);
166 CHECK_STR(szBuf, "MyValue32");
167 CHECK_RC(RTEnvGetEx(Env, "IPRTMyNewVar15", szBuf, sizeof(szBuf), &cch), VINF_SUCCESS);
168 CHECK_STR(szBuf, "MyValue15");
169
170 CHECK_RC(RTEnvUnsetEx(Env, k_pszPathVar), VINF_SUCCESS);
171 CHECK(!RTEnvExistEx(Env, k_pszPathVar));
172 CHECK_RC(RTEnvGetEx(Env, "IPRTMyNewVar32", szBuf, sizeof(szBuf), &cch), VINF_SUCCESS);
173 CHECK_STR(szBuf, "MyValue32");
174 CHECK_RC(RTEnvGetEx(Env, "IPRTMyNewVar15", szBuf, sizeof(szBuf), &cch), VINF_SUCCESS);
175 CHECK_STR(szBuf, "MyValue15");
176
177 RTTestDisableAssertions(hTest);
178#ifdef RT_OS_WINDOWS
179 CHECK_RC(RTEnvSetEx(Env, "=C:", "C:\\Temp"), VINF_SUCCESS);
180 CHECK_RC(RTEnvGetEx(Env, "=C:", szBuf, sizeof(szBuf), &cch), VINF_SUCCESS);
181 CHECK_STR(szBuf, "C:\\Temp");
182#else
183 CHECK_RC(RTEnvSetEx(Env, "=C:", "C:\\Temp"), VERR_ENV_INVALID_VAR_NAME);
184 CHECK_RC(RTEnvSetEx(Env, "=", ""), VERR_ENV_INVALID_VAR_NAME);
185#endif
186 CHECK_RC(RTEnvSetEx(Env, "", ""), VERR_ENV_INVALID_VAR_NAME);
187 RTTestRestoreAssertions(hTest);
188
189 /*
190 * Put.
191 */
192 RTTestSub(hTest, "RTEnvPutEx");
193 CHECK_RC(RTEnvPutEx(Env, "IPRTMyNewVar28"), VINF_SUCCESS);
194 CHECK(!RTEnvExistEx(Env, "IPRTMyNewVar28"));
195 CHECK_RC(RTEnvGetEx(Env, "IPRTMyNewVar32", szBuf, sizeof(szBuf), &cch), VINF_SUCCESS);
196 CHECK_STR(szBuf, "MyValue32");
197 CHECK_RC(RTEnvGetEx(Env, "IPRTMyNewVar15", szBuf, sizeof(szBuf), &cch), VINF_SUCCESS);
198 CHECK_STR(szBuf, "MyValue15");
199
200 CHECK_RC(RTEnvPutEx(Env, "IPRTMyNewVar28=MyValue28"), VINF_SUCCESS);
201 CHECK_RC(RTEnvGetEx(Env, "IPRTMyNewVar28", szBuf, sizeof(szBuf), &cch), VINF_SUCCESS);
202 CHECK_STR(szBuf, "MyValue28");
203 CHECK_RC(RTEnvGetEx(Env, "IPRTMyNewVar32", szBuf, sizeof(szBuf), &cch), VINF_SUCCESS);
204 CHECK_STR(szBuf, "MyValue32");
205 CHECK_RC(RTEnvGetEx(Env, "IPRTMyNewVar15", szBuf, sizeof(szBuf), &cch), VINF_SUCCESS);
206 CHECK_STR(szBuf, "MyValue15");
207
208 RTTestDisableAssertions(hTest);
209#ifdef RT_OS_WINDOWS
210 CHECK_RC(RTEnvPutEx(Env, "=D:=D:\\Temp"), VINF_SUCCESS);
211 CHECK_RC(RTEnvGetEx(Env, "=D:", szBuf, sizeof(szBuf), &cch), VINF_SUCCESS);
212 CHECK_STR(szBuf, "D:\\Temp");
213#else
214 CHECK_RC(RTEnvPutEx(Env, "=D:=D:\\Temp"), VERR_ENV_INVALID_VAR_NAME);
215 CHECK_RC(RTEnvPutEx(Env, "="), VERR_ENV_INVALID_VAR_NAME);
216#endif
217 CHECK_RC(RTEnvPutEx(Env, ""), VERR_ENV_INVALID_VAR_NAME);
218 RTTestRestoreAssertions(hTest);
219
220 /*
221 * Dup.
222 */
223 RTTestSub(hTest, "RTEnvDupEx");
224 char *psz1;
225 CHECK(RTEnvDupEx(Env, "NonExistantVariable") == NULL);
226 psz1 = RTEnvDupEx(Env, "IPRTMyNewVar15");
227 CHECK(psz1);
228 if (psz1)
229 CHECK_STR(psz1, "MyValue15");
230 RTStrFree(psz1);
231
232 static char s_szBigValue[10999];
233 memset(s_szBigValue, 'a', sizeof(s_szBigValue));
234 s_szBigValue[sizeof(s_szBigValue) - 1] = '\0';
235 CHECK_RC(RTEnvSetEx(Env, "IPRTBigValue", s_szBigValue), VINF_SUCCESS);
236 psz1 = RTEnvDupEx(Env, "IPRTBigValue");
237 CHECK(psz1);
238 if (psz1)
239 CHECK_STR(psz1, s_szBigValue);
240 RTStrFree(psz1);
241
242 /*
243 * Another cloning.
244 */
245 RTTestSub(hTest, "RTEnvClone");
246 RTENV Env2;
247 CHECK_RC(RTEnvClone(&Env2, Env), VINF_SUCCESS);
248 CHECK_RC(RTEnvDestroy(Env2), VINF_SUCCESS);
249
250 /*
251 * execve envp and we're done.
252 */
253 RTTestSub(hTest, "RTEnvGetExecEnvP");
254 const char * const *papsz = RTEnvGetExecEnvP(RTENV_DEFAULT);
255 CHECK(papsz != NULL);
256 papsz = RTEnvGetExecEnvP(RTENV_DEFAULT);
257 CHECK(papsz != NULL);
258
259 papsz = RTEnvGetExecEnvP(Env);
260 CHECK(papsz != NULL);
261 papsz = RTEnvGetExecEnvP(Env);
262 CHECK(papsz != NULL);
263
264 CHECK_RC(RTEnvDestroy(Env), VINF_SUCCESS);
265
266 /*
267 * Summary
268 */
269 return RTTestSummaryAndDestroy(hTest);
270}
271
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

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