master
cpp 143 lines 3.85 KB
Raw
1 /*++
2
3 Copyright (c) Microsoft. All rights reserved.
4
5 Module Name:
6
7 WSLCCLIEnvironmentOptionsUnitTests.cpp
8
9 Abstract:
10
11 Unit tests for Environment Options.
12
13 --*/
14
15 #include "precomp.h"
16 #include "windows/Common.h"
17 #include "WSLCCLITestHelpers.h"
18
19 #include "Argument.h"
20 #include "ArgumentConvertedTypes.h"
21 #include "ArgMap.h"
22 #include "EnvironmentOptions.h"
23
24 using namespace wsl::windows::wslc;
25 using namespace wsl::windows::wslc::argument;
26
27 using namespace WSLCTestHelpers;
28 using namespace WEX::Logging;
29 using namespace WEX::Common;
30 using namespace WEX::TestExecution;
31
32 namespace WSLCCLIEnvironmentOptionsUnitTests {
33
34 class WSLCCLIEnvironmentOptionsUnitTests
35 {
36 WSLC_TEST_CLASS(WSLCCLIEnvironmentOptionsUnitTests)
37
38 // Tests touch process-wide env state. ScopedEnvVariable captures any
39 // pre-existing value in setup, clears it, and restores it in cleanup so
40 // the suite is hermetic.
41 TEST_METHOD_SETUP(TestMethodSetup)
42 {
43 m_noColor = std::make_unique<ScopedEnvVariable>(L"NO_COLOR");
44 return true;
45 }
46
47 TEST_METHOD_CLEANUP(TestMethodCleanup)
48 {
49 m_noColor.reset();
50 return true;
51 }
52
53 TEST_METHOD(ApplyEnvironmentOptions_NoColorEmptyValue_SetsFlag)
54 {
55 m_noColor->Set(L"");
56
57 ArgMap target;
58 ApplyEnvironmentOptions(target, NoColorDefs());
59
60 VERIFY_IS_TRUE(target.Contains(ArgType::NoColor));
61 VERIFY_IS_TRUE(target.GetValue<ArgType::NoColor>());
62 }
63
64 // NO_COLOR spec: "0" / "false" / "no" / "off" are not opt-outs.
65 TEST_METHOD(ApplyEnvironmentOptions_NoColorFalsyLikeValues_StillSetFlag)
66 {
67 for (const auto* value : {L"0", L"false", L"FALSE", L"no", L"off"})
68 {
69 m_noColor->Set(value);
70
71 ArgMap target;
72 ApplyEnvironmentOptions(target, NoColorDefs());
73
74 LogComment(std::wstring(L"NO_COLOR=") + value);
75 VERIFY_IS_TRUE(target.Contains(ArgType::NoColor));
76 VERIFY_IS_TRUE(target.GetValue<ArgType::NoColor>());
77
78 m_noColor->Clear();
79 }
80 }
81
82 TEST_METHOD(ApplyEnvironmentOptions_NoColorArbitraryValue_SetsFlag)
83 {
84 m_noColor->Set(L"1");
85
86 ArgMap target;
87 ApplyEnvironmentOptions(target, NoColorDefs());
88
89 VERIFY_IS_TRUE(target.Contains(ArgType::NoColor));
90 VERIFY_IS_TRUE(target.GetValue<ArgType::NoColor>());
91 }
92
93 TEST_METHOD(ApplyEnvironmentOptions_NoColorAbsent_DoesNotSetFlag)
94 {
95 ArgMap target;
96 ApplyEnvironmentOptions(target, NoColorDefs());
97
98 VERIFY_IS_FALSE(target.Contains(ArgType::NoColor));
99 }
100
101 // Env-derived defaults are lowest precedence and must not overwrite.
102 TEST_METHOD(ApplyEnvironmentOptions_TargetAlreadyContainsArg_LeavesItUntouched)
103 {
104 m_noColor->Set(L"");
105
106 ArgMap target;
107 target.Add<ArgType::NoColor>(false);
108
109 ApplyEnvironmentOptions(target, NoColorDefs());
110
111 VERIFY_ARE_EQUAL(1U, target.Count(ArgType::NoColor));
112 VERIFY_IS_FALSE(target.GetValue<ArgType::NoColor>());
113 }
114
115 // Bindings outside definedArgs are ignored even if the env var is set.
116 // Verbose isn't bound to any env var and isn't NoColor, so it stays a
117 // valid "declared but unrelated" stand-in: declaring it alone must not
118 // cause NO_COLOR to leak into target.
119 TEST_METHOD(ApplyEnvironmentOptions_UndeclaredArg_IsIgnored)
120 {
121 m_noColor->Set(L"");
122
123 std::vector<Argument> defs;
124 defs.push_back(Argument::Create(ArgType::Verbose));
125
126 ArgMap target;
127 ApplyEnvironmentOptions(target, defs);
128
129 VERIFY_IS_FALSE(target.Contains(ArgType::NoColor));
130 }
131
132 private:
133 std::unique_ptr<ScopedEnvVariable> m_noColor;
134
135 static std::vector<Argument> NoColorDefs()
136 {
137 std::vector<Argument> defs;
138 defs.push_back(Argument::Create(ArgType::NoColor));
139 return defs;
140 }
141 };
142
143 } // namespace WSLCCLIEnvironmentOptionsUnitTests