xref: /aosp_15_r20/external/cronet/base/process/environment_internal_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2019 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/process/environment_internal.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <memory>
8*6777b538SAndroid Build Coastguard Worker #include <vector>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
11*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
12*6777b538SAndroid Build Coastguard Worker #include "testing/platform_test.h"
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker using EnvironmentInternalTest = PlatformTest;
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker namespace base {
17*6777b538SAndroid Build Coastguard Worker namespace internal {
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker namespace {
ExpectEnvironmentBlock(const std::vector<std::wstring> & vars,const std::wstring & block)22*6777b538SAndroid Build Coastguard Worker void ExpectEnvironmentBlock(const std::vector<std::wstring>& vars,
23*6777b538SAndroid Build Coastguard Worker                             const std::wstring& block) {
24*6777b538SAndroid Build Coastguard Worker   std::wstring expected;
25*6777b538SAndroid Build Coastguard Worker   for (const auto& var : vars) {
26*6777b538SAndroid Build Coastguard Worker     expected += var;
27*6777b538SAndroid Build Coastguard Worker     expected.push_back('\0');
28*6777b538SAndroid Build Coastguard Worker   }
29*6777b538SAndroid Build Coastguard Worker   expected.push_back('\0');
30*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected, block);
31*6777b538SAndroid Build Coastguard Worker }
32*6777b538SAndroid Build Coastguard Worker }  // namespace
33*6777b538SAndroid Build Coastguard Worker 
TEST_F(EnvironmentInternalTest,AlterEnvironment)34*6777b538SAndroid Build Coastguard Worker TEST_F(EnvironmentInternalTest, AlterEnvironment) {
35*6777b538SAndroid Build Coastguard Worker   const wchar_t empty[] = {'\0'};
36*6777b538SAndroid Build Coastguard Worker   const wchar_t a2[] = {'A', '=', '2', '\0', '\0'};
37*6777b538SAndroid Build Coastguard Worker   const wchar_t a2b3[] = {'A', '=', '2', '\0', 'B', '=', '3', '\0', '\0'};
38*6777b538SAndroid Build Coastguard Worker   EnvironmentMap changes;
39*6777b538SAndroid Build Coastguard Worker   NativeEnvironmentString e;
40*6777b538SAndroid Build Coastguard Worker 
41*6777b538SAndroid Build Coastguard Worker   e = AlterEnvironment(empty, changes);
42*6777b538SAndroid Build Coastguard Worker   ExpectEnvironmentBlock({}, e);
43*6777b538SAndroid Build Coastguard Worker 
44*6777b538SAndroid Build Coastguard Worker   changes[L"A"] = L"1";
45*6777b538SAndroid Build Coastguard Worker   e = AlterEnvironment(empty, changes);
46*6777b538SAndroid Build Coastguard Worker   ExpectEnvironmentBlock({L"A=1"}, e);
47*6777b538SAndroid Build Coastguard Worker 
48*6777b538SAndroid Build Coastguard Worker   changes.clear();
49*6777b538SAndroid Build Coastguard Worker   changes[L"A"] = std::wstring();
50*6777b538SAndroid Build Coastguard Worker   e = AlterEnvironment(empty, changes);
51*6777b538SAndroid Build Coastguard Worker   ExpectEnvironmentBlock({}, e);
52*6777b538SAndroid Build Coastguard Worker 
53*6777b538SAndroid Build Coastguard Worker   changes.clear();
54*6777b538SAndroid Build Coastguard Worker   e = AlterEnvironment(a2, changes);
55*6777b538SAndroid Build Coastguard Worker   ExpectEnvironmentBlock({L"A=2"}, e);
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker   changes.clear();
58*6777b538SAndroid Build Coastguard Worker   changes[L"A"] = L"1";
59*6777b538SAndroid Build Coastguard Worker   e = AlterEnvironment(a2, changes);
60*6777b538SAndroid Build Coastguard Worker   ExpectEnvironmentBlock({L"A=1"}, e);
61*6777b538SAndroid Build Coastguard Worker 
62*6777b538SAndroid Build Coastguard Worker   changes.clear();
63*6777b538SAndroid Build Coastguard Worker   changes[L"A"] = std::wstring();
64*6777b538SAndroid Build Coastguard Worker   e = AlterEnvironment(a2, changes);
65*6777b538SAndroid Build Coastguard Worker   ExpectEnvironmentBlock({}, e);
66*6777b538SAndroid Build Coastguard Worker 
67*6777b538SAndroid Build Coastguard Worker   changes.clear();
68*6777b538SAndroid Build Coastguard Worker   changes[L"A"] = std::wstring();
69*6777b538SAndroid Build Coastguard Worker   changes[L"B"] = std::wstring();
70*6777b538SAndroid Build Coastguard Worker   e = AlterEnvironment(a2b3, changes);
71*6777b538SAndroid Build Coastguard Worker   ExpectEnvironmentBlock({}, e);
72*6777b538SAndroid Build Coastguard Worker 
73*6777b538SAndroid Build Coastguard Worker   changes.clear();
74*6777b538SAndroid Build Coastguard Worker   changes[L"A"] = std::wstring();
75*6777b538SAndroid Build Coastguard Worker   e = AlterEnvironment(a2b3, changes);
76*6777b538SAndroid Build Coastguard Worker   ExpectEnvironmentBlock({L"B=3"}, e);
77*6777b538SAndroid Build Coastguard Worker 
78*6777b538SAndroid Build Coastguard Worker   changes.clear();
79*6777b538SAndroid Build Coastguard Worker   changes[L"B"] = std::wstring();
80*6777b538SAndroid Build Coastguard Worker   e = AlterEnvironment(a2b3, changes);
81*6777b538SAndroid Build Coastguard Worker   ExpectEnvironmentBlock({L"A=2"}, e);
82*6777b538SAndroid Build Coastguard Worker 
83*6777b538SAndroid Build Coastguard Worker   changes.clear();
84*6777b538SAndroid Build Coastguard Worker   changes[L"A"] = L"1";
85*6777b538SAndroid Build Coastguard Worker   changes[L"C"] = L"4";
86*6777b538SAndroid Build Coastguard Worker   e = AlterEnvironment(a2b3, changes);
87*6777b538SAndroid Build Coastguard Worker   // AlterEnvironment() currently always puts changed entries at the end.
88*6777b538SAndroid Build Coastguard Worker   ExpectEnvironmentBlock({L"B=3", L"A=1", L"C=4"}, e);
89*6777b538SAndroid Build Coastguard Worker }
90*6777b538SAndroid Build Coastguard Worker 
91*6777b538SAndroid Build Coastguard Worker #else  // !BUILDFLAG(IS_WIN)
92*6777b538SAndroid Build Coastguard Worker 
93*6777b538SAndroid Build Coastguard Worker TEST_F(EnvironmentInternalTest, AlterEnvironment) {
94*6777b538SAndroid Build Coastguard Worker   const char* const empty[] = {nullptr};
95*6777b538SAndroid Build Coastguard Worker   const char* const a2[] = {"A=2", nullptr};
96*6777b538SAndroid Build Coastguard Worker   const char* const a2b3[] = {"A=2", "B=3", nullptr};
97*6777b538SAndroid Build Coastguard Worker   EnvironmentMap changes;
98*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<char*[]> e;
99*6777b538SAndroid Build Coastguard Worker 
100*6777b538SAndroid Build Coastguard Worker   e = AlterEnvironment(empty, changes);
101*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(e[0] == nullptr);
102*6777b538SAndroid Build Coastguard Worker 
103*6777b538SAndroid Build Coastguard Worker   changes["A"] = "1";
104*6777b538SAndroid Build Coastguard Worker   e = AlterEnvironment(empty, changes);
105*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::string("A=1"), e[0]);
106*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(e[1] == nullptr);
107*6777b538SAndroid Build Coastguard Worker 
108*6777b538SAndroid Build Coastguard Worker   changes.clear();
109*6777b538SAndroid Build Coastguard Worker   changes["A"] = std::string();
110*6777b538SAndroid Build Coastguard Worker   e = AlterEnvironment(empty, changes);
111*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(e[0] == nullptr);
112*6777b538SAndroid Build Coastguard Worker 
113*6777b538SAndroid Build Coastguard Worker   changes.clear();
114*6777b538SAndroid Build Coastguard Worker   e = AlterEnvironment(a2, changes);
115*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::string("A=2"), e[0]);
116*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(e[1] == nullptr);
117*6777b538SAndroid Build Coastguard Worker 
118*6777b538SAndroid Build Coastguard Worker   changes.clear();
119*6777b538SAndroid Build Coastguard Worker   changes["A"] = "1";
120*6777b538SAndroid Build Coastguard Worker   e = AlterEnvironment(a2, changes);
121*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::string("A=1"), e[0]);
122*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(e[1] == nullptr);
123*6777b538SAndroid Build Coastguard Worker 
124*6777b538SAndroid Build Coastguard Worker   changes.clear();
125*6777b538SAndroid Build Coastguard Worker   changes["A"] = std::string();
126*6777b538SAndroid Build Coastguard Worker   e = AlterEnvironment(a2, changes);
127*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(e[0] == nullptr);
128*6777b538SAndroid Build Coastguard Worker 
129*6777b538SAndroid Build Coastguard Worker   changes.clear();
130*6777b538SAndroid Build Coastguard Worker   changes["A"] = std::string();
131*6777b538SAndroid Build Coastguard Worker   changes["B"] = std::string();
132*6777b538SAndroid Build Coastguard Worker   e = AlterEnvironment(a2b3, changes);
133*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(e[0] == nullptr);
134*6777b538SAndroid Build Coastguard Worker 
135*6777b538SAndroid Build Coastguard Worker   changes.clear();
136*6777b538SAndroid Build Coastguard Worker   changes["A"] = std::string();
137*6777b538SAndroid Build Coastguard Worker   e = AlterEnvironment(a2b3, changes);
138*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::string("B=3"), e[0]);
139*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(e[1] == nullptr);
140*6777b538SAndroid Build Coastguard Worker 
141*6777b538SAndroid Build Coastguard Worker   changes.clear();
142*6777b538SAndroid Build Coastguard Worker   changes["B"] = std::string();
143*6777b538SAndroid Build Coastguard Worker   e = AlterEnvironment(a2b3, changes);
144*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::string("A=2"), e[0]);
145*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(e[1] == nullptr);
146*6777b538SAndroid Build Coastguard Worker 
147*6777b538SAndroid Build Coastguard Worker   changes.clear();
148*6777b538SAndroid Build Coastguard Worker   changes["A"] = "1";
149*6777b538SAndroid Build Coastguard Worker   changes["C"] = "4";
150*6777b538SAndroid Build Coastguard Worker   e = AlterEnvironment(a2b3, changes);
151*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::string("B=3"), e[0]);
152*6777b538SAndroid Build Coastguard Worker   // AlterEnvironment() currently always puts changed entries at the end.
153*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::string("A=1"), e[1]);
154*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::string("C=4"), e[2]);
155*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(e[3] == nullptr);
156*6777b538SAndroid Build Coastguard Worker }
157*6777b538SAndroid Build Coastguard Worker 
158*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_WIN)
159*6777b538SAndroid Build Coastguard Worker 
160*6777b538SAndroid Build Coastguard Worker }  // namespace internal
161*6777b538SAndroid Build Coastguard Worker }  // namespace base
162