-
Notifications
You must be signed in to change notification settings - Fork 16
/
restart_test.go
114 lines (100 loc) · 2.42 KB
/
restart_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
package i3
import (
"context"
"io/ioutil"
"log"
"os"
"os/exec"
"path/filepath"
"testing"
)
// TestRestartSubprocess runs in a process which has been started with
// DISPLAY= pointing to an Xvfb instance with i3 -c testdata/i3.config running.
func TestRestartSubprocess(t *testing.T) {
if os.Getenv("GO_WANT_XVFB") != "1" {
t.Skip("parent process")
}
// received is buffered so that we can blockingly read on tick.
received := make(chan *ShutdownEvent, 1)
tick := make(chan *TickEvent)
fatal := make(chan bool)
go func() {
defer close(tick)
defer close(received)
defer close(fatal)
recv := Subscribe(ShutdownEventType, TickEventType)
defer recv.Close()
log.Printf("reading events")
for recv.Next() {
log.Printf("received: %#v", recv.Event())
switch ev := recv.Event().(type) {
case *ShutdownEvent:
received <- ev
case *TickEvent:
tick <- ev
}
}
log.Printf("done reading events")
fatal <- true
}()
log.Printf("read initial tick")
<-tick // Wait until the subscription is ready
log.Printf("restart")
if err := Restart(); err != nil {
t.Fatal(err)
}
// Restarting i3 triggered a close of the connection, i.e. also a new
// subscribe and initial tick event:
log.Printf("read next initial tick")
ev := <-tick
if !ev.First {
t.Fatalf("expected first tick after restart, got %#v instead", ev)
}
if _, err := SendTick(""); err != nil {
t.Fatal(err)
}
log.Printf("read tick")
<-tick // Wait until tick was received
log.Printf("read received")
<-received // Verify shutdown event was received
log.Printf("getversion")
if _, err := GetVersion(); err != nil {
t.Fatal(err)
}
select {
case _ = <-fatal:
t.Fatal("Subscribe has been canceled by restart")
default:
}
}
func TestRestart(t *testing.T) {
t.Parallel()
ctx, canc := context.WithCancel(context.Background())
defer canc()
_, DISPLAY, err := launchXvfb(ctx)
if err != nil {
t.Fatal(err)
}
dir, err := ioutil.TempDir("", "i3restart")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(dir)
I3SOCK := filepath.Join(dir, "i3.sock")
cleanup, err := launchI3(ctx, DISPLAY, I3SOCK)
if err != nil {
t.Fatal(err)
}
defer cleanup()
cmd := exec.Command(os.Args[0], "-test.run=TestRestartSubprocess", "-test.v")
cmd.Env = []string{
"GO_WANT_XVFB=1",
"DISPLAY=" + DISPLAY,
"PATH=" + os.Getenv("PATH"),
}
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
t.Fatal(err.Error())
}
}