File: reexec_test.go

package info (click to toggle)
golang-github-containers-storage 1.24.8%2Bdfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 3,324 kB
  • sloc: sh: 812; ansic: 319; makefile: 175; awk: 12
file content (84 lines) | stat: -rw-r--r-- 2,031 bytes parent folder | download | duplicates (6)
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])
}