summaryrefslogtreecommitdiff
path: root/pkg/pool/supervisor_test.go
diff options
context:
space:
mode:
authorValery Piashchynski <[email protected]>2021-09-16 17:12:37 +0300
committerValery Piashchynski <[email protected]>2021-09-16 17:12:37 +0300
commitf3491c089b4da77fd8d2bc942a88b6b8d117a8a5 (patch)
tree32bfffb1f24eeee7b909747cc00a6a6b9fd3ee83 /pkg/pool/supervisor_test.go
parent5d2cd55ab522d4f1e65a833f91146444465a32ac (diff)
Move plugins to a separate repository
Signed-off-by: Valery Piashchynski <[email protected]>
Diffstat (limited to 'pkg/pool/supervisor_test.go')
-rw-r--r--pkg/pool/supervisor_test.go413
1 files changed, 0 insertions, 413 deletions
diff --git a/pkg/pool/supervisor_test.go b/pkg/pool/supervisor_test.go
deleted file mode 100644
index 14df513e..00000000
--- a/pkg/pool/supervisor_test.go
+++ /dev/null
@@ -1,413 +0,0 @@
-package pool
-
-import (
- "context"
- "os"
- "os/exec"
- "testing"
- "time"
-
- "github.com/spiral/roadrunner/v2/pkg/events"
- "github.com/spiral/roadrunner/v2/pkg/payload"
- "github.com/spiral/roadrunner/v2/pkg/transport/pipe"
- "github.com/spiral/roadrunner/v2/pkg/worker"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-var cfgSupervised = &Config{
- NumWorkers: uint64(1),
- AllocateTimeout: time.Second,
- DestroyTimeout: time.Second,
- Supervisor: &SupervisorConfig{
- WatchTick: 1 * time.Second,
- TTL: 100 * time.Second,
- IdleTTL: 100 * time.Second,
- ExecTTL: 100 * time.Second,
- MaxWorkerMemory: 100,
- },
-}
-
-func TestSupervisedPool_Exec(t *testing.T) {
- ctx := context.Background()
- p, err := Initialize(
- ctx,
- func() *exec.Cmd { return exec.Command("php", "../../tests/memleak.php", "pipes") },
- pipe.NewPipeFactory(),
- cfgSupervised,
- )
-
- assert.NoError(t, err)
- assert.NotNil(t, p)
-
- time.Sleep(time.Second)
-
- pidBefore := p.Workers()[0].Pid()
-
- for i := 0; i < 100; i++ {
- time.Sleep(time.Millisecond * 100)
- _, err = p.Exec(&payload.Payload{
- Context: []byte(""),
- Body: []byte("foo"),
- })
- assert.NoError(t, err)
- }
-
- assert.NotEqual(t, pidBefore, p.Workers()[0].Pid())
-
- p.Destroy(context.Background())
-}
-
-// This test should finish without freezes
-func TestSupervisedPool_ExecWithDebugMode(t *testing.T) {
- var cfgSupervised = cfgSupervised
- cfgSupervised.Debug = true
-
- ctx := context.Background()
- p, err := Initialize(
- ctx,
- func() *exec.Cmd { return exec.Command("php", "../../tests/supervised.php") },
- pipe.NewPipeFactory(),
- cfgSupervised,
- )
-
- assert.NoError(t, err)
- assert.NotNil(t, p)
-
- time.Sleep(time.Second)
-
- for i := 0; i < 100; i++ {
- time.Sleep(time.Millisecond * 500)
- _, err = p.Exec(&payload.Payload{
- Context: []byte(""),
- Body: []byte("foo"),
- })
- assert.NoError(t, err)
- }
-
- p.Destroy(context.Background())
-}
-
-func TestSupervisedPool_ExecTTL_TimedOut(t *testing.T) {
- var cfgExecTTL = &Config{
- NumWorkers: uint64(1),
- AllocateTimeout: time.Second,
- DestroyTimeout: time.Second,
- Supervisor: &SupervisorConfig{
- WatchTick: 1 * time.Second,
- TTL: 100 * time.Second,
- IdleTTL: 100 * time.Second,
- ExecTTL: 1 * time.Second,
- MaxWorkerMemory: 100,
- },
- }
- ctx := context.Background()
- p, err := Initialize(
- ctx,
- func() *exec.Cmd { return exec.Command("php", "../../tests/sleep.php", "pipes") },
- pipe.NewPipeFactory(),
- cfgExecTTL,
- )
-
- assert.NoError(t, err)
- assert.NotNil(t, p)
- defer p.Destroy(context.Background())
-
- pid := p.Workers()[0].Pid()
-
- resp, err := p.Exec(&payload.Payload{
- Context: []byte(""),
- Body: []byte("foo"),
- })
-
- assert.Error(t, err)
- assert.Empty(t, resp)
-
- time.Sleep(time.Second * 1)
- // should be new worker with new pid
- assert.NotEqual(t, pid, p.Workers()[0].Pid())
-}
-
-func TestSupervisedPool_ExecTTL_WorkerRestarted(t *testing.T) {
- var cfgExecTTL = &Config{
- NumWorkers: uint64(1),
- Supervisor: &SupervisorConfig{
- WatchTick: 1 * time.Second,
- TTL: 5 * time.Second,
- },
- }
- ctx := context.Background()
- p, err := Initialize(
- ctx,
- func() *exec.Cmd { return exec.Command("php", "../../tests/sleep-ttl.php") },
- pipe.NewPipeFactory(),
- cfgExecTTL,
- )
-
- assert.NoError(t, err)
- assert.NotNil(t, p)
-
- pid := p.Workers()[0].Pid()
-
- resp, err := p.Exec(&payload.Payload{
- Context: []byte(""),
- Body: []byte("foo"),
- })
-
- assert.NoError(t, err)
- assert.Equal(t, string(resp.Body), "hello world")
- assert.Empty(t, resp.Context)
-
- time.Sleep(time.Second)
- assert.NotEqual(t, pid, p.Workers()[0].Pid())
- require.Equal(t, p.Workers()[0].State().Value(), worker.StateReady)
- pid = p.Workers()[0].Pid()
-
- resp, err = p.Exec(&payload.Payload{
- Context: []byte(""),
- Body: []byte("foo"),
- })
-
- assert.NoError(t, err)
- assert.Equal(t, string(resp.Body), "hello world")
- assert.Empty(t, resp.Context)
-
- time.Sleep(time.Second)
- // should be new worker with new pid
- assert.NotEqual(t, pid, p.Workers()[0].Pid())
- require.Equal(t, p.Workers()[0].State().Value(), worker.StateReady)
-
- p.Destroy(context.Background())
-}
-
-func TestSupervisedPool_Idle(t *testing.T) {
- var cfgExecTTL = &Config{
- NumWorkers: uint64(1),
- AllocateTimeout: time.Second,
- DestroyTimeout: time.Second,
- Supervisor: &SupervisorConfig{
- WatchTick: 1 * time.Second,
- TTL: 100 * time.Second,
- IdleTTL: 1 * time.Second,
- ExecTTL: 100 * time.Second,
- MaxWorkerMemory: 100,
- },
- }
- ctx := context.Background()
- p, err := Initialize(
- ctx,
- func() *exec.Cmd { return exec.Command("php", "../../tests/idle.php", "pipes") },
- pipe.NewPipeFactory(),
- cfgExecTTL,
- )
-
- assert.NoError(t, err)
- assert.NotNil(t, p)
-
- pid := p.Workers()[0].Pid()
-
- resp, err := p.Exec(&payload.Payload{
- Context: []byte(""),
- Body: []byte("foo"),
- })
-
- assert.Nil(t, err)
- assert.Empty(t, resp.Body)
- assert.Empty(t, resp.Context)
-
- time.Sleep(time.Second * 5)
-
- // worker should be marked as invalid and reallocated
- _, err = p.Exec(&payload.Payload{
- Context: []byte(""),
- Body: []byte("foo"),
- })
- assert.NoError(t, err)
- // should be new worker with new pid
- assert.NotEqual(t, pid, p.Workers()[0].Pid())
- p.Destroy(context.Background())
-}
-
-func TestSupervisedPool_IdleTTL_StateAfterTimeout(t *testing.T) {
- var cfgExecTTL = &Config{
- NumWorkers: uint64(1),
- AllocateTimeout: time.Second,
- DestroyTimeout: time.Second,
- Supervisor: &SupervisorConfig{
- WatchTick: 1 * time.Second,
- TTL: 1 * time.Second,
- IdleTTL: 1 * time.Second,
- MaxWorkerMemory: 100,
- },
- }
- ctx := context.Background()
- p, err := Initialize(
- ctx,
- func() *exec.Cmd { return exec.Command("php", "../../tests/exec_ttl.php", "pipes") },
- pipe.NewPipeFactory(),
- cfgExecTTL,
- )
-
- assert.NoError(t, err)
- assert.NotNil(t, p)
- defer p.Destroy(context.Background())
-
- pid := p.Workers()[0].Pid()
-
- time.Sleep(time.Millisecond * 100)
- resp, err := p.Exec(&payload.Payload{
- Context: []byte(""),
- Body: []byte("foo"),
- })
-
- assert.NoError(t, err)
- assert.Empty(t, resp.Body)
- assert.Empty(t, resp.Context)
-
- time.Sleep(time.Second * 2)
- // should be destroyed, state should be Ready, not Invalid
- assert.NotEqual(t, pid, p.Workers()[0].Pid())
- assert.Equal(t, int64(1), p.Workers()[0].State().Value())
-}
-
-func TestSupervisedPool_ExecTTL_OK(t *testing.T) {
- var cfgExecTTL = &Config{
- NumWorkers: uint64(1),
- AllocateTimeout: time.Second,
- DestroyTimeout: time.Second,
- Supervisor: &SupervisorConfig{
- WatchTick: 1 * time.Second,
- TTL: 100 * time.Second,
- IdleTTL: 100 * time.Second,
- ExecTTL: 4 * time.Second,
- MaxWorkerMemory: 100,
- },
- }
- ctx := context.Background()
- p, err := Initialize(
- ctx,
- func() *exec.Cmd { return exec.Command("php", "../../tests/exec_ttl.php", "pipes") },
- pipe.NewPipeFactory(),
- cfgExecTTL,
- )
-
- assert.NoError(t, err)
- assert.NotNil(t, p)
- defer p.Destroy(context.Background())
-
- pid := p.Workers()[0].Pid()
-
- time.Sleep(time.Millisecond * 100)
- resp, err := p.Exec(&payload.Payload{
- Context: []byte(""),
- Body: []byte("foo"),
- })
-
- assert.NoError(t, err)
- assert.Empty(t, resp.Body)
- assert.Empty(t, resp.Context)
-
- time.Sleep(time.Second * 1)
- // should be the same pid
- assert.Equal(t, pid, p.Workers()[0].Pid())
-}
-
-func TestSupervisedPool_MaxMemoryReached(t *testing.T) {
- var cfgExecTTL = &Config{
- NumWorkers: uint64(1),
- AllocateTimeout: time.Second,
- DestroyTimeout: time.Second,
- Supervisor: &SupervisorConfig{
- WatchTick: 1 * time.Second,
- TTL: 100 * time.Second,
- IdleTTL: 100 * time.Second,
- ExecTTL: 4 * time.Second,
- MaxWorkerMemory: 1,
- },
- }
-
- block := make(chan struct{}, 10)
- listener := func(event interface{}) {
- if ev, ok := event.(events.PoolEvent); ok {
- if ev.Event == events.EventMaxMemory {
- block <- struct{}{}
- }
- }
- }
-
- // constructed
- // max memory
- // constructed
- ctx := context.Background()
- p, err := Initialize(
- ctx,
- func() *exec.Cmd { return exec.Command("php", "../../tests/memleak.php", "pipes") },
- pipe.NewPipeFactory(),
- cfgExecTTL,
- AddListeners(listener),
- )
-
- assert.NoError(t, err)
- assert.NotNil(t, p)
-
- resp, err := p.Exec(&payload.Payload{
- Context: []byte(""),
- Body: []byte("foo"),
- })
-
- assert.NoError(t, err)
- assert.Empty(t, resp.Body)
- assert.Empty(t, resp.Context)
-
- <-block
- p.Destroy(context.Background())
-}
-
-func TestSupervisedPool_AllocateFailedOK(t *testing.T) {
- var cfgExecTTL = &Config{
- NumWorkers: uint64(2),
- AllocateTimeout: time.Second * 15,
- DestroyTimeout: time.Second * 5,
- Supervisor: &SupervisorConfig{
- WatchTick: 1 * time.Second,
- TTL: 5 * time.Second,
- },
- }
-
- ctx := context.Background()
- p, err := Initialize(
- ctx,
- func() *exec.Cmd { return exec.Command("php", "../../tests/allocate-failed.php") },
- pipe.NewPipeFactory(),
- cfgExecTTL,
- )
-
- assert.NoError(t, err)
- require.NotNil(t, p)
-
- time.Sleep(time.Second)
-
- // should be ok
- _, err = p.Exec(&payload.Payload{
- Context: []byte(""),
- Body: []byte("foo"),
- })
-
- require.NoError(t, err)
-
- // after creating this file, PHP will fail
- file, err := os.Create("break")
- require.NoError(t, err)
-
- time.Sleep(time.Second * 5)
- assert.NoError(t, file.Close())
- assert.NoError(t, os.Remove("break"))
-
- defer func() {
- if r := recover(); r != nil {
- assert.Fail(t, "panic should not be fired!")
- } else {
- p.Destroy(context.Background())
- }
- }()
-}