test_config_integration.py 4.98 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
"""
Test script to verify SGLang config file integration.
"""

import os
import tempfile
from pathlib import Path

import pytest
import yaml

from sglang.srt.server_args import prepare_server_args
from sglang.srt.server_args_config_parser import ConfigArgumentMerger


@pytest.fixture
def merger():
    """Fixture providing a ConfigArgumentMerger instance."""
    return ConfigArgumentMerger()


def test_server_args_config_parser(merger):
    """Test the config parser functionality."""
    # Create a temporary config file
    config_data = {
        "model-path": "microsoft/DialoGPT-medium",
        "host": "0.0.0.0",
        "port": 30000,
        "tensor-parallel-size": 2,
        "trust-remote-code": False,
        "enable-metrics": True,
        "stream-output": True,
        "skip-server-warmup": False,
        "log-requests": True,
        "show-time-cost": True,
        "is-embedding": False,
    }

    with tempfile.NamedTemporaryFile(mode="w", suffix=".yaml", delete=False) as f:
        yaml.dump(config_data, f)
        config_file = f.name

    try:
        # Test config parser directly
        config_args = merger._parse_yaml_config(config_file)

        # Test merging with CLI args
        cli_args = ["--config", config_file, "--max-running-requests", "128"]
        merged_args = merger.merge_config_with_args(cli_args)

        # Verify the merged args contain both config and CLI values
        assert "--model-path" in merged_args
        assert "microsoft/DialoGPT-medium" in merged_args
        assert "--host" in merged_args
        assert "0.0.0.0" in merged_args
        assert "--port" in merged_args
        assert "30000" in merged_args
        assert "--tensor-parallel-size" in merged_args
        assert "2" in merged_args
        assert "--max-running-requests" in merged_args
        assert "128" in merged_args

        # Test boolean arguments
        assert "--enable-metrics" in merged_args  # True boolean
        assert "--stream-output" in merged_args  # True boolean
        assert "--log-requests" in merged_args  # True boolean
        assert "--show-time-cost" in merged_args  # True boolean
        # False booleans should not be present (only add flag if True)
        assert "--trust-remote-code" not in merged_args  # False boolean
        assert "--skip-server-warmup" not in merged_args  # False boolean
        assert "--is-embedding" not in merged_args  # False boolean

    finally:
        os.unlink(config_file)


def test_server_args_integration():
    """Test the integration with server args."""
    # Create a temporary config file
    config_data = {
        "model-path": "microsoft/DialoGPT-medium",
        "host": "0.0.0.0",
        "port": 30000,
        "tensor-parallel-size": 1,
        "max-running-requests": 256,
    }

    with tempfile.NamedTemporaryFile(mode="w", suffix=".yaml", delete=False) as f:
        yaml.dump(config_data, f)
        config_file = f.name

    try:
        # Test with config file
        argv = ["--config", config_file]
        server_args = prepare_server_args(argv)

        # Verify that config values were loaded
        assert server_args.model_path == "microsoft/DialoGPT-medium"
        assert server_args.host == "0.0.0.0"
        assert server_args.port == 30000
        assert server_args.tp_size == 1
        assert server_args.max_running_requests == 256

    finally:
        os.unlink(config_file)


def test_cli_override():
    """Test that CLI arguments override config file values."""
    # Create a temporary config file
    config_data = {
        "model-path": "microsoft/DialoGPT-medium",
        "port": 30000,
        "tensor-parallel-size": 1,
    }

    with tempfile.NamedTemporaryFile(mode="w", suffix=".yaml", delete=False) as f:
        yaml.dump(config_data, f)
        config_file = f.name

    try:
        # Test CLI override (CLI should take precedence)
        argv = [
            "--config",
            config_file,
            "--port",
            "40000",
            "--tensor-parallel-size",
            "2",
        ]
        server_args = prepare_server_args(argv)

        # Verify that CLI values override config values
        assert server_args.model_path == "microsoft/DialoGPT-medium"  # From config
        assert server_args.port == 40000  # From CLI (overrides config)
        assert server_args.tp_size == 2  # From CLI (overrides config)

    finally:
        os.unlink(config_file)


def test_error_handling():
    """Test error handling for invalid config files."""
    # Test non-existent config file
    with pytest.raises(ValueError, match="Config file not found"):
        argv = ["--config", "non-existent.yaml"]
        prepare_server_args(argv)

    # Test invalid YAML file
    with tempfile.NamedTemporaryFile(mode="w", suffix=".yaml", delete=False) as f:
        f.write("invalid: yaml: content: [")
        invalid_yaml_file = f.name

    try:
        with pytest.raises(Exception):
            argv = ["--config", invalid_yaml_file]
            prepare_server_args(argv)
    finally:
        os.unlink(invalid_yaml_file)