forked from taskcluster/taskcluster
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprotocol_test.go
102 lines (83 loc) · 2.87 KB
/
protocol_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
package workerproto
import (
"io"
"testing"
"github.com/stretchr/testify/require"
)
func RequireInitialized(t *testing.T, prot *Protocol, initialized bool) {
prot.initializedCond.L.Lock()
defer prot.initializedCond.L.Unlock()
require.Equal(t, initialized, prot.initialized)
}
func TestCapabilityNegotiation(t *testing.T) {
test := func(t *testing.T, runnerHasCap bool, workerHasCap bool) {
// wire transports together in both directions, and finish them at
// the end of the test
r2wReader, r2wWriter := io.Pipe()
defer r2wWriter.Close()
w2rReader, w2rWriter := io.Pipe()
defer w2rWriter.Close()
runnerTransp := NewPipeTransport(w2rReader, r2wWriter)
workerTransp := NewPipeTransport(r2wReader, w2rWriter)
runnerProto := NewProtocol(runnerTransp)
workerProto := NewProtocol(workerTransp)
if runnerHasCap {
runnerProto.AddCapability("test-capability")
}
if workerHasCap {
workerProto.AddCapability("test-capability")
}
gotWelcome := false
var welcomeCaps []string
workerProto.Register("welcome", func(msg Message) {
gotWelcome = true
welcomeCaps = listOfStrings(msg.Properties["capabilities"])
})
var helloCaps []string
runnerProto.Register("hello", func(msg Message) {
helloCaps = listOfStrings(msg.Properties["capabilities"])
})
RequireInitialized(t, runnerProto, false)
RequireInitialized(t, workerProto, false)
runnerProto.Start(false)
RequireInitialized(t, runnerProto, false)
RequireInitialized(t, workerProto, false)
workerProto.Start(true)
runnerProto.WaitUntilInitialized()
workerProto.WaitUntilInitialized()
RequireInitialized(t, workerProto, true)
RequireInitialized(t, runnerProto, true)
require.True(t, gotWelcome)
if runnerHasCap {
require.Equal(t, welcomeCaps, []string{"test-capability"})
} else {
require.Equal(t, welcomeCaps, []string{})
}
if workerHasCap {
require.Equal(t, helloCaps, []string{"test-capability"})
} else {
require.Equal(t, helloCaps, []string{})
}
// Capable should only return true when both have the capability
if runnerHasCap && workerHasCap {
require.Equal(t, true, workerProto.Capable("test-capability"))
require.Equal(t, true, runnerProto.Capable("test-capability"))
} else {
require.Equal(t, false, workerProto.Capable("test-capability"))
require.Equal(t, false, runnerProto.Capable("test-capability"))
}
}
t.Run("no-capabilities", func(t *testing.T) { test(t, false, false) })
t.Run("runner-capabilities", func(t *testing.T) { test(t, true, false) })
t.Run("worker-capabilities", func(t *testing.T) { test(t, false, true) })
t.Run("both-capabilities", func(t *testing.T) { test(t, true, true) })
}
func TestAddCapabilitiesTooLate(t *testing.T) {
transp := NewNullTransport()
proto := NewProtocol(transp)
proto.Start(false)
RequireInitialized(t, proto, false)
require.Panics(t, func() {
proto.AddCapability("test-capability")
})
}