Files
mqtt/mqtt_test.go
2019-10-20 00:13:39 +02:00

213 lines
5.1 KiB
Go

package mqtt_test
import (
"context"
"errors"
"testing"
"time"
"github.com/lucacasonato/mqtt"
)
// create client with a nil server array
func TestNewClientNilServer(t *testing.T) {
client, err := mqtt.NewClient(mqtt.ClientOptions{})
if !errors.Is(err, mqtt.ErrMinimumOneServer) {
t.Fatal("err should be ErrMinimumOneServer")
}
if client != nil {
t.Fatal("client should be nil")
}
}
// create client with a server array with no servers
func TestNewClientNoServer(t *testing.T) {
client, err := mqtt.NewClient(mqtt.ClientOptions{
Servers: []string{},
})
if !errors.Is(err, mqtt.ErrMinimumOneServer) {
t.Fatal("err should be ErrMinimumOneServer")
}
if client != nil {
t.Fatal("client should be nil")
}
}
// create client with a server array with no servers
func TestNewClientBasicServer(t *testing.T) {
client, err := mqtt.NewClient(mqtt.ClientOptions{
Servers: []string{
"tcp://test.mosquitto.org:1883",
},
})
if err != nil {
t.Fatal("err should be nil")
}
if client == nil {
t.Fatal("client should not be nil")
}
}
// check that a client gets created and a client id is generated when it is not set
func TestNewClientNoClientID(t *testing.T) {
client, err := mqtt.NewClient(mqtt.ClientOptions{
Servers: []string{
"tcp://test.mosquitto.org:1883",
},
})
if err != nil {
t.Fatalf("err should be nil but is %v", err)
}
if client == nil {
t.Fatal("client should not be nil")
}
if client.Options.ClientID == "" {
t.Fatal("client.Options.ClientID should not be empty")
}
}
// check that a client gets created and a client id is not changed when it is set
func TestNewClientHasClientID(t *testing.T) {
client, err := mqtt.NewClient(mqtt.ClientOptions{
Servers: []string{
"tcp://test.mosquitto.org:1883",
},
ClientID: "client-id",
})
if err != nil {
t.Fatal("err should be nil")
}
if client == nil {
t.Fatal("client should not be nil")
}
if client.Options.ClientID != "client-id" {
t.Fatal("client.Options.ClientID should be 'client-id'")
}
}
// check that a client gets created and a client id is not changed when it is set
func TestNewClientWithAuthentication(t *testing.T) {
client, err := mqtt.NewClient(mqtt.ClientOptions{
Servers: []string{
"tcp://test.mosquitto.org:1883",
},
Username: "user",
Password: "password",
})
if err != nil {
t.Fatal("err should be nil")
}
if client == nil {
t.Fatal("client should not be nil")
}
}
// check that a client gets created and a client id is not changed when it is set
func TestConnectSuccess(t *testing.T) {
client, err := mqtt.NewClient(mqtt.ClientOptions{
Servers: []string{
"tcp://test.mosquitto.org:1883",
},
AutoReconnect: false,
})
if err != nil {
t.Fatal("err should be nil")
}
if client == nil {
t.Fatal("client should not be nil")
}
err = client.Connect(context.Background())
if err != nil {
t.Fatal("connect should not have failed")
}
}
// check that a client gets created and a client id is not changed when it is set
func TestConnectContextTimeout(t *testing.T) {
client, err := mqtt.NewClient(mqtt.ClientOptions{
Servers: []string{
"tcp://test.mosquitto.org:1883",
},
AutoReconnect: false,
})
if err != nil {
t.Fatal("err should be nil")
}
if client == nil {
t.Fatal("client should not be nil")
}
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Nanosecond)
defer cancel()
err = client.Connect(ctx)
if !errors.Is(err, context.DeadlineExceeded) {
t.Fatal("connect should have failed with error context.DeadlineExceeded")
}
}
// check that a client gets created and a client id is not changed when it is set
func TestConnectContextCancel(t *testing.T) {
client, err := mqtt.NewClient(mqtt.ClientOptions{
Servers: []string{
"tcp://test.mosquitto.org:1883",
},
AutoReconnect: false,
})
if err != nil {
t.Fatal("err should be nil")
}
if client == nil {
t.Fatal("client should not be nil")
}
ctx, cancel := context.WithCancel(context.Background())
go func() {
time.Sleep(1 * time.Microsecond)
cancel()
}()
defer cancel()
err = client.Connect(ctx)
if !errors.Is(err, context.Canceled) {
t.Fatal("connect should have failed with error context.Canceled")
}
}
// check that a client gets created and a client id is not changed when it is set
func TestConnectFailed(t *testing.T) {
client, err := mqtt.NewClient(mqtt.ClientOptions{
Servers: []string{
"tcp://test.mosquitto.org:1884", // incorrect port
},
AutoReconnect: false,
})
if err != nil {
t.Fatal("err should be nil")
}
if client == nil {
t.Fatal("client should not be nil")
}
err = client.Connect(context.Background())
if err == nil {
t.Fatal("connect should have failed")
}
}
// check that a client gets created and a client id is not changed when it is set
func TestDisconnectImmediately(t *testing.T) {
client, err := mqtt.NewClient(mqtt.ClientOptions{
Servers: []string{
"tcp://test.mosquitto.org:1883",
},
AutoReconnect: false,
})
if err != nil {
t.Fatal("err should be nil")
}
if client == nil {
t.Fatal("client should not be nil")
}
err = client.Connect(context.Background())
if err != nil {
t.Fatal("connect should not have failed")
}
client.DisconnectImmediately()
}