0 | 0 |
package nats_test
|
1 | 1 |
|
2 | 2 |
import (
|
|
3 |
"context"
|
|
4 |
"encoding/json"
|
|
5 |
"errors"
|
|
6 |
"strings"
|
|
7 |
"sync"
|
3 | 8 |
"testing"
|
4 | |
"context"
|
5 | |
"errors"
|
6 | 9 |
"time"
|
7 | |
"sync"
|
8 | |
"strings"
|
9 | |
"encoding/json"
|
10 | |
|
|
10 |
|
|
11 |
"github.com/nats-io/gnatsd/server"
|
11 | 12 |
"github.com/nats-io/go-nats"
|
12 | |
"github.com/nats-io/gnatsd/server"
|
13 | |
|
|
13 |
|
|
14 |
"github.com/go-kit/kit/endpoint"
|
14 | 15 |
natstransport "github.com/go-kit/kit/transport/nats"
|
15 | |
"github.com/go-kit/kit/endpoint"
|
16 | 16 |
)
|
17 | 17 |
|
18 | 18 |
type TestResponse struct {
|
|
20 | 20 |
Error string `json:"err"`
|
21 | 21 |
}
|
22 | 22 |
|
|
23 |
var natsServer *server.Server
|
|
24 |
|
23 | 25 |
func init() {
|
24 | |
opts := server.Options{Host: "localhost", Port: 4222}
|
25 | |
natsServer := server.New(&opts)
|
|
26 |
natsServer = server.New(&server.Options{
|
|
27 |
Host: "localhost",
|
|
28 |
Port: 4222,
|
|
29 |
})
|
26 | 30 |
|
27 | 31 |
go func() {
|
28 | 32 |
natsServer.Start()
|
|
33 | 37 |
}
|
34 | 38 |
}
|
35 | 39 |
|
|
40 |
func newNatsConn(t *testing.T) *nats.Conn {
|
|
41 |
// Subscriptions and connections are closed asynchronously, so it's possible
|
|
42 |
// that there's still a subscription from an old connection that must be closed
|
|
43 |
// before the current test can be run.
|
|
44 |
for tries := 20; tries > 0; tries-- {
|
|
45 |
if natsServer.NumSubscriptions() == 0 {
|
|
46 |
break
|
|
47 |
}
|
|
48 |
|
|
49 |
time.Sleep(5 * time.Millisecond)
|
|
50 |
}
|
|
51 |
|
|
52 |
if n := natsServer.NumSubscriptions(); n > 0 {
|
|
53 |
t.Fatalf("found %d active subscriptions on the server", n)
|
|
54 |
}
|
|
55 |
|
|
56 |
nc, err := nats.Connect("nats://"+natsServer.Addr().String(), nats.Name(t.Name()))
|
|
57 |
if err != nil {
|
|
58 |
t.Fatalf("failed to connect to gnatsd server: %s", err)
|
|
59 |
}
|
|
60 |
|
|
61 |
return nc
|
|
62 |
}
|
|
63 |
|
36 | 64 |
func TestSubscriberBadDecode(t *testing.T) {
|
37 | |
nc, err := nats.Connect(nats.DefaultURL)
|
38 | |
if err != nil {
|
39 | |
t.Fatal(err)
|
40 | |
}
|
|
65 |
nc := newNatsConn(t)
|
41 | 66 |
defer nc.Close()
|
42 | 67 |
|
43 | 68 |
handler := natstransport.NewSubscriber(
|
|
55 | 80 |
}
|
56 | 81 |
|
57 | 82 |
func TestSubscriberBadEndpoint(t *testing.T) {
|
58 | |
nc, err := nats.Connect(nats.DefaultURL)
|
59 | |
if err != nil {
|
60 | |
t.Fatal(err)
|
61 | |
}
|
|
83 |
nc := newNatsConn(t)
|
62 | 84 |
defer nc.Close()
|
63 | 85 |
|
64 | 86 |
handler := natstransport.NewSubscriber(
|
|
75 | 97 |
}
|
76 | 98 |
|
77 | 99 |
func TestSubscriberBadEncode(t *testing.T) {
|
78 | |
nc, err := nats.Connect(nats.DefaultURL)
|
79 | |
if err != nil {
|
80 | |
t.Fatal(err)
|
81 | |
}
|
|
100 |
nc := newNatsConn(t)
|
82 | 101 |
defer nc.Close()
|
83 | 102 |
|
84 | 103 |
handler := natstransport.NewSubscriber(
|
|
95 | 114 |
}
|
96 | 115 |
|
97 | 116 |
func TestSubscriberErrorEncoder(t *testing.T) {
|
98 | |
nc, err := nats.Connect(nats.DefaultURL)
|
99 | |
if err != nil {
|
100 | |
t.Fatal(err)
|
101 | |
}
|
|
117 |
nc := newNatsConn(t)
|
102 | 118 |
defer nc.Close()
|
103 | 119 |
|
104 | 120 |
errTeapot := errors.New("teapot")
|
|
151 | 167 |
}
|
152 | 168 |
|
153 | 169 |
func TestMultipleSubscriberBefore(t *testing.T) {
|
154 | |
nc, err := nats.Connect(nats.DefaultURL)
|
155 | |
if err != nil {
|
156 | |
t.Fatal(err)
|
157 | |
}
|
|
170 |
nc := newNatsConn(t)
|
158 | 171 |
defer nc.Close()
|
159 | 172 |
|
160 | 173 |
var (
|
|
215 | 228 |
}
|
216 | 229 |
|
217 | 230 |
func TestMultipleSubscriberAfter(t *testing.T) {
|
218 | |
nc, err := nats.Connect(nats.DefaultURL)
|
219 | |
if err != nil {
|
220 | |
t.Fatal(err)
|
221 | |
}
|
|
231 |
nc := newNatsConn(t)
|
222 | 232 |
defer nc.Close()
|
223 | 233 |
|
224 | 234 |
var (
|
|
279 | 289 |
}
|
280 | 290 |
|
281 | 291 |
func TestEncodeJSONResponse(t *testing.T) {
|
282 | |
nc, err := nats.Connect(nats.DefaultURL)
|
283 | |
if err != nil {
|
284 | |
t.Fatal(err)
|
285 | |
}
|
286 | |
defer nc.Close()
|
287 | |
|
288 | |
handler := natstransport.NewSubscriber(
|
289 | |
func(context.Context, interface{}) (interface{}, error) { return struct{ Foo string `json:"foo"` }{"bar"}, nil },
|
|
292 |
nc := newNatsConn(t)
|
|
293 |
defer nc.Close()
|
|
294 |
|
|
295 |
handler := natstransport.NewSubscriber(
|
|
296 |
func(context.Context, interface{}) (interface{}, error) {
|
|
297 |
return struct {
|
|
298 |
Foo string `json:"foo"`
|
|
299 |
}{"bar"}, nil
|
|
300 |
},
|
290 | 301 |
func(context.Context, *nats.Msg) (interface{}, error) { return struct{}{}, nil },
|
291 | 302 |
natstransport.EncodeJSONResponse,
|
292 | 303 |
)
|
|
316 | 327 |
}
|
317 | 328 |
|
318 | 329 |
func TestErrorEncoder(t *testing.T) {
|
319 | |
nc, err := nats.Connect(nats.DefaultURL)
|
320 | |
if err != nil {
|
321 | |
t.Fatal(err)
|
322 | |
}
|
323 | |
defer nc.Close()
|
324 | |
|
325 | |
errResp := struct{ Error string `json:"err"` }{"oh no"}
|
|
330 |
nc := newNatsConn(t)
|
|
331 |
defer nc.Close()
|
|
332 |
|
|
333 |
errResp := struct {
|
|
334 |
Error string `json:"err"`
|
|
335 |
}{"oh no"}
|
326 | 336 |
handler := natstransport.NewSubscriber(
|
327 | 337 |
func(context.Context, interface{}) (interface{}, error) {
|
328 | 338 |
return nil, responseError{msg: errResp.Error}
|
|
354 | 364 |
type noContentResponse struct{}
|
355 | 365 |
|
356 | 366 |
func TestEncodeNoContent(t *testing.T) {
|
357 | |
nc, err := nats.Connect(nats.DefaultURL)
|
358 | |
if err != nil {
|
359 | |
t.Fatal(err)
|
360 | |
}
|
|
367 |
nc := newNatsConn(t)
|
361 | 368 |
defer nc.Close()
|
362 | 369 |
|
363 | 370 |
handler := natstransport.NewSubscriber(
|
|
383 | 390 |
}
|
384 | 391 |
|
385 | 392 |
func TestNoOpRequestDecoder(t *testing.T) {
|
386 | |
nc, err := nats.Connect(nats.DefaultURL)
|
387 | |
if err != nil {
|
388 | |
t.Fatal(err)
|
389 | |
}
|
|
393 |
nc := newNatsConn(t)
|
390 | 394 |
defer nc.Close()
|
391 | 395 |
|
392 | 396 |
handler := natstransport.NewSubscriber(
|
|
419 | 423 |
func testSubscriber(t *testing.T) (step func(), resp <-chan *nats.Msg) {
|
420 | 424 |
var (
|
421 | 425 |
stepch = make(chan bool)
|
422 | |
endpoint = func(context.Context, interface{}) (interface{}, error) { <-stepch; return struct{}{}, nil }
|
|
426 |
endpoint = func(context.Context, interface{}) (interface{}, error) {
|
|
427 |
<-stepch
|
|
428 |
return struct{}{}, nil
|
|
429 |
}
|
423 | 430 |
response = make(chan *nats.Msg)
|
424 | 431 |
handler = natstransport.NewSubscriber(
|
425 | 432 |
endpoint,
|
|
431 | 438 |
)
|
432 | 439 |
|
433 | 440 |
go func() {
|
434 | |
nc, err := nats.Connect(nats.DefaultURL)
|
435 | |
if err != nil {
|
436 | |
t.Fatal(err)
|
437 | |
}
|
|
441 |
nc := newNatsConn(t)
|
438 | 442 |
defer nc.Close()
|
439 | 443 |
|
440 | 444 |
sub, err := nc.QueueSubscribe("natstransport.test", "natstransport", handler.ServeMsg(nc))
|