Merge lp:~pedronis/ubuntu-push/acceptance-flex-1 into lp:ubuntu-push

Proposed by Samuele Pedroni
Status: Merged
Approved by: Samuele Pedroni
Approved revision: 68
Merged at revision: 64
Proposed branch: lp:~pedronis/ubuntu-push/acceptance-flex-1
Merge into: lp:ubuntu-push
Diff against target: 501 lines (+203/-143)
2 files modified
server/acceptance/acceptance_helpers.go (+156/-0)
server/acceptance/acceptance_test.go (+47/-143)
To merge this branch: bzr merge lp:~pedronis/ubuntu-push/acceptance-flex-1
Reviewer Review Type Date Requested Status
John Lenton (community) Approve
Review via email: mp+205846@code.launchpad.net

Commit message

starting splitting out helpers in the acceptance tests

Description of the change

in preparation of restructuring acceptance tests as reusable suites: starting splitting out helpers

To post a comment you must log in.
Revision history for this message
John Lenton (chipaca) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added file 'server/acceptance/acceptance_helpers.go'
--- server/acceptance/acceptance_helpers.go 1970-01-01 00:00:00 +0000
+++ server/acceptance/acceptance_helpers.go 2014-02-11 20:38:55 +0000
@@ -0,0 +1,156 @@
1/*
2 Copyright 2013-2014 Canonical Ltd.
3
4 This program is free software: you can redistribute it and/or modify it
5 under the terms of the GNU General Public License version 3, as published
6 by the Free Software Foundation.
7
8 This program is distributed in the hope that it will be useful, but
9 WITHOUT ANY WARRANTY; without even the implied warranties of
10 MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
11 PURPOSE. See the GNU General Public License for more details.
12
13 You should have received a copy of the GNU General Public License along
14 with this program. If not, see <http://www.gnu.org/licenses/>.
15*/
16
17package acceptance
18
19import (
20 "bufio"
21 "encoding/json"
22 "fmt"
23 "io/ioutil"
24 "os"
25 "os/exec"
26 "path/filepath"
27 "regexp"
28 "strings"
29 "time"
30
31 . "launchpad.net/gocheck"
32
33 helpers "launchpad.net/ubuntu-push/testing"
34)
35
36// FillConfig fills cfg from values.
37func FillConfig(cfg, values map[string]interface{}) {
38 for k, v := range values {
39 cfg[k] = v
40 }
41}
42
43// FillServerConfig fills cfg with default server values and "addr": addr.
44func FillServerConfig(cfg map[string]interface{}, addr string) {
45 FillConfig(cfg, map[string]interface{}{
46 "exchange_timeout": "0.1s",
47 "ping_interval": "0.5s",
48 "session_queue_size": 10,
49 "broker_queue_size": 100,
50 "addr": addr,
51 "key_pem_file": helpers.SourceRelative("config/testing.key"),
52 "cert_pem_file": helpers.SourceRelative("config/testing.cert"),
53 })
54}
55
56// FillHttpServerConfig fills cfg with default http server values and
57// "http_addr": httpAddr.
58func FillHTTPServerConfig(cfg map[string]interface{}, httpAddr string) {
59 FillConfig(cfg, map[string]interface{}{
60 "http_addr": httpAddr,
61 "http_read_timeout": "1s",
62 "http_write_timeout": "1s",
63 })
64}
65
66// WriteConfig writes out a config and returns the written filepath.
67func WriteConfig(c *C, dir, filename string, cfg map[string]interface{}) string {
68 cfgFpath := filepath.Join(dir, filename)
69 cfgJson, err := json.Marshal(cfg)
70 if err != nil {
71 c.Fatal(err)
72 }
73 err = ioutil.WriteFile(cfgFpath, cfgJson, os.ModePerm)
74 if err != nil {
75 c.Fatal(err)
76 }
77 return cfgFpath
78}
79
80var rxLineInfo = regexp.MustCompile("^.*? ([[:alpha:]].*)\n")
81
82// RunAndObserve runs cmdName and returns a channel that will receive
83// cmdName stderr logging and a function to kill the process.
84func RunAndObserve(c *C, cmdName string, arg ...string) (<-chan string, func()) {
85 cmd := exec.Command(cmdName, arg...)
86 stderr, err := cmd.StderrPipe()
87 if err != nil {
88 c.Fatal(err)
89 }
90 err = cmd.Start()
91 if err != nil {
92 c.Fatal(err)
93 }
94 bufErr := bufio.NewReaderSize(stderr, 5000)
95 getLineInfo := func() (string, error) {
96 for {
97 line, err := bufErr.ReadString('\n')
98 if err != nil {
99 return "", err
100 }
101 extracted := rxLineInfo.FindStringSubmatch(line)
102 if extracted == nil {
103 return "", fmt.Errorf("unexpected line: %#v", line)
104 }
105 info := extracted[1]
106 return info, nil
107 }
108 }
109 logs := make(chan string, 10)
110 go func() {
111 for {
112 info, err := getLineInfo()
113 if err != nil {
114 logs <- fmt.Sprintf("%s capture: %v", cmdName, err)
115 close(logs)
116 return
117 }
118 logs <- info
119 }
120 }()
121 return logs, func() { cmd.Process.Kill() }
122}
123
124const (
125 DevListeningOnPat = "INFO listening for devices on "
126 HTTPListeningOnPat = "INFO listening for http on "
127 debugPrefix = "DEBUG "
128)
129
130// ExtractListeningAddr goes over logs ignoring DEBUG lines
131// until a line starting with pat and returns the rest of that line.
132func ExtractListeningAddr(c *C, logs <-chan string, pat string) string {
133 for line := range logs {
134 if strings.HasPrefix(line, debugPrefix) {
135 continue
136 }
137 if !strings.HasPrefix(line, pat) {
138 c.Fatalf("matching %v: %v", pat, line)
139 }
140 return line[len(pat):]
141 }
142 panic(fmt.Errorf("logs closed unexpectedly marching %v", pat))
143}
144
145// NextEvent receives an event from given string channel with a 5s timeout,
146// or from a channel for errors.
147func NextEvent(events <-chan string, errCh <-chan error) string {
148 select {
149 case <-time.After(5 * time.Second):
150 panic("too long stuck waiting for next event")
151 case err := <-errCh:
152 return err.Error() // will fail comparison typically
153 case evStr := <-events:
154 return evStr
155 }
156}
0157
=== modified file 'server/acceptance/acceptance_test.go'
--- server/acceptance/acceptance_test.go 2014-02-10 23:50:29 +0000
+++ server/acceptance/acceptance_test.go 2014-02-11 20:38:55 +0000
@@ -17,7 +17,6 @@
17package acceptance17package acceptance
1818
19import (19import (
20 "bufio"
21 "bytes"20 "bytes"
22 "encoding/json"21 "encoding/json"
23 "flag"22 "flag"
@@ -25,10 +24,6 @@
25 "io/ioutil"24 "io/ioutil"
26 "net"25 "net"
27 "net/http"26 "net/http"
28 "os"
29 "os/exec"
30 "path/filepath"
31 "regexp"
32 "runtime"27 "runtime"
33 "strings"28 "strings"
34 "testing"29 "testing"
@@ -44,7 +39,7 @@
44func TestAcceptance(t *testing.T) { TestingT(t) }39func TestAcceptance(t *testing.T) { TestingT(t) }
4540
46type acceptanceSuite struct {41type acceptanceSuite struct {
47 server *exec.Cmd42 serverKill func()
48 serverAddr string43 serverAddr string
49 serverURL string44 serverURL string
50 serverEvents <-chan string45 serverEvents <-chan string
@@ -57,18 +52,9 @@
57var serverAuxCfg = flag.String("auxcfg", "", "auxiliary config for the server")52var serverAuxCfg = flag.String("auxcfg", "", "auxiliary config for the server")
5853
59func testServerConfig(addr, httpAddr string) map[string]interface{} {54func testServerConfig(addr, httpAddr string) map[string]interface{} {
60 cfg := map[string]interface{}{55 cfg := make(map[string]interface{})
61 "exchange_timeout": "0.1s",56 FillServerConfig(cfg, addr)
62 "ping_interval": "0.5s",57 FillHTTPServerConfig(cfg, httpAddr)
63 "session_queue_size": 10,
64 "broker_queue_size": 100,
65 "addr": addr,
66 "key_pem_file": helpers.SourceRelative("config/testing.key"),
67 "cert_pem_file": helpers.SourceRelative("config/testing.cert"),
68 "http_addr": httpAddr,
69 "http_read_timeout": "1s",
70 "http_write_timeout": "1s",
71 }
72 return cfg58 return cfg
73}59}
7460
@@ -86,109 +72,27 @@
86 }72 }
87}73}
8874
89const (
90 devListeningOnPat = "INFO listening for devices on "
91 httpListeningOnPat = "INFO listening for http on "
92 debugPrefix = "DEBUG "
93)
94
95var rxLineInfo = regexp.MustCompile("^.*? ([[:alpha:]].*)\n")
96
97func extractListeningAddr(c *C, pat, line string) string {
98 if !strings.HasPrefix(line, pat) {
99 c.Fatalf("server: %v", line)
100 }
101 return line[len(pat):]
102}
103
104// start a new server for each test75// start a new server for each test
105func (s *acceptanceSuite) SetUpTest(c *C) {76func (s *acceptanceSuite) SetUpTest(c *C) {
106 if *serverCmd == "" {77 if *serverCmd == "" {
107 c.Skip("executable server not specified")78 c.Skip("executable server not specified")
108 }79 }
109 tmpDir := c.MkDir()80 tmpDir := c.MkDir()
110 cfgFilename := filepath.Join(tmpDir, "config.json")81 cfg := testServerConfig("127.0.0.1:0", "127.0.0.1:0")
111 cfgJson, err := json.Marshal(testServerConfig("127.0.0.1:0", "127.0.0.1:0"))82 cfgFilename := WriteConfig(c, tmpDir, "config.json", cfg)
112 if err != nil {
113 c.Fatal(err)
114 }
115 err = ioutil.WriteFile(cfgFilename, cfgJson, os.ModePerm)
116 if err != nil {
117 c.Fatal(err)
118 }
119 cfgs := append(strings.Fields(*serverAuxCfg), cfgFilename)83 cfgs := append(strings.Fields(*serverAuxCfg), cfgFilename)
120 server := exec.Command(*serverCmd, cfgs...)84 serverEvents, killServer := RunAndObserve(c, *serverCmd, cfgs...)
121 stderr, err := server.StderrPipe()85 s.serverKill = killServer
122 if err != nil {86 serverHTTPAddr := ExtractListeningAddr(c, serverEvents, HTTPListeningOnPat)
123 c.Fatal(err)
124 }
125 err = server.Start()
126 if err != nil {
127 c.Fatal(err)
128 }
129 bufErr := bufio.NewReaderSize(stderr, 5000)
130 getLineInfo := func(ignoreDebug bool) (string, error) {
131 for {
132 line, err := bufErr.ReadString('\n')
133 if err != nil {
134 return "", err
135 }
136 extracted := rxLineInfo.FindStringSubmatch(line)
137 if extracted == nil {
138 return "", fmt.Errorf("unexpected server line: %#v", line)
139 }
140 info := extracted[1]
141 if ignoreDebug && strings.HasPrefix(info, debugPrefix) {
142 // don't report DEBUG lines
143 continue
144 }
145 return info, nil
146 }
147 }
148 infoHTTP, err := getLineInfo(true)
149 if err != nil {
150 c.Fatal(err)
151 }
152 serverHTTPAddr := extractListeningAddr(c, httpListeningOnPat, infoHTTP)
153 s.serverURL = fmt.Sprintf("http://%s", serverHTTPAddr)87 s.serverURL = fmt.Sprintf("http://%s", serverHTTPAddr)
154 info, err := getLineInfo(true)88 s.serverAddr = ExtractListeningAddr(c, serverEvents, DevListeningOnPat)
155 if err != nil {
156 c.Fatal(err)
157 }
158 s.serverAddr = extractListeningAddr(c, devListeningOnPat, info)
159 s.server = server
160 serverEvents := make(chan string, 5)
161 s.serverEvents = serverEvents89 s.serverEvents = serverEvents
162 go func() {
163 for {
164 info, err := getLineInfo(false)
165 if err != nil {
166 serverEvents <- fmt.Sprintf("ERROR: %v", err)
167 close(serverEvents)
168 return
169 }
170 serverEvents <- info
171 }
172 }()
173 s.httpClient = &http.Client{}90 s.httpClient = &http.Client{}
174}91}
17592
176func (s *acceptanceSuite) TearDownTest(c *C) {93func (s *acceptanceSuite) TearDownTest(c *C) {
177 if s.server != nil {94 if s.serverKill != nil {
178 s.server.Process.Kill()95 s.serverKill()
179 s.server = nil
180 }
181}
182
183// nextEvent receives an event from given channel with a 5s timeout
184func nextEvent(events <-chan string, errCh <-chan error) string {
185 select {
186 case <-time.After(5 * time.Second):
187 panic("too long stuck waiting for next event")
188 case err := <-errCh:
189 return err.Error() // will fail comparison typically
190 case evStr := <-events:
191 return evStr
192 }96 }
193}97}
19498
@@ -256,19 +160,19 @@
256 go func() {160 go func() {
257 errCh <- sess.Run(events)161 errCh <- sess.Run(events)
258 }()162 }()
259 connectCli := nextEvent(events, errCh)163 connectCli := NextEvent(events, errCh)
260 connectSrv := nextEvent(s.serverEvents, nil)164 connectSrv := NextEvent(s.serverEvents, nil)
261 registeredSrv := nextEvent(s.serverEvents, nil)165 registeredSrv := NextEvent(s.serverEvents, nil)
262 tconnect := time.Now()166 tconnect := time.Now()
263 c.Assert(connectSrv, Matches, ".*session.* connected .*")167 c.Assert(connectSrv, Matches, ".*session.* connected .*")
264 c.Assert(registeredSrv, Matches, ".*session.* registered DEVA")168 c.Assert(registeredSrv, Matches, ".*session.* registered DEVA")
265 c.Assert(strings.HasSuffix(connectSrv, connectCli), Equals, true)169 c.Assert(strings.HasSuffix(connectSrv, connectCli), Equals, true)
266 c.Assert(nextEvent(events, errCh), Equals, "Ping")170 c.Assert(NextEvent(events, errCh), Equals, "Ping")
267 elapsedOfPing := float64(time.Since(tconnect)) / float64(500*time.Millisecond)171 elapsedOfPing := float64(time.Since(tconnect)) / float64(500*time.Millisecond)
268 c.Check(elapsedOfPing >= 1.0, Equals, true)172 c.Check(elapsedOfPing >= 1.0, Equals, true)
269 c.Check(elapsedOfPing < 1.05, Equals, true)173 c.Check(elapsedOfPing < 1.05, Equals, true)
270 c.Assert(nextEvent(events, errCh), Equals, "Ping")174 c.Assert(NextEvent(events, errCh), Equals, "Ping")
271 c.Assert(nextEvent(s.serverEvents, nil), Matches, ".*session.* ended with: EOF")175 c.Assert(NextEvent(s.serverEvents, nil), Matches, ".*session.* ended with: EOF")
272 c.Check(len(errCh), Equals, 0)176 c.Check(len(errCh), Equals, 0)
273}177}
274178
@@ -291,11 +195,11 @@
291 go func() {195 go func() {
292 errCh <- sess.Run(events)196 errCh <- sess.Run(events)
293 }()197 }()
294 c.Assert(nextEvent(events, errCh), Matches, "connected .*")198 c.Assert(NextEvent(events, errCh), Matches, "connected .*")
295 c.Assert(nextEvent(s.serverEvents, nil), Matches, ".*session.* connected .*")199 c.Assert(NextEvent(s.serverEvents, nil), Matches, ".*session.* connected .*")
296 c.Assert(nextEvent(s.serverEvents, nil), Matches, ".*session.* registered .*")200 c.Assert(NextEvent(s.serverEvents, nil), Matches, ".*session.* registered .*")
297 c.Assert(nextEvent(events, errCh), Equals, "Ping")201 c.Assert(NextEvent(events, errCh), Equals, "Ping")
298 c.Assert(nextEvent(s.serverEvents, nil), Matches, `.* ended with:.*timeout`)202 c.Assert(NextEvent(s.serverEvents, nil), Matches, `.* ended with:.*timeout`)
299 c.Check(len(errCh), Equals, 0)203 c.Check(len(errCh), Equals, 0)
300}204}
301205
@@ -335,9 +239,9 @@
335 go func() {239 go func() {
336 errCh <- sess.Run(events)240 errCh <- sess.Run(events)
337 }()241 }()
338 c.Assert(nextEvent(events, errCh), Matches, "connected .*")242 c.Assert(NextEvent(events, errCh), Matches, "connected .*")
339 c.Assert(nextEvent(s.serverEvents, nil), Matches, ".*session.* connected .*")243 c.Assert(NextEvent(s.serverEvents, nil), Matches, ".*session.* connected .*")
340 c.Assert(nextEvent(s.serverEvents, nil), Matches, ".*session.* registered "+devId)244 c.Assert(NextEvent(s.serverEvents, nil), Matches, ".*session.* registered "+devId)
341 return events, errCh245 return events, errCh
342}246}
343247
@@ -359,9 +263,9 @@
359 })263 })
360 c.Assert(err, IsNil)264 c.Assert(err, IsNil)
361 c.Assert(got, Matches, ".*ok.*")265 c.Assert(got, Matches, ".*ok.*")
362 c.Check(nextEvent(events, errCh), Equals, `broadcast chan:0 app: topLevel:1 payloads:[{"n":42}]`)266 c.Check(NextEvent(events, errCh), Equals, `broadcast chan:0 app: topLevel:1 payloads:[{"n":42}]`)
363 clientShutdown <- true267 clientShutdown <- true
364 c.Assert(nextEvent(s.serverEvents, nil), Matches, `.* ended with:.*EOF`)268 c.Assert(NextEvent(s.serverEvents, nil), Matches, `.* ended with:.*EOF`)
365 c.Check(len(errCh), Equals, 0)269 c.Check(len(errCh), Equals, 0)
366}270}
367271
@@ -386,9 +290,9 @@
386 }290 }
387 events, errCh := s.startClient(c, "DEVB", intercept, nil)291 events, errCh := s.startClient(c, "DEVB", intercept, nil)
388 // gettting pending on connect292 // gettting pending on connect
389 c.Check(nextEvent(events, errCh), Equals, `broadcast chan:0 app: topLevel:1 payloads:[{"b":1}]`)293 c.Check(NextEvent(events, errCh), Equals, `broadcast chan:0 app: topLevel:1 payloads:[{"b":1}]`)
390 clientShutdown <- true294 clientShutdown <- true
391 c.Assert(nextEvent(s.serverEvents, nil), Matches, `.* ended with:.*EOF`)295 c.Assert(NextEvent(s.serverEvents, nil), Matches, `.* ended with:.*EOF`)
392 c.Check(len(errCh), Equals, 0)296 c.Check(len(errCh), Equals, 0)
393}297}
394298
@@ -416,10 +320,10 @@
416 }320 }
417 events, errCh := s.startClient(c, "DEVC", intercept, nil)321 events, errCh := s.startClient(c, "DEVC", intercept, nil)
418 // gettting pending on connect322 // gettting pending on connect
419 c.Check(nextEvent(events, errCh), Matches, `broadcast chan:0 app: topLevel:30 payloads:\[{"b":0,.*`)323 c.Check(NextEvent(events, errCh), Matches, `broadcast chan:0 app: topLevel:30 payloads:\[{"b":0,.*`)
420 c.Check(nextEvent(events, errCh), Matches, `broadcast chan:0 app: topLevel:32 payloads:\[.*`)324 c.Check(NextEvent(events, errCh), Matches, `broadcast chan:0 app: topLevel:32 payloads:\[.*`)
421 clientShutdown <- true325 clientShutdown <- true
422 c.Assert(nextEvent(s.serverEvents, nil), Matches, `.* ended with:.*EOF`)326 c.Assert(NextEvent(s.serverEvents, nil), Matches, `.* ended with:.*EOF`)
423 c.Check(len(errCh), Equals, 0)327 c.Check(len(errCh), Equals, 0)
424}328}
425329
@@ -445,11 +349,11 @@
445 })349 })
446 c.Assert(err, IsNil)350 c.Assert(err, IsNil)
447 c.Assert(got, Matches, ".*ok.*")351 c.Assert(got, Matches, ".*ok.*")
448 c.Check(nextEvent(events1, errCh1), Equals, `broadcast chan:0 app: topLevel:1 payloads:[{"n":42}]`)352 c.Check(NextEvent(events1, errCh1), Equals, `broadcast chan:0 app: topLevel:1 payloads:[{"n":42}]`)
449 c.Check(nextEvent(events2, errCh2), Equals, `broadcast chan:0 app: topLevel:1 payloads:[{"n":42}]`)353 c.Check(NextEvent(events2, errCh2), Equals, `broadcast chan:0 app: topLevel:1 payloads:[{"n":42}]`)
450 clientShutdown <- true354 clientShutdown <- true
451 c.Assert(nextEvent(s.serverEvents, nil), Matches, `.* ended with:.*EOF`)355 c.Assert(NextEvent(s.serverEvents, nil), Matches, `.* ended with:.*EOF`)
452 c.Assert(nextEvent(s.serverEvents, nil), Matches, `.* ended with:.*EOF`)356 c.Assert(NextEvent(s.serverEvents, nil), Matches, `.* ended with:.*EOF`)
453 c.Check(len(errCh1), Equals, 0)357 c.Check(len(errCh1), Equals, 0)
454 c.Check(len(errCh2), Equals, 0)358 c.Check(len(errCh2), Equals, 0)
455}359}
@@ -472,9 +376,9 @@
472 })376 })
473 c.Assert(err, IsNil)377 c.Assert(err, IsNil)
474 c.Assert(got, Matches, ".*ok.*")378 c.Assert(got, Matches, ".*ok.*")
475 c.Check(nextEvent(events, errCh), Equals, `broadcast chan:0 app: topLevel:1 payloads:[{"b":1}]`)379 c.Check(NextEvent(events, errCh), Equals, `broadcast chan:0 app: topLevel:1 payloads:[{"b":1}]`)
476 clientShutdown <- true380 clientShutdown <- true
477 c.Assert(nextEvent(s.serverEvents, nil), Matches, `.* ended with:.*EOF`)381 c.Assert(NextEvent(s.serverEvents, nil), Matches, `.* ended with:.*EOF`)
478 c.Check(len(errCh), Equals, 0)382 c.Check(len(errCh), Equals, 0)
479 // another broadcast383 // another broadcast
480 got, err = s.postRequest("/broadcast", &api.Broadcast{384 got, err = s.postRequest("/broadcast", &api.Broadcast{
@@ -489,9 +393,9 @@
489 events, errCh = s.startClient(c, "DEVD", intercept, map[string]int64{393 events, errCh = s.startClient(c, "DEVD", intercept, map[string]int64{
490 protocol.SystemChannelId: 1,394 protocol.SystemChannelId: 1,
491 })395 })
492 c.Check(nextEvent(events, errCh), Equals, `broadcast chan:0 app: topLevel:2 payloads:[{"b":2}]`)396 c.Check(NextEvent(events, errCh), Equals, `broadcast chan:0 app: topLevel:2 payloads:[{"b":2}]`)
493 clientShutdown <- true397 clientShutdown <- true
494 c.Assert(nextEvent(s.serverEvents, nil), Matches, `.* ended with:.*EOF`)398 c.Assert(NextEvent(s.serverEvents, nil), Matches, `.* ended with:.*EOF`)
495 c.Check(len(errCh), Equals, 0)399 c.Check(len(errCh), Equals, 0)
496}400}
497401
@@ -525,9 +429,9 @@
525 protocol.SystemChannelId: 10,429 protocol.SystemChannelId: 10,
526 })430 })
527 // gettting last one pending on connect431 // gettting last one pending on connect
528 c.Check(nextEvent(events, errCh), Equals, `broadcast chan:0 app: topLevel:2 payloads:[{"b":2}]`)432 c.Check(NextEvent(events, errCh), Equals, `broadcast chan:0 app: topLevel:2 payloads:[{"b":2}]`)
529 clientShutdown <- true433 clientShutdown <- true
530 c.Assert(nextEvent(s.serverEvents, nil), Matches, `.* ended with:.*EOF`)434 c.Assert(NextEvent(s.serverEvents, nil), Matches, `.* ended with:.*EOF`)
531 c.Check(len(errCh), Equals, 0)435 c.Check(len(errCh), Equals, 0)
532}436}
533437
@@ -546,9 +450,9 @@
546 protocol.SystemChannelId: 10,450 protocol.SystemChannelId: 10,
547 })451 })
548 // gettting empty pending on connect452 // gettting empty pending on connect
549 c.Check(nextEvent(events, errCh), Equals, `broadcast chan:0 app: topLevel:0 payloads:null`)453 c.Check(NextEvent(events, errCh), Equals, `broadcast chan:0 app: topLevel:0 payloads:null`)
550 clientShutdown <- true454 clientShutdown <- true
551 c.Assert(nextEvent(s.serverEvents, nil), Matches, `.* ended with:.*EOF`)455 c.Assert(NextEvent(s.serverEvents, nil), Matches, `.* ended with:.*EOF`)
552 c.Check(len(errCh), Equals, 0)456 c.Check(len(errCh), Equals, 0)
553}457}
554458
@@ -582,8 +486,8 @@
582 protocol.SystemChannelId: -10,486 protocol.SystemChannelId: -10,
583 })487 })
584 // gettting pending on connect488 // gettting pending on connect
585 c.Check(nextEvent(events, errCh), Equals, `broadcast chan:0 app: topLevel:2 payloads:[{"b":1},{"b":2}]`)489 c.Check(NextEvent(events, errCh), Equals, `broadcast chan:0 app: topLevel:2 payloads:[{"b":1},{"b":2}]`)
586 clientShutdown <- true490 clientShutdown <- true
587 c.Assert(nextEvent(s.serverEvents, nil), Matches, `.* ended with:.*EOF`)491 c.Assert(NextEvent(s.serverEvents, nil), Matches, `.* ended with:.*EOF`)
588 c.Check(len(errCh), Equals, 0)492 c.Check(len(errCh), Equals, 0)
589}493}

Subscribers

People subscribed via source and target branches