heroagent/pkg/processmanager/interfaces/openrpc/rpc_test.go
2025-04-23 04:18:28 +02:00

131 lines
3.4 KiB
Go

package openrpc
import (
"os"
"path/filepath"
"testing"
"time"
"github.com/freeflowuniverse/heroagent/pkg/processmanager"
"github.com/freeflowuniverse/heroagent/pkg/processmanager/interfaces"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestProcessManagerRPC(t *testing.T) {
// Create a temporary directory for the socket
tempDir, err := os.MkdirTemp("", "processmanager-rpc-test")
require.NoError(t, err)
defer os.RemoveAll(tempDir)
// Create a socket path
socketPath := filepath.Join(tempDir, "process-manager.sock")
// Create a process manager
pm := processmanager.NewProcessManager()
pm.SetLogsBasePath(filepath.Join(tempDir, "logs"))
// Create and start the server
server, err := NewServer(pm, socketPath)
require.NoError(t, err)
// Start the server in a goroutine
go func() {
err := server.Start()
if err != nil {
t.Logf("Error starting server: %v", err)
}
}()
// Wait for the server to start
time.Sleep(100 * time.Millisecond)
// Create a client
client := NewClient(socketPath, "")
// Test process start
t.Run("StartProcess", func(t *testing.T) {
result, err := client.StartProcess("test-process", "echo 'Hello, World!'", true, 0, "", "")
require.NoError(t, err)
assert.True(t, result.Success)
assert.NotEmpty(t, result.Message)
assert.NotZero(t, result.PID)
})
// Test process status
t.Run("GetProcessStatus", func(t *testing.T) {
status, err := client.GetProcessStatus("test-process", "json")
require.NoError(t, err)
processStatus, ok := status.(interfaces.ProcessStatus)
require.True(t, ok)
assert.Equal(t, "test-process", processStatus.Name)
assert.Equal(t, "echo 'Hello, World!'", processStatus.Command)
})
// Test process list
t.Run("ListProcesses", func(t *testing.T) {
processList, err := client.ListProcesses("json")
require.NoError(t, err)
processes, ok := processList.([]interfaces.ProcessStatus)
require.True(t, ok)
assert.NotEmpty(t, processes)
// Find our test process
found := false
for _, proc := range processes {
if proc.Name == "test-process" {
found = true
break
}
}
assert.True(t, found)
})
// Test process logs
t.Run("GetProcessLogs", func(t *testing.T) {
// Wait a bit for logs to be generated
time.Sleep(100 * time.Millisecond)
logs, err := client.GetProcessLogs("test-process", 10)
require.NoError(t, err)
assert.True(t, logs.Success)
})
// Test process restart
t.Run("RestartProcess", func(t *testing.T) {
result, err := client.RestartProcess("test-process")
require.NoError(t, err)
assert.True(t, result.Success)
assert.NotEmpty(t, result.Message)
})
// Test process stop
t.Run("StopProcess", func(t *testing.T) {
result, err := client.StopProcess("test-process")
require.NoError(t, err)
assert.True(t, result.Success)
assert.NotEmpty(t, result.Message)
})
// Test process delete
t.Run("DeleteProcess", func(t *testing.T) {
result, err := client.DeleteProcess("test-process")
require.NoError(t, err)
assert.True(t, result.Success)
assert.NotEmpty(t, result.Message)
})
// Stop the server
err = server.Stop()
require.NoError(t, err)
}
// TestProcessManagerRPCWithMock tests the RPC interface with a mock process manager
func TestProcessManagerRPCWithMock(t *testing.T) {
// This test would use a mock implementation of the ProcessManagerInterface
// to test the RPC layer without actually starting real processes
t.Skip("Mock implementation test to be added")
}