master
cpp 221 lines 8.6 KB
Raw
1 /*++
2
3 Copyright (c) Microsoft. All rights reserved.
4
5 Module Name:
6
7 WSLCE2ENetworkPruneTests.cpp
8
9 Abstract:
10
11 This file contains end-to-end tests for the WSLC network prune command.
12 --*/
13
14 #include "precomp.h"
15 #include "windows/Common.h"
16 #include "WSLCExecutor.h"
17 #include "WSLCE2EHelpers.h"
18 #include "TestImageRegistry.h"
19
20 namespace WSLCE2ETests {
21 using namespace wsl::shared;
22
23 class WSLCE2ENetworkPruneTests
24 {
25 WSLC_TEST_CLASS(WSLCE2ENetworkPruneTests)
26
27 TEST_CLASS_SETUP(ClassSetup)
28 {
29 TestImageRegistry::Instance().EnsureLoaded(DebianImage);
30 CleanUpAllTestState();
31 return true;
32 }
33
34 TEST_METHOD_SETUP(MethodSetup)
35 {
36 CleanUpAllTestState();
37 return true;
38 }
39
40 TEST_CLASS_CLEANUP(ClassCleanup)
41 {
42 CleanUpAllTestState();
43 return true;
44 }
45
46 WSLC_TEST_METHOD(WSLCE2E_Network_Prune_HelpCommand)
47 {
48 const auto result = RunWslc(L"network prune --help");
49 result.Verify({.Stderr = L"", .ExitCode = 0});
50 VERIFY_IS_FALSE(result.Stdout.value().empty());
51 }
52
53 WSLC_TEST_METHOD(WSLCE2E_Network_Prune_NoNetworks)
54 {
55 // Prune when no unused networks exist should succeed without reporting any of our test networks.
56 const auto result = RunWslc(L"network prune");
57 result.Verify({.Stderr = L"", .ExitCode = 0});
58
59 VERIFY_IS_FALSE(result.StdoutContainsLine(TestNetworkName));
60 VERIFY_IS_FALSE(result.StdoutContainsLine(TestNetworkName2));
61 }
62
63 WSLC_TEST_METHOD(WSLCE2E_Network_Prune_RemovesUnusedNetwork)
64 {
65 RunWslc(std::format(L"network create --driver bridge {}", TestNetworkName)).Verify({.Stderr = L"", .ExitCode = 0});
66 VerifyNetworkIsListed(TestNetworkName);
67
68 auto cleanup = wil::scope_exit([&]() { EnsureNetworkDoesNotExist(TestNetworkName); });
69
70 const auto result = RunWslc(L"network prune");
71 result.Verify({.Stderr = L"", .ExitCode = 0});
72
73 auto output = result.GetStdoutLines();
74 VERIFY_ARE_EQUAL(3u, output.size());
75 VERIFY_ARE_EQUAL(Localization::WSLCCLI_NetworkPruneDeletedHeader(), output[0]);
76 VERIFY_ARE_EQUAL(TestNetworkName, output[1]);
77 VERIFY_ARE_EQUAL(std::wstring{}, output[2]);
78
79 VerifyNetworkIsNotListed(TestNetworkName);
80 }
81
82 WSLC_TEST_METHOD(WSLCE2E_Network_Prune_RemovesMultipleNetworks)
83 {
84 RunWslc(std::format(L"network create --driver bridge {}", TestNetworkName)).Verify({.Stderr = L"", .ExitCode = 0});
85 RunWslc(std::format(L"network create --driver bridge {}", TestNetworkName2)).Verify({.Stderr = L"", .ExitCode = 0});
86 VerifyNetworkIsListed(TestNetworkName);
87 VerifyNetworkIsListed(TestNetworkName2);
88
89 auto cleanup = wil::scope_exit([&]() {
90 EnsureNetworkDoesNotExist(TestNetworkName);
91 EnsureNetworkDoesNotExist(TestNetworkName2);
92 });
93
94 const auto result = RunWslc(L"network prune");
95 result.Verify({.Stderr = L"", .ExitCode = 0});
96
97 VERIFY_IS_TRUE(result.StdoutContainsLine(TestNetworkName));
98 VERIFY_IS_TRUE(result.StdoutContainsLine(TestNetworkName2));
99
100 VerifyNetworkIsNotListed(TestNetworkName);
101 VerifyNetworkIsNotListed(TestNetworkName2);
102 }
103
104 WSLC_TEST_METHOD(WSLCE2E_Network_Prune_InUseNetwork_Preserved)
105 {
106 RunWslc(std::format(L"network create --driver bridge {}", TestNetworkName)).Verify({.Stderr = L"", .ExitCode = 0});
107 VerifyNetworkIsListed(TestNetworkName);
108
109 // Start a container attached to the network so it is considered in use.
110 RunWslc(std::format(
111 L"container run -d --name {} --network {} {} sleep infinity", WslcContainerName, TestNetworkName, DebianImage.NameAndTag()))
112 .Verify({.Stderr = L"", .ExitCode = 0});
113
114 auto cleanup = wil::scope_exit([&]() {
115 EnsureContainerDoesNotExist(WslcContainerName);
116 EnsureNetworkDoesNotExist(TestNetworkName);
117 });
118
119 const auto result = RunWslc(L"network prune");
120 result.Verify({.Stderr = L"", .ExitCode = 0});
121
122 VERIFY_IS_FALSE(result.StdoutContainsLine(TestNetworkName), L"Network in use by a running container must not be pruned");
123
124 VerifyNetworkIsListed(TestNetworkName);
125 }
126
127 WSLC_TEST_METHOD(WSLCE2E_Network_Prune_LabelFilter_PreservesNonMatchingNetwork)
128 {
129 RunWslc(std::format(L"network create --driver bridge {}", TestNetworkName)).Verify({.Stderr = L"", .ExitCode = 0});
130 VerifyNetworkIsListed(TestNetworkName);
131
132 auto cleanup = wil::scope_exit([&]() { EnsureNetworkDoesNotExist(TestNetworkName); });
133
134 // A label filter that does not match the network should preserve it.
135 const auto filteredPrune = RunWslc(L"network prune --filter label=wslc.test.never=present");
136 filteredPrune.Verify({.Stderr = L"", .ExitCode = 0});
137 VERIFY_IS_FALSE(
138 filteredPrune.StdoutContainsLine(TestNetworkName), L"Filtered prune should not have deleted the non-matching network");
139 VerifyNetworkIsListed(TestNetworkName);
140
141 // A subsequent unfiltered prune should still remove it, proving the filter
142 // was the reason it survived.
143 const auto unfilteredPrune = RunWslc(L"network prune");
144 unfilteredPrune.Verify({.Stderr = L"", .ExitCode = 0});
145 VERIFY_IS_TRUE(unfilteredPrune.StdoutContainsLine(TestNetworkName));
146 VerifyNetworkIsNotListed(TestNetworkName);
147 }
148
149 WSLC_TEST_METHOD(WSLCE2E_Network_Prune_LabelFilter_MatchingValueIsDeleted)
150 {
151 RunWslc(std::format(L"network create --driver bridge --label wslc.test.prune=keep {}", TestNetworkName)).Verify({.Stderr = L"", .ExitCode = 0});
152 RunWslc(std::format(L"network create --driver bridge {}", TestNetworkName2)).Verify({.Stderr = L"", .ExitCode = 0});
153 VerifyNetworkIsListed(TestNetworkName);
154 VerifyNetworkIsListed(TestNetworkName2);
155
156 auto cleanup = wil::scope_exit([&]() {
157 EnsureNetworkDoesNotExist(TestNetworkName);
158 EnsureNetworkDoesNotExist(TestNetworkName2);
159 });
160
161 const auto result = RunWslc(L"network prune --filter label=wslc.test.prune=keep");
162 result.Verify({.Stderr = L"", .ExitCode = 0});
163
164 VERIFY_IS_TRUE(result.StdoutContainsLine(TestNetworkName));
165 VERIFY_IS_FALSE(result.StdoutContainsLine(TestNetworkName2), L"Network without the matching label must not be deleted");
166
167 VerifyNetworkIsNotListed(TestNetworkName);
168 VerifyNetworkIsListed(TestNetworkName2);
169 }
170
171 WSLC_TEST_METHOD(WSLCE2E_Network_Prune_NegatedLabelFilter_PreservesLabeledNetwork)
172 {
173 RunWslc(std::format(L"network create --driver bridge --label wslc.test.keep=yes {}", TestNetworkName)).Verify({.Stderr = L"", .ExitCode = 0});
174 RunWslc(std::format(L"network create --driver bridge {}", TestNetworkName2)).Verify({.Stderr = L"", .ExitCode = 0});
175 VerifyNetworkIsListed(TestNetworkName);
176 VerifyNetworkIsListed(TestNetworkName2);
177
178 auto cleanup = wil::scope_exit([&]() {
179 EnsureNetworkDoesNotExist(TestNetworkName);
180 EnsureNetworkDoesNotExist(TestNetworkName2);
181 });
182
183 const auto result = RunWslc(L"network prune --filter label!=wslc.test.keep");
184 result.Verify({.Stderr = L"", .ExitCode = 0});
185
186 VERIFY_IS_TRUE(result.StdoutContainsLine(TestNetworkName2));
187 VERIFY_IS_FALSE(
188 result.StdoutContainsLine(TestNetworkName), L"Labeled network must be preserved when prune negates that label");
189
190 VerifyNetworkIsListed(TestNetworkName);
191 VerifyNetworkIsNotListed(TestNetworkName2);
192 }
193
194 WSLC_TEST_METHOD(WSLCE2E_Network_Prune_Filter_MalformedValue)
195 {
196 const auto result = RunWslc(L"network prune --filter label");
197 result.Verify({.Stdout = L"", .ExitCode = 1});
198 VERIFY_IS_TRUE(result.StderrContainsSubstring(Localization::WSLCCLI_InvalidFilterError(L"label")));
199 }
200
201 WSLC_TEST_METHOD(WSLCE2E_Network_Prune_Filter_InvalidKey)
202 {
203 const auto result = RunWslc(L"network prune --filter color=red");
204 result.Verify({.Stdout = L"", .ExitCode = 1});
205 VERIFY_IS_TRUE(result.StderrContainsSubstring(L"invalid filter 'color'\r\nError code: E_INVALIDARG"));
206 }
207
208 private:
209 const TestImage& DebianImage = DebianTestImage();
210 const std::wstring TestNetworkName = L"wslc-e2e-network-prune";
211 const std::wstring TestNetworkName2 = L"wslc-e2e-network-prune-2";
212 const std::wstring WslcContainerName = L"wslc-network-prune-test-container";
213
214 void CleanUpAllTestState()
215 {
216 EnsureContainerDoesNotExist(WslcContainerName);
217 EnsureNetworkDoesNotExist(TestNetworkName);
218 EnsureNetworkDoesNotExist(TestNetworkName2);
219 }
220 };
221 } // namespace WSLCE2ETests