mirror of https://github.com/tidwall/tile38.git
471 lines
10 KiB
Go
471 lines
10 KiB
Go
// Copyright 2012-2018 The NATS Authors
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package test
|
|
|
|
import (
|
|
"bytes"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/nats-io/go-nats"
|
|
"github.com/nats-io/go-nats/encoders/builtin"
|
|
)
|
|
|
|
const TEST_PORT = 8168
|
|
|
|
func NewDefaultEConn(t *testing.T) *nats.EncodedConn {
|
|
ec, err := nats.NewEncodedConn(NewConnection(t, TEST_PORT), nats.DEFAULT_ENCODER)
|
|
if err != nil {
|
|
t.Fatalf("Failed to create an encoded connection: %v\n", err)
|
|
}
|
|
return ec
|
|
}
|
|
|
|
func TestEncBuiltinConstructorErrs(t *testing.T) {
|
|
s := RunServerOnPort(TEST_PORT)
|
|
defer s.Shutdown()
|
|
|
|
c := NewConnection(t, TEST_PORT)
|
|
_, err := nats.NewEncodedConn(nil, "default")
|
|
if err == nil {
|
|
t.Fatal("Expected err for nil connection")
|
|
}
|
|
_, err = nats.NewEncodedConn(c, "foo22")
|
|
if err == nil {
|
|
t.Fatal("Expected err for bad encoder")
|
|
}
|
|
c.Close()
|
|
_, err = nats.NewEncodedConn(c, "default")
|
|
if err == nil {
|
|
t.Fatal("Expected err for closed connection")
|
|
}
|
|
|
|
}
|
|
|
|
func TestEncBuiltinMarshalString(t *testing.T) {
|
|
s := RunServerOnPort(TEST_PORT)
|
|
defer s.Shutdown()
|
|
|
|
ec := NewDefaultEConn(t)
|
|
defer ec.Close()
|
|
ch := make(chan bool)
|
|
|
|
testString := "Hello World!"
|
|
|
|
ec.Subscribe("enc_string", func(s string) {
|
|
if s != testString {
|
|
t.Fatalf("Received test string of '%s', wanted '%s'\n", s, testString)
|
|
}
|
|
ch <- true
|
|
})
|
|
ec.Publish("enc_string", testString)
|
|
if e := Wait(ch); e != nil {
|
|
if ec.LastError() != nil {
|
|
e = ec.LastError()
|
|
}
|
|
t.Fatalf("Did not receive the message: %s", e)
|
|
}
|
|
}
|
|
|
|
func TestEncBuiltinMarshalBytes(t *testing.T) {
|
|
s := RunServerOnPort(TEST_PORT)
|
|
defer s.Shutdown()
|
|
|
|
ec := NewDefaultEConn(t)
|
|
defer ec.Close()
|
|
ch := make(chan bool)
|
|
|
|
testBytes := []byte("Hello World!")
|
|
|
|
ec.Subscribe("enc_bytes", func(b []byte) {
|
|
if !bytes.Equal(b, testBytes) {
|
|
t.Fatalf("Received test bytes of '%s', wanted '%s'\n", b, testBytes)
|
|
}
|
|
ch <- true
|
|
})
|
|
ec.Publish("enc_bytes", testBytes)
|
|
if e := Wait(ch); e != nil {
|
|
if ec.LastError() != nil {
|
|
e = ec.LastError()
|
|
}
|
|
t.Fatalf("Did not receive the message: %s", e)
|
|
}
|
|
}
|
|
|
|
func TestEncBuiltinMarshalInt(t *testing.T) {
|
|
s := RunServerOnPort(TEST_PORT)
|
|
defer s.Shutdown()
|
|
|
|
ec := NewDefaultEConn(t)
|
|
defer ec.Close()
|
|
ch := make(chan bool)
|
|
|
|
testN := 22
|
|
|
|
ec.Subscribe("enc_int", func(n int) {
|
|
if n != testN {
|
|
t.Fatalf("Received test number of %d, wanted %d\n", n, testN)
|
|
}
|
|
ch <- true
|
|
})
|
|
ec.Publish("enc_int", testN)
|
|
if e := Wait(ch); e != nil {
|
|
if ec.LastError() != nil {
|
|
e = ec.LastError()
|
|
}
|
|
t.Fatalf("Did not receive the message: %s", e)
|
|
}
|
|
}
|
|
|
|
func TestEncBuiltinMarshalInt32(t *testing.T) {
|
|
s := RunServerOnPort(TEST_PORT)
|
|
defer s.Shutdown()
|
|
|
|
ec := NewDefaultEConn(t)
|
|
defer ec.Close()
|
|
ch := make(chan bool)
|
|
|
|
testN := 22
|
|
|
|
ec.Subscribe("enc_int", func(n int32) {
|
|
if n != int32(testN) {
|
|
t.Fatalf("Received test number of %d, wanted %d\n", n, testN)
|
|
}
|
|
ch <- true
|
|
})
|
|
ec.Publish("enc_int", testN)
|
|
if e := Wait(ch); e != nil {
|
|
if ec.LastError() != nil {
|
|
e = ec.LastError()
|
|
}
|
|
t.Fatalf("Did not receive the message: %s", e)
|
|
}
|
|
}
|
|
|
|
func TestEncBuiltinMarshalInt64(t *testing.T) {
|
|
s := RunServerOnPort(TEST_PORT)
|
|
defer s.Shutdown()
|
|
|
|
ec := NewDefaultEConn(t)
|
|
defer ec.Close()
|
|
ch := make(chan bool)
|
|
|
|
testN := 22
|
|
|
|
ec.Subscribe("enc_int", func(n int64) {
|
|
if n != int64(testN) {
|
|
t.Fatalf("Received test number of %d, wanted %d\n", n, testN)
|
|
}
|
|
ch <- true
|
|
})
|
|
ec.Publish("enc_int", testN)
|
|
if e := Wait(ch); e != nil {
|
|
if ec.LastError() != nil {
|
|
e = ec.LastError()
|
|
}
|
|
t.Fatalf("Did not receive the message: %s", e)
|
|
}
|
|
}
|
|
|
|
func TestEncBuiltinMarshalFloat32(t *testing.T) {
|
|
s := RunServerOnPort(TEST_PORT)
|
|
defer s.Shutdown()
|
|
|
|
ec := NewDefaultEConn(t)
|
|
defer ec.Close()
|
|
ch := make(chan bool)
|
|
|
|
testN := float32(22)
|
|
|
|
ec.Subscribe("enc_float", func(n float32) {
|
|
if n != testN {
|
|
t.Fatalf("Received test number of %f, wanted %f\n", n, testN)
|
|
}
|
|
ch <- true
|
|
})
|
|
ec.Publish("enc_float", testN)
|
|
if e := Wait(ch); e != nil {
|
|
if ec.LastError() != nil {
|
|
e = ec.LastError()
|
|
}
|
|
t.Fatalf("Did not receive the message: %s", e)
|
|
}
|
|
}
|
|
|
|
func TestEncBuiltinMarshalFloat64(t *testing.T) {
|
|
s := RunServerOnPort(TEST_PORT)
|
|
defer s.Shutdown()
|
|
|
|
ec := NewDefaultEConn(t)
|
|
defer ec.Close()
|
|
ch := make(chan bool)
|
|
|
|
testN := float64(22.22)
|
|
|
|
ec.Subscribe("enc_float", func(n float64) {
|
|
if n != testN {
|
|
t.Fatalf("Received test number of %f, wanted %f\n", n, testN)
|
|
}
|
|
ch <- true
|
|
})
|
|
ec.Publish("enc_float", testN)
|
|
if e := Wait(ch); e != nil {
|
|
if ec.LastError() != nil {
|
|
e = ec.LastError()
|
|
}
|
|
t.Fatalf("Did not receive the message: %s", e)
|
|
}
|
|
}
|
|
|
|
func TestEncBuiltinMarshalBool(t *testing.T) {
|
|
s := RunServerOnPort(TEST_PORT)
|
|
defer s.Shutdown()
|
|
|
|
ec := NewDefaultEConn(t)
|
|
defer ec.Close()
|
|
ch := make(chan bool)
|
|
expected := make(chan bool, 1)
|
|
|
|
ec.Subscribe("enc_bool", func(b bool) {
|
|
val := <-expected
|
|
if b != val {
|
|
t.Fatal("Boolean values did not match")
|
|
}
|
|
ch <- true
|
|
})
|
|
|
|
expected <- false
|
|
ec.Publish("enc_bool", false)
|
|
if e := Wait(ch); e != nil {
|
|
if ec.LastError() != nil {
|
|
e = ec.LastError()
|
|
}
|
|
t.Fatalf("Did not receive the message: %s", e)
|
|
}
|
|
|
|
expected <- true
|
|
ec.Publish("enc_bool", true)
|
|
if e := Wait(ch); e != nil {
|
|
if ec.LastError() != nil {
|
|
e = ec.LastError()
|
|
}
|
|
t.Fatalf("Did not receive the message: %s", e)
|
|
}
|
|
}
|
|
|
|
func TestEncBuiltinExtendedSubscribeCB(t *testing.T) {
|
|
s := RunServerOnPort(TEST_PORT)
|
|
defer s.Shutdown()
|
|
|
|
ec := NewDefaultEConn(t)
|
|
defer ec.Close()
|
|
|
|
ch := make(chan bool)
|
|
|
|
testString := "Hello World!"
|
|
subject := "cb_args"
|
|
|
|
ec.Subscribe(subject, func(subj, s string) {
|
|
if s != testString {
|
|
t.Fatalf("Received test string of '%s', wanted '%s'\n", s, testString)
|
|
}
|
|
if subj != subject {
|
|
t.Fatalf("Received subject of '%s', wanted '%s'\n", subj, subject)
|
|
}
|
|
ch <- true
|
|
})
|
|
ec.Publish(subject, testString)
|
|
if e := Wait(ch); e != nil {
|
|
if ec.LastError() != nil {
|
|
e = ec.LastError()
|
|
}
|
|
t.Fatalf("Did not receive the message: %s", e)
|
|
}
|
|
}
|
|
|
|
func TestEncBuiltinExtendedSubscribeCB2(t *testing.T) {
|
|
s := RunServerOnPort(TEST_PORT)
|
|
defer s.Shutdown()
|
|
|
|
ec := NewDefaultEConn(t)
|
|
defer ec.Close()
|
|
|
|
ch := make(chan bool)
|
|
|
|
testString := "Hello World!"
|
|
oSubj := "cb_args"
|
|
oReply := "foobar"
|
|
|
|
ec.Subscribe(oSubj, func(subj, reply, s string) {
|
|
if s != testString {
|
|
t.Fatalf("Received test string of '%s', wanted '%s'\n", s, testString)
|
|
}
|
|
if subj != oSubj {
|
|
t.Fatalf("Received subject of '%s', wanted '%s'\n", subj, oSubj)
|
|
}
|
|
if reply != oReply {
|
|
t.Fatalf("Received reply of '%s', wanted '%s'\n", reply, oReply)
|
|
}
|
|
ch <- true
|
|
})
|
|
ec.PublishRequest(oSubj, oReply, testString)
|
|
if e := Wait(ch); e != nil {
|
|
if ec.LastError() != nil {
|
|
e = ec.LastError()
|
|
}
|
|
t.Fatalf("Did not receive the message: %s", e)
|
|
}
|
|
}
|
|
|
|
func TestEncBuiltinRawMsgSubscribeCB(t *testing.T) {
|
|
s := RunServerOnPort(TEST_PORT)
|
|
defer s.Shutdown()
|
|
|
|
ec := NewDefaultEConn(t)
|
|
defer ec.Close()
|
|
|
|
ch := make(chan bool)
|
|
|
|
testString := "Hello World!"
|
|
oSubj := "cb_args"
|
|
oReply := "foobar"
|
|
|
|
ec.Subscribe(oSubj, func(m *nats.Msg) {
|
|
s := string(m.Data)
|
|
if s != testString {
|
|
t.Fatalf("Received test string of '%s', wanted '%s'\n", s, testString)
|
|
}
|
|
if m.Subject != oSubj {
|
|
t.Fatalf("Received subject of '%s', wanted '%s'\n", m.Subject, oSubj)
|
|
}
|
|
if m.Reply != oReply {
|
|
t.Fatalf("Received reply of '%s', wanted '%s'\n", m.Reply, oReply)
|
|
}
|
|
ch <- true
|
|
})
|
|
ec.PublishRequest(oSubj, oReply, testString)
|
|
if e := Wait(ch); e != nil {
|
|
if ec.LastError() != nil {
|
|
e = ec.LastError()
|
|
}
|
|
t.Fatalf("Did not receive the message: %s", e)
|
|
}
|
|
}
|
|
|
|
func TestEncBuiltinRequest(t *testing.T) {
|
|
s := RunServerOnPort(TEST_PORT)
|
|
defer s.Shutdown()
|
|
|
|
ec := NewDefaultEConn(t)
|
|
defer ec.Close()
|
|
|
|
expectedResp := "I can help!"
|
|
|
|
ec.Subscribe("help", func(subj, reply, req string) {
|
|
ec.Publish(reply, expectedResp)
|
|
})
|
|
|
|
var resp string
|
|
|
|
err := ec.Request("help", "help me", &resp, 1*time.Second)
|
|
if err != nil {
|
|
t.Fatalf("Failed at receiving proper response: %v\n", err)
|
|
}
|
|
if resp != expectedResp {
|
|
t.Fatalf("Received reply '%s', wanted '%s'\n", resp, expectedResp)
|
|
}
|
|
}
|
|
|
|
func TestEncBuiltinRequestReceivesMsg(t *testing.T) {
|
|
s := RunServerOnPort(TEST_PORT)
|
|
defer s.Shutdown()
|
|
|
|
ec := NewDefaultEConn(t)
|
|
defer ec.Close()
|
|
|
|
expectedResp := "I can help!"
|
|
|
|
ec.Subscribe("help", func(subj, reply, req string) {
|
|
ec.Publish(reply, expectedResp)
|
|
})
|
|
|
|
var resp nats.Msg
|
|
|
|
err := ec.Request("help", "help me", &resp, 1*time.Second)
|
|
if err != nil {
|
|
t.Fatalf("Failed at receiving proper response: %v\n", err)
|
|
}
|
|
if string(resp.Data) != expectedResp {
|
|
t.Fatalf("Received reply '%s', wanted '%s'\n", string(resp.Data), expectedResp)
|
|
}
|
|
}
|
|
|
|
func TestEncBuiltinAsyncMarshalErr(t *testing.T) {
|
|
s := RunServerOnPort(TEST_PORT)
|
|
defer s.Shutdown()
|
|
|
|
ec := NewDefaultEConn(t)
|
|
defer ec.Close()
|
|
|
|
ch := make(chan bool)
|
|
|
|
testString := "Hello World!"
|
|
subject := "err_marshall"
|
|
|
|
ec.Subscribe(subject, func(subj, num int) {
|
|
// This will never get called.
|
|
})
|
|
|
|
ec.Conn.Opts.AsyncErrorCB = func(c *nats.Conn, s *nats.Subscription, err error) {
|
|
ch <- true
|
|
}
|
|
|
|
ec.Publish(subject, testString)
|
|
if e := Wait(ch); e != nil {
|
|
t.Fatalf("Did not receive the message: %s", e)
|
|
}
|
|
}
|
|
|
|
func TestEncBuiltinEncodeNil(t *testing.T) {
|
|
de := &builtin.DefaultEncoder{}
|
|
_, err := de.Encode("foo", nil)
|
|
if err != nil {
|
|
t.Fatalf("Expected no error encoding nil: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestEncBuiltinDecodeDefault(t *testing.T) {
|
|
de := &builtin.DefaultEncoder{}
|
|
b, err := de.Encode("foo", 22)
|
|
if err != nil {
|
|
t.Fatalf("Expected no error encoding number: %v", err)
|
|
}
|
|
var c chan bool
|
|
err = de.Decode("foo", b, &c)
|
|
if err == nil {
|
|
t.Fatalf("Expected an error decoding")
|
|
}
|
|
}
|
|
|
|
func TestEncDrainSupported(t *testing.T) {
|
|
s := RunServerOnPort(TEST_PORT)
|
|
defer s.Shutdown()
|
|
|
|
ec := NewDefaultEConn(t)
|
|
err := ec.Drain()
|
|
if err != nil {
|
|
t.Fatalf("Expected no error calling Drain(), got %v", err)
|
|
}
|
|
}
|