7a0da7932b
Backwards Compatibility / Verify Encryption Constants (push) Waiting to run
Backwards Compatibility / PyPI Version Compatibility (push) Waiting to run
Backwards Compatibility / Database Migration Tests (push) Waiting to run
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
CodeQL Advanced / Analyze (python) (push) Waiting to run
Docker Tests (Consolidated) / UI Tests (Puppeteer) [research-form] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [research-metrics] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [research-workflow] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [settings-core] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [settings-pages] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [history-news] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [library] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [link-analytics] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [mobile] (push) Blocked by required conditions
Docker Tests (Consolidated) / detect-changes (push) Waiting to run
Docker Tests (Consolidated) / Build Test Image (push) Waiting to run
Docker Tests (Consolidated) / All Pytest Tests + Coverage (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [accessibility] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [api-crud] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [auth-login] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [auth-pages] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [auth-register] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [chat-core] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [chat-lifecycle] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [error-benchmark] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) (push) Blocked by required conditions
Docker Tests (Consolidated) / Accessibility Tests (push) Blocked by required conditions
Docker Tests (Consolidated) / LLM Unit Tests (push) Blocked by required conditions
Docker Tests (Consolidated) / LLM Example Tests (push) Blocked by required conditions
Docker Tests (Consolidated) / Production Image Smoke Test (push) Blocked by required conditions
Docker Tests (Consolidated) / Infrastructure Tests (push) Blocked by required conditions
OSSF Scorecard / OSSF Security Scorecard Analysis (push) Waiting to run
OSV-Scanner (Scheduled) / scan-scheduled (push) Failing after 0s
Create Release / test-gate (push) Has been cancelled
Create Release / release-gate (push) Has been cancelled
Create Release / ci-gate (push) Has been cancelled
Create Release / version-check (push) Has been cancelled
Create Release / e2e-test-gate (push) Has been cancelled
Create Release / responsive-test-gate (push) Has been cancelled
Create Release / compat-test-gate (push) Has been cancelled
Create Release / compose-integration-gate (push) Has been cancelled
Create Release / vulture-gate (push) Has been cancelled
Create Release / build (push) Has been cancelled
Create Release / provenance (push) Has been cancelled
Create Release / prerelease-docker (push) Has been cancelled
Create Release / publish-docker (push) Has been cancelled
Create Release / create-release (push) Has been cancelled
Create Release / cleanup-changelog (push) Has been cancelled
Create Release / trigger-pypi (push) Has been cancelled
Create Release / monitor-pypi (push) Has been cancelled
Create Release / Clean up orphan prerelease tags and signatures (push) Has been cancelled
264 lines
9.3 KiB
Python
264 lines
9.3 KiB
Python
"""
|
|
Tests for benchmarks/datasets/utils.py
|
|
|
|
Tests cover:
|
|
- derive_key function for key derivation
|
|
- decrypt function for XOR decryption
|
|
- get_known_answer_map function
|
|
"""
|
|
|
|
import base64
|
|
|
|
|
|
class TestDeriveKey:
|
|
"""Tests for the derive_key function."""
|
|
|
|
def test_derives_consistent_key(self):
|
|
"""Test that same password produces same key."""
|
|
from local_deep_research.benchmarks.datasets.utils import derive_key
|
|
|
|
key1 = derive_key("password123", 32)
|
|
key2 = derive_key("password123", 32)
|
|
|
|
assert key1 == key2
|
|
|
|
def test_different_passwords_produce_different_keys(self):
|
|
"""Test that different passwords produce different keys."""
|
|
from local_deep_research.benchmarks.datasets.utils import derive_key
|
|
|
|
key1 = derive_key("password1", 32)
|
|
key2 = derive_key("password2", 32)
|
|
|
|
assert key1 != key2
|
|
|
|
def test_key_has_requested_length(self):
|
|
"""Test that key has the requested length."""
|
|
from local_deep_research.benchmarks.datasets.utils import derive_key
|
|
|
|
for length in [16, 32, 64, 100]:
|
|
key = derive_key("password", length)
|
|
assert len(key) == length
|
|
|
|
def test_handles_short_length(self):
|
|
"""Test handling of short key lengths."""
|
|
from local_deep_research.benchmarks.datasets.utils import derive_key
|
|
|
|
key = derive_key("password", 8)
|
|
assert len(key) == 8
|
|
|
|
def test_handles_long_length(self):
|
|
"""Test handling of long key lengths (requires key repetition)."""
|
|
from local_deep_research.benchmarks.datasets.utils import derive_key
|
|
|
|
key = derive_key("password", 128)
|
|
assert len(key) == 128
|
|
|
|
def test_empty_password(self):
|
|
"""Test handling of empty password."""
|
|
from local_deep_research.benchmarks.datasets.utils import derive_key
|
|
|
|
key = derive_key("", 32)
|
|
assert len(key) == 32
|
|
|
|
|
|
class TestDecrypt:
|
|
"""Tests for the decrypt function."""
|
|
|
|
def test_returns_short_strings_unchanged(self):
|
|
"""Test that strings shorter than 8 chars are returned unchanged."""
|
|
from local_deep_research.benchmarks.datasets.utils import decrypt
|
|
|
|
result = decrypt("short", "password")
|
|
assert result == "short"
|
|
|
|
def test_returns_non_base64_unchanged(self):
|
|
"""Test that non-base64 strings are returned unchanged."""
|
|
from local_deep_research.benchmarks.datasets.utils import decrypt
|
|
|
|
# Contains characters not in base64 alphabet
|
|
result = decrypt("not@base64!string", "password")
|
|
assert result == "not@base64!string"
|
|
|
|
def test_returns_non_string_unchanged(self):
|
|
"""Test that non-string input is returned unchanged."""
|
|
from local_deep_research.benchmarks.datasets.utils import decrypt
|
|
|
|
result = decrypt(12345, "password")
|
|
assert result == 12345
|
|
|
|
def test_known_encryption_decryption(self):
|
|
"""Test decryption with known encrypted value."""
|
|
from local_deep_research.benchmarks.datasets.utils import (
|
|
decrypt,
|
|
derive_key,
|
|
)
|
|
|
|
# Create a known encrypted value
|
|
plaintext = "Hello World test message"
|
|
password = "test_password"
|
|
|
|
# Encrypt
|
|
key = derive_key(password, len(plaintext.encode()))
|
|
encrypted = bytes(
|
|
a ^ b for a, b in zip(plaintext.encode(), key, strict=False)
|
|
)
|
|
ciphertext_b64 = base64.b64encode(encrypted).decode()
|
|
|
|
# Decrypt should return original
|
|
result = decrypt(ciphertext_b64, password)
|
|
assert result == plaintext
|
|
|
|
def test_invalid_base64_returns_original(self):
|
|
"""Test that invalid base64 returns original string."""
|
|
from local_deep_research.benchmarks.datasets.utils import decrypt
|
|
|
|
# Valid base64 chars but invalid padding/encoding
|
|
invalid = "AAAAAAAA" # Valid chars but may not decode properly
|
|
result = decrypt(invalid, "password")
|
|
# Should return something (either original or decrypted)
|
|
assert isinstance(result, str)
|
|
|
|
def test_decryption_with_hardcoded_key_fallback(self):
|
|
"""Test that hardcoded key fallback is attempted."""
|
|
from local_deep_research.benchmarks.datasets.utils import decrypt
|
|
|
|
# Create encrypted with hardcoded BrowseComp key
|
|
plaintext = "This is a test message with spaces"
|
|
password = "MHGGF2022!"
|
|
|
|
from local_deep_research.benchmarks.datasets.utils import derive_key
|
|
|
|
key = derive_key(password, len(plaintext.encode()))
|
|
encrypted = bytes(
|
|
a ^ b for a, b in zip(plaintext.encode(), key, strict=False)
|
|
)
|
|
ciphertext_b64 = base64.b64encode(encrypted).decode()
|
|
|
|
# Should decrypt using hardcoded key as fallback
|
|
result = decrypt(ciphertext_b64, "wrong_password")
|
|
assert result == plaintext
|
|
|
|
|
|
class TestGetKnownAnswerMap:
|
|
"""Tests for the get_known_answer_map function."""
|
|
|
|
def test_returns_dictionary(self):
|
|
"""Test that function returns a dictionary."""
|
|
from local_deep_research.benchmarks.datasets.utils import (
|
|
get_known_answer_map,
|
|
)
|
|
|
|
result = get_known_answer_map()
|
|
assert isinstance(result, dict)
|
|
|
|
def test_contains_known_mappings(self):
|
|
"""Test that known mappings are present."""
|
|
from local_deep_research.benchmarks.datasets.utils import (
|
|
get_known_answer_map,
|
|
)
|
|
|
|
result = get_known_answer_map()
|
|
|
|
# Check known mappings exist
|
|
assert "dFoTn+K+bcdyWg==" in result
|
|
assert result["dFoTn+K+bcdyWg=="] == "Tooth Rock"
|
|
|
|
assert "ERFIwA==" in result
|
|
assert result["ERFIwA=="] == "1945"
|
|
|
|
def test_values_are_strings(self):
|
|
"""Test that all values are strings."""
|
|
from local_deep_research.benchmarks.datasets.utils import (
|
|
get_known_answer_map,
|
|
)
|
|
|
|
result = get_known_answer_map()
|
|
|
|
for key, value in result.items():
|
|
assert isinstance(key, str)
|
|
assert isinstance(value, str)
|
|
|
|
|
|
class TestDatasetRegistry:
|
|
"""Tests for the DatasetRegistry class."""
|
|
|
|
def test_registry_has_register_method(self):
|
|
"""Test that registry has register method."""
|
|
from local_deep_research.benchmarks.datasets.base import DatasetRegistry
|
|
|
|
assert hasattr(DatasetRegistry, "register")
|
|
assert callable(DatasetRegistry.register)
|
|
|
|
def test_registry_has_get_dataset_class_method(self):
|
|
"""Test that registry has get_dataset_class method."""
|
|
from local_deep_research.benchmarks.datasets.base import DatasetRegistry
|
|
|
|
assert hasattr(DatasetRegistry, "get_dataset_class")
|
|
assert callable(DatasetRegistry.get_dataset_class)
|
|
|
|
def test_registry_has_create_dataset_method(self):
|
|
"""Test that registry has create_dataset method."""
|
|
from local_deep_research.benchmarks.datasets.base import DatasetRegistry
|
|
|
|
assert hasattr(DatasetRegistry, "create_dataset")
|
|
assert callable(DatasetRegistry.create_dataset)
|
|
|
|
def test_registry_has_get_available_datasets(self):
|
|
"""Test that registry has get_available_datasets method."""
|
|
from local_deep_research.benchmarks.datasets.base import DatasetRegistry
|
|
|
|
assert hasattr(DatasetRegistry, "get_available_datasets")
|
|
result = DatasetRegistry.get_available_datasets()
|
|
assert isinstance(result, list)
|
|
|
|
def test_registry_has_load_dataset_method(self):
|
|
"""Test that registry has load_dataset method."""
|
|
from local_deep_research.benchmarks.datasets.base import DatasetRegistry
|
|
|
|
assert hasattr(DatasetRegistry, "load_dataset")
|
|
assert callable(DatasetRegistry.load_dataset)
|
|
|
|
def test_get_unknown_dataset_raises(self):
|
|
"""Test that getting unknown dataset raises ValueError."""
|
|
from local_deep_research.benchmarks.datasets.base import DatasetRegistry
|
|
import pytest
|
|
|
|
with pytest.raises(ValueError, match="Unknown dataset"):
|
|
DatasetRegistry.get_dataset_class("nonexistent_dataset_xyz")
|
|
|
|
|
|
class TestBenchmarkDatasetBase:
|
|
"""Tests for the BenchmarkDataset abstract base class."""
|
|
|
|
def test_benchmark_dataset_is_abstract(self):
|
|
"""Test that BenchmarkDataset is abstract."""
|
|
from local_deep_research.benchmarks.datasets.base import (
|
|
BenchmarkDataset,
|
|
)
|
|
from abc import ABC
|
|
|
|
assert issubclass(BenchmarkDataset, ABC)
|
|
|
|
def test_benchmark_dataset_has_abstract_methods(self):
|
|
"""Test that BenchmarkDataset has required abstract methods."""
|
|
from local_deep_research.benchmarks.datasets.base import (
|
|
BenchmarkDataset,
|
|
)
|
|
|
|
# Check for abstract methods
|
|
assert hasattr(BenchmarkDataset, "get_dataset_info")
|
|
assert hasattr(BenchmarkDataset, "get_default_dataset_path")
|
|
assert hasattr(BenchmarkDataset, "process_example")
|
|
|
|
def test_benchmark_dataset_has_utility_methods(self):
|
|
"""Test that BenchmarkDataset has utility methods."""
|
|
from local_deep_research.benchmarks.datasets.base import (
|
|
BenchmarkDataset,
|
|
)
|
|
|
|
assert hasattr(BenchmarkDataset, "load")
|
|
assert hasattr(BenchmarkDataset, "get_examples")
|
|
assert hasattr(BenchmarkDataset, "get_example")
|
|
assert hasattr(BenchmarkDataset, "get_question")
|
|
assert hasattr(BenchmarkDataset, "get_answer")
|