You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

233 lines
6.1 KiB

package task
import (
"fmt"
"testing"
"time"
"github.com/seaweedfs/seaweedfs/weed/worker/types"
)
// TestSimpleIntegration tests basic admin-worker operational flow without complex dependencies
func TestSimpleIntegration(t *testing.T) {
t.Logf("Starting simple integration test")
// Step 1: Create a minimal admin server configuration
config := &AdminConfig{
ScanInterval: 10 * time.Second,
WorkerTimeout: 30 * time.Second,
TaskTimeout: 2 * time.Hour,
MaxRetries: 3,
ReconcileInterval: 5 * time.Minute,
EnableFailureRecovery: true,
MaxConcurrentTasks: 5,
}
// Step 2: Create admin server with nil master client (for testing)
adminServer := NewAdminServer(config, nil)
// Step 3: Start admin server
err := adminServer.Start()
if err != nil {
t.Fatalf("Failed to start admin server: %v", err)
}
defer adminServer.Stop()
// Step 4: Test worker registration
t.Logf("Testing worker registration")
worker := &types.Worker{
ID: "test-worker-1",
Address: "localhost:9001",
Capabilities: []types.TaskType{types.TaskTypeVacuum},
MaxConcurrent: 2,
Status: "active",
CurrentLoad: 0,
LastHeartbeat: time.Now(),
}
err = adminServer.RegisterWorker(worker)
if err != nil {
t.Fatalf("Failed to register worker: %v", err)
}
t.Logf("Successfully registered worker %s", worker.ID)
// Step 5: Test task queueing
t.Logf("Testing task queueing")
task := &types.Task{
ID: "test-task-1",
Type: types.TaskTypeVacuum,
VolumeID: 1001,
Server: "localhost:8080",
Status: types.TaskStatusPending,
Priority: types.TaskPriorityNormal,
Parameters: map[string]interface{}{
"garbage_threshold": "0.3",
},
CreatedAt: time.Now(),
}
err = adminServer.QueueTask(task)
if err != nil {
t.Fatalf("Failed to queue task: %v", err)
}
t.Logf("Successfully queued task %s", task.ID)
// Step 6: Test task request by worker
t.Logf("Testing task request")
assignedTask, err := adminServer.RequestTask("test-worker-1", []types.TaskType{types.TaskTypeVacuum})
if err != nil {
t.Fatalf("Failed to request task: %v", err)
}
if assignedTask != nil {
t.Logf("Successfully assigned task %s to worker", assignedTask.ID)
// Step 7: Test task progress updates
t.Logf("Testing task progress updates")
err = adminServer.UpdateTaskProgress(assignedTask.ID, 50.0)
if err != nil {
t.Errorf("Failed to update task progress: %v", err)
}
err = adminServer.UpdateTaskProgress(assignedTask.ID, 100.0)
if err != nil {
t.Errorf("Failed to update task progress: %v", err)
}
// Step 8: Test task completion
t.Logf("Testing task completion")
err = adminServer.CompleteTask(assignedTask.ID, true, "")
if err != nil {
t.Errorf("Failed to complete task: %v", err)
}
t.Logf("Successfully completed task %s", assignedTask.ID)
} else {
t.Logf("No task was assigned (queue might be empty)")
}
// Step 9: Test basic metrics
t.Logf("Testing basic metrics")
stats := adminServer.GetSystemStats()
if stats != nil {
t.Logf("System stats: Active tasks=%d, Queued tasks=%d, Active workers=%d",
stats.ActiveTasks, stats.QueuedTasks, stats.ActiveWorkers)
}
queuedCount := adminServer.GetQueuedTaskCount()
activeCount := adminServer.GetActiveTaskCount()
t.Logf("Queue status: %d queued, %d active tasks", queuedCount, activeCount)
// Step 10: Test task history
history := adminServer.GetTaskHistory()
t.Logf("Task history contains %d entries", len(history))
t.Logf("Simple integration test completed successfully")
}
// TestWorkerHeartbeat tests worker heartbeat functionality
func TestWorkerHeartbeat(t *testing.T) {
t.Logf("Testing worker heartbeat")
config := &AdminConfig{
ScanInterval: 10 * time.Second,
WorkerTimeout: 30 * time.Second,
TaskTimeout: 2 * time.Hour,
MaxRetries: 3,
ReconcileInterval: 5 * time.Minute,
EnableFailureRecovery: true,
MaxConcurrentTasks: 5,
}
adminServer := NewAdminServer(config, nil)
err := adminServer.Start()
if err != nil {
t.Fatalf("Failed to start admin server: %v", err)
}
defer adminServer.Stop()
// Register a worker
worker := &types.Worker{
ID: "heartbeat-worker",
Address: "localhost:9002",
Capabilities: []types.TaskType{types.TaskTypeVacuum},
MaxConcurrent: 1,
Status: "active",
CurrentLoad: 0,
LastHeartbeat: time.Now(),
}
err = adminServer.RegisterWorker(worker)
if err != nil {
t.Fatalf("Failed to register worker: %v", err)
}
// Test heartbeat update
status := &types.WorkerStatus{
Status: "active",
CurrentLoad: 0,
}
err = adminServer.UpdateWorkerHeartbeat("heartbeat-worker", status)
if err != nil {
t.Errorf("Failed to update worker heartbeat: %v", err)
}
t.Logf("Worker heartbeat test completed successfully")
}
// TestTaskQueueOperations tests task queue operations
func TestTaskQueueOperations(t *testing.T) {
t.Logf("Testing task queue operations")
config := &AdminConfig{
ScanInterval: 10 * time.Second,
WorkerTimeout: 30 * time.Second,
TaskTimeout: 2 * time.Hour,
MaxRetries: 3,
ReconcileInterval: 5 * time.Minute,
EnableFailureRecovery: true,
MaxConcurrentTasks: 5,
}
adminServer := NewAdminServer(config, nil)
err := adminServer.Start()
if err != nil {
t.Fatalf("Failed to start admin server: %v", err)
}
defer adminServer.Stop()
// Test queuing multiple tasks
for i := 0; i < 3; i++ {
task := &types.Task{
ID: fmt.Sprintf("queue-test-task-%d", i),
Type: types.TaskTypeVacuum,
VolumeID: uint32(2000 + i),
Server: "localhost:8080",
Status: types.TaskStatusPending,
Priority: types.TaskPriorityNormal,
Parameters: map[string]interface{}{
"garbage_threshold": "0.3",
},
CreatedAt: time.Now(),
}
err = adminServer.QueueTask(task)
if err != nil {
t.Errorf("Failed to queue task %d: %v", i, err)
}
}
// Check queue size
queuedCount := adminServer.GetQueuedTaskCount()
if queuedCount != 3 {
t.Errorf("Expected 3 queued tasks, got %d", queuedCount)
}
t.Logf("Task queue operations test completed successfully")
}