Add mock API testing infrastructure and monitoring dashboard
- Add mock Hive API server providing fake projects/tasks for real bzzz coordination - Add comprehensive test suite with task simulator and coordination scenarios - Add real-time monitoring dashboard (btop/nvtop style) for coordination activity - Add antennae monitoring and logging infrastructure - Add systemd configuration scripts and deployment tools - Update pubsub message types for coordination requests and completion - Add Docker support and cluster deployment scripts 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
409
test/task_simulator.go
Normal file
409
test/task_simulator.go
Normal file
@@ -0,0 +1,409 @@
|
||||
package test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"time"
|
||||
|
||||
"github.com/deepblackcloud/bzzz/pubsub"
|
||||
)
|
||||
|
||||
// TaskSimulator generates realistic task scenarios for testing antennae coordination
|
||||
type TaskSimulator struct {
|
||||
pubsub *pubsub.PubSub
|
||||
ctx context.Context
|
||||
isRunning bool
|
||||
repositories []MockRepository
|
||||
scenarios []CoordinationScenario
|
||||
}
|
||||
|
||||
// MockRepository represents a simulated repository with tasks
|
||||
type MockRepository struct {
|
||||
Owner string `json:"owner"`
|
||||
Name string `json:"name"`
|
||||
URL string `json:"url"`
|
||||
Tasks []MockTask `json:"tasks"`
|
||||
Dependencies []string `json:"dependencies"` // Other repos this depends on
|
||||
}
|
||||
|
||||
// MockTask represents a simulated GitHub issue/task
|
||||
type MockTask struct {
|
||||
Number int `json:"number"`
|
||||
Title string `json:"title"`
|
||||
Description string `json:"description"`
|
||||
Labels []string `json:"labels"`
|
||||
Difficulty string `json:"difficulty"` // easy, medium, hard
|
||||
TaskType string `json:"task_type"` // feature, bug, refactor, etc.
|
||||
Dependencies []TaskDependency `json:"dependencies"`
|
||||
EstimatedHours int `json:"estimated_hours"`
|
||||
RequiredSkills []string `json:"required_skills"`
|
||||
}
|
||||
|
||||
// TaskDependency represents a cross-repository task dependency
|
||||
type TaskDependency struct {
|
||||
Repository string `json:"repository"`
|
||||
TaskNumber int `json:"task_number"`
|
||||
DependencyType string `json:"dependency_type"` // api_contract, database_schema, config, security
|
||||
}
|
||||
|
||||
// CoordinationScenario represents a test scenario for antennae coordination
|
||||
type CoordinationScenario struct {
|
||||
Name string `json:"name"`
|
||||
Description string `json:"description"`
|
||||
Repositories []string `json:"repositories"`
|
||||
Tasks []ScenarioTask `json:"tasks"`
|
||||
ExpectedCoordination []string `json:"expected_coordination"`
|
||||
}
|
||||
|
||||
// ScenarioTask links tasks across repositories for coordination testing
|
||||
type ScenarioTask struct {
|
||||
Repository string `json:"repository"`
|
||||
TaskNumber int `json:"task_number"`
|
||||
Priority int `json:"priority"`
|
||||
BlockedBy []ScenarioTask `json:"blocked_by"`
|
||||
}
|
||||
|
||||
// NewTaskSimulator creates a new task simulator
|
||||
func NewTaskSimulator(ps *pubsub.PubSub, ctx context.Context) *TaskSimulator {
|
||||
sim := &TaskSimulator{
|
||||
pubsub: ps,
|
||||
ctx: ctx,
|
||||
repositories: generateMockRepositories(),
|
||||
scenarios: generateCoordinationScenarios(),
|
||||
}
|
||||
return sim
|
||||
}
|
||||
|
||||
// Start begins the task simulation
|
||||
func (ts *TaskSimulator) Start() {
|
||||
if ts.isRunning {
|
||||
return
|
||||
}
|
||||
ts.isRunning = true
|
||||
|
||||
fmt.Println("🎭 Starting Task Simulator for Antennae Testing")
|
||||
|
||||
// Start different simulation routines
|
||||
go ts.simulateTaskAnnouncements()
|
||||
go ts.simulateCoordinationScenarios()
|
||||
go ts.simulateAgentResponses()
|
||||
}
|
||||
|
||||
// Stop stops the task simulation
|
||||
func (ts *TaskSimulator) Stop() {
|
||||
ts.isRunning = false
|
||||
fmt.Println("🛑 Task Simulator stopped")
|
||||
}
|
||||
|
||||
// simulateTaskAnnouncements periodically announces available tasks
|
||||
func (ts *TaskSimulator) simulateTaskAnnouncements() {
|
||||
ticker := time.NewTicker(45 * time.Second)
|
||||
defer ticker.Stop()
|
||||
|
||||
for ts.isRunning {
|
||||
select {
|
||||
case <-ts.ctx.Done():
|
||||
return
|
||||
case <-ticker.C:
|
||||
ts.announceRandomTask()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// announceRandomTask announces a random task from the mock repositories
|
||||
func (ts *TaskSimulator) announceRandomTask() {
|
||||
if len(ts.repositories) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
repo := ts.repositories[rand.Intn(len(ts.repositories))]
|
||||
if len(repo.Tasks) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
task := repo.Tasks[rand.Intn(len(repo.Tasks))]
|
||||
|
||||
announcement := map[string]interface{}{
|
||||
"type": "task_available",
|
||||
"repository": map[string]interface{}{
|
||||
"owner": repo.Owner,
|
||||
"name": repo.Name,
|
||||
"url": repo.URL,
|
||||
},
|
||||
"task": task,
|
||||
"announced_at": time.Now().Unix(),
|
||||
"announced_by": "task_simulator",
|
||||
}
|
||||
|
||||
fmt.Printf("📢 Announcing task: %s/#%d - %s\n", repo.Name, task.Number, task.Title)
|
||||
|
||||
if err := ts.pubsub.PublishBzzzMessage(pubsub.TaskAnnouncement, announcement); err != nil {
|
||||
fmt.Printf("❌ Failed to announce task: %v\n", err)
|
||||
}
|
||||
}
|
||||
|
||||
// simulateCoordinationScenarios runs coordination test scenarios
|
||||
func (ts *TaskSimulator) simulateCoordinationScenarios() {
|
||||
ticker := time.NewTicker(2 * time.Minute)
|
||||
defer ticker.Stop()
|
||||
|
||||
scenarioIndex := 0
|
||||
|
||||
for ts.isRunning {
|
||||
select {
|
||||
case <-ts.ctx.Done():
|
||||
return
|
||||
case <-ticker.C:
|
||||
if len(ts.scenarios) > 0 {
|
||||
scenario := ts.scenarios[scenarioIndex%len(ts.scenarios)]
|
||||
ts.runCoordinationScenario(scenario)
|
||||
scenarioIndex++
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// runCoordinationScenario executes a specific coordination test scenario
|
||||
func (ts *TaskSimulator) runCoordinationScenario(scenario CoordinationScenario) {
|
||||
fmt.Printf("🎯 Running coordination scenario: %s\n", scenario.Name)
|
||||
fmt.Printf(" Description: %s\n", scenario.Description)
|
||||
|
||||
// Announce the scenario start
|
||||
scenarioStart := map[string]interface{}{
|
||||
"type": "coordination_scenario_start",
|
||||
"scenario": scenario,
|
||||
"started_at": time.Now().Unix(),
|
||||
}
|
||||
|
||||
if err := ts.pubsub.PublishAntennaeMessage(pubsub.CoordinationRequest, scenarioStart); err != nil {
|
||||
fmt.Printf("❌ Failed to announce scenario start: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
// Announce each task in the scenario with dependencies
|
||||
for _, task := range scenario.Tasks {
|
||||
taskAnnouncement := map[string]interface{}{
|
||||
"type": "scenario_task",
|
||||
"scenario_name": scenario.Name,
|
||||
"repository": task.Repository,
|
||||
"task_number": task.TaskNumber,
|
||||
"priority": task.Priority,
|
||||
"blocked_by": task.BlockedBy,
|
||||
"announced_at": time.Now().Unix(),
|
||||
}
|
||||
|
||||
fmt.Printf(" 📋 Task: %s/#%d (Priority: %d)\n", task.Repository, task.TaskNumber, task.Priority)
|
||||
|
||||
if err := ts.pubsub.PublishBzzzMessage(pubsub.TaskAnnouncement, taskAnnouncement); err != nil {
|
||||
fmt.Printf("❌ Failed to announce scenario task: %v\n", err)
|
||||
}
|
||||
|
||||
time.Sleep(2 * time.Second) // Stagger announcements
|
||||
}
|
||||
}
|
||||
|
||||
// simulateAgentResponses simulates agent responses to create coordination activity
|
||||
func (ts *TaskSimulator) simulateAgentResponses() {
|
||||
ticker := time.NewTicker(30 * time.Second)
|
||||
defer ticker.Stop()
|
||||
|
||||
responses := []string{
|
||||
"I can handle this frontend task",
|
||||
"This requires database schema changes first",
|
||||
"Need to coordinate with API team",
|
||||
"This conflicts with my current work",
|
||||
"I have the required Python skills",
|
||||
"This should be done after the security review",
|
||||
"I can start this immediately",
|
||||
"This needs clarification on requirements",
|
||||
}
|
||||
|
||||
for ts.isRunning {
|
||||
select {
|
||||
case <-ts.ctx.Done():
|
||||
return
|
||||
case <-ticker.C:
|
||||
if rand.Float32() < 0.7 { // 70% chance of response
|
||||
response := responses[rand.Intn(len(responses))]
|
||||
ts.simulateAgentResponse(response)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// simulateAgentResponse simulates an agent response for coordination
|
||||
func (ts *TaskSimulator) simulateAgentResponse(response string) {
|
||||
agentResponse := map[string]interface{}{
|
||||
"type": "agent_response",
|
||||
"agent_id": fmt.Sprintf("sim-agent-%d", rand.Intn(3)+1),
|
||||
"message": response,
|
||||
"timestamp": time.Now().Unix(),
|
||||
"confidence": rand.Float32()*0.4 + 0.6, // 0.6-1.0 confidence
|
||||
}
|
||||
|
||||
fmt.Printf("🤖 Simulated agent response: %s\n", response)
|
||||
|
||||
if err := ts.pubsub.PublishAntennaeMessage(pubsub.MetaDiscussion, agentResponse); err != nil {
|
||||
fmt.Printf("❌ Failed to publish agent response: %v\n", err)
|
||||
}
|
||||
}
|
||||
|
||||
// generateMockRepositories creates realistic mock repositories for testing
|
||||
func generateMockRepositories() []MockRepository {
|
||||
return []MockRepository{
|
||||
{
|
||||
Owner: "deepblackcloud",
|
||||
Name: "hive",
|
||||
URL: "https://github.com/deepblackcloud/hive",
|
||||
Dependencies: []string{"bzzz", "distributed-ai-dev"},
|
||||
Tasks: []MockTask{
|
||||
{
|
||||
Number: 15,
|
||||
Title: "Add WebSocket support for real-time coordination",
|
||||
Description: "Implement WebSocket endpoints for real-time agent coordination",
|
||||
Labels: []string{"bzzz-task", "feature", "realtime"},
|
||||
Difficulty: "medium",
|
||||
TaskType: "feature",
|
||||
EstimatedHours: 8,
|
||||
RequiredSkills: []string{"websockets", "python", "fastapi"},
|
||||
Dependencies: []TaskDependency{
|
||||
{Repository: "bzzz", TaskNumber: 23, DependencyType: "api_contract"},
|
||||
},
|
||||
},
|
||||
{
|
||||
Number: 16,
|
||||
Title: "Implement agent authentication system",
|
||||
Description: "Add secure authentication for bzzz agents",
|
||||
Labels: []string{"bzzz-task", "security", "auth"},
|
||||
Difficulty: "hard",
|
||||
TaskType: "security",
|
||||
EstimatedHours: 12,
|
||||
RequiredSkills: []string{"security", "jwt", "python"},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Owner: "deepblackcloud",
|
||||
Name: "bzzz",
|
||||
URL: "https://github.com/deepblackcloud/bzzz",
|
||||
Dependencies: []string{"hive"},
|
||||
Tasks: []MockTask{
|
||||
{
|
||||
Number: 23,
|
||||
Title: "Define coordination API contract",
|
||||
Description: "Standardize API contract for cross-repository coordination",
|
||||
Labels: []string{"bzzz-task", "api", "coordination"},
|
||||
Difficulty: "medium",
|
||||
TaskType: "api_design",
|
||||
EstimatedHours: 6,
|
||||
RequiredSkills: []string{"api_design", "go", "documentation"},
|
||||
},
|
||||
{
|
||||
Number: 24,
|
||||
Title: "Implement dependency detection algorithm",
|
||||
Description: "Auto-detect task dependencies across repositories",
|
||||
Labels: []string{"bzzz-task", "algorithm", "coordination"},
|
||||
Difficulty: "hard",
|
||||
TaskType: "feature",
|
||||
EstimatedHours: 16,
|
||||
RequiredSkills: []string{"algorithms", "go", "graph_theory"},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Owner: "deepblackcloud",
|
||||
Name: "distributed-ai-dev",
|
||||
URL: "https://github.com/deepblackcloud/distributed-ai-dev",
|
||||
Dependencies: []string{},
|
||||
Tasks: []MockTask{
|
||||
{
|
||||
Number: 8,
|
||||
Title: "Add support for bzzz coordination",
|
||||
Description: "Integrate with bzzz P2P coordination system",
|
||||
Labels: []string{"bzzz-task", "integration", "p2p"},
|
||||
Difficulty: "medium",
|
||||
TaskType: "integration",
|
||||
EstimatedHours: 10,
|
||||
RequiredSkills: []string{"p2p", "python", "integration"},
|
||||
Dependencies: []TaskDependency{
|
||||
{Repository: "bzzz", TaskNumber: 23, DependencyType: "api_contract"},
|
||||
{Repository: "hive", TaskNumber: 16, DependencyType: "security"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// generateCoordinationScenarios creates test scenarios for coordination
|
||||
func generateCoordinationScenarios() []CoordinationScenario {
|
||||
return []CoordinationScenario{
|
||||
{
|
||||
Name: "Cross-Repository API Integration",
|
||||
Description: "Testing coordination when multiple repos need to implement a shared API",
|
||||
Repositories: []string{"hive", "bzzz", "distributed-ai-dev"},
|
||||
Tasks: []ScenarioTask{
|
||||
{Repository: "bzzz", TaskNumber: 23, Priority: 1, BlockedBy: []ScenarioTask{}},
|
||||
{Repository: "hive", TaskNumber: 15, Priority: 2, BlockedBy: []ScenarioTask{{Repository: "bzzz", TaskNumber: 23}}},
|
||||
{Repository: "distributed-ai-dev", TaskNumber: 8, Priority: 3, BlockedBy: []ScenarioTask{{Repository: "bzzz", TaskNumber: 23}, {Repository: "hive", TaskNumber: 16}}},
|
||||
},
|
||||
ExpectedCoordination: []string{
|
||||
"API contract should be defined first",
|
||||
"Authentication system blocks integration work",
|
||||
"WebSocket implementation depends on API contract",
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "Security-First Development",
|
||||
Description: "Testing coordination when security requirements block other work",
|
||||
Repositories: []string{"hive", "distributed-ai-dev"},
|
||||
Tasks: []ScenarioTask{
|
||||
{Repository: "hive", TaskNumber: 16, Priority: 1, BlockedBy: []ScenarioTask{}},
|
||||
{Repository: "distributed-ai-dev", TaskNumber: 8, Priority: 2, BlockedBy: []ScenarioTask{{Repository: "hive", TaskNumber: 16}}},
|
||||
},
|
||||
ExpectedCoordination: []string{
|
||||
"Security authentication must be completed first",
|
||||
"Integration work blocked until auth system ready",
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "Parallel Development Conflict",
|
||||
Description: "Testing coordination when agents might work on conflicting tasks",
|
||||
Repositories: []string{"hive", "bzzz"},
|
||||
Tasks: []ScenarioTask{
|
||||
{Repository: "hive", TaskNumber: 15, Priority: 1, BlockedBy: []ScenarioTask{}},
|
||||
{Repository: "bzzz", TaskNumber: 24, Priority: 1, BlockedBy: []ScenarioTask{}},
|
||||
},
|
||||
ExpectedCoordination: []string{
|
||||
"Both tasks modify coordination logic",
|
||||
"Need to coordinate implementation approach",
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// GetMockRepositories returns the mock repositories for external use
|
||||
func (ts *TaskSimulator) GetMockRepositories() []MockRepository {
|
||||
return ts.repositories
|
||||
}
|
||||
|
||||
// GetScenarios returns the coordination scenarios for external use
|
||||
func (ts *TaskSimulator) GetScenarios() []CoordinationScenario {
|
||||
return ts.scenarios
|
||||
}
|
||||
|
||||
// PrintStatus prints the current simulation status
|
||||
func (ts *TaskSimulator) PrintStatus() {
|
||||
fmt.Printf("🎭 Task Simulator Status:\n")
|
||||
fmt.Printf(" Running: %v\n", ts.isRunning)
|
||||
fmt.Printf(" Mock Repositories: %d\n", len(ts.repositories))
|
||||
fmt.Printf(" Coordination Scenarios: %d\n", len(ts.scenarios))
|
||||
|
||||
totalTasks := 0
|
||||
for _, repo := range ts.repositories {
|
||||
totalTasks += len(repo.Tasks)
|
||||
}
|
||||
fmt.Printf(" Total Mock Tasks: %d\n", totalTasks)
|
||||
}
|
||||
Reference in New Issue
Block a user