internal/blegateway/relay_test.go
raw ยท 1911 bytes
package blegateway
import (
"encoding/binary"
"testing"
)
func TestRelayResponses(t *testing.T) {
sid := uint32(0x12345678)
seq := uint16(8)
good := packet(0x11, sid, seq, 0, 2, []byte{0x90, 0})
data, ready, e := parseResponse(good, sid, seq)
if e != nil || !ready || len(data) != 2 {
t.Fatal("valid response rejected")
}
for _, b := range [][]byte{packet(0x11, sid-1, seq, 0, 2, []byte{0x90, 0}), packet(0x11, sid, seq-1, 0, 2, []byte{0x90, 0}), packet(0x10, sid, seq, 0, 0, nil)} {
_, ready, e := parseResponse(b, sid, seq)
if e != nil || ready {
t.Fatal("stale or pending response accepted")
}
}
for _, b := range [][]byte{good[:13], packet(0x11, sid, seq, 1, 2, []byte{0x90, 0}), packet(0x12, sid, seq, 0, 1, []byte{3}), packet(0x11, sid, seq, 0, 1, []byte{0x90})} {
if _, _, e := parseResponse(b, sid, seq); e == nil {
t.Fatal("malformed/error response accepted")
}
}
}
func TestCardSession(t *testing.T) {
b := make([]byte, 18)
b[0] = 1
b[1] = 1
b[2] = 4
b[3] = 0x20
binary.BigEndian.PutUint32(b[4:], 123)
copy(b[8:], []byte{1, 2, 3, 4})
c, e := parseCard(b)
if e != nil || c.Session != 123 || len(c.UID) != 4 || c.SAK != 0x20 {
t.Fatal("card status rejected")
}
b[2] = 11
if _, e := parseCard(b); e == nil {
t.Fatal("bad UID accepted")
}
}
func TestECPConfiguration(t *testing.T) {
group := []byte{1, 2, 3, 4, 5, 6, 7, 8}
b, err := ecpConfigPacket(group)
if err != nil || len(b) != 20 || b[1] != 3 || binary.BigEndian.Uint16(b[10:]) != 8 {
t.Fatal("bad ECP packet")
}
for _, v := range b[2:10] {
if v != 0 {
t.Fatal("configuration must be session-independent")
}
}
for i, v := range group {
if b[12+i] != v {
t.Fatal("wrong group")
}
}
b, err = ecpConfigPacket(nil)
if err != nil || len(b) != 12 {
t.Fatal("bad disable packet")
}
if _, err = ecpConfigPacket(group[:7]); err == nil {
t.Fatal("accepted invalid group")
}
}