121 lines
3.5 KiB
Go
121 lines
3.5 KiB
Go
package loadsim
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"lingniu-vehicle-ingest/go/vehicle-gateway/internal/protocol/gb32960"
|
|
"lingniu-vehicle-ingest/go/vehicle-gateway/internal/protocol/jt808"
|
|
)
|
|
|
|
func TestFrameFactoryGeneratesUniqueParsableJT808Frames(t *testing.T) {
|
|
factory, err := NewFrameFactory(ProtocolJT808, "0200")
|
|
if err != nil {
|
|
t.Fatalf("NewFrameFactory() error = %v", err)
|
|
}
|
|
|
|
first, err := factory.Frame(0, 0)
|
|
if err != nil {
|
|
t.Fatalf("first Frame() error = %v", err)
|
|
}
|
|
second, err := factory.Frame(1, 2)
|
|
if err != nil {
|
|
t.Fatalf("second Frame() error = %v", err)
|
|
}
|
|
if string(first) == string(second) {
|
|
t.Fatal("variant frames should not be byte-identical")
|
|
}
|
|
|
|
firstEnv := parseJT808Frame(t, first)
|
|
secondEnv := parseJT808Frame(t, second)
|
|
if firstEnv.Phone == secondEnv.Phone {
|
|
t.Fatalf("phones should differ, both %q", firstEnv.Phone)
|
|
}
|
|
if firstEnv.Sequence == secondEnv.Sequence {
|
|
t.Fatalf("sequences should differ, both %d", firstEnv.Sequence)
|
|
}
|
|
if firstEnv.StableEventID() == secondEnv.StableEventID() {
|
|
t.Fatal("stable event ids should differ")
|
|
}
|
|
}
|
|
|
|
func TestFrameFactoryUsesConfiguredJT808PhoneBase(t *testing.T) {
|
|
factory, err := NewFrameFactoryWithJT808PhoneBase(ProtocolJT808, "0200", 138900000000)
|
|
if err != nil {
|
|
t.Fatalf("NewFrameFactoryWithJT808PhoneBase() error = %v", err)
|
|
}
|
|
frame, err := factory.Frame(42, 0)
|
|
if err != nil {
|
|
t.Fatalf("Frame() error = %v", err)
|
|
}
|
|
if got := parseJT808Frame(t, frame).Phone; got != "138900000042" {
|
|
t.Fatalf("phone = %q, want 138900000042", got)
|
|
}
|
|
}
|
|
|
|
func TestFrameFactoryGeneratesUniqueParsableGB32960Frames(t *testing.T) {
|
|
factory, err := NewFrameFactory(ProtocolGB32960, "realtime")
|
|
if err != nil {
|
|
t.Fatalf("NewFrameFactory() error = %v", err)
|
|
}
|
|
|
|
first, err := factory.Frame(0, 0)
|
|
if err != nil {
|
|
t.Fatalf("first Frame() error = %v", err)
|
|
}
|
|
second, err := factory.Frame(1, 2)
|
|
if err != nil {
|
|
t.Fatalf("second Frame() error = %v", err)
|
|
}
|
|
if string(first) == string(second) {
|
|
t.Fatal("variant frames should not be byte-identical")
|
|
}
|
|
|
|
firstEnv := parseGB32960Frame(t, first)
|
|
secondEnv := parseGB32960Frame(t, second)
|
|
if firstEnv.VIN == secondEnv.VIN {
|
|
t.Fatalf("VINs should differ, both %q", firstEnv.VIN)
|
|
}
|
|
if firstEnv.StableEventID() == secondEnv.StableEventID() {
|
|
t.Fatal("stable event ids should differ")
|
|
}
|
|
}
|
|
|
|
func parseJT808Frame(t *testing.T, frame []byte) parsedEnvelope {
|
|
t.Helper()
|
|
frames, remainder, err := jt808.ExtractFrames(frame)
|
|
if err != nil {
|
|
t.Fatalf("ExtractFrames() error = %v", err)
|
|
}
|
|
if len(remainder) != 0 || len(frames) != 1 {
|
|
t.Fatalf("unexpected split frames=%d remainder=%x", len(frames), remainder)
|
|
}
|
|
env, err := jt808.ParseFrame(frames[0], 1782918600000, "127.0.0.1:808")
|
|
if err != nil {
|
|
t.Fatalf("ParseFrame() error = %v", err)
|
|
}
|
|
return parsedEnvelope{Phone: env.Phone, VIN: env.VIN, Sequence: env.Sequence, StableEventID: env.StableEventID}
|
|
}
|
|
|
|
func parseGB32960Frame(t *testing.T, frame []byte) parsedEnvelope {
|
|
t.Helper()
|
|
frames, remainder, err := gb32960.ExtractFrames(frame)
|
|
if err != nil {
|
|
t.Fatalf("ExtractFrames() error = %v", err)
|
|
}
|
|
if len(remainder) != 0 || len(frames) != 1 {
|
|
t.Fatalf("unexpected split frames=%d remainder=%x", len(frames), remainder)
|
|
}
|
|
env, err := gb32960.ParseFrame(frames[0], 1782918600000, "127.0.0.1:32960")
|
|
if err != nil {
|
|
t.Fatalf("ParseFrame() error = %v", err)
|
|
}
|
|
return parsedEnvelope{Phone: env.Phone, VIN: env.VIN, Sequence: env.Sequence, StableEventID: env.StableEventID}
|
|
}
|
|
|
|
type parsedEnvelope struct {
|
|
Phone string
|
|
VIN string
|
|
Sequence uint16
|
|
StableEventID func() string
|
|
}
|