This repository has been archived by the owner on Jan 25, 2022. It is now read-only.
/
nats_runner.go
73 lines (59 loc) · 1.54 KB
/
nats_runner.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
package natsrunner
import (
"fmt"
"os"
"os/exec"
"strconv"
"time"
"github.com/cloudfoundry/yagnats"
"github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"github.com/onsi/gomega/gexec"
)
var natsCommand *exec.Cmd
type NATSRunner struct {
port int
natsSession *gexec.Session
natsUrls []string
MessageBus yagnats.NATSConn
}
func NewNATSRunner(port int) *NATSRunner {
return &NATSRunner{
port: port,
}
}
func (runner *NATSRunner) Start() {
if runner.natsSession != nil {
panic("starting an already started NATS runner!!!")
}
_, err := exec.LookPath("gnatsd")
if err != nil {
fmt.Println("You need gnatsd installed!")
os.Exit(1)
}
cmd := exec.Command("gnatsd", "-p", strconv.Itoa(runner.port))
sess, err := gexec.Start(
cmd,
gexec.NewPrefixedWriter("\x1b[32m[o]\x1b[34m[gnatsd]\x1b[0m ", ginkgo.GinkgoWriter),
gexec.NewPrefixedWriter("\x1b[91m[e]\x1b[34m[gnatsd]\x1b[0m ", ginkgo.GinkgoWriter),
)
Expect(err).NotTo(HaveOccurred(), "Make sure to have gnatsd on your path")
runner.natsSession = sess
Expect(err).NotTo(HaveOccurred())
var messageBus yagnats.NATSConn
Eventually(func() error {
messageBus, err = yagnats.Connect([]string{fmt.Sprintf("nats://127.0.0.1:%d", runner.port)})
return err
}, 5, 0.1).ShouldNot(HaveOccurred())
runner.MessageBus = messageBus
}
func (runner *NATSRunner) Stop() {
runner.KillWithFire()
}
func (runner *NATSRunner) KillWithFire() {
if runner.natsSession != nil {
runner.natsSession.Kill().Wait(5 * time.Second)
runner.MessageBus = nil
runner.natsSession = nil
}
}