73 lines
1.7 KiB
Go
73 lines
1.7 KiB
Go
package executor
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestRingBufferKeepsNewestData(t *testing.T) {
|
|
r := NewRingBuffer(8)
|
|
_, _ = r.Write([]byte("12345678"))
|
|
_, _ = r.Write([]byte("90"))
|
|
if got := string(r.Snapshot()); got != "34567890" {
|
|
t.Fatalf("got %q", got)
|
|
}
|
|
}
|
|
func TestSessionCapturesAndTerminates(t *testing.T) {
|
|
s, err := StartSession(context.Background(), "t1", "printf hello; sleep 5", "", "owner", 1024)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
time.Sleep(100 * time.Millisecond)
|
|
out, _ := s.Output()
|
|
if !strings.Contains(out, "hello") {
|
|
t.Fatalf("out=%q", out)
|
|
}
|
|
if err := s.Terminate(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
select {
|
|
case <-s.Done():
|
|
case <-time.After(2 * time.Second):
|
|
t.Fatal("session did not terminate")
|
|
}
|
|
}
|
|
func TestSessionManagerDuplicateAndLimit(t *testing.T) {
|
|
m := NewSessionManager(1)
|
|
s, err := m.Start(context.Background(), "a", "sleep 1", "", "owner", 128)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer s.Kill()
|
|
if _, err := m.Start(context.Background(), "b", "true", "", "owner", 128); err == nil {
|
|
t.Fatal("expected limit")
|
|
}
|
|
if _, err := m.Start(context.Background(), "a", "true", "", "owner", 128); err == nil {
|
|
t.Fatal("expected duplicate")
|
|
}
|
|
}
|
|
|
|
func TestSessionIdleAuthorizationTouch(t *testing.T) {
|
|
s, err := StartSession(context.Background(), "idle-test", "sleep 2", "", "owner", 128)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer s.Kill()
|
|
|
|
s.mu.Lock()
|
|
s.LastAccess = time.Now().Add(-(SessionIdleTTL + time.Second))
|
|
s.mu.Unlock()
|
|
if s.Authorized("owner") {
|
|
t.Fatal("idle-expired session must not authorize")
|
|
}
|
|
|
|
s.mu.Lock()
|
|
s.LastAccess = time.Now()
|
|
s.mu.Unlock()
|
|
if !s.Authorized("owner") {
|
|
t.Fatal("active session should authorize")
|
|
}
|
|
}
|