216 lines
6.0 KiB
Go
216 lines
6.0 KiB
Go
package mqtpp
|
|
|
|
import "testing"
|
|
|
|
func TestBuildTextMessageServiceEnvelopeRoundTrip(t *testing.T) {
|
|
key, err := ExpandPSK("AQ==")
|
|
if err != nil {
|
|
t.Fatalf("ExpandPSK() error = %v", err)
|
|
}
|
|
|
|
raw, err := BuildTextMessageServiceEnvelope(TextMessageBuildOptions{
|
|
PacketBuildOptions: PacketBuildOptions{
|
|
FromNodeNum: 0x12345678,
|
|
ToNodeNum: NodeNumBroadcast,
|
|
PacketID: 0x87654321,
|
|
ChannelID: "LongFast",
|
|
GatewayID: "!12345678",
|
|
PSK: key,
|
|
Encrypt: true,
|
|
ViaMQTT: true,
|
|
},
|
|
Text: "hello from bot",
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("BuildTextMessageServiceEnvelope() error = %v", err)
|
|
}
|
|
|
|
valid, _, record := MQTTPP("msh/2/e/LongFast/!12345678", raw, key, Options{})
|
|
if !valid {
|
|
t.Fatalf("MQTTPP() valid = false, record = %#v", record)
|
|
}
|
|
if record["type"] != "text_message" {
|
|
t.Fatalf("record type = %v", record["type"])
|
|
}
|
|
if record["text"] != "hello from bot" {
|
|
t.Fatalf("text = %v", record["text"])
|
|
}
|
|
if record["from_num"] != uint32(0x12345678) {
|
|
t.Fatalf("from_num = %v", record["from_num"])
|
|
}
|
|
if record["packet_to_num"] != uint32(NodeNumBroadcast) {
|
|
t.Fatalf("packet_to_num = %v", record["packet_to_num"])
|
|
}
|
|
if record["decrypt_success"] != true {
|
|
t.Fatalf("decrypt_success = %v", record["decrypt_success"])
|
|
}
|
|
}
|
|
|
|
func TestBuildTextMessageServiceEnvelopeDirectRoundTrip(t *testing.T) {
|
|
key, err := ExpandPSK("AQ==")
|
|
if err != nil {
|
|
t.Fatalf("ExpandPSK() error = %v", err)
|
|
}
|
|
|
|
raw, err := BuildTextMessageServiceEnvelope(TextMessageBuildOptions{
|
|
PacketBuildOptions: PacketBuildOptions{
|
|
FromNodeNum: 0x12345678,
|
|
ToNodeNum: 0x10203040,
|
|
PacketID: 0x11111111,
|
|
ChannelID: "LongFast",
|
|
GatewayID: "!12345678",
|
|
PSK: key,
|
|
Encrypt: true,
|
|
ViaMQTT: true,
|
|
},
|
|
Text: "direct hello",
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("BuildTextMessageServiceEnvelope() error = %v", err)
|
|
}
|
|
|
|
valid, _, record := MQTTPP("msh/2/e/LongFast/!12345678", raw, key, Options{})
|
|
if !valid {
|
|
t.Fatalf("MQTTPP() valid = false, record = %#v", record)
|
|
}
|
|
if record["text"] != "direct hello" {
|
|
t.Fatalf("text = %v", record["text"])
|
|
}
|
|
if record["packet_to"] != "!10203040" {
|
|
t.Fatalf("packet_to = %v", record["packet_to"])
|
|
}
|
|
if record["packet_to_num"] != uint32(0x10203040) {
|
|
t.Fatalf("packet_to_num = %v", record["packet_to_num"])
|
|
}
|
|
}
|
|
|
|
func TestBuildNodeInfoServiceEnvelopeRoundTrip(t *testing.T) {
|
|
key, err := ExpandPSK("AQ==")
|
|
if err != nil {
|
|
t.Fatalf("ExpandPSK() error = %v", err)
|
|
}
|
|
|
|
raw, err := BuildNodeInfoServiceEnvelope(NodeInfoBuildOptions{
|
|
PacketBuildOptions: PacketBuildOptions{
|
|
FromNodeNum: 0x12345678,
|
|
ToNodeNum: NodeNumBroadcast,
|
|
PacketID: 0x22222222,
|
|
ChannelID: "LongFast",
|
|
GatewayID: "!12345678",
|
|
PSK: key,
|
|
Encrypt: true,
|
|
ViaMQTT: true,
|
|
},
|
|
NodeID: "!12345678",
|
|
LongName: "MQTT Bot",
|
|
ShortName: "BT",
|
|
HWModel: 255,
|
|
Role: 0,
|
|
IsLicensed: false,
|
|
PublicKey: []byte{1, 2, 3},
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("BuildNodeInfoServiceEnvelope() error = %v", err)
|
|
}
|
|
|
|
valid, _, record := MQTTPP("msh/2/e/LongFast/!12345678", raw, key, Options{})
|
|
if !valid {
|
|
t.Fatalf("MQTTPP() valid = false, record = %#v", record)
|
|
}
|
|
if record["type"] != "nodeinfo" {
|
|
t.Fatalf("record type = %v", record["type"])
|
|
}
|
|
if record["long_name"] != "MQTT Bot" {
|
|
t.Fatalf("long_name = %v", record["long_name"])
|
|
}
|
|
if record["short_name"] != "BT" {
|
|
t.Fatalf("short_name = %v", record["short_name"])
|
|
}
|
|
if record["hw_model"] != "PRIVATE_HW" {
|
|
t.Fatalf("hw_model = %v", record["hw_model"])
|
|
}
|
|
if record["role"] != "CLIENT" {
|
|
t.Fatalf("role = %v", record["role"])
|
|
}
|
|
if record["is_licensed"] != false {
|
|
t.Fatalf("is_licensed = %v", record["is_licensed"])
|
|
}
|
|
if record["public_key"] != "010203" {
|
|
t.Fatalf("public_key = %v", record["public_key"])
|
|
}
|
|
}
|
|
|
|
func TestBuildNodeInfoTruncatesNanopbStrings(t *testing.T) {
|
|
key, err := ExpandPSK("AQ==")
|
|
if err != nil {
|
|
t.Fatalf("ExpandPSK() error = %v", err)
|
|
}
|
|
|
|
raw, err := BuildNodeInfoServiceEnvelope(NodeInfoBuildOptions{
|
|
PacketBuildOptions: PacketBuildOptions{FromNodeNum: 0x12345678, ToNodeNum: NodeNumBroadcast, PacketID: 0x33333333, ChannelID: "LongFast", GatewayID: "!12345678", PSK: key, Encrypt: true, ViaMQTT: true},
|
|
NodeID: "!12345678",
|
|
LongName: "这是一个非常非常非常非常长的机器人节点名称",
|
|
ShortName: "机器人",
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("BuildNodeInfoServiceEnvelope() error = %v", err)
|
|
}
|
|
valid, _, record := MQTTPP("msh/2/e/LongFast/!12345678", raw, key, Options{})
|
|
if !valid {
|
|
t.Fatalf("MQTTPP() valid = false, record = %#v", record)
|
|
}
|
|
if len([]byte(record["long_name"].(string))) > 40 {
|
|
t.Fatalf("long_name byte length = %d", len([]byte(record["long_name"].(string))))
|
|
}
|
|
if len([]byte(record["short_name"].(string))) > 5 {
|
|
t.Fatalf("short_name byte length = %d", len([]byte(record["short_name"].(string))))
|
|
}
|
|
}
|
|
|
|
func TestBuildAckServiceEnvelopeRoundTrip(t *testing.T) {
|
|
key, err := ExpandPSK("AQ==")
|
|
if err != nil {
|
|
t.Fatalf("ExpandPSK: %v", err)
|
|
}
|
|
const requestID uint32 = 0xabcd1234
|
|
raw, err := BuildAckServiceEnvelope(AckBuildOptions{
|
|
PacketBuildOptions: PacketBuildOptions{
|
|
FromNodeNum: 0x10101010,
|
|
ToNodeNum: 0x20202020,
|
|
PacketID: 0x30303030,
|
|
ChannelID: "LongFast",
|
|
GatewayID: "!10101010",
|
|
PSK: key,
|
|
Encrypt: true,
|
|
ViaMQTT: true,
|
|
},
|
|
RequestID: requestID,
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("BuildAckServiceEnvelope: %v", err)
|
|
}
|
|
valid, _, record := MQTTPP("msh/2/e/LongFast/!10101010", raw, key, Options{})
|
|
if !valid {
|
|
t.Fatalf("MQTTPP not valid: %#v", record)
|
|
}
|
|
if record["portnum"] != "ROUTING_APP" {
|
|
t.Fatalf("portnum = %v", record["portnum"])
|
|
}
|
|
if record["type"] != "routing" {
|
|
t.Fatalf("type = %v", record["type"])
|
|
}
|
|
}
|
|
|
|
func TestParseNodeID(t *testing.T) {
|
|
num, err := ParseNodeID("!1234abcd")
|
|
if err != nil {
|
|
t.Fatalf("ParseNodeID() error = %v", err)
|
|
}
|
|
if num != 0x1234abcd {
|
|
t.Fatalf("num = %#x", num)
|
|
}
|
|
if NodeNumToID(num) != "!1234abcd" {
|
|
t.Fatalf("NodeNumToID() = %s", NodeNumToID(num))
|
|
}
|
|
}
|