feat: build vehicle data platform and production pipeline
This commit is contained in:
76
go/vehicle-gateway/internal/gateway/fields_test.go
Normal file
76
go/vehicle-gateway/internal/gateway/fields_test.go
Normal file
@@ -0,0 +1,76 @@
|
||||
package gateway
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"lingniu-vehicle-ingest/go/vehicle-gateway/internal/envelope"
|
||||
)
|
||||
|
||||
func TestCanonicalRawEnvelopeDropsBareStandardizedFields(t *testing.T) {
|
||||
original := envelope.FrameEnvelope{
|
||||
Protocol: envelope.ProtocolJT808,
|
||||
EventKind: envelope.EventKindFields,
|
||||
Parsed: map[string]any{
|
||||
"location": map[string]any{"latitude": 30.5, "speed_kmh": 20},
|
||||
},
|
||||
Fields: map[string]any{
|
||||
envelope.FieldLatitude: 30.5,
|
||||
envelope.FieldSpeedKMH: 20,
|
||||
},
|
||||
ParsedFields: map[string]any{
|
||||
"jt808.location.latitude": 30.5,
|
||||
"jt808.location.speed_kmh": 20,
|
||||
},
|
||||
}
|
||||
|
||||
canonical := canonicalRawEnvelope(original)
|
||||
if canonical.EventKind != envelope.EventKindRaw {
|
||||
t.Fatalf("event kind = %q", canonical.EventKind)
|
||||
}
|
||||
if len(canonical.Fields) != 0 {
|
||||
t.Fatalf("canonical raw leaked bare fields: %#v", canonical.Fields)
|
||||
}
|
||||
if len(canonical.Parsed) != 0 {
|
||||
t.Fatalf("canonical raw leaked duplicate parsed tree: %#v", canonical.Parsed)
|
||||
}
|
||||
if len(canonical.ParsedFields) != 2 {
|
||||
t.Fatalf("canonical raw lost protocol fields: %#v", canonical.ParsedFields)
|
||||
}
|
||||
if len(original.Fields) != 2 {
|
||||
t.Fatalf("canonical copy mutated in-process parser fields: %#v", original.Fields)
|
||||
}
|
||||
if len(original.Parsed) != 1 {
|
||||
t.Fatalf("canonical copy mutated in-process parsed tree: %#v", original.Parsed)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCanonicalRawEnvelopeReducesDuplicateParsedPayload(t *testing.T) {
|
||||
original := envelope.FrameEnvelope{
|
||||
Protocol: envelope.ProtocolGB32960,
|
||||
MessageID: "0x02",
|
||||
VIN: "LTESTVIN000000001",
|
||||
ParseStatus: envelope.ParseOK,
|
||||
Parsed: map[string]any{
|
||||
"data_units": []any{map[string]any{
|
||||
"name": "vendor",
|
||||
"value": strings.Repeat("x", 4096),
|
||||
}},
|
||||
},
|
||||
ParsedFields: map[string]any{
|
||||
"gb32960.vendor.value": strings.Repeat("x", 4096),
|
||||
},
|
||||
}
|
||||
before, err := original.MarshalJSONBytes()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
after, err := canonicalRawEnvelope(original).MarshalJSONBytes()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(after)*100 >= len(before)*65 {
|
||||
t.Fatalf("canonical raw should remove the duplicate parsed tree: before=%d after=%d", len(before), len(after))
|
||||
}
|
||||
t.Logf("canonical raw bytes before=%d after=%d reduction=%.1f%%", len(before), len(after), 100*(1-float64(len(after))/float64(len(before))))
|
||||
}
|
||||
Reference in New Issue
Block a user