master
cpp 197 lines 7.11 KB
Raw
1 /*++
2
3 Copyright (c) Microsoft. All rights reserved.
4
5 Module Name:
6
7 WSLCE2EVolumeRemoveTests.cpp
8
9 Abstract:
10
11 This file contains end-to-end tests for WSLC.
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 WSLCE2EVolumeRemoveTests
24 {
25 WSLC_TEST_CLASS(WSLCE2EVolumeRemoveTests)
26
27 TEST_CLASS_SETUP(ClassSetup)
28 {
29 TestImageRegistry::Instance().EnsureLoaded(DebianImage);
30 return true;
31 }
32
33 TEST_METHOD_SETUP(MethodSetup)
34 {
35 EnsureContainerDoesNotExist(WslcContainerName);
36 EnsureVolumeDoesNotExist(TestVolumeName);
37 EnsureVolumeDoesNotExist(TestVolumeName2);
38 return true;
39 }
40
41 TEST_CLASS_CLEANUP(ClassCleanup)
42 {
43 EnsureContainerDoesNotExist(WslcContainerName);
44 EnsureVolumeDoesNotExist(TestVolumeName);
45 EnsureVolumeDoesNotExist(TestVolumeName2);
46 return true;
47 }
48
49 WSLC_TEST_METHOD(WSLCE2E_Volume_Remove_HelpCommand)
50 {
51 auto result = RunWslc(L"volume remove --help");
52 result.Verify({.Stderr = L"", .ExitCode = 0});
53 VERIFY_IS_FALSE(result.Stdout.value().empty());
54 }
55
56 WSLC_TEST_METHOD(WSLCE2E_Volume_Remove_MissingVolumeName)
57 {
58 auto result = RunWslc(L"volume remove");
59 result.Verify({.Stdout = L"", .ExitCode = 1});
60 VERIFY_IS_TRUE(result.StderrContainsSubstring(L"Required argument not provided: 'volume-name'"));
61 }
62
63 WSLC_TEST_METHOD(WSLCE2E_Volume_Remove_Valid)
64 {
65 auto result = RunWslc(std::format(L"volume create {}", TestVolumeName));
66 result.Verify({.Stderr = L"", .ExitCode = 0});
67
68 VerifyVolumeIsListed(TestVolumeName);
69
70 result = RunWslc(std::format(L"volume remove {}", TestVolumeName));
71 result.Verify({.Stdout = std::format(L"{}\r\n", TestVolumeName), .Stderr = L"", .ExitCode = 0});
72
73 VerifyVolumeIsNotListed(TestVolumeName);
74 }
75
76 WSLC_TEST_METHOD(WSLCE2E_Volume_Remove_Multiple_Valid)
77 {
78 auto result = RunWslc(std::format(L"volume create {}", TestVolumeName));
79 result.Verify({.Stderr = L"", .ExitCode = 0});
80 result = RunWslc(std::format(L"volume create {}", TestVolumeName2));
81 result.Verify({.Stderr = L"", .ExitCode = 0});
82
83 VerifyVolumeIsListed(TestVolumeName);
84 VerifyVolumeIsListed(TestVolumeName2);
85
86 result = RunWslc(std::format(L"volume remove {} {}", TestVolumeName, TestVolumeName2));
87 result.Verify({.Stderr = L"", .ExitCode = 0});
88
89 VerifyVolumeIsNotListed(TestVolumeName);
90 VerifyVolumeIsNotListed(TestVolumeName2);
91 }
92
93 WSLC_TEST_METHOD(WSLCE2E_Volume_Remove_NotFound)
94 {
95 auto result = RunWslc(std::format(L"volume remove {}", TestVolumeName));
96 result.Verify({.Stdout = L"", .Stderr = std::format(L"Volume not found: '{}'\r\n", TestVolumeName), .ExitCode = 1});
97 }
98
99 WSLC_TEST_METHOD(WSLCE2E_Volume_Remove_MixedFoundNotFound)
100 {
101 auto result = RunWslc(std::format(L"volume create {}", TestVolumeName));
102 result.Verify({.Stderr = L"", .ExitCode = 0});
103 VerifyVolumeIsListed(TestVolumeName);
104
105 result = RunWslc(std::format(L"volume remove {} {}", TestVolumeName, TestVolumeName2));
106 result.Verify(
107 {.Stdout = std::format(L"{}\r\n", TestVolumeName), .Stderr = std::format(L"Volume not found: '{}'\r\n", TestVolumeName2), .ExitCode = 1});
108 VerifyVolumeIsNotListed(TestVolumeName);
109 }
110
111 WSLC_TEST_METHOD(WSLCE2E_Volume_Remove_VolumeInUse_Fail)
112 {
113 auto result = RunWslc(std::format(L"volume create {}", TestVolumeName));
114 result.Verify({.Stderr = L"", .ExitCode = 0});
115 VerifyVolumeIsListed(TestVolumeName);
116
117 // Create a container that uses the volume to ensure it's in use
118 result = RunWslc(std::format(
119 L"container run -d --name {} -v {}:/data {} sh -c \"echo -n 'WSLC Volume In Use Test' > /data/test.txt && sleep "
120 L"infinity\"",
121 WslcContainerName,
122 TestVolumeName,
123 DebianImage.NameAndTag()));
124 result.Verify({.Stderr = L"", .ExitCode = 0});
125
126 // Attempt to remove the volume while it's in use
127 result = RunWslc(std::format(L"volume remove {}", TestVolumeName));
128 result.Verify(
129 {.Stdout = L"",
130 .Stderr = FormatErrorMessage(std::format(L"Volume '{}' is in use.", TestVolumeName), L"ERROR_SHARING_VIOLATION"),
131 .ExitCode = 1});
132
133 VerifyVolumeIsListed(TestVolumeName);
134 }
135
136 WSLC_TEST_METHOD(WSLCE2E_Volume_Remove_Force_NotFound)
137 {
138 auto result = RunWslc(std::format(L"volume remove --force {}", TestVolumeName));
139 result.Verify({.Stdout = L"", .Stderr = L"", .ExitCode = 0});
140 }
141
142 WSLC_TEST_METHOD(WSLCE2E_Volume_Remove_Force_Valid)
143 {
144 auto result = RunWslc(std::format(L"volume create {}", TestVolumeName));
145 result.Verify({.Stderr = L"", .ExitCode = 0});
146
147 VerifyVolumeIsListed(TestVolumeName);
148
149 result = RunWslc(std::format(L"volume remove --force {}", TestVolumeName));
150 result.Verify({.Stdout = std::format(L"{}\r\n", TestVolumeName), .Stderr = L"", .ExitCode = 0});
151
152 VerifyVolumeIsNotListed(TestVolumeName);
153 }
154
155 WSLC_TEST_METHOD(WSLCE2E_Volume_Remove_Force_MixedFoundNotFound)
156 {
157 auto result = RunWslc(std::format(L"volume create {}", TestVolumeName));
158 result.Verify({.Stderr = L"", .ExitCode = 0});
159 VerifyVolumeIsListed(TestVolumeName);
160
161 result = RunWslc(std::format(L"volume remove --force {} {}", TestVolumeName, TestVolumeName2));
162 result.Verify({.Stdout = std::format(L"{}\r\n", TestVolumeName), .Stderr = L"", .ExitCode = 0});
163 VerifyVolumeIsNotListed(TestVolumeName);
164 }
165
166 WSLC_TEST_METHOD(WSLCE2E_Volume_Remove_Force_VolumeInUse_Fail)
167 {
168 auto result = RunWslc(std::format(L"volume create {}", TestVolumeName));
169 result.Verify({.Stderr = L"", .ExitCode = 0});
170 VerifyVolumeIsListed(TestVolumeName);
171
172 // Create a container that uses the volume to ensure it's in use
173 result = RunWslc(std::format(
174 L"container run -d --name {} -v {}:/data {} sh -c \"echo -n 'WSLC Volume In Use Test' > /data/test.txt && sleep "
175 L"infinity\"",
176 WslcContainerName,
177 TestVolumeName,
178 DebianImage.NameAndTag()));
179 result.Verify({.Stderr = L"", .ExitCode = 0});
180
181 // --force does not bypass in-use checks, volume should still fail to be removed
182 result = RunWslc(std::format(L"volume remove --force {}", TestVolumeName));
183 result.Verify(
184 {.Stdout = L"",
185 .Stderr = FormatErrorMessage(std::format(L"Volume '{}' is in use.", TestVolumeName), L"ERROR_SHARING_VIOLATION"),
186 .ExitCode = 1});
187
188 VerifyVolumeIsListed(TestVolumeName);
189 }
190
191 private:
192 const std::wstring WslcContainerName = L"wslc-test-container";
193 const TestImage& DebianImage = DebianTestImage();
194 const std::wstring TestVolumeName = L"wslc-e2e-volume-remove";
195 const std::wstring TestVolumeName2 = L"wslc-e2e-volume-remove-2";
196 };
197 } // namespace WSLCE2ETests