mirror of
https://github.com/volcengine/OpenViking.git
synced 2026-09-28 11:43:00 +08:00
* lisence: change the main lisence from Apache-2.0 to AGPL-v3 * lisence: change the main lisence from Apache-2.0 to AGPL-v3 * lisence: change the main lisence from Apache-2.0 to AGPL-v3 --------- Co-authored-by: openviking <openviking@example.com>
192 lines
6.0 KiB
Python
192 lines
6.0 KiB
Python
#!/usr/bin/env python3
|
|
# Copyright (c) 2026 Beijing Volcano Engine Technology Co., Ltd.
|
|
# SPDX-License-Identifier: AGPL-3.0
|
|
"""
|
|
Simplified edge case tests for OpenViking that don't rely on complex imports.
|
|
|
|
These tests focus on boundary conditions and edge cases that can be tested
|
|
with minimal dependencies, highlighting potential issues in the codebase.
|
|
"""
|
|
|
|
import json
|
|
import unicodedata
|
|
|
|
|
|
class TestBasicEdgeCases:
|
|
"""Basic edge case tests without heavy dependencies."""
|
|
|
|
def test_filename_length_boundaries(self):
|
|
"""Test various filename lengths."""
|
|
# Test exactly 255 bytes
|
|
filename_255 = "a" * 251 + ".txt"
|
|
assert len(filename_255.encode("utf-8")) == 255
|
|
print("255-byte filename: PASS")
|
|
|
|
# Test 256 bytes (just over limit)
|
|
filename_256 = "b" * 252 + ".txt"
|
|
assert len(filename_256.encode("utf-8")) == 256
|
|
print("256-byte filename: PASS")
|
|
|
|
# Test very long with CJK
|
|
cjk_filename = "测试文件名" * 30 + ".py"
|
|
assert len(cjk_filename.encode("utf-8")) > 400
|
|
print(f"Long CJK filename ({len(cjk_filename.encode('utf-8'))} bytes): PASS")
|
|
|
|
def test_special_character_filenames(self):
|
|
"""Test filenames with special characters."""
|
|
special_chars = [
|
|
"file!@#$.txt",
|
|
"file with spaces.txt",
|
|
"file\ttab.txt",
|
|
"file\nnewline.txt",
|
|
"файл.txt", # Cyrillic
|
|
"档案.txt", # Chinese
|
|
"ملف.txt", # Arabic
|
|
]
|
|
|
|
for filename in special_chars:
|
|
# Basic validation - should not crash
|
|
assert len(filename) > 0
|
|
assert isinstance(filename, str)
|
|
|
|
print("Special character filenames: PASS")
|
|
|
|
def test_unicode_edge_cases(self):
|
|
"""Test Unicode edge cases."""
|
|
# Zero-width characters
|
|
zwsp_filename = "test\u200bfile.txt"
|
|
assert "\u200b" in zwsp_filename
|
|
print("Zero-width character test: PASS")
|
|
|
|
# Combining characters
|
|
combined = "e\u0301\u0302\u0303.txt" # e with multiple accents
|
|
assert len(combined) > 5 # Base char + combining chars + extension
|
|
print("Combining characters test: PASS")
|
|
|
|
# Unicode normalization
|
|
nfc = "café.txt"
|
|
nfd = "cafe\u0301.txt"
|
|
assert nfc != nfd
|
|
assert unicodedata.normalize("NFC", nfd) == nfc
|
|
print("Unicode normalization test: PASS")
|
|
|
|
def test_json_edge_cases(self):
|
|
"""Test JSON handling edge cases."""
|
|
# Empty JSON
|
|
empty_json = "{}"
|
|
parsed = json.loads(empty_json)
|
|
assert parsed == {}
|
|
print("Empty JSON test: PASS")
|
|
|
|
# Deeply nested (but not too deep to crash)
|
|
nested = {}
|
|
current = nested
|
|
for i in range(100): # Reasonable depth
|
|
current[f"level_{i}"] = {}
|
|
current = current[f"level_{i}"]
|
|
current["value"] = "deep"
|
|
|
|
# Should serialize/deserialize without issues
|
|
json_str = json.dumps(nested)
|
|
parsed_nested = json.loads(json_str)
|
|
assert parsed_nested is not None
|
|
print("Nested JSON test: PASS")
|
|
|
|
# JSON with special characters
|
|
special_json = {"unicode": "测试", "emoji": "😀", "null_byte": "test\x00null"}
|
|
json_str = json.dumps(special_json)
|
|
parsed_special = json.loads(json_str)
|
|
assert parsed_special["unicode"] == "测试"
|
|
print("Special character JSON test: PASS")
|
|
|
|
def test_path_traversal_patterns(self):
|
|
"""Test path traversal patterns."""
|
|
dangerous_paths = [
|
|
"../../../etc/passwd",
|
|
"..\\..\\windows\\system32",
|
|
"file/../../../secret.txt",
|
|
"/etc/passwd",
|
|
"C:\\windows\\system32\\config",
|
|
]
|
|
|
|
for path in dangerous_paths:
|
|
# Basic validation - paths should be detectable as dangerous
|
|
assert ".." in path or "/" in path or "\\" in path
|
|
|
|
print("Path traversal pattern detection: PASS")
|
|
|
|
def test_empty_and_null_inputs(self):
|
|
"""Test empty and null inputs."""
|
|
# Empty strings
|
|
assert "" == ""
|
|
assert len("") == 0
|
|
|
|
# Null bytes
|
|
null_string = "hello\x00world"
|
|
assert "\x00" in null_string
|
|
assert len(null_string) == 11
|
|
|
|
# Whitespace only
|
|
whitespace = " \t\n "
|
|
assert whitespace.strip() == ""
|
|
|
|
print("Empty/null input tests: PASS")
|
|
|
|
def test_encoding_edge_cases(self):
|
|
"""Test various encoding scenarios."""
|
|
# UTF-8 BOM
|
|
bom_text = "\ufeffHello World"
|
|
assert bom_text.startswith("\ufeff")
|
|
|
|
# Mixed encoding content (as much as we can test without complex imports)
|
|
mixed_content = "ASCII text with 中文 and émojis 😀"
|
|
utf8_bytes = mixed_content.encode("utf-8")
|
|
decoded = utf8_bytes.decode("utf-8")
|
|
assert decoded == mixed_content
|
|
|
|
print("Encoding edge case tests: PASS")
|
|
|
|
|
|
def run_all_tests():
|
|
"""Run all edge case tests."""
|
|
print("Running OpenViking Edge Case Tests...")
|
|
print("=" * 50)
|
|
|
|
test_instance = TestBasicEdgeCases()
|
|
|
|
tests = [
|
|
test_instance.test_filename_length_boundaries,
|
|
test_instance.test_special_character_filenames,
|
|
test_instance.test_unicode_edge_cases,
|
|
test_instance.test_json_edge_cases,
|
|
test_instance.test_path_traversal_patterns,
|
|
test_instance.test_empty_and_null_inputs,
|
|
test_instance.test_encoding_edge_cases,
|
|
]
|
|
|
|
passed = 0
|
|
failed = 0
|
|
|
|
for test in tests:
|
|
try:
|
|
test()
|
|
passed += 1
|
|
except Exception as e:
|
|
print(f"{test.__name__}: FAILED - {e}")
|
|
failed += 1
|
|
|
|
print("=" * 50)
|
|
print(f"Results: {passed} passed, {failed} failed")
|
|
|
|
if failed > 0:
|
|
print("\nFailed tests indicate potential edge cases that need attention!")
|
|
return 1
|
|
else:
|
|
print("\nAll edge case tests passed!")
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
exit_code = run_all_tests()
|
|
exit(exit_code)
|