chore: import upstream snapshot with attribution
CI: cua-driver distro-compat matrix / debian:12 (glibc 2.36) (push) Has been cancelled
CI: SPDX Headers / Check SPDX headers (warn-only) (push) Has been cancelled
CD: Docs MCP Server / build (linux/amd64) (push) Has been cancelled
CD: Docs MCP Server / build (linux/arm64) (push) Has been cancelled
CD: Docs MCP Server / merge (push) Has been cancelled
CI: cua-driver distro-compat matrix / Resolve release version (push) Has been cancelled
CI: cua-driver distro-compat matrix / fedora:41 (glibc 2.40) (push) Has been cancelled
CI: cua-driver distro-compat matrix / rockylinux:9 (glibc 2.34) (push) Has been cancelled
CI: cua-driver distro-compat matrix / ubuntu:22.04 (glibc 2.35) (push) Has been cancelled
CI: cua-driver distro-compat matrix / ubuntu:24.04 (glibc 2.39) (push) Has been cancelled
CI: cua-driver distro-compat matrix / Distro compat summary (push) Has been cancelled
CI: Rust Linux unit / Rust Linux unit and compile (push) Has been cancelled
CI: Rust Windows unit / Rust Windows unit and compile (push) Has been cancelled
CI: Nix Linux Rust source / Nix / compositor build (push) Has been cancelled
CI: Nix Linux Rust source / Nix / driver package (push) Has been cancelled
CI: Nix Linux Rust source / Nix / Rust unit tests (push) Has been cancelled
CI: cua-driver distro-compat matrix / debian:12 (glibc 2.36) (push) Has been cancelled
CI: SPDX Headers / Check SPDX headers (warn-only) (push) Has been cancelled
CD: Docs MCP Server / build (linux/amd64) (push) Has been cancelled
CD: Docs MCP Server / build (linux/arm64) (push) Has been cancelled
CD: Docs MCP Server / merge (push) Has been cancelled
CI: cua-driver distro-compat matrix / Resolve release version (push) Has been cancelled
CI: cua-driver distro-compat matrix / fedora:41 (glibc 2.40) (push) Has been cancelled
CI: cua-driver distro-compat matrix / rockylinux:9 (glibc 2.34) (push) Has been cancelled
CI: cua-driver distro-compat matrix / ubuntu:22.04 (glibc 2.35) (push) Has been cancelled
CI: cua-driver distro-compat matrix / ubuntu:24.04 (glibc 2.39) (push) Has been cancelled
CI: cua-driver distro-compat matrix / Distro compat summary (push) Has been cancelled
CI: Rust Linux unit / Rust Linux unit and compile (push) Has been cancelled
CI: Rust Windows unit / Rust Windows unit and compile (push) Has been cancelled
CI: Nix Linux Rust source / Nix / compositor build (push) Has been cancelled
CI: Nix Linux Rust source / Nix / driver package (push) Has been cancelled
CI: Nix Linux Rust source / Nix / Rust unit tests (push) Has been cancelled
This commit is contained in:
@@ -0,0 +1,145 @@
|
||||
"""
|
||||
Test script to verify telemetry events are emitted correctly.
|
||||
"""
|
||||
|
||||
from unittest.mock import AsyncMock, MagicMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
class TestAgentTelemetryEvents:
|
||||
"""Test telemetry events emitted by ComputerAgent."""
|
||||
|
||||
@patch("cua_agent.agent.record_event")
|
||||
@patch("cua_agent.agent.is_telemetry_enabled", return_value=True)
|
||||
def test_agent_init_event(self, mock_telemetry_enabled, mock_record_event):
|
||||
"""Test that agent_init event is emitted with correct args_provided."""
|
||||
from cua_agent.agent import ComputerAgent
|
||||
|
||||
# Create agent with various args
|
||||
agent = ComputerAgent(
|
||||
model="anthropic/claude-sonnet-4-5-20250929",
|
||||
instructions="Test instructions",
|
||||
max_retries=5, # non-default
|
||||
trajectory_dir="/tmp/test",
|
||||
)
|
||||
|
||||
# Find the agent_init call
|
||||
agent_init_calls = [
|
||||
call for call in mock_record_event.call_args_list if call[0][0] == "agent_init"
|
||||
]
|
||||
|
||||
assert len(agent_init_calls) == 1, "agent_init should be called once"
|
||||
|
||||
event_name, event_data = agent_init_calls[0][0]
|
||||
assert event_name == "agent_init"
|
||||
assert event_data["model"] == "anthropic/claude-sonnet-4-5-20250929"
|
||||
assert "instructions" in event_data["args_provided"]
|
||||
assert "max_retries" in event_data["args_provided"]
|
||||
assert "trajectory_dir" in event_data["args_provided"]
|
||||
|
||||
@patch("cua_agent.agent.record_event")
|
||||
@patch("cua_agent.agent.is_telemetry_enabled", return_value=True)
|
||||
def test_agent_init_minimal_args(self, mock_telemetry_enabled, mock_record_event):
|
||||
"""Test agent_init with minimal args (defaults)."""
|
||||
from cua_agent.agent import ComputerAgent
|
||||
|
||||
agent = ComputerAgent(model="anthropic/claude-sonnet-4-5-20250929")
|
||||
|
||||
agent_init_calls = [
|
||||
call for call in mock_record_event.call_args_list if call[0][0] == "agent_init"
|
||||
]
|
||||
|
||||
assert len(agent_init_calls) == 1
|
||||
event_name, event_data = agent_init_calls[0][0]
|
||||
|
||||
# With defaults, only model-related things should be tracked
|
||||
# instructions, trajectory_dir, etc. should NOT be in args_provided
|
||||
assert "instructions" not in event_data["args_provided"]
|
||||
assert "trajectory_dir" not in event_data["args_provided"]
|
||||
assert "max_retries" not in event_data["args_provided"] # default is 3
|
||||
|
||||
@patch("cua_agent.agent.record_event")
|
||||
@patch("cua_agent.agent.is_telemetry_enabled", return_value=False)
|
||||
def test_no_events_when_telemetry_disabled(self, mock_telemetry_enabled, mock_record_event):
|
||||
"""Test that no events are emitted when telemetry is disabled."""
|
||||
from cua_agent.agent import ComputerAgent
|
||||
|
||||
agent = ComputerAgent(
|
||||
model="anthropic/claude-sonnet-4-5-20250929",
|
||||
telemetry_enabled=False,
|
||||
)
|
||||
|
||||
# No agent_init should be called (telemetry disabled)
|
||||
agent_init_calls = [
|
||||
call for call in mock_record_event.call_args_list if call[0][0] == "agent_init"
|
||||
]
|
||||
|
||||
assert len(agent_init_calls) == 0
|
||||
|
||||
|
||||
class TestActionTelemetryEvents:
|
||||
"""Test telemetry events for computer actions."""
|
||||
|
||||
@pytest.mark.asyncio
|
||||
@patch("cua_agent.agent.record_event")
|
||||
@patch("cua_agent.agent.is_telemetry_enabled", return_value=True)
|
||||
async def test_computer_action_executed_event(self, mock_telemetry_enabled, mock_record_event):
|
||||
"""Test that computer_action_executed is emitted for computer calls."""
|
||||
from cua_agent.agent import ComputerAgent
|
||||
|
||||
agent = ComputerAgent(model="anthropic/claude-sonnet-4-5-20250929")
|
||||
agent.telemetry_enabled = True
|
||||
|
||||
# Mock computer handler
|
||||
mock_computer = MagicMock()
|
||||
mock_computer.click = AsyncMock(return_value=None)
|
||||
mock_computer.screenshot = AsyncMock(return_value="base64screenshot")
|
||||
|
||||
# Create a mock computer_call item
|
||||
item = {
|
||||
"type": "computer_call",
|
||||
"call_id": "test-call-id",
|
||||
"action": {
|
||||
"type": "click",
|
||||
"x": 100,
|
||||
"y": 200,
|
||||
},
|
||||
}
|
||||
|
||||
# Process the item (this would normally happen in the agent loop)
|
||||
# Note: We can't easily test this without running the full agent loop
|
||||
# This is more of an integration test
|
||||
|
||||
# For unit testing, we verify the event structure
|
||||
expected_event = {
|
||||
"action_type": "click",
|
||||
}
|
||||
|
||||
# Verify event structure is correct
|
||||
assert "action_type" in expected_event
|
||||
|
||||
|
||||
class TestToolExecutedEvents:
|
||||
"""Test telemetry events for tool execution."""
|
||||
|
||||
def test_event_structure(self):
|
||||
"""Test that agent_tool_executed event has correct structure."""
|
||||
expected_computer_tool_event = {
|
||||
"tool_type": "computer",
|
||||
"tool_name": "click",
|
||||
}
|
||||
|
||||
expected_function_tool_event = {
|
||||
"tool_type": "function",
|
||||
"tool_name": "my_custom_function",
|
||||
}
|
||||
|
||||
# Verify expected structure
|
||||
assert "tool_type" in expected_computer_tool_event
|
||||
assert "tool_name" in expected_computer_tool_event
|
||||
assert expected_computer_tool_event["tool_type"] in ["computer", "function"]
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
pytest.main([__file__, "-v"])
|
||||
Reference in New Issue
Block a user