92 lines
3.0 KiB
Python
92 lines
3.0 KiB
Python
![]() |
import json
|
||
|
import unittest
|
||
|
|
||
|
from vllm.entrypoints.openai.cli_args import make_arg_parser
|
||
|
from vllm.entrypoints.openai.serving_engine import LoRAModulePath
|
||
|
from vllm.utils import FlexibleArgumentParser
|
||
|
|
||
|
LORA_MODULE = {
|
||
|
"name": "module2",
|
||
|
"path": "/path/to/module2",
|
||
|
"base_model_name": "llama"
|
||
|
}
|
||
|
|
||
|
|
||
|
class TestLoraParserAction(unittest.TestCase):
|
||
|
|
||
|
def setUp(self):
|
||
|
# Setting up argparse parser for tests
|
||
|
parser = FlexibleArgumentParser(
|
||
|
description="vLLM's remote OpenAI server.")
|
||
|
self.parser = make_arg_parser(parser)
|
||
|
|
||
|
def test_valid_key_value_format(self):
|
||
|
# Test old format: name=path
|
||
|
args = self.parser.parse_args([
|
||
|
'--lora-modules',
|
||
|
'module1=/path/to/module1',
|
||
|
])
|
||
|
expected = [LoRAModulePath(name='module1', path='/path/to/module1')]
|
||
|
self.assertEqual(args.lora_modules, expected)
|
||
|
|
||
|
def test_valid_json_format(self):
|
||
|
# Test valid JSON format input
|
||
|
args = self.parser.parse_args([
|
||
|
'--lora-modules',
|
||
|
json.dumps(LORA_MODULE),
|
||
|
])
|
||
|
expected = [
|
||
|
LoRAModulePath(name='module2',
|
||
|
path='/path/to/module2',
|
||
|
base_model_name='llama')
|
||
|
]
|
||
|
self.assertEqual(args.lora_modules, expected)
|
||
|
|
||
|
def test_invalid_json_format(self):
|
||
|
# Test invalid JSON format input, missing closing brace
|
||
|
with self.assertRaises(SystemExit):
|
||
|
self.parser.parse_args([
|
||
|
'--lora-modules',
|
||
|
'{"name": "module3", "path": "/path/to/module3"'
|
||
|
])
|
||
|
|
||
|
def test_invalid_type_error(self):
|
||
|
# Test type error when values are not JSON or key=value
|
||
|
with self.assertRaises(SystemExit):
|
||
|
self.parser.parse_args([
|
||
|
'--lora-modules',
|
||
|
'invalid_format' # This is not JSON or key=value format
|
||
|
])
|
||
|
|
||
|
def test_invalid_json_field(self):
|
||
|
# Test valid JSON format but missing required fields
|
||
|
with self.assertRaises(SystemExit):
|
||
|
self.parser.parse_args([
|
||
|
'--lora-modules',
|
||
|
'{"name": "module4"}' # Missing required 'path' field
|
||
|
])
|
||
|
|
||
|
def test_empty_values(self):
|
||
|
# Test when no LoRA modules are provided
|
||
|
args = self.parser.parse_args(['--lora-modules', ''])
|
||
|
self.assertEqual(args.lora_modules, [])
|
||
|
|
||
|
def test_multiple_valid_inputs(self):
|
||
|
# Test multiple valid inputs (both old and JSON format)
|
||
|
args = self.parser.parse_args([
|
||
|
'--lora-modules',
|
||
|
'module1=/path/to/module1',
|
||
|
json.dumps(LORA_MODULE),
|
||
|
])
|
||
|
expected = [
|
||
|
LoRAModulePath(name='module1', path='/path/to/module1'),
|
||
|
LoRAModulePath(name='module2',
|
||
|
path='/path/to/module2',
|
||
|
base_model_name='llama')
|
||
|
]
|
||
|
self.assertEqual(args.lora_modules, expected)
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
unittest.main()
|