mirror of
https://github.com/mochi-mqtt/server.git
synced 2025-10-06 00:27:01 +08:00
Convert all packet processes to byte.buffers
This commit is contained in:
@@ -3,7 +3,6 @@ package packets
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// ConnackPacket contains the values of an MQTT CONNACK packet.
|
// ConnackPacket contains the values of an MQTT CONNACK packet.
|
||||||
@@ -15,7 +14,17 @@ type ConnackPacket struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Encode encodes and writes the packet data values to the buffer.
|
// Encode encodes and writes the packet data values to the buffer.
|
||||||
func (pk *ConnackPacket) Encode(w io.Writer) error {
|
func (pk *ConnackPacket) Encode(buf *bytes.Buffer) error {
|
||||||
|
pk.FixedHeader.Remaining = 2
|
||||||
|
pk.FixedHeader.encode(buf)
|
||||||
|
buf.WriteByte(encodeBool(pk.SessionPresent))
|
||||||
|
buf.WriteByte(pk.ReturnCode)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Encode encodes and writes the packet data values to the buffer.
|
||||||
|
/*func (pk *ConnackPacket) Encode(w io.Writer) error {
|
||||||
var body bytes.Buffer
|
var body bytes.Buffer
|
||||||
|
|
||||||
// Write flags to packet body.
|
// Write flags to packet body.
|
||||||
@@ -35,6 +44,8 @@ func (pk *ConnackPacket) Encode(w io.Writer) error {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
// Decode extracts the data values from the packet.
|
// Decode extracts the data values from the packet.
|
||||||
func (pk *ConnackPacket) Decode(buf []byte) error {
|
func (pk *ConnackPacket) Decode(buf []byte) error {
|
||||||
|
|
||||||
|
@@ -8,6 +8,7 @@ import (
|
|||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
func TestConnackEncode(t *testing.T) {
|
func TestConnackEncode(t *testing.T) {
|
||||||
require.Contains(t, expectedPackets, Connack)
|
require.Contains(t, expectedPackets, Connack)
|
||||||
for i, wanted := range expectedPackets[Connack] {
|
for i, wanted := range expectedPackets[Connack] {
|
||||||
@@ -38,7 +39,6 @@ func TestConnackEncode(t *testing.T) {
|
|||||||
require.Equal(t, wanted.packet.(*ConnackPacket).SessionPresent, pk.SessionPresent, "Mismatched session present bool [i:%d] %s", i, wanted.desc)
|
require.Equal(t, wanted.packet.(*ConnackPacket).SessionPresent, pk.SessionPresent, "Mismatched session present bool [i:%d] %s", i, wanted.desc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkConnackEncode(b *testing.B) {
|
func BenchmarkConnackEncode(b *testing.B) {
|
||||||
pk := new(ConnackPacket)
|
pk := new(ConnackPacket)
|
||||||
copier.Copy(pk, expectedPackets[Connack][0].packet.(*ConnackPacket))
|
copier.Copy(pk, expectedPackets[Connack][0].packet.(*ConnackPacket))
|
||||||
@@ -49,6 +49,47 @@ func BenchmarkConnackEncode(b *testing.B) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
func TestConnackEncode(t *testing.T) {
|
||||||
|
require.Contains(t, expectedPackets, Connack)
|
||||||
|
for i, wanted := range expectedPackets[Connack] {
|
||||||
|
|
||||||
|
if !encodeTestOK(wanted) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
require.Equal(t, uint8(2), Connack, "Incorrect Packet Type [i:%d] %s", i, wanted.desc)
|
||||||
|
pk := new(ConnackPacket)
|
||||||
|
copier.Copy(pk, wanted.packet.(*ConnackPacket))
|
||||||
|
|
||||||
|
require.Equal(t, Connack, pk.Type, "Mismatched Packet Type [i:%d] %s", i, wanted.desc)
|
||||||
|
require.Equal(t, Connack, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
err := pk.Encode(buf)
|
||||||
|
require.NoError(t, err, "Expected no error writing buffer [i:%d] %s", i, wanted.desc)
|
||||||
|
encoded := buf.Bytes()
|
||||||
|
|
||||||
|
require.Equal(t, len(wanted.rawBytes), len(encoded), "Mismatched packet length [i:%d] %s", i, wanted.desc)
|
||||||
|
require.Equal(t, byte(Connack<<4), encoded[0], "Mismatched fixed header packets [i:%d] %s", i, wanted.desc)
|
||||||
|
require.EqualValues(t, wanted.rawBytes, encoded, "Mismatched byte values [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
|
require.Equal(t, wanted.packet.(*ConnackPacket).ReturnCode, pk.ReturnCode, "Mismatched return code [i:%d] %s", i, wanted.desc)
|
||||||
|
require.Equal(t, wanted.packet.(*ConnackPacket).SessionPresent, pk.SessionPresent, "Mismatched session present bool [i:%d] %s", i, wanted.desc)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkConnackEncode(b *testing.B) {
|
||||||
|
pk := new(ConnackPacket)
|
||||||
|
copier.Copy(pk, expectedPackets[Connack][0].packet.(*ConnackPacket))
|
||||||
|
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
for n := 0; n < b.N; n++ {
|
||||||
|
pk.Encode(buf)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestConnackDecode(t *testing.T) {
|
func TestConnackDecode(t *testing.T) {
|
||||||
require.Contains(t, expectedPackets, Connack)
|
require.Contains(t, expectedPackets, Connack)
|
||||||
for i, wanted := range expectedPackets[Connack] {
|
for i, wanted := range expectedPackets[Connack] {
|
||||||
|
@@ -3,7 +3,6 @@ package packets
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// ConnectPacket contains the values of an MQTT CONNECT packet.
|
// ConnectPacket contains the values of an MQTT CONNECT packet.
|
||||||
@@ -28,8 +27,7 @@ type ConnectPacket struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Encode encodes and writes the packet data values to the buffer.
|
// Encode encodes and writes the packet data values to the buffer.
|
||||||
func (pk *ConnectPacket) Encode(w io.Writer) error {
|
func (pk *ConnectPacket) Encode(buf *bytes.Buffer) error {
|
||||||
|
|
||||||
var body bytes.Buffer
|
var body bytes.Buffer
|
||||||
|
|
||||||
// Write flags to packet body.
|
// Write flags to packet body.
|
||||||
@@ -55,15 +53,11 @@ func (pk *ConnectPacket) Encode(w io.Writer) error {
|
|||||||
body.Write(encodeString(pk.Password))
|
body.Write(encodeString(pk.Password))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set remaining length.
|
|
||||||
pk.FixedHeader.Remaining = body.Len()
|
pk.FixedHeader.Remaining = body.Len()
|
||||||
|
pk.FixedHeader.encode(buf)
|
||||||
|
buf.Write(body.Bytes())
|
||||||
|
|
||||||
// Write header and packet to output.
|
return nil
|
||||||
out := pk.FixedHeader.encode()
|
|
||||||
out.Write(body.Bytes())
|
|
||||||
_, err := out.WriteTo(w)
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decode extracts the data values from the packet.
|
// Decode extracts the data values from the packet.
|
||||||
|
@@ -22,15 +22,12 @@ func TestConnectEncode(t *testing.T) {
|
|||||||
require.Equal(t, Connect, pk.Type, "Mismatched Packet Type [i:%d] %s", i, wanted.desc)
|
require.Equal(t, Connect, pk.Type, "Mismatched Packet Type [i:%d] %s", i, wanted.desc)
|
||||||
require.Equal(t, Connect, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d] %s", i, wanted.desc)
|
require.Equal(t, Connect, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
var b bytes.Buffer
|
buf := new(bytes.Buffer)
|
||||||
err := pk.Encode(&b)
|
pk.Encode(buf)
|
||||||
|
encoded := buf.Bytes()
|
||||||
encoded := b.Bytes()
|
|
||||||
|
|
||||||
require.Equal(t, len(wanted.rawBytes), len(encoded), "Mismatched packet length [i:%d] %s", i, wanted.desc)
|
require.Equal(t, len(wanted.rawBytes), len(encoded), "Mismatched packet length [i:%d] %s", i, wanted.desc)
|
||||||
require.Equal(t, byte(Connect<<4), encoded[0], "Mismatched fixed header packets [i:%d] %s", i, wanted.desc)
|
require.Equal(t, byte(Connect<<4), encoded[0], "Mismatched fixed header packets [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
require.NoError(t, err, "Error writing buffer [i:%d] %s", i, wanted.desc)
|
|
||||||
require.EqualValues(t, wanted.rawBytes, encoded, "Mismatched byte values [i:%d] %s", i, wanted.desc)
|
require.EqualValues(t, wanted.rawBytes, encoded, "Mismatched byte values [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
ok, _ := pk.Validate()
|
ok, _ := pk.Validate()
|
||||||
@@ -60,6 +57,16 @@ func TestConnectEncode(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkConnectEncode(b *testing.B) {
|
||||||
|
pk := new(ConnectPacket)
|
||||||
|
copier.Copy(pk, expectedPackets[Connect][0].packet.(*ConnectPacket))
|
||||||
|
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
for n := 0; n < b.N; n++ {
|
||||||
|
pk.Encode(buf)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestConnectDecode(t *testing.T) {
|
func TestConnectDecode(t *testing.T) {
|
||||||
require.Contains(t, expectedPackets, Connect)
|
require.Contains(t, expectedPackets, Connect)
|
||||||
for i, wanted := range expectedPackets[Connect] {
|
for i, wanted := range expectedPackets[Connect] {
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
package packets
|
package packets
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
"bytes"
|
||||||
)
|
)
|
||||||
|
|
||||||
// DisconnectPacket contains the values of an MQTT DISCONNECT packet.
|
// DisconnectPacket contains the values of an MQTT DISCONNECT packet.
|
||||||
@@ -10,12 +10,9 @@ type DisconnectPacket struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Encode encodes and writes the packet data values to the buffer.
|
// Encode encodes and writes the packet data values to the buffer.
|
||||||
func (pk *DisconnectPacket) Encode(w io.Writer) error {
|
func (pk *DisconnectPacket) Encode(buf *bytes.Buffer) error {
|
||||||
|
pk.FixedHeader.encode(buf)
|
||||||
out := pk.FixedHeader.encode()
|
return nil
|
||||||
_, err := out.WriteTo(w)
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decode extracts the data values from the packet.
|
// Decode extracts the data values from the packet.
|
||||||
|
@@ -19,12 +19,23 @@ func TestDisconnectEncode(t *testing.T) {
|
|||||||
require.Equal(t, Disconnect, pk.Type, "Mismatched Packet Type [i:%d]", i)
|
require.Equal(t, Disconnect, pk.Type, "Mismatched Packet Type [i:%d]", i)
|
||||||
require.Equal(t, Disconnect, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d]", i)
|
require.Equal(t, Disconnect, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d]", i)
|
||||||
|
|
||||||
var b bytes.Buffer
|
buf := new(bytes.Buffer)
|
||||||
err := pk.Encode(&b)
|
err := pk.Encode(buf)
|
||||||
|
require.NoError(t, err, "Expected no error writing buffer [i:%d] %s", i, wanted.desc)
|
||||||
|
encoded := buf.Bytes()
|
||||||
|
|
||||||
require.NoError(t, err, "Error writing buffer [i:%d]", i)
|
require.Equal(t, len(wanted.rawBytes), len(encoded), "Mismatched packet length [i:%d]", i)
|
||||||
require.Equal(t, len(wanted.rawBytes), len(b.Bytes()), "Mismatched packet length [i:%d]", i)
|
require.EqualValues(t, wanted.rawBytes, encoded, "Mismatched byte values [i:%d]", i)
|
||||||
require.EqualValues(t, wanted.rawBytes, b.Bytes(), "Mismatched byte values [i:%d]", i)
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkDisconnectEncode(b *testing.B) {
|
||||||
|
pk := new(DisconnectPacket)
|
||||||
|
copier.Copy(pk, expectedPackets[Disconnect][0].packet.(*DisconnectPacket))
|
||||||
|
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
for n := 0; n < b.N; n++ {
|
||||||
|
pk.Encode(buf)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -24,8 +24,14 @@ type FixedHeader struct {
|
|||||||
Remaining int
|
Remaining int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// encode encodes the FixedHeader and returns a bytes buffer.
|
||||||
|
func (fh *FixedHeader) encode(buf *bytes.Buffer) {
|
||||||
|
buf.WriteByte(fh.Type<<4 | encodeBool(fh.Dup)<<3 | fh.Qos<<1 | encodeBool(fh.Retain))
|
||||||
|
encodeLength(buf, fh.Remaining)
|
||||||
|
}
|
||||||
|
|
||||||
// Encode encodes the FixedHeader and returns a bytes buffer.
|
// Encode encodes the FixedHeader and returns a bytes buffer.
|
||||||
func (fh *FixedHeader) encode() bytes.Buffer {
|
/*func (fh *FixedHeader) encode() bytes.Buffer {
|
||||||
var encoded bytes.Buffer
|
var encoded bytes.Buffer
|
||||||
|
|
||||||
// Encode flags.
|
// Encode flags.
|
||||||
@@ -37,6 +43,7 @@ func (fh *FixedHeader) encode() bytes.Buffer {
|
|||||||
return encoded
|
return encoded
|
||||||
|
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// decode extracts the specification bits from the header byte.
|
// decode extracts the specification bits from the header byte.
|
||||||
func (fh *FixedHeader) decode(headerByte byte) error {
|
func (fh *FixedHeader) decode(headerByte byte) error {
|
||||||
@@ -77,7 +84,7 @@ func (fh *FixedHeader) decode(headerByte byte) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// encodeLength creates length bits for the header.
|
// encodeLength creates length bits for the header.
|
||||||
func encodeLength(length int) []byte {
|
/*func encodeLength(length int) []byte {
|
||||||
encodedLength := make([]byte, 0, 8)
|
encodedLength := make([]byte, 0, 8)
|
||||||
for {
|
for {
|
||||||
digit := byte(length % 128)
|
digit := byte(length % 128)
|
||||||
@@ -92,3 +99,19 @@ func encodeLength(length int) []byte {
|
|||||||
}
|
}
|
||||||
return encodedLength
|
return encodedLength
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
// encodeLength writes length bits for the header.
|
||||||
|
func encodeLength(buf *bytes.Buffer, length int) {
|
||||||
|
for {
|
||||||
|
digit := byte(length % 128)
|
||||||
|
length /= 128
|
||||||
|
if length > 0 {
|
||||||
|
digit |= 0x80
|
||||||
|
}
|
||||||
|
buf.WriteByte(digit)
|
||||||
|
if length == 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
package packets
|
package packets
|
||||||
|
|
||||||
import (
|
import (
|
||||||
//"bytes"
|
"bytes"
|
||||||
"math"
|
"math"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
@@ -149,15 +149,17 @@ var fixedHeaderExpected = []fixedHeaderTable{
|
|||||||
|
|
||||||
func TestFixedHeaderEncode(t *testing.T) {
|
func TestFixedHeaderEncode(t *testing.T) {
|
||||||
for i, wanted := range fixedHeaderExpected {
|
for i, wanted := range fixedHeaderExpected {
|
||||||
b := wanted.header.encode()
|
buf := new(bytes.Buffer)
|
||||||
require.Equal(t, len(wanted.rawBytes), len(b.Bytes()), "Mismatched fixedheader length [i:%d] %v", i, wanted.rawBytes)
|
wanted.header.encode(buf)
|
||||||
require.EqualValues(t, wanted.rawBytes, b.Bytes(), "Mismatched byte values [i:%d] %v", i, wanted.rawBytes)
|
require.Equal(t, len(wanted.rawBytes), len(buf.Bytes()), "Mismatched fixedheader length [i:%d] %v", i, wanted.rawBytes)
|
||||||
|
require.EqualValues(t, wanted.rawBytes, buf.Bytes(), "Mismatched byte values [i:%d] %v", i, wanted.rawBytes)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkFixedHeaderEncode(b *testing.B) {
|
func BenchmarkFixedHeaderEncode(b *testing.B) {
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
for n := 0; n < b.N; n++ {
|
for n := 0; n < b.N; n++ {
|
||||||
fixedHeaderExpected[0].header.encode()
|
fixedHeaderExpected[0].header.encode(buf)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -203,12 +205,15 @@ func TestEncodeLength(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for i, wanted := range tt {
|
for i, wanted := range tt {
|
||||||
require.Equal(t, wanted.want, encodeLength(wanted.have), "Returned bytes should match length [i:%d] %s", i, wanted.have)
|
buf := new(bytes.Buffer)
|
||||||
|
encodeLength(buf, wanted.have)
|
||||||
|
require.Equal(t, wanted.want, buf.Bytes(), "Returned bytes should match length [i:%d] %s", i, wanted.have)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkEncodeLength(b *testing.B) {
|
func BenchmarkEncodeLength(b *testing.B) {
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
for n := 0; n < b.N; n++ {
|
for n := 0; n < b.N; n++ {
|
||||||
encodeLength(120)
|
encodeLength(buf, 120)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,6 +2,7 @@ package packets
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
|
"bytes"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
@@ -13,8 +14,8 @@ import (
|
|||||||
// Packet is the base interface that all MQTT packets must implement.
|
// Packet is the base interface that all MQTT packets must implement.
|
||||||
type Packet interface {
|
type Packet interface {
|
||||||
|
|
||||||
// Encode encodes a packet into a byte array and writes it to a writer.
|
// Encode encodes a packet into a byte buffer.
|
||||||
Encode(io.Writer) error
|
Encode(*bytes.Buffer) error
|
||||||
|
|
||||||
// Decode decodes a byte array into a packet struct.
|
// Decode decodes a byte array into a packet struct.
|
||||||
Decode([]byte) error
|
Decode([]byte) error
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
package packets
|
package packets
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
"bytes"
|
||||||
)
|
)
|
||||||
|
|
||||||
// PingreqPacket contains the values of an MQTT PINGREQ packet.
|
// PingreqPacket contains the values of an MQTT PINGREQ packet.
|
||||||
@@ -10,12 +10,9 @@ type PingreqPacket struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Encode encodes and writes the packet data values to the buffer.
|
// Encode encodes and writes the packet data values to the buffer.
|
||||||
func (pk *PingreqPacket) Encode(w io.Writer) error {
|
func (pk *PingreqPacket) Encode(buf *bytes.Buffer) error {
|
||||||
|
pk.FixedHeader.encode(buf)
|
||||||
out := pk.FixedHeader.encode()
|
return nil
|
||||||
_, err := out.WriteTo(w)
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decode extracts the data values from the packet.
|
// Decode extracts the data values from the packet.
|
||||||
|
@@ -21,12 +21,23 @@ func TestPingreqEncode(t *testing.T) {
|
|||||||
require.Equal(t, Pingreq, pk.Type, "Mismatched Packet Type [i:%d]", i)
|
require.Equal(t, Pingreq, pk.Type, "Mismatched Packet Type [i:%d]", i)
|
||||||
require.Equal(t, Pingreq, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d]", i)
|
require.Equal(t, Pingreq, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d]", i)
|
||||||
|
|
||||||
var b bytes.Buffer
|
buf := new(bytes.Buffer)
|
||||||
err := pk.Encode(&b)
|
err := pk.Encode(buf)
|
||||||
|
require.NoError(t, err, "Expected no error writing buffer [i:%d] %s", i, wanted.desc)
|
||||||
|
encoded := buf.Bytes()
|
||||||
|
|
||||||
require.NoError(t, err, "Error writing buffer [i:%d]", i)
|
require.Equal(t, len(wanted.rawBytes), len(encoded), "Mismatched packet length [i:%d]", i)
|
||||||
require.Equal(t, len(wanted.rawBytes), len(b.Bytes()), "Mismatched packet length [i:%d]", i)
|
require.EqualValues(t, wanted.rawBytes, encoded, "Mismatched byte values [i:%d]", i)
|
||||||
require.EqualValues(t, wanted.rawBytes, b.Bytes(), "Mismatched byte values [i:%d]", i)
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkPingreqEncode(b *testing.B) {
|
||||||
|
pk := new(PingreqPacket)
|
||||||
|
copier.Copy(pk, expectedPackets[Pingreq][0].packet.(*PingreqPacket))
|
||||||
|
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
for n := 0; n < b.N; n++ {
|
||||||
|
pk.Encode(buf)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
package packets
|
package packets
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
"bytes"
|
||||||
)
|
)
|
||||||
|
|
||||||
// PingrespPacket contains the values of an MQTT PINGRESP packet.
|
// PingrespPacket contains the values of an MQTT PINGRESP packet.
|
||||||
@@ -10,12 +10,9 @@ type PingrespPacket struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Encode encodes and writes the packet data values to the buffer.
|
// Encode encodes and writes the packet data values to the buffer.
|
||||||
func (pk *PingrespPacket) Encode(w io.Writer) error {
|
func (pk *PingrespPacket) Encode(buf *bytes.Buffer) error {
|
||||||
|
pk.FixedHeader.encode(buf)
|
||||||
out := pk.FixedHeader.encode()
|
return nil
|
||||||
_, err := out.WriteTo(w)
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decode extracts the data values from the packet.
|
// Decode extracts the data values from the packet.
|
||||||
|
@@ -20,12 +20,23 @@ func TestPingrespEncode(t *testing.T) {
|
|||||||
require.Equal(t, Pingresp, pk.Type, "Mismatched Packet Type [i:%d]", i)
|
require.Equal(t, Pingresp, pk.Type, "Mismatched Packet Type [i:%d]", i)
|
||||||
require.Equal(t, Pingresp, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d]", i)
|
require.Equal(t, Pingresp, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d]", i)
|
||||||
|
|
||||||
var b bytes.Buffer
|
buf := new(bytes.Buffer)
|
||||||
err := pk.Encode(&b)
|
err := pk.Encode(buf)
|
||||||
|
require.NoError(t, err, "Expected no error writing buffer [i:%d] %s", i, wanted.desc)
|
||||||
|
encoded := buf.Bytes()
|
||||||
|
|
||||||
require.NoError(t, err, "Error writing buffer [i:%d]", i)
|
require.Equal(t, len(wanted.rawBytes), len(encoded), "Mismatched packet length [i:%d]", i)
|
||||||
require.Equal(t, len(wanted.rawBytes), len(b.Bytes()), "Mismatched packet length [i:%d]", i)
|
require.EqualValues(t, wanted.rawBytes, encoded, "Mismatched byte values [i:%d]", i)
|
||||||
require.EqualValues(t, wanted.rawBytes, b.Bytes(), "Mismatched byte values [i:%d]", i)
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkPingrespEncode(b *testing.B) {
|
||||||
|
pk := new(PingrespPacket)
|
||||||
|
copier.Copy(pk, expectedPackets[Pingresp][0].packet.(*PingrespPacket))
|
||||||
|
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
for n := 0; n < b.N; n++ {
|
||||||
|
pk.Encode(buf)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -3,7 +3,6 @@ package packets
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// PubackPacket contains the values of an MQTT PUBACK packet.
|
// PubackPacket contains the values of an MQTT PUBACK packet.
|
||||||
@@ -14,20 +13,11 @@ type PubackPacket struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Encode encodes and writes the packet data values to the buffer.
|
// Encode encodes and writes the packet data values to the buffer.
|
||||||
func (pk *PubackPacket) Encode(w io.Writer) error {
|
func (pk *PubackPacket) Encode(buf *bytes.Buffer) error {
|
||||||
|
pk.FixedHeader.Remaining = 2
|
||||||
var body bytes.Buffer
|
pk.FixedHeader.encode(buf)
|
||||||
|
buf.Write(encodeUint16(pk.PacketID))
|
||||||
// Add the Packet ID.
|
return nil
|
||||||
body.Write(encodeUint16(pk.PacketID))
|
|
||||||
pk.Remaining = 2
|
|
||||||
|
|
||||||
// Write header and packet to output.
|
|
||||||
out := pk.FixedHeader.encode()
|
|
||||||
out.Write(body.Bytes())
|
|
||||||
_, err := out.WriteTo(w)
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decode extracts the data values from the packet.
|
// Decode extracts the data values from the packet.
|
||||||
|
@@ -22,21 +22,29 @@ func TestPubackEncode(t *testing.T) {
|
|||||||
require.Equal(t, Puback, pk.Type, "Mismatched Packet Type [i:%d] %s", i, wanted.desc)
|
require.Equal(t, Puback, pk.Type, "Mismatched Packet Type [i:%d] %s", i, wanted.desc)
|
||||||
require.Equal(t, Puback, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d] %s", i, wanted.desc)
|
require.Equal(t, Puback, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
var b bytes.Buffer
|
buf := new(bytes.Buffer)
|
||||||
err := pk.Encode(&b)
|
err := pk.Encode(buf)
|
||||||
|
require.NoError(t, err, "Expected no error writing buffer [i:%d] %s", i, wanted.desc)
|
||||||
encoded := b.Bytes()
|
encoded := buf.Bytes()
|
||||||
|
|
||||||
require.Equal(t, len(wanted.rawBytes), len(encoded), "Mismatched packet length [i:%d] %s", i, wanted.desc)
|
require.Equal(t, len(wanted.rawBytes), len(encoded), "Mismatched packet length [i:%d] %s", i, wanted.desc)
|
||||||
require.Equal(t, byte(Puback<<4), encoded[0], "Mismatched fixed header packets [i:%d] %s", i, wanted.desc)
|
require.Equal(t, byte(Puback<<4), encoded[0], "Mismatched fixed header packets [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
require.NoError(t, err, "Error writing buffer [i:%d] %s", i, wanted.desc)
|
|
||||||
require.EqualValues(t, wanted.rawBytes, encoded, "Mismatched byte values [i:%d] %s", i, wanted.desc)
|
require.EqualValues(t, wanted.rawBytes, encoded, "Mismatched byte values [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
require.Equal(t, wanted.packet.(*PubackPacket).PacketID, pk.PacketID, "Mismatched Packet ID [i:%d] %s", i, wanted.desc)
|
require.Equal(t, wanted.packet.(*PubackPacket).PacketID, pk.PacketID, "Mismatched Packet ID [i:%d] %s", i, wanted.desc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkPubackEncode(b *testing.B) {
|
||||||
|
pk := new(PubackPacket)
|
||||||
|
copier.Copy(pk, expectedPackets[Puback][0].packet.(*PubackPacket))
|
||||||
|
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
for n := 0; n < b.N; n++ {
|
||||||
|
pk.Encode(buf)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestPubackDecode(t *testing.T) {
|
func TestPubackDecode(t *testing.T) {
|
||||||
require.Contains(t, expectedPackets, Puback)
|
require.Contains(t, expectedPackets, Puback)
|
||||||
for i, wanted := range expectedPackets[Puback] {
|
for i, wanted := range expectedPackets[Puback] {
|
||||||
|
@@ -3,7 +3,6 @@ package packets
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// PubcompPacket contains the values of an MQTT PUBCOMP packet.
|
// PubcompPacket contains the values of an MQTT PUBCOMP packet.
|
||||||
@@ -14,32 +13,20 @@ type PubcompPacket struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Encode encodes and writes the packet data values to the buffer.
|
// Encode encodes and writes the packet data values to the buffer.
|
||||||
func (pk *PubcompPacket) Encode(w io.Writer) error {
|
func (pk *PubcompPacket) Encode(buf *bytes.Buffer) error {
|
||||||
|
pk.FixedHeader.Remaining = 2
|
||||||
var body bytes.Buffer
|
pk.FixedHeader.encode(buf)
|
||||||
|
buf.Write(encodeUint16(pk.PacketID))
|
||||||
// Add the Packet ID.
|
return nil
|
||||||
body.Write(encodeUint16(pk.PacketID))
|
|
||||||
pk.Remaining = 2
|
|
||||||
|
|
||||||
// Write header and packet to output.
|
|
||||||
out := pk.FixedHeader.encode()
|
|
||||||
out.Write(body.Bytes())
|
|
||||||
_, err := out.WriteTo(w)
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decode extracts the data values from the packet.
|
// Decode extracts the data values from the packet.
|
||||||
func (pk *PubcompPacket) Decode(buf []byte) error {
|
func (pk *PubcompPacket) Decode(buf []byte) error {
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
pk.PacketID, _, err = decodeUint16(buf, 0)
|
pk.PacketID, _, err = decodeUint16(buf, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.New(ErrMalformedPacketID)
|
return errors.New(ErrMalformedPacketID)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -22,21 +22,29 @@ func TestPubcompEncode(t *testing.T) {
|
|||||||
require.Equal(t, Pubcomp, pk.Type, "Mismatched Packet Type [i:%d] %s", i, wanted.desc)
|
require.Equal(t, Pubcomp, pk.Type, "Mismatched Packet Type [i:%d] %s", i, wanted.desc)
|
||||||
require.Equal(t, Pubcomp, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d] %s", i, wanted.desc)
|
require.Equal(t, Pubcomp, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
var b bytes.Buffer
|
buf := new(bytes.Buffer)
|
||||||
err := pk.Encode(&b)
|
err := pk.Encode(buf)
|
||||||
|
require.NoError(t, err, "Expected no error writing buffer [i:%d] %s", i, wanted.desc)
|
||||||
encoded := b.Bytes()
|
encoded := buf.Bytes()
|
||||||
|
|
||||||
require.Equal(t, len(wanted.rawBytes), len(encoded), "Mismatched packet length [i:%d] %s", i, wanted.desc)
|
require.Equal(t, len(wanted.rawBytes), len(encoded), "Mismatched packet length [i:%d] %s", i, wanted.desc)
|
||||||
require.Equal(t, byte(Pubcomp<<4), encoded[0], "Mismatched fixed header packets [i:%d] %s", i, wanted.desc)
|
require.Equal(t, byte(Pubcomp<<4), encoded[0], "Mismatched fixed header packets [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
require.NoError(t, err, "Error writing buffer [i:%d] %s", i, wanted.desc)
|
|
||||||
require.EqualValues(t, wanted.rawBytes, encoded, "Mismatched byte values [i:%d] %s", i, wanted.desc)
|
require.EqualValues(t, wanted.rawBytes, encoded, "Mismatched byte values [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
require.Equal(t, wanted.packet.(*PubcompPacket).PacketID, pk.PacketID, "Mismatched Packet ID [i:%d] %s", i, wanted.desc)
|
require.Equal(t, wanted.packet.(*PubcompPacket).PacketID, pk.PacketID, "Mismatched Packet ID [i:%d] %s", i, wanted.desc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkPubcompEncode(b *testing.B) {
|
||||||
|
pk := new(PubcompPacket)
|
||||||
|
copier.Copy(pk, expectedPackets[Pubcomp][0].packet.(*PubcompPacket))
|
||||||
|
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
for n := 0; n < b.N; n++ {
|
||||||
|
pk.Encode(buf)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestPubcompDecode(t *testing.T) {
|
func TestPubcompDecode(t *testing.T) {
|
||||||
require.Contains(t, expectedPackets, Pubcomp)
|
require.Contains(t, expectedPackets, Pubcomp)
|
||||||
for i, wanted := range expectedPackets[Pubcomp] {
|
for i, wanted := range expectedPackets[Pubcomp] {
|
||||||
|
@@ -3,7 +3,6 @@ package packets
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// PublishPacket contains the values of an MQTT PUBLISH packet.
|
// PublishPacket contains the values of an MQTT PUBLISH packet.
|
||||||
@@ -16,12 +15,10 @@ type PublishPacket struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Encode encodes and writes the packet data values to the buffer.
|
// Encode encodes and writes the packet data values to the buffer.
|
||||||
func (pk *PublishPacket) Encode(w io.Writer) error {
|
func (pk *PublishPacket) Encode(buf *bytes.Buffer) error {
|
||||||
|
|
||||||
var body bytes.Buffer
|
var body bytes.Buffer
|
||||||
|
|
||||||
// Write topic name.
|
body.Write(encodeString(pk.TopicName)) // Write topic name.
|
||||||
body.Write(encodeString(pk.TopicName))
|
|
||||||
|
|
||||||
// Add PacketID if QOS is set.
|
// Add PacketID if QOS is set.
|
||||||
// [MQTT-2.3.1-5] A PUBLISH Packet MUST NOT contain a Packet Identifier if its QoS value is set to 0.
|
// [MQTT-2.3.1-5] A PUBLISH Packet MUST NOT contain a Packet Identifier if its QoS value is set to 0.
|
||||||
@@ -37,15 +34,11 @@ func (pk *PublishPacket) Encode(w io.Writer) error {
|
|||||||
|
|
||||||
// Set remaining length.
|
// Set remaining length.
|
||||||
pk.FixedHeader.Remaining = body.Len() + len(pk.Payload)
|
pk.FixedHeader.Remaining = body.Len() + len(pk.Payload)
|
||||||
|
pk.FixedHeader.encode(buf)
|
||||||
|
buf.Write(body.Bytes())
|
||||||
|
buf.Write(pk.Payload)
|
||||||
|
|
||||||
// Write header and packet to output.
|
return nil
|
||||||
out := pk.FixedHeader.encode()
|
|
||||||
out.Write(body.Bytes())
|
|
||||||
out.Write(pk.Payload)
|
|
||||||
_, err := out.WriteTo(w)
|
|
||||||
|
|
||||||
return err
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decode extracts the data values from the packet.
|
// Decode extracts the data values from the packet.
|
||||||
|
@@ -23,12 +23,13 @@ func TestPublishEncode(t *testing.T) {
|
|||||||
require.Equal(t, Publish, pk.Type, "Mismatched Packet Type [i:%d] %s", i, wanted.desc)
|
require.Equal(t, Publish, pk.Type, "Mismatched Packet Type [i:%d] %s", i, wanted.desc)
|
||||||
require.Equal(t, Publish, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d] %s", i, wanted.desc)
|
require.Equal(t, Publish, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
var b bytes.Buffer
|
buf := new(bytes.Buffer)
|
||||||
err := pk.Encode(&b)
|
err := pk.Encode(buf)
|
||||||
|
encoded := buf.Bytes()
|
||||||
|
|
||||||
if wanted.expect != nil {
|
if wanted.expect != nil {
|
||||||
require.Error(t, err, "Expected error writing buffer [i:%d] %s", i, wanted.desc)
|
require.Error(t, err, "Expected error writing buffer [i:%d] %s", i, wanted.desc)
|
||||||
} else {
|
} else {
|
||||||
encoded := b.Bytes()
|
|
||||||
|
|
||||||
// If actualBytes is set, compare mutated version of byte string instead (to avoid length mismatches, etc).
|
// If actualBytes is set, compare mutated version of byte string instead (to avoid length mismatches, etc).
|
||||||
if len(wanted.actualBytes) > 0 {
|
if len(wanted.actualBytes) > 0 {
|
||||||
@@ -47,11 +48,21 @@ func TestPublishEncode(t *testing.T) {
|
|||||||
require.Equal(t, wanted.packet.(*PublishPacket).FixedHeader.Dup, pk.FixedHeader.Dup, "Mismatched Dup [i:%d] %s", i, wanted.desc)
|
require.Equal(t, wanted.packet.(*PublishPacket).FixedHeader.Dup, pk.FixedHeader.Dup, "Mismatched Dup [i:%d] %s", i, wanted.desc)
|
||||||
require.Equal(t, wanted.packet.(*PublishPacket).FixedHeader.Retain, pk.FixedHeader.Retain, "Mismatched Retain [i:%d] %s", i, wanted.desc)
|
require.Equal(t, wanted.packet.(*PublishPacket).FixedHeader.Retain, pk.FixedHeader.Retain, "Mismatched Retain [i:%d] %s", i, wanted.desc)
|
||||||
require.Equal(t, wanted.packet.(*PublishPacket).PacketID, pk.PacketID, "Mismatched Packet ID [i:%d] %s", i, wanted.desc)
|
require.Equal(t, wanted.packet.(*PublishPacket).PacketID, pk.PacketID, "Mismatched Packet ID [i:%d] %s", i, wanted.desc)
|
||||||
require.NoError(t, err, "Error writing buffer [i:%d] %s", i, wanted.desc)
|
require.NoError(t, err, "Expected no error writing buffer [i:%d] %s", i, wanted.desc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkPublishEncode(b *testing.B) {
|
||||||
|
pk := new(PublishPacket)
|
||||||
|
copier.Copy(pk, expectedPackets[Publish][0].packet.(*PublishPacket))
|
||||||
|
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
for n := 0; n < b.N; n++ {
|
||||||
|
pk.Encode(buf)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestPublishDecode(t *testing.T) {
|
func TestPublishDecode(t *testing.T) {
|
||||||
require.Contains(t, expectedPackets, Publish)
|
require.Contains(t, expectedPackets, Publish)
|
||||||
for i, wanted := range expectedPackets[Publish] {
|
for i, wanted := range expectedPackets[Publish] {
|
||||||
|
@@ -3,7 +3,6 @@ package packets
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// PubrecPacket contains the values of an MQTT PUBREC packet.
|
// PubrecPacket contains the values of an MQTT PUBREC packet.
|
||||||
@@ -14,20 +13,11 @@ type PubrecPacket struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Encode encodes and writes the packet data values to the buffer.
|
// Encode encodes and writes the packet data values to the buffer.
|
||||||
func (pk *PubrecPacket) Encode(w io.Writer) error {
|
func (pk *PubrecPacket) Encode(buf *bytes.Buffer) error {
|
||||||
|
pk.FixedHeader.Remaining = 2
|
||||||
var body bytes.Buffer
|
pk.FixedHeader.encode(buf)
|
||||||
|
buf.Write(encodeUint16(pk.PacketID))
|
||||||
// Add the Packet ID.
|
return nil
|
||||||
body.Write(encodeUint16(pk.PacketID))
|
|
||||||
pk.Remaining = 2
|
|
||||||
|
|
||||||
// Write header and packet to output.
|
|
||||||
out := pk.FixedHeader.encode()
|
|
||||||
out.Write(body.Bytes())
|
|
||||||
_, err := out.WriteTo(w)
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decode extracts the data values from the packet.
|
// Decode extracts the data values from the packet.
|
||||||
|
@@ -23,21 +23,28 @@ func TestPubrecEncode(t *testing.T) {
|
|||||||
require.Equal(t, Pubrec, pk.Type, "Mismatched Packet Type [i:%d] %s", i, wanted.desc)
|
require.Equal(t, Pubrec, pk.Type, "Mismatched Packet Type [i:%d] %s", i, wanted.desc)
|
||||||
require.Equal(t, Pubrec, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d] %s", i, wanted.desc)
|
require.Equal(t, Pubrec, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
var b bytes.Buffer
|
buf := new(bytes.Buffer)
|
||||||
err := pk.Encode(&b)
|
err := pk.Encode(buf)
|
||||||
|
require.NoError(t, err, "Expected no error writing buffer [i:%d] %s", i, wanted.desc)
|
||||||
encoded := b.Bytes()
|
encoded := buf.Bytes()
|
||||||
|
|
||||||
require.Equal(t, len(wanted.rawBytes), len(encoded), "Mismatched packet length [i:%d] %s", i, wanted.desc)
|
require.Equal(t, len(wanted.rawBytes), len(encoded), "Mismatched packet length [i:%d] %s", i, wanted.desc)
|
||||||
require.Equal(t, byte(Pubrec<<4), encoded[0], "Mismatched fixed header packets [i:%d] %s", i, wanted.desc)
|
require.Equal(t, byte(Pubrec<<4), encoded[0], "Mismatched fixed header packets [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
require.NoError(t, err, "Error writing buffer [i:%d] %s", i, wanted.desc)
|
|
||||||
require.EqualValues(t, wanted.rawBytes, encoded, "Mismatched byte values [i:%d] %s", i, wanted.desc)
|
require.EqualValues(t, wanted.rawBytes, encoded, "Mismatched byte values [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
require.Equal(t, wanted.packet.(*PubrecPacket).PacketID, pk.PacketID, "Mismatched Packet ID [i:%d] %s", i, wanted.desc)
|
require.Equal(t, wanted.packet.(*PubrecPacket).PacketID, pk.PacketID, "Mismatched Packet ID [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkPubrecEncode(b *testing.B) {
|
||||||
|
pk := new(PubrecPacket)
|
||||||
|
copier.Copy(pk, expectedPackets[Pubrec][0].packet.(*PubrecPacket))
|
||||||
|
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
for n := 0; n < b.N; n++ {
|
||||||
|
pk.Encode(buf)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPubrecDecode(t *testing.T) {
|
func TestPubrecDecode(t *testing.T) {
|
||||||
|
@@ -3,7 +3,6 @@ package packets
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// PubrelPacket contains the values of an MQTT PUBREL packet.
|
// PubrelPacket contains the values of an MQTT PUBREL packet.
|
||||||
@@ -14,20 +13,11 @@ type PubrelPacket struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Encode encodes and writes the packet data values to the buffer.
|
// Encode encodes and writes the packet data values to the buffer.
|
||||||
func (pk *PubrelPacket) Encode(w io.Writer) error {
|
func (pk *PubrelPacket) Encode(buf *bytes.Buffer) error {
|
||||||
|
pk.FixedHeader.Remaining = 2
|
||||||
var body bytes.Buffer
|
pk.FixedHeader.encode(buf)
|
||||||
|
buf.Write(encodeUint16(pk.PacketID))
|
||||||
// Add the Packet ID.
|
return nil
|
||||||
body.Write(encodeUint16(pk.PacketID))
|
|
||||||
pk.Remaining = 2
|
|
||||||
|
|
||||||
// Write header and packet to output.
|
|
||||||
out := pk.FixedHeader.encode()
|
|
||||||
out.Write(body.Bytes())
|
|
||||||
_, err := out.WriteTo(w)
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decode extracts the data values from the packet.
|
// Decode extracts the data values from the packet.
|
||||||
|
@@ -23,15 +23,13 @@ func TestPubrelEncode(t *testing.T) {
|
|||||||
require.Equal(t, Pubrel, pk.Type, "Mismatched Packet Type [i:%d] %s", i, wanted.desc)
|
require.Equal(t, Pubrel, pk.Type, "Mismatched Packet Type [i:%d] %s", i, wanted.desc)
|
||||||
require.Equal(t, Pubrel, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d] %s", i, wanted.desc)
|
require.Equal(t, Pubrel, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
var b bytes.Buffer
|
buf := new(bytes.Buffer)
|
||||||
err := pk.Encode(&b)
|
err := pk.Encode(buf)
|
||||||
|
require.NoError(t, err, "Expected no error writing buffer [i:%d] %s", i, wanted.desc)
|
||||||
encoded := b.Bytes()
|
encoded := buf.Bytes()
|
||||||
|
|
||||||
require.Equal(t, len(wanted.rawBytes), len(encoded), "Mismatched packet length [i:%d] %s", i, wanted.desc)
|
require.Equal(t, len(wanted.rawBytes), len(encoded), "Mismatched packet length [i:%d] %s", i, wanted.desc)
|
||||||
require.Equal(t, byte(Pubrel<<4), encoded[0], "Mismatched fixed header packets [i:%d] %s", i, wanted.desc)
|
require.Equal(t, byte(Pubrel<<4), encoded[0], "Mismatched fixed header packets [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
require.NoError(t, err, "Error writing buffer [i:%d] %s", i, wanted.desc)
|
|
||||||
require.EqualValues(t, wanted.rawBytes, encoded, "Mismatched byte values [i:%d] %s", i, wanted.desc)
|
require.EqualValues(t, wanted.rawBytes, encoded, "Mismatched byte values [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
require.Equal(t, wanted.packet.(*PubrelPacket).PacketID, pk.PacketID, "Mismatched Packet ID [i:%d] %s", i, wanted.desc)
|
require.Equal(t, wanted.packet.(*PubrelPacket).PacketID, pk.PacketID, "Mismatched Packet ID [i:%d] %s", i, wanted.desc)
|
||||||
@@ -40,6 +38,16 @@ func TestPubrelEncode(t *testing.T) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkPubrelEncode(b *testing.B) {
|
||||||
|
pk := new(PubrelPacket)
|
||||||
|
copier.Copy(pk, expectedPackets[Pubrel][0].packet.(*PubrelPacket))
|
||||||
|
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
for n := 0; n < b.N; n++ {
|
||||||
|
pk.Encode(buf)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestPubrelDecode(t *testing.T) {
|
func TestPubrelDecode(t *testing.T) {
|
||||||
require.Contains(t, expectedPackets, Pubrel)
|
require.Contains(t, expectedPackets, Pubrel)
|
||||||
for i, wanted := range expectedPackets[Pubrel] {
|
for i, wanted := range expectedPackets[Pubrel] {
|
||||||
@@ -63,7 +71,7 @@ func TestPubrelDecode(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkPubrelkDecode(b *testing.B) {
|
func BenchmarkPubrelDecode(b *testing.B) {
|
||||||
pk := newPacket(Pubrel).(*PubrelPacket)
|
pk := newPacket(Pubrel).(*PubrelPacket)
|
||||||
pk.FixedHeader.decode(expectedPackets[Pubrel][0].rawBytes[0])
|
pk.FixedHeader.decode(expectedPackets[Pubrel][0].rawBytes[0])
|
||||||
|
|
||||||
|
@@ -3,7 +3,6 @@ package packets
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// SubackPacket contains the values of an MQTT SUBACK packet.
|
// SubackPacket contains the values of an MQTT SUBACK packet.
|
||||||
@@ -15,25 +14,32 @@ type SubackPacket struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Encode encodes and writes the packet data values to the buffer.
|
// Encode encodes and writes the packet data values to the buffer.
|
||||||
func (pk *SubackPacket) Encode(w io.Writer) error {
|
func (pk *SubackPacket) Encode(buf *bytes.Buffer) error {
|
||||||
|
pk.FixedHeader.encode(buf)
|
||||||
|
|
||||||
|
bodyLen := buf.Len()
|
||||||
|
|
||||||
|
buf.Write(encodeUint16(pk.PacketID)) // Encode Packet ID.
|
||||||
|
buf.Write(pk.ReturnCodes) // Encode granted QOS flags.
|
||||||
|
|
||||||
|
pk.FixedHeader.Remaining = buf.Len() - bodyLen // Set length.
|
||||||
|
|
||||||
|
return nil
|
||||||
|
/*
|
||||||
|
|
||||||
var body bytes.Buffer
|
var body bytes.Buffer
|
||||||
|
|
||||||
// Encode Packet ID.
|
|
||||||
body.Write(encodeUint16(pk.PacketID))
|
body.Write(encodeUint16(pk.PacketID))
|
||||||
|
|
||||||
// Encode granted QOS flags.
|
|
||||||
body.Write(pk.ReturnCodes)
|
body.Write(pk.ReturnCodes)
|
||||||
|
|
||||||
// Set length.
|
|
||||||
pk.FixedHeader.Remaining = body.Len()
|
|
||||||
|
|
||||||
// Write header and packet to output.
|
// Write header and packet to output.
|
||||||
out := pk.FixedHeader.encode()
|
out := pk.FixedHeader.encode()
|
||||||
out.Write(body.Bytes())
|
out.Write(body.Bytes())
|
||||||
_, err := out.WriteTo(w)
|
_, err := out.WriteTo(w)
|
||||||
|
|
||||||
return err
|
return err
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decode extracts the data values from the packet.
|
// Decode extracts the data values from the packet.
|
||||||
|
@@ -23,10 +23,10 @@ func TestSubackEncode(t *testing.T) {
|
|||||||
require.Equal(t, Suback, pk.Type, "Mismatched Packet Type [i:%d] %s", i, wanted.desc)
|
require.Equal(t, Suback, pk.Type, "Mismatched Packet Type [i:%d] %s", i, wanted.desc)
|
||||||
require.Equal(t, Suback, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d] %s", i, wanted.desc)
|
require.Equal(t, Suback, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
var b bytes.Buffer
|
buf := new(bytes.Buffer)
|
||||||
err := pk.Encode(&b)
|
err := pk.Encode(buf)
|
||||||
|
require.NoError(t, err, "Expected no error writing buffer [i:%d] %s", i, wanted.desc)
|
||||||
encoded := b.Bytes()
|
encoded := buf.Bytes()
|
||||||
|
|
||||||
require.Equal(t, len(wanted.rawBytes), len(encoded), "Mismatched packet length [i:%d] %s", i, wanted.desc)
|
require.Equal(t, len(wanted.rawBytes), len(encoded), "Mismatched packet length [i:%d] %s", i, wanted.desc)
|
||||||
if wanted.meta != nil {
|
if wanted.meta != nil {
|
||||||
@@ -35,7 +35,6 @@ func TestSubackEncode(t *testing.T) {
|
|||||||
require.Equal(t, byte(Suback<<4), encoded[0], "Mismatched fixed header packets [i:%d] %s", i, wanted.desc)
|
require.Equal(t, byte(Suback<<4), encoded[0], "Mismatched fixed header packets [i:%d] %s", i, wanted.desc)
|
||||||
}
|
}
|
||||||
|
|
||||||
require.NoError(t, err, "Error writing buffer [i:%d] %s", i, wanted.desc)
|
|
||||||
require.EqualValues(t, wanted.rawBytes, encoded, "Mismatched byte values [i:%d] %s", i, wanted.desc)
|
require.EqualValues(t, wanted.rawBytes, encoded, "Mismatched byte values [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
require.Equal(t, wanted.packet.(*SubackPacket).PacketID, pk.PacketID, "Mismatched Packet ID [i:%d] %s", i, wanted.desc)
|
require.Equal(t, wanted.packet.(*SubackPacket).PacketID, pk.PacketID, "Mismatched Packet ID [i:%d] %s", i, wanted.desc)
|
||||||
@@ -43,6 +42,16 @@ func TestSubackEncode(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkSubackEncode(b *testing.B) {
|
||||||
|
pk := new(SubackPacket)
|
||||||
|
copier.Copy(pk, expectedPackets[Suback][0].packet.(*SubackPacket))
|
||||||
|
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
for n := 0; n < b.N; n++ {
|
||||||
|
pk.Encode(buf)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestSubackDecode(t *testing.T) {
|
func TestSubackDecode(t *testing.T) {
|
||||||
require.Contains(t, expectedPackets, Suback)
|
require.Contains(t, expectedPackets, Suback)
|
||||||
for i, wanted := range expectedPackets[Suback] {
|
for i, wanted := range expectedPackets[Suback] {
|
||||||
|
@@ -3,7 +3,6 @@ package packets
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// SubscribePacket contains the values of an MQTT SUBSCRIBE packet.
|
// SubscribePacket contains the values of an MQTT SUBSCRIBE packet.
|
||||||
@@ -16,7 +15,7 @@ type SubscribePacket struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Encode encodes and writes the packet data values to the buffer.
|
// Encode encodes and writes the packet data values to the buffer.
|
||||||
func (pk *SubscribePacket) Encode(w io.Writer) error {
|
func (pk *SubscribePacket) Encode(buf *bytes.Buffer) error {
|
||||||
|
|
||||||
var body bytes.Buffer
|
var body bytes.Buffer
|
||||||
|
|
||||||
@@ -34,6 +33,28 @@ func (pk *SubscribePacket) Encode(w io.Writer) error {
|
|||||||
body.WriteByte(pk.Qoss[i])
|
body.WriteByte(pk.Qoss[i])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set length.
|
||||||
|
pk.FixedHeader.Remaining = body.Len()
|
||||||
|
pk.FixedHeader.encode(buf)
|
||||||
|
buf.Write(body.Bytes())
|
||||||
|
|
||||||
|
/*
|
||||||
|
var body bytes.Buffer
|
||||||
|
|
||||||
|
// Add the Packet ID.
|
||||||
|
// [MQTT-2.3.1-1] SUBSCRIBE, UNSUBSCRIBE, and PUBLISH (in cases where QoS > 0) Control Packets MUST contain a non-zero 16-bit Packet Identifier.
|
||||||
|
if pk.PacketID == 0 {
|
||||||
|
return errors.New(ErrMissingPacketID)
|
||||||
|
}
|
||||||
|
|
||||||
|
body.Write(encodeUint16(pk.PacketID))
|
||||||
|
|
||||||
|
// Add all provided topic names and associated QOS flags.
|
||||||
|
for i, topic := range pk.Topics {
|
||||||
|
body.Write(encodeString(topic))
|
||||||
|
body.WriteByte(pk.Qoss[i])
|
||||||
|
}
|
||||||
|
|
||||||
// Set length.
|
// Set length.
|
||||||
pk.FixedHeader.Remaining = body.Len()
|
pk.FixedHeader.Remaining = body.Len()
|
||||||
|
|
||||||
@@ -43,6 +64,9 @@ func (pk *SubscribePacket) Encode(w io.Writer) error {
|
|||||||
_, err := out.WriteTo(w)
|
_, err := out.WriteTo(w)
|
||||||
|
|
||||||
return err
|
return err
|
||||||
|
*/
|
||||||
|
|
||||||
|
return nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -22,18 +22,14 @@ func TestSubscribeEncode(t *testing.T) {
|
|||||||
require.Equal(t, Subscribe, pk.Type, "Mismatched Packet Type [i:%d] %s", i, wanted.desc)
|
require.Equal(t, Subscribe, pk.Type, "Mismatched Packet Type [i:%d] %s", i, wanted.desc)
|
||||||
require.Equal(t, Subscribe, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d] %s", i, wanted.desc)
|
require.Equal(t, Subscribe, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
var b bytes.Buffer
|
buf := new(bytes.Buffer)
|
||||||
err := pk.Encode(&b)
|
err := pk.Encode(buf)
|
||||||
|
encoded := buf.Bytes()
|
||||||
|
|
||||||
if wanted.expect != nil {
|
if wanted.expect != nil {
|
||||||
|
|
||||||
require.Error(t, err, "Expected error writing buffer [i:%d] %s", i, wanted.desc)
|
require.Error(t, err, "Expected error writing buffer [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
require.NoError(t, err, "Error writing buffer [i:%d] %s", i, wanted.desc)
|
require.NoError(t, err, "Error writing buffer [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
encoded := b.Bytes()
|
|
||||||
|
|
||||||
require.Equal(t, len(wanted.rawBytes), len(encoded), "Mismatched packet length [i:%d] %s", i, wanted.desc)
|
require.Equal(t, len(wanted.rawBytes), len(encoded), "Mismatched packet length [i:%d] %s", i, wanted.desc)
|
||||||
if wanted.meta != nil {
|
if wanted.meta != nil {
|
||||||
require.Equal(t, byte(Subscribe<<4)|wanted.meta.(byte), encoded[0], "Mismatched fixed header bytes [i:%d] %s", i, wanted.desc)
|
require.Equal(t, byte(Subscribe<<4)|wanted.meta.(byte), encoded[0], "Mismatched fixed header bytes [i:%d] %s", i, wanted.desc)
|
||||||
@@ -42,11 +38,21 @@ func TestSubscribeEncode(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
require.EqualValues(t, wanted.rawBytes, encoded, "Mismatched byte values [i:%d] %s", i, wanted.desc)
|
require.EqualValues(t, wanted.rawBytes, encoded, "Mismatched byte values [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
require.Equal(t, wanted.packet.(*SubscribePacket).PacketID, pk.PacketID, "Mismatched Packet ID [i:%d] %s", i, wanted.desc)
|
require.Equal(t, wanted.packet.(*SubscribePacket).PacketID, pk.PacketID, "Mismatched Packet ID [i:%d] %s", i, wanted.desc)
|
||||||
require.Equal(t, wanted.packet.(*SubscribePacket).Topics, pk.Topics, "Mismatched Topics slice [i:%d] %s", i, wanted.desc)
|
require.Equal(t, wanted.packet.(*SubscribePacket).Topics, pk.Topics, "Mismatched Topics slice [i:%d] %s", i, wanted.desc)
|
||||||
require.Equal(t, wanted.packet.(*SubscribePacket).Qoss, pk.Qoss, "Mismatched Qoss slice [i:%d] %s", i, wanted.desc)
|
require.Equal(t, wanted.packet.(*SubscribePacket).Qoss, pk.Qoss, "Mismatched Qoss slice [i:%d] %s", i, wanted.desc)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkSubscribeEncode(b *testing.B) {
|
||||||
|
pk := new(SubscribePacket)
|
||||||
|
copier.Copy(pk, expectedPackets[Subscribe][0].packet.(*SubscribePacket))
|
||||||
|
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
for n := 0; n < b.N; n++ {
|
||||||
|
pk.Encode(buf)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -3,7 +3,6 @@ package packets
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// UnsubackPacket contains the values of an MQTT UNSUBACK packet.
|
// UnsubackPacket contains the values of an MQTT UNSUBACK packet.
|
||||||
@@ -14,21 +13,11 @@ type UnsubackPacket struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Encode encodes and writes the packet data values to the buffer.
|
// Encode encodes and writes the packet data values to the buffer.
|
||||||
func (pk *UnsubackPacket) Encode(w io.Writer) error {
|
func (pk *UnsubackPacket) Encode(buf *bytes.Buffer) error {
|
||||||
|
pk.FixedHeader.Remaining = 2
|
||||||
var body bytes.Buffer
|
pk.FixedHeader.encode(buf)
|
||||||
|
buf.Write(encodeUint16(pk.PacketID))
|
||||||
// Add the Packet ID.
|
return nil
|
||||||
body.Write(encodeUint16(pk.PacketID))
|
|
||||||
pk.Remaining = 2
|
|
||||||
|
|
||||||
// Write header and packet to output.
|
|
||||||
out := pk.FixedHeader.encode()
|
|
||||||
out.Write(body.Bytes())
|
|
||||||
_, err := out.WriteTo(w)
|
|
||||||
|
|
||||||
return err
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decode extracts the data values from the packet.
|
// Decode extracts the data values from the packet.
|
||||||
|
@@ -22,10 +22,10 @@ func TestUnsubackEncode(t *testing.T) {
|
|||||||
require.Equal(t, Unsuback, pk.Type, "Mismatched Packet Type [i:%d] %s", i, wanted.desc)
|
require.Equal(t, Unsuback, pk.Type, "Mismatched Packet Type [i:%d] %s", i, wanted.desc)
|
||||||
require.Equal(t, Unsuback, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d] %s", i, wanted.desc)
|
require.Equal(t, Unsuback, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
var b bytes.Buffer
|
buf := new(bytes.Buffer)
|
||||||
err := pk.Encode(&b)
|
err := pk.Encode(buf)
|
||||||
|
require.NoError(t, err, "Expected no error writing buffer [i:%d] %s", i, wanted.desc)
|
||||||
encoded := b.Bytes()
|
encoded := buf.Bytes()
|
||||||
|
|
||||||
require.Equal(t, len(wanted.rawBytes), len(encoded), "Mismatched packet length [i:%d] %s", i, wanted.desc)
|
require.Equal(t, len(wanted.rawBytes), len(encoded), "Mismatched packet length [i:%d] %s", i, wanted.desc)
|
||||||
if wanted.meta != nil {
|
if wanted.meta != nil {
|
||||||
@@ -34,13 +34,22 @@ func TestUnsubackEncode(t *testing.T) {
|
|||||||
require.Equal(t, byte(Unsuback<<4), encoded[0], "Mismatched fixed header packets [i:%d] %s", i, wanted.desc)
|
require.Equal(t, byte(Unsuback<<4), encoded[0], "Mismatched fixed header packets [i:%d] %s", i, wanted.desc)
|
||||||
}
|
}
|
||||||
|
|
||||||
require.NoError(t, err, "Error writing buffer [i:%d] %s", i, wanted.desc)
|
|
||||||
require.EqualValues(t, wanted.rawBytes, encoded, "Mismatched byte values [i:%d] %s", i, wanted.desc)
|
require.EqualValues(t, wanted.rawBytes, encoded, "Mismatched byte values [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
require.Equal(t, wanted.packet.(*UnsubackPacket).PacketID, pk.PacketID, "Mismatched Packet ID [i:%d] %s", i, wanted.desc)
|
require.Equal(t, wanted.packet.(*UnsubackPacket).PacketID, pk.PacketID, "Mismatched Packet ID [i:%d] %s", i, wanted.desc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkUnsubackEncode(b *testing.B) {
|
||||||
|
pk := new(UnsubackPacket)
|
||||||
|
copier.Copy(pk, expectedPackets[Unsuback][0].packet.(*UnsubackPacket))
|
||||||
|
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
for n := 0; n < b.N; n++ {
|
||||||
|
pk.Encode(buf)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestUnsubackDecode(t *testing.T) {
|
func TestUnsubackDecode(t *testing.T) {
|
||||||
require.Contains(t, expectedPackets, Unsuback)
|
require.Contains(t, expectedPackets, Unsuback)
|
||||||
for i, wanted := range expectedPackets[Unsuback] {
|
for i, wanted := range expectedPackets[Unsuback] {
|
||||||
|
@@ -3,7 +3,6 @@ package packets
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// UnsubscribePacket contains the values of an MQTT UNSUBSCRIBE packet.
|
// UnsubscribePacket contains the values of an MQTT UNSUBSCRIBE packet.
|
||||||
@@ -15,8 +14,30 @@ type UnsubscribePacket struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Encode encodes and writes the packet data values to the buffer.
|
// Encode encodes and writes the packet data values to the buffer.
|
||||||
func (pk *UnsubscribePacket) Encode(w io.Writer) error {
|
func (pk *UnsubscribePacket) Encode(buf *bytes.Buffer) error {
|
||||||
|
var body bytes.Buffer
|
||||||
|
|
||||||
|
// Add the Packet ID.
|
||||||
|
// [MQTT-2.3.1-1] SUBSCRIBE, UNSUBSCRIBE, and PUBLISH (in cases where QoS > 0) Control Packets MUST contain a non-zero 16-bit Packet Identifier.
|
||||||
|
if pk.PacketID == 0 {
|
||||||
|
return errors.New(ErrMissingPacketID)
|
||||||
|
}
|
||||||
|
|
||||||
|
body.Write(encodeUint16(pk.PacketID))
|
||||||
|
|
||||||
|
// Add all provided topic names and associated QOS flags.
|
||||||
|
for _, topic := range pk.Topics {
|
||||||
|
body.Write(encodeString(topic))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set length.
|
||||||
|
pk.FixedHeader.Remaining = body.Len()
|
||||||
|
pk.FixedHeader.encode(buf)
|
||||||
|
buf.Write(body.Bytes())
|
||||||
|
|
||||||
|
return nil
|
||||||
|
|
||||||
|
/*
|
||||||
var body bytes.Buffer
|
var body bytes.Buffer
|
||||||
|
|
||||||
// Add the Packet ID.
|
// Add the Packet ID.
|
||||||
@@ -41,7 +62,7 @@ func (pk *UnsubscribePacket) Encode(w io.Writer) error {
|
|||||||
_, err := out.WriteTo(w)
|
_, err := out.WriteTo(w)
|
||||||
|
|
||||||
return err
|
return err
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decode extracts the data values from the packet.
|
// Decode extracts the data values from the packet.
|
||||||
|
@@ -22,18 +22,14 @@ func TestUnsubscribeEncode(t *testing.T) {
|
|||||||
require.Equal(t, Unsubscribe, pk.Type, "Mismatched Packet Type [i:%d] %s", i, wanted.desc)
|
require.Equal(t, Unsubscribe, pk.Type, "Mismatched Packet Type [i:%d] %s", i, wanted.desc)
|
||||||
require.Equal(t, Unsubscribe, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d] %s", i, wanted.desc)
|
require.Equal(t, Unsubscribe, pk.FixedHeader.Type, "Mismatched FixedHeader Type [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
var b bytes.Buffer
|
buf := new(bytes.Buffer)
|
||||||
err := pk.Encode(&b)
|
err := pk.Encode(buf)
|
||||||
|
encoded := buf.Bytes()
|
||||||
|
|
||||||
if wanted.expect != nil {
|
if wanted.expect != nil {
|
||||||
|
|
||||||
require.Error(t, err, "Expected error writing buffer [i:%d] %s", i, wanted.desc)
|
require.Error(t, err, "Expected error writing buffer [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
require.NoError(t, err, "Error writing buffer [i:%d] %s", i, wanted.desc)
|
require.NoError(t, err, "Error writing buffer [i:%d] %s", i, wanted.desc)
|
||||||
|
|
||||||
encoded := b.Bytes()
|
|
||||||
|
|
||||||
require.Equal(t, len(wanted.rawBytes), len(encoded), "Mismatched packet length [i:%d] %s", i, wanted.desc)
|
require.Equal(t, len(wanted.rawBytes), len(encoded), "Mismatched packet length [i:%d] %s", i, wanted.desc)
|
||||||
if wanted.meta != nil {
|
if wanted.meta != nil {
|
||||||
require.Equal(t, byte(Unsubscribe<<4)|wanted.meta.(byte), encoded[0], "Mismatched fixed header bytes [i:%d] %s", i, wanted.desc)
|
require.Equal(t, byte(Unsubscribe<<4)|wanted.meta.(byte), encoded[0], "Mismatched fixed header bytes [i:%d] %s", i, wanted.desc)
|
||||||
@@ -50,6 +46,16 @@ func TestUnsubscribeEncode(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkUnsubscribeEncode(b *testing.B) {
|
||||||
|
pk := new(UnsubscribePacket)
|
||||||
|
copier.Copy(pk, expectedPackets[Unsubscribe][0].packet.(*UnsubscribePacket))
|
||||||
|
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
for n := 0; n < b.N; n++ {
|
||||||
|
pk.Encode(buf)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestUnsubscribeDecode(t *testing.T) {
|
func TestUnsubscribeDecode(t *testing.T) {
|
||||||
require.Contains(t, expectedPackets, Unsubscribe)
|
require.Contains(t, expectedPackets, Unsubscribe)
|
||||||
for i, wanted := range expectedPackets[Unsubscribe] {
|
for i, wanted := range expectedPackets[Unsubscribe] {
|
||||||
|
Reference in New Issue
Block a user