forked from miekg/dinit
-
Notifications
You must be signed in to change notification settings - Fork 0
/
dinit_test.go
146 lines (130 loc) · 4.35 KB
/
dinit_test.go
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package main
import (
"os"
"os/exec"
"syscall"
"testing"
"time"
)
func TestEnv(t *testing.T) {
varname := "DINIT_BOOVAR"
os.Setenv(varname, "")
c := command("echo " + "$" + varname)
if c.Args[1] != "" {
t.Fatalf("%s should be a env. var", varname)
}
os.Setenv(varname, "blah")
c = command("echo " + "$" + varname)
if c.Args[1] != "blah" {
t.Fatalf("%s should be a env. var", varname)
}
os.Setenv(varname, "blah")
c = command("echo " + "$" + varname + ".morestuff")
if c.Args[1] != "blah.morestuff" {
t.Fatalf("%s should be a env. var", varname)
}
}
func TestStart(t *testing.T) {
cmd := "/bin/sleep 1"
os.Setenv("DINIT_START", cmd)
start := envString("$DINIT_START", "")
if start != cmd {
t.Fatalf("got %s, expected %s", cmd, start)
}
}
func ExampleRun() {
test.SetTest(true)
run([]*exec.Cmd{command("cat /dev/null")}, false)
wait(false)
// Output: dinit: pid 123 started: [cat /dev/null]
// dinit: pid 123 finished: [cat /dev/null]
// dinit: pid 123 was primary, signalling other processes
// dinit: all processes exited, goodbye!
}
func ExampleRunINT() {
test.SetTest(true)
run([]*exec.Cmd{command("sleep 10")}, false)
go func() {
time.Sleep(10 * time.Millisecond)
procs.Signal(syscall.SIGINT)
}()
wait(false)
// Output: dinit: pid 123 started: [sleep 10]
// dinit: signal 2 sent to pid 123
// dinit: pid 123 finished: [sleep 10] with error: signal: interrupt
// dinit: pid 123 was primary, signalling other processes
// dinit: all processes exited, goodbye!
}
func ExampleFailToStart() {
test.SetTest(true)
run([]*exec.Cmd{command("sleep 10"), command("verbose")}, false)
wait(false)
// Output: dinit: pid 123 started: [sleep 10]
// dinit: process failed to start: exec: "verbose": executable file not found in $PATH
// dinit: signal 2 sent to pid 123
// dinit: pid 123 finished: [sleep 10] with error: signal: interrupt
// dinit: all processes exited, goodbye!
}
func ExampleTestAllPrimary() {
test.SetTest(true)
prim.SetAll(true)
defer prim.SetAll(false)
run([]*exec.Cmd{command("sleep 2"), command("sleep 20")}, false)
wait(false)
time.Sleep(3 * time.Second) // wait for Cleanup to terminate
// Output: dinit: pid 123 started: [sleep 2]
// dinit: pid 123 started: [sleep 20]
// dinit: pid 123 finished: [sleep 2]
// dinit: all processes considered primary, signalling other processes
// dinit: signal 2 sent to pid 123
// dinit: pid 123 finished: [sleep 20] with error: signal: interrupt
// dinit: all processes considered primary, signalling other processes
// dinit: all processes exited, goodbye!
}
// Test is flaky because of random output ordering.
func ExampleTestSubmit() {
const name = "dinit.sock"
test.SetTest(true)
go socket(name)
defer os.Remove(name)
time.Sleep(1 * time.Second)
run([]*exec.Cmd{command("sleep 3")}, false)
write(name, []*exec.Cmd{command("/bin/bash -c \"trap '' INT; /bin/sleep 4\"")})
time.Sleep(1 * time.Second)
procs.Signal(syscall.SIGINT)
wait(true)
// Output:
// dinit: socket: successfully created
// dinit: pid 123 started: [sleep 3]
// dinit: pid 123 started: [/bin/bash -c trap '' INT; /bin/sleep 4]
// dinit: signal 2 sent to pid 123
// dinit: signal 2 sent to pid 123
// dinit: pid 123 finished: [sleep 3] with error: signal: interrupt
// dinit: pid 123 was primary, signalling other processes
// dinit: signal 2 sent to pid 123
// dinit: 1 processes still alive after SIGINT/SIGTERM
// dinit: signal 9 sent to pid 123
// dinit: pid 123 finished: [/bin/bash -c trap '' INT; /bin/sleep 4] with error: signal: killed
// dinit: all processes exited, goodbye!
}
// Test is flaky because of random output ordering.
func exampleTestPrimary() {
test.SetTest(true)
run([]*exec.Cmd{command("less -"), command("killall -SEGV cat"), command("cat")}, false)
wait(false)
// Output: dinit: pid 123 started: [less -]
// dinit: pid 123 started: [killall -SEGV cat]
// dinit: pid 123 finished: [less -]
// dinit: pid 123 started: [cat]
// dinit: pid 123 finished: [cat]
// dinit: pid 123 was primary, signalling other processes
// dinit: signal 2 sent to pid 123
// dinit: pid 123 finished: [killall -SEGV cat] with error: signal: interrupt
// dinit: all processes exited, goodbye!
}
// Can test outside of Docker - i.e. with proper init running.
func exampleTestSubProcessReaping() {
run([]*exec.Cmd{command("./zombie.sh"), command("less - ")}, false)
wait(false)
time.Sleep(5 * time.Second)
}