@@ -0,0 +1,83 @@
10+ "github.com/stretchr/testify/assert"
11+ "github.com/stretchr/testify/require"
14+func TestShellPerformanceComparison(t *testing.T) {
15+ tmpDir, err := os.MkdirTemp("", "shell-test")
16+ require.NoError(t, err)
17+ defer os.RemoveAll(tmpDir)
19+ shell := GetPersistentShell(tmpDir)
22+ // Test quick command
24+ stdout, stderr, exitCode, _, err := shell.Exec(context.Background(), "echo 'hello'", 0)
25+ duration := time.Since(start)
27+ require.NoError(t, err)
28+ assert.Equal(t, 0, exitCode)
29+ assert.Contains(t, stdout, "hello")
30+ assert.Empty(t, stderr)
32+ t.Logf("Quick command took: %v", duration)
35+func TestShellCPUUsageComparison(t *testing.T) {
36+ tmpDir, err := os.MkdirTemp("", "shell-test")
37+ require.NoError(t, err)
38+ defer os.RemoveAll(tmpDir)
40+ shell := GetPersistentShell(tmpDir)
43+ // Measure CPU and memory usage during a longer command
44+ var m1, m2 runtime.MemStats
46+ runtime.ReadMemStats(&m1)
49+ _, stderr, exitCode, _, err := shell.Exec(context.Background(), "sleep 0.1", 1000)
50+ duration := time.Since(start)
52+ runtime.ReadMemStats(&m2)
54+ require.NoError(t, err)
55+ assert.Equal(t, 0, exitCode)
56+ assert.Empty(t, stderr)
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)
64+// Benchmark CPU usage during polling
65+func BenchmarkShellPolling(b *testing.B) {
66+ tmpDir, err := os.MkdirTemp("", "shell-bench")
67+ require.NoError(b, err)
68+ defer os.RemoveAll(tmpDir)
70+ shell := GetPersistentShell(tmpDir)
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)