This repository has been archived by the owner on Jun 3, 2021. It is now read-only.
/
mock_service.go
93 lines (82 loc) · 2.47 KB
/
mock_service.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
package testHelpers
import (
"encoding/json"
"fmt"
"sync"
"github.com/gorilla/websocket"
"github.com/pkg/errors"
"github.com/Originate/exocom/go/structs"
"github.com/Originate/exocom/go/utils"
)
// MockService is a mock of a real service that would connect to exocom
type MockService struct {
exocomPort int
role string
socket *websocket.Conn
receivedMessages []structs.Message
receivedMessagesMutex sync.RWMutex
}
// NewMockService returns a new MockService
func NewMockService(exocomPort int, role string) *MockService {
return &MockService{
role: role,
exocomPort: exocomPort,
receivedMessages: []structs.Message{},
}
}
// Connect connects the mock service to exocom
func (m *MockService) Connect() error {
url := fmt.Sprintf("ws://%s:%d/services", "localhost", m.exocomPort)
var err error
m.socket, err = utils.ConnectWithRetry(url, 100)
if err != nil {
return err
}
go m.websocketHandler()
serializedBytes, err := json.Marshal(structs.Message{
Name: "exocom.register-service",
Sender: m.role,
ActivityID: "123",
})
if err != nil {
return err
}
return m.socket.WriteMessage(websocket.TextMessage, serializedBytes)
}
//Send allows the mock service to send a websocket message to exocom
func (m *MockService) Send(message structs.Message) error {
serializedBytes, err := json.Marshal(message)
if err != nil {
return err
}
return m.socket.WriteMessage(websocket.TextMessage, serializedBytes)
}
// Close disconnects the mock service from exocom
func (m *MockService) Close() error {
if m.socket != nil {
err := m.socket.Close()
m.socket = nil
return err
}
return nil
}
//GetReceivedMessages gets the messages this mock service has received
func (m *MockService) GetReceivedMessages() []structs.Message {
m.receivedMessagesMutex.RLock()
defer m.receivedMessagesMutex.RUnlock()
return m.receivedMessages
}
//WaitForMessageWithName tells this mock service to wait to receive a message with the given name
func (m *MockService) WaitForMessageWithName(name string) (structs.Message, error) {
return utils.WaitForMessageWithName(m, name)
}
func (m *MockService) websocketHandler() {
utils.ListenForMessages(m.socket, func(message structs.Message) error {
m.receivedMessagesMutex.Lock()
m.receivedMessages = append(m.receivedMessages, message)
m.receivedMessagesMutex.Unlock()
return nil
}, func(err error) {
fmt.Println(errors.Wrap(err, "Exocom listening for messages"))
})
}