@@ -775,18 +775,18 @@ class WslcSdkTests
775775
776776 // Negative: port mappings with NONE networking must fail at container creation.
777777 {
778- WslcContainerSettings containerSettings ;
779- VERIFY_SUCCEEDED (WslcInitContainerSettings (" debian:latest" , &containerSettings ));
780- VERIFY_SUCCEEDED (WslcSetContainerSettingsNetworkingMode (&containerSettings , WSLC_CONTAINER_NETWORKING_MODE_NONE));
778+ WslcContainerSettings containerSettings1 ;
779+ VERIFY_SUCCEEDED (WslcInitContainerSettings (" debian:latest" , &containerSettings1 ));
780+ VERIFY_SUCCEEDED (WslcSetContainerSettingsNetworkingMode (&containerSettings1 , WSLC_CONTAINER_NETWORKING_MODE_NONE));
781781
782782 WslcContainerPortMapping mapping{};
783783 mapping.windowsPort = 12342 ;
784784 mapping.containerPort = 8000 ;
785785 mapping.protocol = WSLC_PORT_PROTOCOL_TCP;
786- VERIFY_SUCCEEDED (WslcSetContainerSettingsPortMappings (&containerSettings , &mapping, 1 ));
786+ VERIFY_SUCCEEDED (WslcSetContainerSettingsPortMappings (&containerSettings1 , &mapping, 1 ));
787787
788788 WslcContainer rawContainer = nullptr ;
789- VERIFY_ARE_EQUAL (WslcCreateContainer (m_defaultSession, &containerSettings , &rawContainer, nullptr ), E_INVALIDARG);
789+ VERIFY_ARE_EQUAL (WslcCreateContainer (m_defaultSession, &containerSettings1 , &rawContainer, nullptr ), E_INVALIDARG);
790790 VERIFY_IS_NULL (rawContainer);
791791 }
792792
@@ -800,19 +800,19 @@ class WslcSdkTests
800800 const char * env[] = {" PYTHONUNBUFFERED=1" };
801801 VERIFY_SUCCEEDED (WslcSetProcessSettingsEnvVariables (&procSettings, env, ARRAYSIZE (env)));
802802
803- WslcContainerSettings containerSettings ;
804- VERIFY_SUCCEEDED (WslcInitContainerSettings (" python:3.12-alpine" , &containerSettings ));
805- VERIFY_SUCCEEDED (WslcSetContainerSettingsInitProcess (&containerSettings , &procSettings));
806- VERIFY_SUCCEEDED (WslcSetContainerSettingsNetworkingMode (&containerSettings , WSLC_CONTAINER_NETWORKING_MODE_BRIDGED));
803+ WslcContainerSettings containerSettings2 ;
804+ VERIFY_SUCCEEDED (WslcInitContainerSettings (" python:3.12-alpine" , &containerSettings2 ));
805+ VERIFY_SUCCEEDED (WslcSetContainerSettingsInitProcess (&containerSettings2 , &procSettings));
806+ VERIFY_SUCCEEDED (WslcSetContainerSettingsNetworkingMode (&containerSettings2 , WSLC_CONTAINER_NETWORKING_MODE_BRIDGED));
807807
808808 WslcContainerPortMapping mapping{};
809809 mapping.windowsPort = 12341 ;
810810 mapping.containerPort = 8000 ;
811811 mapping.protocol = WSLC_PORT_PROTOCOL_TCP;
812- VERIFY_SUCCEEDED (WslcSetContainerSettingsPortMappings (&containerSettings , &mapping, 1 ));
812+ VERIFY_SUCCEEDED (WslcSetContainerSettingsPortMappings (&containerSettings2 , &mapping, 1 ));
813813
814814 UniqueContainer container;
815- VERIFY_SUCCEEDED (WslcCreateContainer (m_defaultSession, &containerSettings , &container, nullptr ));
815+ VERIFY_SUCCEEDED (WslcCreateContainer (m_defaultSession, &containerSettings2 , &container, nullptr ));
816816 VERIFY_SUCCEEDED (WslcStartContainer (container.get (), WSLC_CONTAINER_START_FLAG_ATTACH, nullptr ));
817817
818818 UniqueProcess process;
@@ -825,6 +825,105 @@ class WslcSdkTests
825825
826826 ExpectHttpResponse (L" http://127.0.0.1:12341" , 200 );
827827 }
828+
829+ // Functional: port mapping with explicit IPv4 windowsAddress (127.0.0.1).
830+ {
831+ WslcProcessSettings procSettings;
832+ VERIFY_SUCCEEDED (WslcInitProcessSettings (&procSettings));
833+ const char * argv[] = {" python3" , " -m" , " http.server" , " 8000" };
834+ VERIFY_SUCCEEDED (WslcSetProcessSettingsCmdLine (&procSettings, argv, ARRAYSIZE (argv)));
835+ const char * env[] = {" PYTHONUNBUFFERED=1" };
836+ VERIFY_SUCCEEDED (WslcSetProcessSettingsEnvVariables (&procSettings, env, ARRAYSIZE (env)));
837+
838+ WslcContainerSettings containerSettings3;
839+ VERIFY_SUCCEEDED (WslcInitContainerSettings (" python:3.12-alpine" , &containerSettings3));
840+ VERIFY_SUCCEEDED (WslcSetContainerSettingsInitProcess (&containerSettings3, &procSettings));
841+ VERIFY_SUCCEEDED (WslcSetContainerSettingsNetworkingMode (&containerSettings3, WSLC_CONTAINER_NETWORKING_MODE_BRIDGED));
842+
843+ sockaddr_storage addr4{};
844+ auto * sin4 = reinterpret_cast <sockaddr_in*>(&addr4);
845+ sin4->sin_family = AF_INET;
846+ VERIFY_ARE_EQUAL (inet_pton (AF_INET, " 127.0.0.1" , &sin4->sin_addr ), 1 );
847+
848+ WslcContainerPortMapping mapping{};
849+ mapping.windowsPort = 12343 ;
850+ mapping.containerPort = 8000 ;
851+ mapping.protocol = WSLC_PORT_PROTOCOL_TCP;
852+ mapping.windowsAddress = &addr4;
853+ VERIFY_SUCCEEDED (WslcSetContainerSettingsPortMappings (&containerSettings3, &mapping, 1 ));
854+
855+ UniqueContainer container;
856+ VERIFY_SUCCEEDED (WslcCreateContainer (m_defaultSession, &containerSettings3, &container, nullptr ));
857+ VERIFY_SUCCEEDED (WslcStartContainer (container.get (), WSLC_CONTAINER_START_FLAG_ATTACH, nullptr ));
858+
859+ UniqueProcess process;
860+ VERIFY_SUCCEEDED (WslcGetContainerInitProcess (container.get (), &process));
861+
862+ wil::unique_handle ownedStdout;
863+ VERIFY_SUCCEEDED (WslcGetProcessIOHandle (process.get (), WSLC_PROCESS_IO_HANDLE_STDOUT, &ownedStdout));
864+
865+ WaitForOutput (std::move (ownedStdout), " Serving HTTP on" , 30s);
866+
867+ ExpectHttpResponse (L" http://127.0.0.1:12343" , 200 );
868+ }
869+
870+ // Functional: port mapping with explicit IPv6 windowsAddress (::1).
871+ {
872+ WslcProcessSettings procSettings;
873+ VERIFY_SUCCEEDED (WslcInitProcessSettings (&procSettings));
874+ const char * argv[] = {" python3" , " -m" , " http.server" , " 8000" , " --bind" , " ::" };
875+ VERIFY_SUCCEEDED (WslcSetProcessSettingsCmdLine (&procSettings, argv, ARRAYSIZE (argv)));
876+ const char * env[] = {" PYTHONUNBUFFERED=1" };
877+ VERIFY_SUCCEEDED (WslcSetProcessSettingsEnvVariables (&procSettings, env, ARRAYSIZE (env)));
878+
879+ WslcContainerSettings containerSettings4;
880+ VERIFY_SUCCEEDED (WslcInitContainerSettings (" python:3.12-alpine" , &containerSettings4));
881+ VERIFY_SUCCEEDED (WslcSetContainerSettingsInitProcess (&containerSettings4, &procSettings));
882+ VERIFY_SUCCEEDED (WslcSetContainerSettingsNetworkingMode (&containerSettings4, WSLC_CONTAINER_NETWORKING_MODE_BRIDGED));
883+
884+ sockaddr_storage addr6{};
885+ auto * sin6 = reinterpret_cast <sockaddr_in6*>(&addr6);
886+ sin6->sin6_family = AF_INET6;
887+ VERIFY_ARE_EQUAL (inet_pton (AF_INET6, " ::1" , &sin6->sin6_addr ), 1 );
888+
889+ WslcContainerPortMapping mapping{};
890+ mapping.windowsPort = 12344 ;
891+ mapping.containerPort = 8000 ;
892+ mapping.protocol = WSLC_PORT_PROTOCOL_TCP;
893+ mapping.windowsAddress = &addr6;
894+ VERIFY_SUCCEEDED (WslcSetContainerSettingsPortMappings (&containerSettings4, &mapping, 1 ));
895+
896+ UniqueContainer container;
897+ VERIFY_SUCCEEDED (WslcCreateContainer (m_defaultSession, &containerSettings4, &container, nullptr ));
898+ VERIFY_SUCCEEDED (WslcStartContainer (container.get (), WSLC_CONTAINER_START_FLAG_ATTACH, nullptr ));
899+
900+ UniqueProcess process;
901+ VERIFY_SUCCEEDED (WslcGetContainerInitProcess (container.get (), &process));
902+
903+ wil::unique_handle ownedStdout;
904+ VERIFY_SUCCEEDED (WslcGetProcessIOHandle (process.get (), WSLC_PROCESS_IO_HANDLE_STDOUT, &ownedStdout));
905+
906+ WaitForOutput (std::move (ownedStdout), " Serving HTTP on" , 30s);
907+
908+ ExpectHttpResponse (L" http://[::1]:12344" , 200 );
909+ }
910+
911+ // Negative: unsupported address family must fail when setting container portmapping values.
912+ {
913+ WslcContainerSettings containerSettings5;
914+ VERIFY_SUCCEEDED (WslcInitContainerSettings (" debian:latest" , &containerSettings5));
915+ VERIFY_SUCCEEDED (WslcSetContainerSettingsNetworkingMode (&containerSettings5, WSLC_CONTAINER_NETWORKING_MODE_BRIDGED));
916+
917+ sockaddr_storage badAddr{};
918+ badAddr.ss_family = AF_UNIX; // unsupported for port mapping
919+
920+ WslcContainerPortMapping mapping{};
921+ mapping.windowsPort = 12345 ;
922+ mapping.containerPort = 8000 ;
923+ mapping.protocol = WSLC_PORT_PROTOCOL_TCP;
924+ mapping.windowsAddress = &badAddr;
925+ VERIFY_ARE_EQUAL (WslcSetContainerSettingsPortMappings (&containerSettings5, &mapping, 1 ), E_INVALIDARG);
926+ }
828927 }
829928
830929 WSLC_TEST_METHOD (ContainerVolumeUnit)
0 commit comments