robocar-camera/pkg/camera/camera_test.go

102 lines
2.4 KiB
Go
Raw Permalink Normal View History

2019-12-18 23:08:07 +00:00
package camera
import (
"bytes"
"github.com/cyrilix/robocar-protobuf/go/events"
mqtt "github.com/eclipse/paho.mqtt.golang"
2021-10-12 16:26:57 +00:00
"go.uber.org/zap"
2019-12-18 23:08:07 +00:00
"gocv.io/x/gocv"
2022-01-03 18:21:35 +00:00
"google.golang.org/protobuf/proto"
2019-12-18 23:08:07 +00:00
"image/jpeg"
"sync"
2019-12-18 23:08:07 +00:00
"testing"
)
type fakeVideoSource struct {
}
func (f fakeVideoSource) Close() error {
return nil
2019-12-18 23:08:07 +00:00
}
func (f fakeVideoSource) Read(dest *gocv.Mat) bool {
img := gocv.IMRead("testdata/img.jpg", gocv.IMReadUnchanged)
if img.Total() == 0 {
2021-10-12 16:26:57 +00:00
zap.S().Info("image read is empty")
2019-12-18 23:08:07 +00:00
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() {
2020-01-28 22:30:38 +00:00
publish = oldPublish
}()
2021-09-09 21:19:39 +00:00
waitEvent := sync.WaitGroup{}
waitEvent.Add(2)
2020-01-28 22:30:38 +00:00
publish = func(_ mqtt.Client, topic string, payload *[]byte) {
muPubEvents.Lock()
defer muPubEvents.Unlock()
publishedEvents[topic] = payload
2021-09-09 21:19:39 +00:00
waitEvent.Done()
}
2019-12-18 23:08:07 +00:00
const topic = "topic/test/camera"
const topicRoi = "topic/test/camera-roi"
2019-12-18 23:08:07 +00:00
imgBuffer := gocv.NewMat()
part := OpencvCameraPart{
2020-01-28 22:30:38 +00:00
client: nil,
2019-12-18 23:08:07 +00:00
vc: fakeVideoSource{},
topic: topic,
topicRoi: topicRoi,
2021-09-09 21:19:39 +00:00
publishFrequency: 2, // Send 2 img/s for tests
2019-12-18 23:08:07 +00:00
imgBuffered: &imgBuffer,
horizon: 30,
2019-12-18 23:08:07 +00:00
}
go part.Start()
2021-09-09 21:19:39 +00:00
waitEvent.Wait()
2019-12-18 23:08:07 +00:00
for _, tpc := range []string{topic, topicRoi} {
var frameMsg events.FrameMessage
muPubEvents.Lock()
err := proto.Unmarshal(*(publishedEvents[tpc]), &frameMsg)
if err != nil {
t.Errorf("unable to unmarshal published frame to topic %v", tpc)
}
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)
}
2019-12-18 23:08:07 +00:00
// Uncomment to debug image cropping
/*
2022-01-03 18:21:35 +00:00
dir, f := path.Split(fmt.Sprintf("/tmp/%s.jpg", tpc))
os.MkdirAll(dir, os.FileMode(0755))
err = ioutil.WriteFile(path.Join(dir, f), frameMsg.GetFrame(), os.FileMode(0644) )
if err != nil {
t.Errorf("unable to write image for topic %s: %v", tpc, err)
}
*/
2019-12-18 23:08:07 +00:00
}
}