1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
package reexec
import (
"bytes"
"context"
"fmt"
"os"
"os/exec"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
const sleepMessage = "sleeping"
func init() {
Register("reexec", func() {
panic("Return Error")
})
Register("sleep", func() {
fmt.Print(sleepMessage)
time.Sleep(time.Hour)
fmt.Printf("\nfinished " + sleepMessage)
})
Init()
}
func TestRegister(t *testing.T) {
defer func() {
if r := recover(); r != nil {
require.Equal(t, `reexec func already registered under name "reexec"`, r)
}
}()
Register("reexec", func() {})
}
func TestCommand(t *testing.T) {
cmd := Command("reexec")
w, err := cmd.StdinPipe()
require.NoError(t, err, "Error on pipe creation: %v", err)
defer w.Close()
err = cmd.Start()
require.NoError(t, err, "Error on re-exec cmd: %v", err)
err = cmd.Wait()
require.EqualError(t, err, "exit status 2")
}
func TestCommandContext(t *testing.T) {
stdout := &bytes.Buffer{}
ctx, finish := context.WithDeadline(context.TODO(), time.Now().Add(5*time.Second))
defer finish()
cmd := CommandContext(ctx, "sleep")
w, err := cmd.StdinPipe()
require.NoError(t, err, "Error on pipe creation: %v", err)
defer w.Close()
cmd.Stdout = stdout
started := time.Now()
err = cmd.Start()
require.NoError(t, err, "Error on re-exec cmd: %v", err)
err = cmd.Wait()
require.NotNil(t, err, "Expected an error when the deadline was exceeded.")
require.True(t, time.Since(started) < time.Hour/2, "Subprocess runtime exceeded deadline.")
require.Equal(t, stdout.String(), sleepMessage, "error setting args for child process")
}
func TestNaiveSelf(t *testing.T) {
if os.Getenv("TEST_CHECK") == "1" {
os.Exit(2)
}
cmd := exec.Command(naiveSelf(), "-test.run=TestNaiveSelf")
cmd.Env = append(os.Environ(), "TEST_CHECK=1")
err := cmd.Start()
require.NoError(t, err, "Unable to start command")
err = cmd.Wait()
require.EqualError(t, err, "exit status 2")
os.Args[0] = "mkdir"
assert.NotEqual(t, naiveSelf(), os.Args[0])
}
|