master
cpp 218 lines 8.71 KB
Raw
1 /*++
2
3 Copyright (c) Microsoft. All rights reserved.
4
5 Module Name:
6
7 WSLCE2ENetworkCreateTests.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
22 class WSLCE2ENetworkCreateTests
23 {
24 WSLC_TEST_CLASS(WSLCE2ENetworkCreateTests)
25
26 TEST_METHOD_SETUP(MethodSetup)
27 {
28 EnsureNetworkDoesNotExist(TestNetworkName);
29 return true;
30 }
31
32 TEST_CLASS_CLEANUP(ClassCleanup)
33 {
34 EnsureNetworkDoesNotExist(TestNetworkName);
35 return true;
36 }
37
38 WSLC_TEST_METHOD(WSLCE2E_Network_Create_HelpCommand)
39 {
40 auto result = RunWslc(L"network create --help");
41 result.Verify({.Stderr = L"", .ExitCode = 0});
42 VERIFY_IS_FALSE(result.Stdout.value().empty());
43 }
44
45 WSLC_TEST_METHOD(WSLCE2E_Network_Create_MissingName)
46 {
47 auto result = RunWslc(L"network create");
48 result.Verify({.Stdout = L"", .ExitCode = 1});
49 VERIFY_IS_TRUE(result.StderrContainsSubstring(L"Required argument not provided: 'network-name'"));
50 }
51
52 WSLC_TEST_METHOD(WSLCE2E_Network_Create_DefaultDriver_Success)
53 {
54 auto result = RunWslc(std::format(L"network create {}", TestNetworkName));
55 result.Verify({.Stderr = L"", .ExitCode = 0});
56 VERIFY_ARE_EQUAL(TestNetworkName, result.GetStdoutOneLine());
57
58 VerifyNetworkIsListed(TestNetworkName);
59 auto inspect = InspectNetwork(TestNetworkName);
60 VERIFY_ARE_EQUAL("bridge", inspect.Driver);
61 }
62
63 WSLC_TEST_METHOD(WSLCE2E_Network_Create_BridgeDriver_Success)
64 {
65 auto result = RunWslc(std::format(L"network create --driver bridge {}", TestNetworkName));
66 result.Verify({.Stderr = L"", .ExitCode = 0});
67 VERIFY_ARE_EQUAL(TestNetworkName, result.GetStdoutOneLine());
68
69 VerifyNetworkIsListed(TestNetworkName);
70 auto inspect = InspectNetwork(TestNetworkName);
71 VERIFY_ARE_EQUAL("bridge", inspect.Driver);
72 }
73
74 WSLC_TEST_METHOD(WSLCE2E_Network_Create_WithLabels_Success)
75 {
76 auto result = RunWslc(std::format(L"network create --driver bridge --label env=test --label app=wslc {}", TestNetworkName));
77 result.Verify({.Stderr = L"", .ExitCode = 0});
78 VERIFY_ARE_EQUAL(TestNetworkName, result.GetStdoutOneLine());
79
80 VerifyNetworkIsListed(TestNetworkName);
81 auto inspect = InspectNetwork(TestNetworkName);
82 VERIFY_ARE_EQUAL("bridge", inspect.Driver);
83 VERIFY_ARE_EQUAL("test", inspect.Labels["env"]);
84 VERIFY_ARE_EQUAL("wslc", inspect.Labels["app"]);
85 }
86
87 WSLC_TEST_METHOD(WSLCE2E_Network_Create_EmptyLabelKey_Fail)
88 {
89 auto result = RunWslc(std::format(L"network create --driver bridge --label =foo {}", TestNetworkName));
90 result.Verify({.Stdout = L"", .ExitCode = 1});
91 VERIFY_IS_TRUE(result.StderrContainsSubstring(L"Label key cannot be empty\r\nError code: E_INVALIDARG"));
92
93 VerifyNetworkIsNotListed(TestNetworkName);
94 }
95
96 WSLC_TEST_METHOD(WSLCE2E_Network_Create_InvalidDriver_Fail)
97 {
98 auto result = RunWslc(std::format(L"network create --driver invalid_driver {}", TestNetworkName));
99 result.Verify({.Stdout = L"", .ExitCode = 1});
100 VERIFY_IS_TRUE(result.StderrContainsSubstring(
101 std::format(L"Unsupported network driver: 'invalid_driver'\r\nError code: E_INVALIDARG")));
102
103 VerifyNetworkIsNotListed(TestNetworkName);
104 }
105
106 WSLC_TEST_METHOD(WSLCE2E_Network_Create_Duplicate_Fail)
107 {
108 auto result = RunWslc(std::format(L"network create --driver bridge {}", TestNetworkName));
109 result.Verify({.Stderr = L"", .ExitCode = 0});
110
111 result = RunWslc(std::format(L"network create --driver bridge {}", TestNetworkName));
112 result.Verify(
113 {.Stdout = L"",
114 .Stderr = FormatErrorMessage(L"Cannot create a file when that file already exists. ", L"ERROR_ALREADY_EXISTS"),
115 .ExitCode = 1});
116 }
117
118 WSLC_TEST_METHOD(WSLCE2E_Network_Create_Internal_Success)
119 {
120 auto result = RunWslc(std::format(L"network create --internal {}", TestNetworkName));
121 result.Verify({.Stderr = L"", .ExitCode = 0});
122 VERIFY_ARE_EQUAL(TestNetworkName, result.GetStdoutOneLine());
123
124 VerifyNetworkIsListed(TestNetworkName);
125 auto inspect = InspectNetwork(TestNetworkName);
126 VERIFY_ARE_EQUAL("bridge", inspect.Driver);
127 VERIFY_IS_TRUE(inspect.Internal);
128 }
129
130 WSLC_TEST_METHOD(WSLCE2E_Network_Create_Subnet_Success)
131 {
132 const std::wstring subnet = L"172.45.0.0/16";
133 auto result = RunWslc(std::format(L"network create --subnet {} {}", subnet, TestNetworkName));
134 result.Verify({.Stderr = L"", .ExitCode = 0});
135 VERIFY_ARE_EQUAL(TestNetworkName, result.GetStdoutOneLine());
136
137 VerifyNetworkIsListed(TestNetworkName);
138 auto inspect = InspectNetwork(TestNetworkName);
139 VERIFY_ARE_EQUAL("bridge", inspect.Driver);
140 VERIFY_IS_TRUE(inspect.IPAM.Config.has_value());
141 VERIFY_ARE_EQUAL(1u, inspect.IPAM.Config->size());
142 VERIFY_ARE_EQUAL(wsl::shared::string::WideToMultiByte(subnet), (*inspect.IPAM.Config)[0].Subnet);
143 }
144
145 WSLC_TEST_METHOD(WSLCE2E_Network_Create_SubnetAndGateway_Success)
146 {
147 const std::wstring subnet = L"172.46.0.0/16";
148 const std::wstring gateway = L"172.46.0.1";
149 auto result = RunWslc(std::format(L"network create --subnet {} --gateway {} {}", subnet, gateway, TestNetworkName));
150 result.Verify({.Stderr = L"", .ExitCode = 0});
151 VERIFY_ARE_EQUAL(TestNetworkName, result.GetStdoutOneLine());
152
153 VerifyNetworkIsListed(TestNetworkName);
154 auto inspect = InspectNetwork(TestNetworkName);
155 VERIFY_ARE_EQUAL("bridge", inspect.Driver);
156 VERIFY_IS_TRUE(inspect.IPAM.Config.has_value());
157 VERIFY_ARE_EQUAL(1u, inspect.IPAM.Config->size());
158 VERIFY_ARE_EQUAL(wsl::shared::string::WideToMultiByte(subnet), (*inspect.IPAM.Config)[0].Subnet);
159 VERIFY_ARE_EQUAL(wsl::shared::string::WideToMultiByte(gateway), (*inspect.IPAM.Config)[0].Gateway);
160 }
161
162 WSLC_TEST_METHOD(WSLCE2E_Network_Create_GatewayWithoutSubnet_Fail)
163 {
164 auto result = RunWslc(std::format(L"network create --gateway 172.47.0.1 {}", TestNetworkName));
165 result.Verify(
166 {.Stdout = L"",
167 .Stderr = FormatErrorMessage(L"The '--gateway' option requires '--subnet' to also be specified.", L"E_INVALIDARG"),
168 .ExitCode = 1});
169
170 VerifyNetworkIsNotListed(TestNetworkName);
171 }
172
173 WSLC_TEST_METHOD(WSLCE2E_Network_Create_SubnetAndIpRange_Success)
174 {
175 const std::wstring subnet = L"172.51.0.0/16";
176 const std::wstring ipRange = L"172.51.10.0/24";
177 auto result = RunWslc(std::format(L"network create --subnet {} --ip-range {} {}", subnet, ipRange, TestNetworkName));
178 result.Verify({.Stderr = L"", .ExitCode = 0});
179 VERIFY_ARE_EQUAL(TestNetworkName, result.GetStdoutOneLine());
180
181 VerifyNetworkIsListed(TestNetworkName);
182 auto inspect = InspectNetwork(TestNetworkName);
183 VERIFY_ARE_EQUAL("bridge", inspect.Driver);
184 VERIFY_IS_TRUE(inspect.IPAM.Config.has_value());
185 VERIFY_ARE_EQUAL(1u, inspect.IPAM.Config->size());
186 VERIFY_ARE_EQUAL(wsl::shared::string::WideToMultiByte(subnet), (*inspect.IPAM.Config)[0].Subnet);
187 VERIFY_ARE_EQUAL(wsl::shared::string::WideToMultiByte(ipRange), (*inspect.IPAM.Config)[0].IPRange);
188 }
189
190 WSLC_TEST_METHOD(WSLCE2E_Network_Create_IpRangeWithoutSubnet_Fail)
191 {
192 auto result = RunWslc(std::format(L"network create --ip-range 172.52.10.0/24 {}", TestNetworkName));
193 result.Verify(
194 {.Stdout = L"",
195 .Stderr = FormatErrorMessage(L"The '--ip-range' option requires '--subnet' to also be specified.", L"E_INVALIDARG"),
196 .ExitCode = 1});
197
198 VerifyNetworkIsNotListed(TestNetworkName);
199 }
200
201 WSLC_TEST_METHOD(WSLCE2E_Network_Create_WithOpt_Success)
202 {
203 constexpr auto c_opts = L"--opt com.docker.network.bridge.enable_icc=true --opt com.docker.network.driver.mtu=1450";
204 auto result = RunWslc(std::format(L"network create {} {}", c_opts, TestNetworkName));
205 result.Verify({.Stderr = L"", .ExitCode = 0});
206 VERIFY_ARE_EQUAL(TestNetworkName, result.GetStdoutOneLine());
207
208 VerifyNetworkIsListed(TestNetworkName);
209 auto inspect = InspectNetwork(TestNetworkName);
210 VERIFY_ARE_EQUAL("bridge", inspect.Driver);
211 VERIFY_ARE_EQUAL("true", inspect.Options["com.docker.network.bridge.enable_icc"]);
212 VERIFY_ARE_EQUAL("1450", inspect.Options["com.docker.network.driver.mtu"]);
213 }
214
215 private:
216 const std::wstring TestNetworkName = L"wslc-e2e-network-create";
217 };
218 } // namespace WSLCE2ETests