- Change file mode from 644 to 755 for all project files - Add chain_id parameter to get_balance RPC endpoint with default "ait-devnet" - Rename Miner.extra_meta_data to extra_metadata for consistency
443 lines
14 KiB
Python
Executable File
443 lines
14 KiB
Python
Executable File
"""
|
|
Test for cross-chain agent communication system
|
|
"""
|
|
|
|
import asyncio
|
|
import pytest
|
|
from datetime import datetime, timedelta
|
|
from aitbc_cli.core.config import MultiChainConfig, NodeConfig
|
|
from aitbc_cli.core.agent_communication import (
|
|
CrossChainAgentCommunication, AgentInfo, AgentMessage,
|
|
MessageType, AgentStatus, AgentCollaboration, AgentReputation
|
|
)
|
|
|
|
def test_agent_communication_creation():
|
|
"""Test agent communication system creation"""
|
|
config = MultiChainConfig()
|
|
comm = CrossChainAgentCommunication(config)
|
|
|
|
assert comm.config == config
|
|
assert comm.agents == {}
|
|
assert comm.messages == {}
|
|
assert comm.collaborations == {}
|
|
assert comm.reputations == {}
|
|
assert comm.routing_table == {}
|
|
|
|
async def test_agent_registration():
|
|
"""Test agent registration"""
|
|
config = MultiChainConfig()
|
|
comm = CrossChainAgentCommunication(config)
|
|
|
|
# Create test agent
|
|
agent_info = AgentInfo(
|
|
agent_id="test-agent-1",
|
|
name="Test Agent",
|
|
chain_id="chain-1",
|
|
node_id="node-1",
|
|
status=AgentStatus.ACTIVE,
|
|
capabilities=["trading", "analytics"],
|
|
reputation_score=0.8,
|
|
last_seen=datetime.now(),
|
|
endpoint="http://localhost:8080",
|
|
version="1.0.0"
|
|
)
|
|
|
|
# Register agent
|
|
success = await comm.register_agent(agent_info)
|
|
|
|
assert success
|
|
assert "test-agent-1" in comm.agents
|
|
assert comm.agents["test-agent-1"].name == "Test Agent"
|
|
assert "test-agent-1" in comm.reputations
|
|
assert comm.reputations["test-agent-1"].reputation_score == 0.8
|
|
|
|
async def test_agent_discovery():
|
|
"""Test agent discovery"""
|
|
config = MultiChainConfig()
|
|
comm = CrossChainAgentCommunication(config)
|
|
|
|
# Register multiple agents
|
|
agents = [
|
|
AgentInfo(
|
|
agent_id="agent-1",
|
|
name="Agent 1",
|
|
chain_id="chain-1",
|
|
node_id="node-1",
|
|
status=AgentStatus.ACTIVE,
|
|
capabilities=["trading", "analytics"],
|
|
reputation_score=0.8,
|
|
last_seen=datetime.now(),
|
|
endpoint="http://localhost:8080",
|
|
version="1.0.0"
|
|
),
|
|
AgentInfo(
|
|
agent_id="agent-2",
|
|
name="Agent 2",
|
|
chain_id="chain-1",
|
|
node_id="node-1",
|
|
status=AgentStatus.ACTIVE,
|
|
capabilities=["mining"],
|
|
reputation_score=0.7,
|
|
last_seen=datetime.now(),
|
|
endpoint="http://localhost:8081",
|
|
version="1.0.0"
|
|
),
|
|
AgentInfo(
|
|
agent_id="agent-3",
|
|
name="Agent 3",
|
|
chain_id="chain-2",
|
|
node_id="node-2",
|
|
status=AgentStatus.INACTIVE,
|
|
capabilities=["trading"],
|
|
reputation_score=0.6,
|
|
last_seen=datetime.now(),
|
|
endpoint="http://localhost:8082",
|
|
version="1.0.0"
|
|
)
|
|
]
|
|
|
|
for agent in agents:
|
|
await comm.register_agent(agent)
|
|
|
|
# Discover agents on chain-1
|
|
chain1_agents = await comm.discover_agents("chain-1")
|
|
assert len(chain1_agents) == 2
|
|
assert all(agent.chain_id == "chain-1" for agent in chain1_agents)
|
|
|
|
# Discover agents with trading capability
|
|
trading_agents = await comm.discover_agents("chain-1", ["trading"])
|
|
assert len(trading_agents) == 1
|
|
assert trading_agents[0].agent_id == "agent-1"
|
|
|
|
# Discover active agents only
|
|
active_agents = await comm.discover_agents("chain-1")
|
|
assert all(agent.status == AgentStatus.ACTIVE for agent in active_agents)
|
|
|
|
async def test_message_sending():
|
|
"""Test message sending"""
|
|
config = MultiChainConfig()
|
|
comm = CrossChainAgentCommunication(config)
|
|
|
|
# Register agents
|
|
sender = AgentInfo(
|
|
agent_id="sender-agent",
|
|
name="Sender",
|
|
chain_id="chain-1",
|
|
node_id="node-1",
|
|
status=AgentStatus.ACTIVE,
|
|
capabilities=["trading"],
|
|
reputation_score=0.8,
|
|
last_seen=datetime.now(),
|
|
endpoint="http://localhost:8080",
|
|
version="1.0.0"
|
|
)
|
|
|
|
receiver = AgentInfo(
|
|
agent_id="receiver-agent",
|
|
name="Receiver",
|
|
chain_id="chain-1",
|
|
node_id="node-1",
|
|
status=AgentStatus.ACTIVE,
|
|
capabilities=["analytics"],
|
|
reputation_score=0.7,
|
|
last_seen=datetime.now(),
|
|
endpoint="http://localhost:8081",
|
|
version="1.0.0"
|
|
)
|
|
|
|
await comm.register_agent(sender)
|
|
await comm.register_agent(receiver)
|
|
|
|
# Create message
|
|
message = AgentMessage(
|
|
message_id="test-message-1",
|
|
sender_id="sender-agent",
|
|
receiver_id="receiver-agent",
|
|
message_type=MessageType.COMMUNICATION,
|
|
chain_id="chain-1",
|
|
target_chain_id=None,
|
|
payload={"action": "test", "data": "hello"},
|
|
timestamp=datetime.now(),
|
|
signature="test-signature",
|
|
priority=5,
|
|
ttl_seconds=3600
|
|
)
|
|
|
|
# Send message
|
|
success = await comm.send_message(message)
|
|
|
|
assert success
|
|
assert "test-message-1" in comm.messages
|
|
assert len(comm.message_queue["receiver-agent"]) == 0 # Should be delivered immediately
|
|
|
|
async def test_cross_chain_messaging():
|
|
"""Test cross-chain messaging"""
|
|
config = MultiChainConfig()
|
|
comm = CrossChainAgentCommunication(config)
|
|
|
|
# Register agents on different chains
|
|
sender = AgentInfo(
|
|
agent_id="cross-chain-sender",
|
|
name="Cross Chain Sender",
|
|
chain_id="chain-1",
|
|
node_id="node-1",
|
|
status=AgentStatus.ACTIVE,
|
|
capabilities=["trading"],
|
|
reputation_score=0.8,
|
|
last_seen=datetime.now(),
|
|
endpoint="http://localhost:8080",
|
|
version="1.0.0"
|
|
)
|
|
|
|
receiver = AgentInfo(
|
|
agent_id="cross-chain-receiver",
|
|
name="Cross Chain Receiver",
|
|
chain_id="chain-2",
|
|
node_id="node-2",
|
|
status=AgentStatus.ACTIVE,
|
|
capabilities=["analytics"],
|
|
reputation_score=0.7,
|
|
last_seen=datetime.now(),
|
|
endpoint="http://localhost:8081",
|
|
version="1.0.0"
|
|
)
|
|
|
|
await comm.register_agent(sender)
|
|
await comm.register_agent(receiver)
|
|
|
|
# Create cross-chain message
|
|
message = AgentMessage(
|
|
message_id="cross-chain-message-1",
|
|
sender_id="cross-chain-sender",
|
|
receiver_id="cross-chain-receiver",
|
|
message_type=MessageType.COMMUNICATION,
|
|
chain_id="chain-1",
|
|
target_chain_id="chain-2",
|
|
payload={"action": "cross_chain_test", "data": "hello across chains"},
|
|
timestamp=datetime.now(),
|
|
signature="test-signature",
|
|
priority=5,
|
|
ttl_seconds=3600
|
|
)
|
|
|
|
# Send cross-chain message
|
|
success = await comm.send_message(message)
|
|
|
|
assert success
|
|
assert "cross-chain-message-1" in comm.messages
|
|
|
|
async def test_collaboration_creation():
|
|
"""Test multi-agent collaboration creation"""
|
|
config = MultiChainConfig()
|
|
comm = CrossChainAgentCommunication(config)
|
|
|
|
# Register multiple agents
|
|
agents = []
|
|
for i in range(3):
|
|
agent = AgentInfo(
|
|
agent_id=f"collab-agent-{i+1}",
|
|
name=f"Collab Agent {i+1}",
|
|
chain_id=f"chain-{(i % 2) + 1}", # Spread across 2 chains
|
|
node_id=f"node-{(i % 2) + 1}",
|
|
status=AgentStatus.ACTIVE,
|
|
capabilities=["trading", "analytics"],
|
|
reputation_score=0.8,
|
|
last_seen=datetime.now(),
|
|
endpoint=f"http://localhost:808{i}",
|
|
version="1.0.0"
|
|
)
|
|
await comm.register_agent(agent)
|
|
agents.append(agent.agent_id)
|
|
|
|
# Create collaboration
|
|
collaboration_id = await comm.create_collaboration(
|
|
agents,
|
|
"research_project",
|
|
{"voting_threshold": 0.6, "resource_sharing": True}
|
|
)
|
|
|
|
assert collaboration_id is not None
|
|
assert collaboration_id in comm.collaborations
|
|
|
|
collaboration = comm.collaborations[collaboration_id]
|
|
assert collaboration.collaboration_type == "research_project"
|
|
assert len(collaboration.agent_ids) == 3
|
|
assert collaboration.status == "active"
|
|
assert collaboration.governance_rules["voting_threshold"] == 0.6
|
|
|
|
async def test_reputation_system():
|
|
"""Test reputation system"""
|
|
config = MultiChainConfig()
|
|
comm = CrossChainAgentCommunication(config)
|
|
|
|
# Register agent
|
|
agent = AgentInfo(
|
|
agent_id="reputation-agent",
|
|
name="Reputation Agent",
|
|
chain_id="chain-1",
|
|
node_id="node-1",
|
|
status=AgentStatus.ACTIVE,
|
|
capabilities=["trading"],
|
|
reputation_score=0.5, # Start with neutral reputation
|
|
last_seen=datetime.now(),
|
|
endpoint="http://localhost:8080",
|
|
version="1.0.0"
|
|
)
|
|
|
|
await comm.register_agent(agent)
|
|
|
|
# Update reputation with successful interactions
|
|
for i in range(5):
|
|
await comm.update_reputation("reputation-agent", True, 0.8)
|
|
|
|
# Update reputation with some failures
|
|
for i in range(2):
|
|
await comm.update_reputation("reputation-agent", False, 0.3)
|
|
|
|
# Check reputation
|
|
reputation = comm.reputations["reputation-agent"]
|
|
assert reputation.total_interactions == 7
|
|
assert reputation.successful_interactions == 5
|
|
assert reputation.failed_interactions == 2
|
|
assert reputation.reputation_score > 0.5 # Should have improved
|
|
|
|
async def test_agent_status():
|
|
"""Test agent status retrieval"""
|
|
config = MultiChainConfig()
|
|
comm = CrossChainAgentCommunication(config)
|
|
|
|
# Register agent
|
|
agent = AgentInfo(
|
|
agent_id="status-agent",
|
|
name="Status Agent",
|
|
chain_id="chain-1",
|
|
node_id="node-1",
|
|
status=AgentStatus.ACTIVE,
|
|
capabilities=["trading", "analytics"],
|
|
reputation_score=0.8,
|
|
last_seen=datetime.now(),
|
|
endpoint="http://localhost:8080",
|
|
version="1.0.0"
|
|
)
|
|
|
|
await comm.register_agent(agent)
|
|
|
|
# Get agent status
|
|
status = await comm.get_agent_status("status-agent")
|
|
|
|
assert status is not None
|
|
assert status["agent_info"]["agent_id"] == "status-agent"
|
|
assert status["status"] == "active"
|
|
assert status["reputation"] is not None
|
|
assert status["message_queue_size"] == 0
|
|
assert status["active_collaborations"] == 0
|
|
|
|
async def test_network_overview():
|
|
"""Test network overview"""
|
|
config = MultiChainConfig()
|
|
comm = CrossChainAgentCommunication(config)
|
|
|
|
# Register multiple agents
|
|
for i in range(5):
|
|
agent = AgentInfo(
|
|
agent_id=f"network-agent-{i+1}",
|
|
name=f"Network Agent {i+1}",
|
|
chain_id=f"chain-{(i % 3) + 1}", # Spread across 3 chains
|
|
node_id=f"node-{(i % 2) + 1}",
|
|
status=AgentStatus.ACTIVE if i < 4 else AgentStatus.BUSY,
|
|
capabilities=["trading", "analytics"],
|
|
reputation_score=0.7 + (i * 0.05),
|
|
last_seen=datetime.now(),
|
|
endpoint=f"http://localhost:808{i}",
|
|
version="1.0.0"
|
|
)
|
|
await comm.register_agent(agent)
|
|
|
|
# Create some collaborations
|
|
collab_id = await comm.create_collaboration(
|
|
["network-agent-1", "network-agent-2"],
|
|
"test_collaboration",
|
|
{}
|
|
)
|
|
|
|
# Get network overview
|
|
overview = await comm.get_network_overview()
|
|
|
|
assert overview["total_agents"] == 5
|
|
assert overview["active_agents"] == 4
|
|
assert overview["total_collaborations"] == 1
|
|
assert overview["active_collaborations"] == 1
|
|
assert len(overview["agents_by_chain"]) == 3
|
|
assert overview["average_reputation"] > 0.7
|
|
|
|
def test_validation_functions():
|
|
"""Test validation functions"""
|
|
config = MultiChainConfig()
|
|
comm = CrossChainAgentCommunication(config)
|
|
|
|
# Test agent validation
|
|
valid_agent = AgentInfo(
|
|
agent_id="valid-agent",
|
|
name="Valid Agent",
|
|
chain_id="chain-1",
|
|
node_id="node-1",
|
|
status=AgentStatus.ACTIVE,
|
|
capabilities=["trading"],
|
|
reputation_score=0.8,
|
|
last_seen=datetime.now(),
|
|
endpoint="http://localhost:8080",
|
|
version="1.0.0"
|
|
)
|
|
|
|
assert comm._validate_agent_info(valid_agent) == True
|
|
|
|
# Test invalid agent (missing capabilities)
|
|
invalid_agent = AgentInfo(
|
|
agent_id="invalid-agent",
|
|
name="Invalid Agent",
|
|
chain_id="chain-1",
|
|
node_id="node-1",
|
|
status=AgentStatus.ACTIVE,
|
|
capabilities=[], # Empty capabilities
|
|
reputation_score=0.8,
|
|
last_seen=datetime.now(),
|
|
endpoint="http://localhost:8080",
|
|
version="1.0.0"
|
|
)
|
|
|
|
assert comm._validate_agent_info(invalid_agent) == False
|
|
|
|
# Test message validation
|
|
valid_message = AgentMessage(
|
|
message_id="valid-message",
|
|
sender_id="sender",
|
|
receiver_id="receiver",
|
|
message_type=MessageType.COMMUNICATION,
|
|
chain_id="chain-1",
|
|
target_chain_id=None,
|
|
payload={"test": "data"},
|
|
timestamp=datetime.now(),
|
|
signature="signature",
|
|
priority=5,
|
|
ttl_seconds=3600
|
|
)
|
|
|
|
assert comm._validate_message(valid_message) == True
|
|
|
|
if __name__ == "__main__":
|
|
# Run basic tests
|
|
test_agent_communication_creation()
|
|
test_validation_functions()
|
|
|
|
# Run async tests
|
|
asyncio.run(test_agent_registration())
|
|
asyncio.run(test_agent_discovery())
|
|
asyncio.run(test_message_sending())
|
|
asyncio.run(test_cross_chain_messaging())
|
|
asyncio.run(test_collaboration_creation())
|
|
asyncio.run(test_reputation_system())
|
|
asyncio.run(test_agent_status())
|
|
asyncio.run(test_network_overview())
|
|
|
|
print("✅ All agent communication tests passed!")
|