1package shell
2
3import (
4 "context"
5 "os"
6 "runtime"
7 "testing"
8 "time"
9
10 "github.com/stretchr/testify/assert"
11 "github.com/stretchr/testify/require"
12)
13
14func TestShellPerformanceComparison(t *testing.T) {
15 tmpDir, err := os.MkdirTemp("", "shell-test")
16 require.NoError(t, err)
17 defer os.RemoveAll(tmpDir)
18
19 shell := GetPersistentShell(tmpDir)
20 defer shell.Close()
21
22 // Test quick command
23 start := time.Now()
24 stdout, stderr, exitCode, _, err := shell.Exec(context.Background(), "echo 'hello'", 0)
25 duration := time.Since(start)
26
27 require.NoError(t, err)
28 assert.Equal(t, 0, exitCode)
29 assert.Contains(t, stdout, "hello")
30 assert.Empty(t, stderr)
31
32 t.Logf("Quick command took: %v", duration)
33}
34
35func TestShellCPUUsageComparison(t *testing.T) {
36 tmpDir, err := os.MkdirTemp("", "shell-test")
37 require.NoError(t, err)
38 defer os.RemoveAll(tmpDir)
39
40 shell := GetPersistentShell(tmpDir)
41 defer shell.Close()
42
43 // Measure CPU and memory usage during a longer command
44 var m1, m2 runtime.MemStats
45 runtime.GC()
46 runtime.ReadMemStats(&m1)
47
48 start := time.Now()
49 _, stderr, exitCode, _, err := shell.Exec(context.Background(), "sleep 0.1", 1000)
50 duration := time.Since(start)
51
52 runtime.ReadMemStats(&m2)
53
54 require.NoError(t, err)
55 assert.Equal(t, 0, exitCode)
56 assert.Empty(t, stderr)
57
58 memGrowth := m2.Alloc - m1.Alloc
59 t.Logf("Sleep 0.1s command took: %v", duration)
60 t.Logf("Memory growth during polling: %d bytes", memGrowth)
61 t.Logf("GC cycles during test: %d", m2.NumGC-m1.NumGC)
62}
63
64// Benchmark CPU usage during polling
65func BenchmarkShellPolling(b *testing.B) {
66 tmpDir, err := os.MkdirTemp("", "shell-bench")
67 require.NoError(b, err)
68 defer os.RemoveAll(tmpDir)
69
70 shell := GetPersistentShell(tmpDir)
71 defer shell.Close()
72
73 b.ResetTimer()
74 b.ReportAllocs()
75
76 for i := 0; i < b.N; i++ {
77 // Use a short sleep to measure polling overhead
78 _, _, exitCode, _, err := shell.Exec(context.Background(), "sleep 0.02", 500)
79 if err != nil || exitCode != 0 {
80 b.Fatalf("Command failed: %v, exit code: %d", err, exitCode)
81 }
82 }
83}