robocar-camera/camera/camera_test.go

86 lines
1.9 KiB
Go

package camera
import (
"bytes"
"github.com/cyrilix/robocar-protobuf/go/events"
mqtt "github.com/eclipse/paho.mqtt.golang"
"github.com/golang/protobuf/proto"
"go.uber.org/zap"
"gocv.io/x/gocv"
"image/jpeg"
"sync"
"testing"
)
type fakeVideoSource struct {
}
func (f fakeVideoSource) Close() error {
return nil
}
func (f fakeVideoSource) Read(dest *gocv.Mat) bool {
img := gocv.IMRead("testdata/img.jpg", gocv.IMReadUnchanged)
if img.Total() == 0 {
zap.S().Info("image read is empty")
return false
}
img.CopyTo(dest)
return true
}
func TestOpencvCameraPart(t *testing.T) {
var muPubEvents sync.Mutex
publishedEvents := make(map[string]*[]byte)
oldPublish := publish
defer func() {
publish = oldPublish
}()
waitEvent := sync.WaitGroup{}
waitEvent.Add(1)
publish = func(_ mqtt.Client, topic string, payload *[]byte) {
muPubEvents.Lock()
defer muPubEvents.Unlock()
publishedEvents[topic] = payload
waitEvent.Done()
}
const topic = "topic/test/camera"
imgBuffer := gocv.NewMat()
part := OpencvCameraPart{
client: nil,
vc: fakeVideoSource{},
topic: topic,
publishFrequency: 2, // Send 2 img/s for tests
imgBuffered: &imgBuffer,
}
go part.Start()
waitEvent.Wait()
var frameMsg events.FrameMessage
muPubEvents.Lock()
err := proto.Unmarshal(*(publishedEvents[topic]), &frameMsg)
if err != nil {
t.Errorf("unable to unmarshal pubblished frame")
}
muPubEvents.Unlock()
if frameMsg.GetId().GetName() != "camera" {
t.Errorf("bad name frame: %v, wants %v", frameMsg.GetId().GetName(), "camera")
}
if len(frameMsg.GetId().GetId()) != 13 {
t.Errorf("bad id length: %v, wants %v", len(frameMsg.GetId().GetId()), 13)
}
if frameMsg.GetId().GetCreatedAt() == nil {
t.Errorf("missin CreatedAt field")
}
_, err = jpeg.Decode(bytes.NewReader(frameMsg.GetFrame()))
if err != nil {
t.Errorf("image published can't be decoded: %v", err)
}
}