mirror of
https://github.com/j3ssie/osmedeus.git
synced 2026-09-07 10:17:46 +02:00
185 lines
4.3 KiB
Go
185 lines
4.3 KiB
Go
package runner
|
|
|
|
import (
|
|
"context"
|
|
"net"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/j3ssie/osmedeus/v5/internal/core"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestHostRunner_Execute(t *testing.T) {
|
|
ctx := context.Background()
|
|
runner := NewHostRunner("")
|
|
|
|
err := runner.Setup(ctx)
|
|
require.NoError(t, err)
|
|
defer func() { _ = runner.Cleanup(ctx) }()
|
|
|
|
result, err := runner.Execute(ctx, "echo hello")
|
|
|
|
require.NoError(t, err)
|
|
assert.Equal(t, 0, result.ExitCode)
|
|
assert.Contains(t, result.Output, "hello")
|
|
}
|
|
|
|
func TestHostRunner_Type(t *testing.T) {
|
|
runner := NewHostRunner("")
|
|
assert.Equal(t, core.RunnerTypeHost, runner.Type())
|
|
assert.False(t, runner.IsRemote())
|
|
}
|
|
|
|
func TestHostRunner_ExitCode(t *testing.T) {
|
|
ctx := context.Background()
|
|
runner := NewHostRunner("")
|
|
|
|
result, err := runner.Execute(ctx, "exit 1")
|
|
|
|
require.NoError(t, err)
|
|
assert.Equal(t, 1, result.ExitCode)
|
|
}
|
|
|
|
func TestHostRunner_WithBinariesPath(t *testing.T) {
|
|
ctx := context.Background()
|
|
runner := NewHostRunner("/tmp/test-binaries")
|
|
|
|
result, err := runner.Execute(ctx, "echo $PATH")
|
|
|
|
require.NoError(t, err)
|
|
assert.Equal(t, 0, result.ExitCode)
|
|
assert.Contains(t, result.Output, "/tmp/test-binaries")
|
|
}
|
|
|
|
// Integration test - requires Docker
|
|
func TestDockerRunner_Execute_Integration(t *testing.T) {
|
|
if testing.Short() {
|
|
t.Skip("skipping integration test")
|
|
}
|
|
|
|
ctx := context.Background()
|
|
config := &core.RunnerConfig{
|
|
Image: "alpine:latest",
|
|
Persistent: false,
|
|
}
|
|
|
|
runner, err := NewDockerRunner(config, "")
|
|
require.NoError(t, err)
|
|
|
|
err = runner.Setup(ctx)
|
|
require.NoError(t, err)
|
|
defer func() { _ = runner.Cleanup(ctx) }()
|
|
|
|
result, err := runner.Execute(ctx, "echo hello from docker")
|
|
|
|
require.NoError(t, err)
|
|
assert.Equal(t, 0, result.ExitCode)
|
|
assert.Contains(t, result.Output, "hello from docker")
|
|
}
|
|
|
|
func TestDockerRunner_Type(t *testing.T) {
|
|
config := &core.RunnerConfig{
|
|
Image: "alpine:latest",
|
|
}
|
|
runner, err := NewDockerRunner(config, "")
|
|
require.NoError(t, err)
|
|
|
|
assert.Equal(t, core.RunnerTypeDocker, runner.Type())
|
|
assert.True(t, runner.IsRemote())
|
|
}
|
|
|
|
func TestDockerRunner_RequiresImage(t *testing.T) {
|
|
config := &core.RunnerConfig{}
|
|
_, err := NewDockerRunner(config, "")
|
|
assert.Error(t, err)
|
|
assert.Contains(t, err.Error(), "image")
|
|
}
|
|
|
|
// Integration test - requires SSH server (linuxserver/openssh-server)
|
|
func TestSSHRunner_Execute_Integration(t *testing.T) {
|
|
if testing.Short() {
|
|
t.Skip("skipping integration test")
|
|
}
|
|
conn, err := net.DialTimeout("tcp", "localhost:2222", 500*time.Millisecond)
|
|
if err != nil {
|
|
t.Skip("skipping integration test: SSH server not available on localhost:2222")
|
|
}
|
|
_ = conn.Close()
|
|
|
|
ctx := context.Background()
|
|
config := &core.RunnerConfig{
|
|
Host: "localhost",
|
|
Port: 2222,
|
|
User: "testuser",
|
|
Password: "testpass",
|
|
}
|
|
|
|
runner, err := NewSSHRunner(config, "")
|
|
require.NoError(t, err)
|
|
|
|
err = runner.Setup(ctx)
|
|
require.NoError(t, err)
|
|
defer func() { _ = runner.Cleanup(ctx) }()
|
|
|
|
result, err := runner.Execute(ctx, "echo hello from ssh")
|
|
|
|
require.NoError(t, err)
|
|
assert.Equal(t, 0, result.ExitCode)
|
|
assert.Contains(t, result.Output, "hello from ssh")
|
|
}
|
|
|
|
func TestSSHRunner_Type(t *testing.T) {
|
|
config := &core.RunnerConfig{
|
|
Host: "localhost",
|
|
User: "test",
|
|
}
|
|
runner, err := NewSSHRunner(config, "")
|
|
require.NoError(t, err)
|
|
|
|
assert.Equal(t, core.RunnerTypeSSH, runner.Type())
|
|
assert.True(t, runner.IsRemote())
|
|
}
|
|
|
|
func TestSSHRunner_RequiresHost(t *testing.T) {
|
|
config := &core.RunnerConfig{
|
|
User: "test",
|
|
}
|
|
_, err := NewSSHRunner(config, "")
|
|
assert.Error(t, err)
|
|
assert.Contains(t, err.Error(), "host")
|
|
}
|
|
|
|
func TestSSHRunner_RequiresUser(t *testing.T) {
|
|
config := &core.RunnerConfig{
|
|
Host: "localhost",
|
|
}
|
|
_, err := NewSSHRunner(config, "")
|
|
assert.Error(t, err)
|
|
assert.Contains(t, err.Error(), "user")
|
|
}
|
|
|
|
func TestNewRunner_Host(t *testing.T) {
|
|
workflow := &core.Workflow{
|
|
Name: "test",
|
|
Kind: core.KindModule,
|
|
Runner: core.RunnerTypeHost,
|
|
}
|
|
|
|
runner, err := NewRunner(workflow, "")
|
|
require.NoError(t, err)
|
|
assert.Equal(t, core.RunnerTypeHost, runner.Type())
|
|
}
|
|
|
|
func TestNewRunner_DefaultsToHost(t *testing.T) {
|
|
workflow := &core.Workflow{
|
|
Name: "test",
|
|
Kind: core.KindModule,
|
|
}
|
|
|
|
runner, err := NewRunner(workflow, "")
|
|
require.NoError(t, err)
|
|
assert.Equal(t, core.RunnerTypeHost, runner.Type())
|
|
}
|