master
cpp 166 lines 6.59 KB
Raw
1 /*++
2
3 Copyright (c) Microsoft. All rights reserved.
4
5 Module Name:
6
7 WSLCE2EVolumeInspectTests.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
19 namespace WSLCE2ETests {
20 using namespace wsl::shared;
21 using namespace wsl::shared::string;
22
23 class WSLCE2EVolumeInspectTests
24 {
25 WSLC_TEST_CLASS(WSLCE2EVolumeInspectTests)
26
27 TEST_METHOD_SETUP(MethodSetup)
28 {
29 EnsureVolumeDoesNotExist(TestVolumeName1);
30 EnsureVolumeDoesNotExist(TestVolumeName2);
31 return true;
32 }
33
34 TEST_CLASS_CLEANUP(ClassCleanup)
35 {
36 EnsureVolumeDoesNotExist(TestVolumeName1);
37 EnsureVolumeDoesNotExist(TestVolumeName2);
38 return true;
39 }
40
41 WSLC_TEST_METHOD(WSLCE2E_Volume_Inspect_HelpCommand)
42 {
43 auto result = RunWslc(L"volume inspect --help");
44 result.Verify({.Stderr = L"", .ExitCode = 0});
45 VERIFY_IS_FALSE(result.Stdout.value().empty());
46 }
47
48 WSLC_TEST_METHOD(WSLCE2E_Volume_Inspect_MissingVolumeName)
49 {
50 auto result = RunWslc(L"volume inspect");
51 result.Verify({.Stdout = L"", .ExitCode = 1});
52 VERIFY_IS_TRUE(result.StderrContainsSubstring(L"Required argument not provided: 'volume-name'"));
53 }
54
55 WSLC_TEST_METHOD(WSLCE2E_Volume_Inspect_Success)
56 {
57 auto result = RunWslc(std::format(L"volume create {}", TestVolumeName1));
58 result.Verify({.Stderr = L"", .ExitCode = 0});
59 VERIFY_ARE_EQUAL(TestVolumeName1, result.GetStdoutOneLine());
60
61 result = RunWslc(std::format(L"volume inspect {}", TestVolumeName1));
62 result.Verify({.Stderr = L"", .ExitCode = 0});
63 auto inspectData =
64 wsl::shared::FromJson<std::vector<wsl::windows::common::wslc_schema::InspectVolume>>(result.Stdout.value().c_str());
65 VERIFY_ARE_EQUAL(1u, inspectData.size());
66 auto inspect = inspectData[0];
67
68 VERIFY_ARE_EQUAL(WideToMultiByte(TestVolumeName1), inspect.Name);
69 VERIFY_ARE_EQUAL("guest", inspect.Driver);
70 }
71
72 // Every volume reports the same field set: Labels and Options are null rather than empty
73 // objects, Scope is always "local", and Status is only present when the driver reports one.
74 WSLC_TEST_METHOD(WSLCE2E_Volume_Inspect_ReportsFullFieldSet)
75 {
76 auto result = RunWslc(std::format(L"volume create {}", TestVolumeName1));
77 result.Verify({.Stderr = L"", .ExitCode = 0});
78
79 result = RunWslc(std::format(L"volume inspect --format json {}", TestVolumeName1));
80 result.Verify({.Stderr = L"", .ExitCode = 0});
81
82 const auto document = VerifyCompactJsonOutput(result);
83 VERIFY_ARE_EQUAL(1u, document.size());
84 const auto& volume = document[0];
85
86 VERIFY_ARE_EQUAL(7u, volume.size());
87 VERIFY_IS_TRUE(volume["CreatedAt"].is_string());
88 VERIFY_ARE_EQUAL("guest", volume["Driver"].get<std::string>());
89 VERIFY_IS_TRUE(volume["Labels"].is_null());
90 VERIFY_IS_FALSE(volume["Mountpoint"].get<std::string>().empty());
91 VERIFY_ARE_EQUAL(WideToMultiByte(TestVolumeName1), volume["Name"].get<std::string>());
92 VERIFY_IS_TRUE(volume["Options"].is_null());
93 VERIFY_ARE_EQUAL("local", volume["Scope"].get<std::string>());
94 VERIFY_IS_FALSE(volume.contains("Status"));
95 }
96
97 WSLC_TEST_METHOD(WSLCE2E_Volume_Inspect_FormatJson_IsSingleLine)
98 {
99 auto result = RunWslc(std::format(L"volume create {}", TestVolumeName1));
100 result.Verify({.Stderr = L"", .ExitCode = 0});
101
102 result = RunWslc(std::format(L"volume inspect --format json {}", TestVolumeName1));
103 result.Verify({.Stderr = L"", .ExitCode = 0});
104
105 const auto document = VerifyCompactJsonOutput(result);
106 VERIFY_IS_TRUE(document.is_array());
107 VERIFY_ARE_EQUAL(1u, document.size());
108 VERIFY_ARE_EQUAL(WideToMultiByte(TestVolumeName1), document[0]["Name"].get<std::string>());
109 }
110
111 WSLC_TEST_METHOD(WSLCE2E_Volume_InspectMultiple_Success)
112 {
113 // Create two volumes to inspect at the same time
114 auto result = RunWslc(std::format(L"volume create {}", TestVolumeName1));
115 result.Verify({.Stderr = L"", .ExitCode = 0});
116 VERIFY_ARE_EQUAL(TestVolumeName1, result.GetStdoutOneLine());
117 result = RunWslc(std::format(L"volume create {}", TestVolumeName2));
118 result.Verify({.Stderr = L"", .ExitCode = 0});
119 VERIFY_ARE_EQUAL(TestVolumeName2, result.GetStdoutOneLine());
120
121 // Inspect both volumes in the same command
122 result = RunWslc(std::format(L"volume inspect {} {}", TestVolumeName1, TestVolumeName2));
123 result.Verify({.Stderr = L"", .ExitCode = 0});
124 auto inspectData =
125 wsl::shared::FromJson<std::vector<wsl::windows::common::wslc_schema::InspectVolume>>(result.Stdout.value().c_str());
126 VERIFY_ARE_EQUAL(2u, inspectData.size());
127
128 auto inspect1 = inspectData[0];
129 VERIFY_ARE_EQUAL(WideToMultiByte(TestVolumeName1), inspect1.Name);
130 VERIFY_ARE_EQUAL("guest", inspect1.Driver);
131
132 auto inspect2 = inspectData[1];
133 VERIFY_ARE_EQUAL(WideToMultiByte(TestVolumeName2), inspect2.Name);
134 VERIFY_ARE_EQUAL("guest", inspect2.Driver);
135 }
136
137 WSLC_TEST_METHOD(WSLCE2E_Volume_Inspect_NotFound)
138 {
139 auto result = RunWslc(std::format(L"volume inspect {}", TestVolumeName1));
140 result.Verify({.Stdout = L"[]\r\n", .Stderr = std::format(L"Volume not found: '{}'\r\n", TestVolumeName1), .ExitCode = 1});
141 }
142
143 WSLC_TEST_METHOD(WSLCE2E_Volume_Inspect_MixedFoundNotFound)
144 {
145 // Create one volume but not the other
146 auto result = RunWslc(std::format(L"volume create {}", TestVolumeName1));
147 result.Verify({.Stderr = L"", .ExitCode = 0});
148 VERIFY_ARE_EQUAL(TestVolumeName1, result.GetStdoutOneLine());
149
150 // Inspect both volumes in the same command, expecting one to be found and the other to not be found
151 result = RunWslc(std::format(L"volume inspect {} {}", TestVolumeName1, TestVolumeName2));
152 result.Verify({.Stderr = std::format(L"Volume not found: '{}'\r\n", TestVolumeName2), .ExitCode = 1});
153
154 // Verify found volume
155 auto inspectData =
156 wsl::shared::FromJson<std::vector<wsl::windows::common::wslc_schema::InspectVolume>>(result.Stdout.value().c_str());
157 VERIFY_ARE_EQUAL(1u, inspectData.size());
158 auto inspect = inspectData[0];
159 VERIFY_ARE_EQUAL(WideToMultiByte(TestVolumeName1), inspect.Name);
160 }
161
162 private:
163 const std::wstring TestVolumeName1 = L"wslc-e2e-volume-inspect-1";
164 const std::wstring TestVolumeName2 = L"wslc-e2e-volume-inspect-2";
165 };
166 } // namespace WSLCE2ETests