e0e362d700
SDK Tests / SDK CI (push) Blocked by required conditions
SDK Tests / changes (push) Successful in 2m29s
Real E2E Tests / changes (push) Successful in 2m29s
SDK Tests / Python SDK Tests (sandbox) (push) Waiting to run
SDK Tests / CLI Quality (push) Waiting to run
SDK Tests / CLI Tests (push) Waiting to run
SDK Tests / Python SDK Quality (code-interpreter) (push) Waiting to run
SDK Tests / Python SDK Quality (sandbox) (push) Waiting to run
SDK Tests / Python SDK Tests (code-interpreter) (push) Waiting to run
SDK Tests / JavaScript SDK Quality And Tests (code-interpreter) (push) Waiting to run
SDK Tests / JavaScript SDK Quality And Tests (sandbox) (push) Waiting to run
SDK Tests / Kotlin SDK Quality And Tests (sandbox) (push) Waiting to run
SDK Tests / Kotlin SDK Quality And Tests (code-interpreter) (push) Waiting to run
SDK Tests / C# SDK Quality And Tests (code-interpreter) (push) Waiting to run
SDK Tests / C# SDK Quality And Tests (sandbox) (push) Waiting to run
SDK Tests / Go SDK Quality And Tests (push) Waiting to run
Deploy Docs Pages / build (push) Has been cancelled
Deploy Docs Pages / deploy (push) Has been cancelled
Real E2E Tests / JavaScript E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / Python E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / Java E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / C# E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / Go E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / Real E2E CI (push) Has been cancelled
154 lines
5.0 KiB
Python
154 lines
5.0 KiB
Python
# Copyright 2026 Alibaba Group Holding Ltd.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
from unittest.mock import patch
|
|
|
|
import pytest
|
|
from fastapi import HTTPException
|
|
|
|
from opensandbox_server.api.schema import PlatformSpec
|
|
from opensandbox_server.services.windows_common import (
|
|
inject_windows_resource_limits_env,
|
|
inject_windows_user_ports,
|
|
validate_windows_resource_limits,
|
|
)
|
|
from opensandbox_server.services.docker.windows_profile import (
|
|
apply_windows_runtime_host_config_defaults,
|
|
resolve_docker_platform,
|
|
validate_windows_runtime_prerequisites,
|
|
)
|
|
|
|
|
|
def test_apply_windows_runtime_host_config_defaults_injects_required_defaults():
|
|
host_cfg = {"network_mode": "host"}
|
|
updated = apply_windows_runtime_host_config_defaults(host_cfg, "sbx-1")
|
|
|
|
assert updated["devices"] == ["/dev/kvm", "/dev/net/tun"]
|
|
assert "NET_ADMIN" in updated["cap_add"]
|
|
assert "NET_RAW" in updated["cap_add"]
|
|
assert "opensandbox-win-oem-sbx-1:/oem:rw" in updated["binds"]
|
|
|
|
|
|
def test_apply_windows_runtime_host_config_defaults_removes_net_admin_from_cap_drop():
|
|
host_cfg = {
|
|
"cap_drop": ["NET_ADMIN", "NET_RAW", "SYS_ADMIN"],
|
|
"binds": ["/tmp/data:/data:rw"],
|
|
}
|
|
updated = apply_windows_runtime_host_config_defaults(host_cfg, "sbx-2")
|
|
|
|
assert "NET_ADMIN" not in (updated.get("cap_drop") or [])
|
|
assert "NET_RAW" not in (updated.get("cap_drop") or [])
|
|
assert "SYS_ADMIN" in (updated.get("cap_drop") or [])
|
|
assert "/tmp/data:/data:rw" in updated["binds"]
|
|
|
|
|
|
def test_validate_windows_runtime_prerequisites_reports_missing_devices():
|
|
with patch("opensandbox_server.services.docker.windows_profile.os.path.exists", return_value=False):
|
|
with pytest.raises(HTTPException) as exc_info:
|
|
validate_windows_runtime_prerequisites()
|
|
|
|
assert exc_info.value.status_code == 400
|
|
assert "/dev/kvm" in exc_info.value.detail["message"]
|
|
assert "/dev/net/tun" in exc_info.value.detail["message"]
|
|
|
|
|
|
def test_resolve_docker_platform_skips_windows_profile():
|
|
assert (
|
|
resolve_docker_platform(PlatformSpec(os="windows", arch="amd64"))
|
|
is None
|
|
)
|
|
|
|
|
|
def test_resolve_docker_platform_preserves_linux_profile():
|
|
assert (
|
|
resolve_docker_platform(PlatformSpec(os="linux", arch="arm64"))
|
|
== "linux/arm64"
|
|
)
|
|
|
|
|
|
def test_inject_windows_user_ports_appends_when_missing():
|
|
env = ["VERSION=11"]
|
|
updated = inject_windows_user_ports(env, ["44772", "8080/tcp"])
|
|
assert "VERSION=11" in updated
|
|
assert "USER_PORTS=44772,8080" in updated
|
|
|
|
|
|
def test_inject_windows_user_ports_merges_existing_value():
|
|
env = ["USER_PORTS=3389,44772", "VERSION=11"]
|
|
updated = inject_windows_user_ports(env, ["44772", "8080"])
|
|
assert "USER_PORTS=3389,44772,8080" in updated
|
|
|
|
|
|
def test_inject_windows_resource_limits_env_from_resource_limits():
|
|
env = ["VERSION=11"]
|
|
updated = inject_windows_resource_limits_env(
|
|
env,
|
|
{
|
|
"cpu": "4",
|
|
"memory": "8G",
|
|
"disk": "64G",
|
|
},
|
|
)
|
|
assert "VERSION=11" in updated
|
|
assert "CPU_CORES=4" in updated
|
|
assert "RAM_SIZE=8G" in updated
|
|
assert "DISK_SIZE=64G" in updated
|
|
|
|
|
|
def test_inject_windows_resource_limits_env_overrides_existing_env():
|
|
env = ["CPU_CORES=1", "RAM_SIZE=1G", "DISK_SIZE=20G", "VERSION=11"]
|
|
updated = inject_windows_resource_limits_env(
|
|
env,
|
|
{
|
|
"cpu": "2500m",
|
|
"memory": "8192Mi",
|
|
"storage": "100Gi",
|
|
},
|
|
)
|
|
assert "CPU_CORES=3" in updated
|
|
assert "RAM_SIZE=8G" in updated
|
|
assert "DISK_SIZE=100G" in updated
|
|
assert "CPU_CORES=1" not in updated
|
|
assert "RAM_SIZE=1G" not in updated
|
|
assert "DISK_SIZE=20G" not in updated
|
|
|
|
|
|
def test_validate_windows_resource_limits_accepts_minimum_values():
|
|
validate_windows_resource_limits(
|
|
{
|
|
"cpu": "2",
|
|
"memory": "4G",
|
|
"disk": "64G",
|
|
}
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("resource_limits", "expected_message_fragment"),
|
|
[
|
|
({"cpu": "1500m"}, "resourceLimits.cpu >= 2"),
|
|
({"memory": "3G"}, "resourceLimits.memory >= 4G"),
|
|
({"disk": "63G"}, "resourceLimits.disk"),
|
|
],
|
|
)
|
|
def test_validate_windows_resource_limits_rejects_values_below_minimum(
|
|
resource_limits, expected_message_fragment
|
|
):
|
|
with pytest.raises(HTTPException) as exc_info:
|
|
validate_windows_resource_limits(resource_limits)
|
|
assert exc_info.value.status_code == 400
|
|
assert expected_message_fragment in exc_info.value.detail["message"]
|
|
|
|
|