1
- package gorums_test
1
+ package gorums
2
2
3
3
import (
4
- "net"
4
+ "context"
5
+ "sync"
5
6
"testing"
6
- "time"
7
7
8
- "github.com/relab/gorums"
9
- "google.golang.org/grpc"
10
- "google.golang.org/grpc/credentials/insecure"
8
+ "github.com/google/uuid"
9
+ "github.com/relab/gorums/ordering"
11
10
"google.golang.org/protobuf/reflect/protoreflect"
12
11
)
13
12
14
- type testBroadcastRequest struct {}
13
+ type testBroadcastRequest struct {
14
+ value string
15
+ }
15
16
16
17
func (t * testBroadcastRequest ) ProtoReflect () protoreflect.Message {
17
18
return nil
@@ -23,141 +24,214 @@ func (t *testBroadcastResponse) ProtoReflect() protoreflect.Message {
23
24
return nil
24
25
}
25
26
26
- type testBroadcastImpl interface {
27
- Broadcast (ctx gorums.ServerCtx , request * testBroadcastRequest , broadcast * testBroadcast )
28
- }
29
-
30
- type testBroadcastServer struct {
31
- * gorums.Server
32
- numMsgs int
33
- }
34
-
27
+ // type testBroadcastImpl interface {
28
+ // Broadcast(ctx gorums.ServerCtx, request *testBroadcastRequest, broadcast *testBroadcast)
29
+ // }
30
+ //
31
+ // type testBroadcastServer struct {
32
+ // *gorums.Server
33
+ // numMsgs int
34
+ // }
35
+ //
36
+ // func newTestBroadcastServer() *testBroadcastServer {
37
+ // return &testBroadcastServer{
38
+ // Server: gorums.NewServer(),
39
+ // }
40
+ // }
35
41
type testBroadcast struct {
36
- * gorums. BroadcastStruct
37
- sp * gorums. SpBroadcast
38
- metadata gorums. BroadcastMetadata
42
+ * BroadcastStruct
43
+ sp * SpBroadcast
44
+ metadata BroadcastMetadata
39
45
}
40
46
41
- func configureHandlers (b * testBroadcast ) func (bh gorums. BroadcastHandlerFunc , ch gorums. BroadcastReturnToClientHandlerFunc ) {
42
- return func (bh gorums. BroadcastHandlerFunc , ch gorums. BroadcastReturnToClientHandlerFunc ) {
47
+ func configureHandlers (b * testBroadcast ) func (bh BroadcastHandlerFunc , ch BroadcastReturnToClientHandlerFunc ) {
48
+ return func (bh BroadcastHandlerFunc , ch BroadcastReturnToClientHandlerFunc ) {
43
49
b .sp .BroadcastHandler = bh
44
50
b .sp .ReturnToClientHandler = ch
45
51
}
46
52
}
47
53
48
- func configureMetadata (b * testBroadcast ) func (metadata gorums. BroadcastMetadata ) {
49
- return func (metadata gorums. BroadcastMetadata ) {
54
+ func configureMetadata (b * testBroadcast ) func (metadata BroadcastMetadata ) {
55
+ return func (metadata BroadcastMetadata ) {
50
56
b .metadata = metadata
51
57
}
52
58
}
53
59
54
- func (b * testBroadcast ) Broadcast (req * testBroadcastRequest , opts ... gorums. BroadcastOption ) {
55
- data := gorums . NewBroadcastOptions ()
60
+ func (b * testBroadcast ) Broadcast (req * testBroadcastRequest , opts ... BroadcastOption ) {
61
+ data := NewBroadcastOptions ()
56
62
for _ , opt := range opts {
57
63
opt (& data )
58
64
}
59
65
b .sp .BroadcastHandler ("broadcast" , req , b .metadata , data )
60
66
}
61
67
62
- // Returns a readonly struct of the metadata used in the broadcast.
63
68
//
64
- // Note: Some of the data are equal across the cluster, such as BroadcastID.
65
- // Other fields are local, such as SenderAddr.
66
- func (b * testBroadcast ) GetMetadata () gorums.BroadcastMetadata {
67
- return b .metadata
68
- }
69
+ //// Returns a readonly struct of the metadata used in the broadcast.
70
+ ////
71
+ //// Note: Some of the data are equal across the cluster, such as BroadcastID.
72
+ //// Other fields are local, such as SenderAddr.
73
+ //func (b *testBroadcast) GetMetadata() gorums.BroadcastMetadata {
74
+ // return b.metadata
75
+ //}
76
+ //
77
+ //func (es *testBroadcastServer) Broadcast(ctx gorums.ServerCtx, request *testBroadcastRequest, broadcast *testBroadcast) {
78
+ // es.numMsgs++
79
+ // broadcast.Broadcast(&testBroadcastRequest{})
80
+ //}
81
+ //
82
+ //func createBroadcastServer(ownAddr string, srvAddrs []string) *testBroadcastServer {
83
+ // srv := &testBroadcastServer{
84
+ // Server: gorums.NewServer(),
85
+ // numMsgs: 0,
86
+ // }
87
+ // srv.RegisterHandler("broadcast", gorums.BroadcastHandler(srv.Broadcast, srv.Server))
88
+ //
89
+ // lis, err := net.Listen("tcp", ownAddr)
90
+ // if err != nil {
91
+ // return nil
92
+ // }
93
+ //
94
+ // go func() { _ = srv.Serve(lis) }()
95
+ // //defer srv.Stop()
96
+ //
97
+ // srv.RegisterView(ownAddr, srvAddrs)
98
+ // srv.ListenForBroadcast()
99
+ // return srv
100
+ //}
101
+ //
102
+ //type testBroadcastConfiguration struct {
103
+ // gorums.RawConfiguration
104
+ // qspec *testBroadcastQSpec
105
+ // srv *clientServerImpl
106
+ //}
107
+ //
108
+ //type clientServerImpl struct {
109
+ // *gorums.ClientServer
110
+ // grpcServer *grpc.Server
111
+ //}
112
+ //
113
+ //func (c *testBroadcastConfiguration) RegisterClientServer(lis net.Listener, opts ...grpc.ServerOption) error {
114
+ // srvImpl := &clientServerImpl{
115
+ // grpcServer: grpc.NewServer(opts...),
116
+ // }
117
+ // srv, err := gorums.NewClientServer(lis)
118
+ // if err != nil {
119
+ // return err
120
+ // }
121
+ // //srvImpl.grpcServer.RegisterService(&clientServer_ServiceDesc, srvImpl)
122
+ // go srvImpl.grpcServer.Serve(lis)
123
+ // srvImpl.ClientServer = srv
124
+ // c.srv = srvImpl
125
+ // return nil
126
+ //}
127
+ //
128
+ //type testBroadcastQSpec struct {
129
+ // quorumSize int
130
+ //}
131
+ //
132
+ //func newQSpec(qSize int) *testBroadcastQSpec {
133
+ // return &testBroadcastQSpec{
134
+ // quorumSize: qSize,
135
+ // }
136
+ //}
137
+ //func (qs *testBroadcastQSpec) BroadcastQF(reqs []*testBroadcastResponse) (*testBroadcastResponse, bool) {
138
+ // if len(reqs) < qs.quorumSize {
139
+ // return nil, false
140
+ // }
141
+ // return reqs[0], true
142
+ //}
143
+ //
144
+ //func getConfig(srvAddresses []string, numSrvs int) *testBroadcastConfiguration {
145
+ // mgr := gorums.NewRawManager(
146
+ // gorums.WithDialTimeout(time.Second),
147
+ // gorums.WithGrpcDialOptions(
148
+ // grpc.WithBlock(),
149
+ // grpc.WithTransportCredentials(insecure.NewCredentials()),
150
+ // ),
151
+ // )
152
+ // c := &testBroadcastConfiguration{}
153
+ // c.RawConfiguration, _ = gorums.NewRawConfiguration(mgr, gorums.WithNodeList(srvAddresses))
154
+ // c.qspec = newQSpec(numSrvs)
155
+ // //c.RegisterClientServer(gorums.WithListener("localhost:8080"))
156
+ // return c
157
+ //}
158
+
159
+ //func TestBroadcast(t *testing.T) {
160
+ // srv := gorums.NewServer()
161
+ //
162
+ // lis, err := net.Listen("tcp", ":0")
163
+ // if err != nil {
164
+ // t.Fatal(err)
165
+ // }
166
+ //
167
+ // go func() { _ = srv.Serve(lis) }()
168
+ // defer srv.Stop()
169
+ //
170
+ //}
69
171
70
- func (es * testBroadcastServer ) Broadcast (ctx gorums.ServerCtx , request * testBroadcastRequest , broadcast * testBroadcast ) {
71
- es .numMsgs ++
72
- broadcast .Broadcast (& testBroadcastRequest {})
172
+ type testBroadcastServer struct {
173
+ * Server
174
+ numMsgs int
175
+ req * testBroadcastRequest
73
176
}
74
177
75
- func createBroadcastServer ( ownAddr string , srvAddrs [] string ) * testBroadcastServer {
178
+ func newTestBroadcastServer ( ) * testBroadcastServer {
76
179
srv := & testBroadcastServer {
77
- Server : gorums . NewServer (),
78
- numMsgs : 0 ,
180
+ Server : NewServer (),
181
+ req : & testBroadcastRequest {} ,
79
182
}
80
- srv .RegisterHandler ("broadcast" , gorums .BroadcastHandler (srv .Broadcast , srv .Server ))
81
-
82
- lis , err := net .Listen ("tcp" , ownAddr )
83
- if err != nil {
84
- return nil
183
+ b := & testBroadcast {
184
+ BroadcastStruct : NewBroadcastStruct (),
185
+ sp : NewSpBroadcastStruct (),
85
186
}
86
-
87
- go func () { _ = srv .Serve (lis ) }()
88
- //defer srv.Stop()
89
-
90
- srv .RegisterView (ownAddr , srvAddrs )
91
- srv .ListenForBroadcast ()
187
+ srv .RegisterBroadcastStruct (b , configureHandlers (b ), configureMetadata (b ))
92
188
return srv
93
189
}
94
190
95
- type testBroadcastConfiguration struct {
96
- gorums. RawConfiguration
97
- qspec * testBroadcastQSpec
98
- srv * clientServerImpl
191
+ func ( srv * testBroadcastServer ) Broadcast ( ctx ServerCtx , request * testBroadcastRequest , broadcast * testBroadcast ) {
192
+ srv . numMsgs ++
193
+ srv . req = request
194
+ //broadcast.Broadcast(&testBroadcastRequest{})
99
195
}
100
196
101
- type clientServerImpl struct {
102
- * gorums.ClientServer
103
- grpcServer * grpc.Server
104
- }
105
-
106
- func (c * testBroadcastConfiguration ) RegisterClientServer (lis net.Listener , opts ... grpc.ServerOption ) error {
107
- srvImpl := & clientServerImpl {
108
- grpcServer : grpc .NewServer (opts ... ),
197
+ func createReq (val string ) (ServerCtx , * Message , chan <- * Message ) {
198
+ var mut sync.Mutex
199
+ mut .Lock ()
200
+ srvCtx := ServerCtx {
201
+ Context : context .Background (),
202
+ once : new (sync.Once ),
203
+ mut : & mut ,
109
204
}
110
- srv , err := gorums .NewClientServer (lis )
111
- if err != nil {
112
- return err
205
+ req := newMessage (requestType )
206
+ req .Metadata = & ordering.Metadata {
207
+ BroadcastMsg : & ordering.BroadcastMsg {
208
+ BroadcastID : uuid .New ().String (),
209
+ },
113
210
}
114
- //srvImpl.grpcServer.RegisterService(&clientServer_ServiceDesc, srvImpl)
115
- go srvImpl .grpcServer .Serve (lis )
116
- srvImpl .ClientServer = srv
117
- c .srv = srvImpl
118
- return nil
119
- }
120
-
121
- type testBroadcastQSpec struct {
122
- quorumSize int
123
- }
124
-
125
- func newQSpec (qSize int ) * testBroadcastQSpec {
126
- return & testBroadcastQSpec {
127
- quorumSize : qSize ,
128
- }
129
- }
130
- func (qs * testBroadcastQSpec ) BroadcastQF (reqs []* testBroadcastResponse ) (* testBroadcastResponse , bool ) {
131
- if len (reqs ) < qs .quorumSize {
132
- return nil , false
211
+ req .Message = & testBroadcastRequest {
212
+ value : val ,
133
213
}
134
- return reqs [0 ], true
214
+ finished := make (chan * Message , 0 )
215
+ return srvCtx , req , finished
135
216
}
136
217
137
- func getConfig (srvAddresses []string , numSrvs int ) * testBroadcastConfiguration {
138
- mgr := gorums .NewRawManager (
139
- gorums .WithDialTimeout (time .Second ),
140
- gorums .WithGrpcDialOptions (
141
- grpc .WithBlock (),
142
- grpc .WithTransportCredentials (insecure .NewCredentials ()),
143
- ),
144
- )
145
- c := & testBroadcastConfiguration {}
146
- c .RawConfiguration , _ = gorums .NewRawConfiguration (mgr , gorums .WithNodeList (srvAddresses ))
147
- c .qspec = newQSpec (numSrvs )
148
- //c.RegisterClientServer(gorums.WithListener("localhost:8080"))
149
- return c
150
- }
218
+ func TestBroadcastHandler (t * testing.T ) {
219
+ handlerName := "broadcast"
151
220
152
- func TestBroadcast (t * testing.T ) {
153
- srv := gorums .NewServer ()
221
+ // create a server
222
+ srv := newTestBroadcastServer ()
223
+ // register the broadcast handler. Similar to proto option: broadcast
224
+ srv .RegisterHandler (handlerName , BroadcastHandler (srv .Broadcast , srv .Server ))
154
225
155
- lis , err := net .Listen ("tcp" , ":0" )
156
- if err != nil {
157
- t .Fatal (err )
158
- }
159
-
160
- go func () { _ = srv .Serve (lis ) }()
161
- defer srv .Stop ()
226
+ // create a request
227
+ vals := []string {"test1" , "test2" , "test3" }
228
+ for _ , val := range vals {
229
+ srvCtx , req , finished := createReq (val )
230
+ // call the server handler
231
+ srv .srv .handlers [handlerName ](srvCtx , req , finished )
162
232
233
+ if srv .req .value != val {
234
+ t .Errorf ("request.value = %s, expected %s" , srv .req .value , val )
235
+ }
236
+ }
163
237
}
0 commit comments