This repository has been archived by the owner on Jan 16, 2019. It is now read-only.
/
server.go
executable file
·89 lines (73 loc) · 1.9 KB
/
server.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
// Package mesgtest is a testing package for MESG service.
// Use this package while unit testing your programs.
package mesgtest
import (
"encoding/json"
service "github.com/mesg-foundation/go-service/proto"
uuid "github.com/satori/go.uuid"
)
// Server is a test server.
type Server struct {
service *serviceServer
socket *Socket
}
// NewServer creates a new test server.
func NewServer() *Server {
return &Server{
service: newServiceServer(),
socket: newSocket(),
}
}
// Start starts the test server.
func (s *Server) Start() error {
return s.socket.listen(s.service)
}
// Socket returns a in-memory socket for client application.
func (s *Server) Socket() *Socket {
return s.socket
}
// LastEmit returns the chan that receives last emitted event's info.
func (s *Server) LastEmit() chan *Event {
return s.service.emitC
}
// Execute executes a task with data.
func (s *Server) Execute(task string, data interface{}) (string, *Execution, error) {
bytes, err := json.Marshal(data)
if err != nil {
return "", nil, err
}
uuidV4, err := uuid.NewV4()
if err != nil {
return "", nil, err
}
id := uuidV4.String()
taskData := &service.TaskData{
ExecutionID: id,
TaskKey: task,
InputData: string(bytes),
}
select {
case <-s.service.closingC:
return "", nil, ErrConnectionClosed{}
case s.service.taskC <- taskData:
}
select {
case <-s.service.closingC:
return "", nil, ErrConnectionClosed{}
case resp := <-s.service.submitC:
return id, resp, nil
}
}
// ListenToken returns the token of service that started listening for tasks.
func (s *Server) ListenToken() string {
return s.service.token
}
// Close closes test server.
func (s *Server) Close() error {
return s.socket.close()
}
// ErrConnectionClosed returned when the connection closed between go-service and server.
type ErrConnectionClosed struct{}
func (e ErrConnectionClosed) Error() string {
return "connection closed"
}