99 lines
4.1 KiB
Go
99 lines
4.1 KiB
Go
package admission
|
|
|
|
import (
|
|
"context"
|
|
"encoding/base64"
|
|
"testing"
|
|
"yovision.local/sense/app/sense/adapters/onvif"
|
|
"yovision.local/sense/app/sense/adapters/rtsp"
|
|
"yovision.local/sense/app/sense/device"
|
|
"yovision.local/sense/app/sense/identity"
|
|
"yovision.local/sense/internal/platform"
|
|
)
|
|
|
|
type fakeONVIF struct{}
|
|
|
|
func (fakeONVIF) Profiles(context.Context, string, onvif.Credential) ([]onvif.Profile, error) {
|
|
return []onvif.Profile{{Token: "main", Name: "主码流", Width: 1920, Height: 1080, Encoding: "H264", StreamURI: "rtsp://camera.invalid/main"}, {Token: "sub", Name: "子码流", Width: 640, Height: 360, Encoding: "H264", StreamURI: "rtsp://camera.invalid/sub"}}, nil
|
|
}
|
|
|
|
type fakeRTSP struct{}
|
|
|
|
func (fakeRTSP) Verify(context.Context, string, rtsp.Credential) (rtsp.Result, error) {
|
|
return rtsp.Result{Status: "ready"}, nil
|
|
}
|
|
|
|
type credentialCapturingONVIF struct{ got onvif.Credential }
|
|
|
|
func (f *credentialCapturingONVIF) Profiles(_ context.Context, _ string, credential onvif.Credential) ([]onvif.Profile, error) {
|
|
f.got = credential
|
|
return fakeONVIF{}.Profiles(context.Background(), "", credential)
|
|
}
|
|
|
|
type credentialCapturingRTSP struct{ got rtsp.Credential }
|
|
|
|
func (f *credentialCapturingRTSP) Verify(_ context.Context, _ string, credential rtsp.Credential) (rtsp.Result, error) {
|
|
f.got = credential
|
|
return rtsp.Result{Status: "ready"}, nil
|
|
}
|
|
func TestProbeProfilesWithoutCredentialURI(t *testing.T) {
|
|
vault, err := device.NewCredentialVault(base64.StdEncoding.EncodeToString([]byte("0123456789abcdef0123456789abcdef")), false)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
store := device.NewMemoryStore()
|
|
deviceService := device.NewService(store, vault)
|
|
module := device.NewModule(deviceService)
|
|
module.Register(platform.NewApp(platform.Config{DatabaseMode: platform.DatabaseModeMemory}, nil, nil))
|
|
item, err := deviceService.Create(context.Background(), identity.Principal{}, "camera", "", device.ModalityVideo, nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err = deviceService.SetCredential(context.Background(), identity.Principal{}, item.ID, "fixture-user", "fixture-password"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
service := NewService(fakeONVIF{}, fakeRTSP{}, "")
|
|
result, err := service.Probe(context.Background(), identity.Principal{}, item.ID, "http://camera.invalid/onvif/device_service")
|
|
if err != nil || result.Status != "ready" || result.Profiles[0].Kind != "main" || result.Profiles[1].Kind != "sub" {
|
|
t.Fatalf("result=%#v err=%v", result, err)
|
|
}
|
|
}
|
|
|
|
func TestProbeUsesSeparateCredentialsPersistsProfilesAndActivatesDevice(t *testing.T) {
|
|
vault, err := device.NewCredentialVault(base64.StdEncoding.EncodeToString([]byte("0123456789abcdef0123456789abcdef")), false)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
deviceStore := device.NewMemoryStore()
|
|
deviceService := device.NewService(deviceStore, vault)
|
|
device.NewModule(deviceService).Register(platform.NewApp(platform.Config{DatabaseMode: platform.DatabaseModeMemory}, nil, nil))
|
|
item, err := deviceService.Create(context.Background(), identity.Principal{}, "camera", "gate", device.ModalityVideo, nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err = deviceService.SetCredentials(context.Background(), identity.Principal{}, item.ID, "onvif-user", "onvif-password", false, "rtsp-user", "rtsp-password"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
onvifClient := &credentialCapturingONVIF{}
|
|
rtspVerifier := &credentialCapturingRTSP{}
|
|
store := NewMemoryStore()
|
|
service := NewService(onvifClient, rtspVerifier, "", store)
|
|
result, err := service.Probe(context.Background(), identity.Principal{}, item.ID, "http://camera.invalid/onvif/device_service")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if onvifClient.got.Username != "onvif-user" || rtspVerifier.got.Username != "rtsp-user" {
|
|
t.Fatal("credentials were not separated")
|
|
}
|
|
restarted := NewService(onvifClient, rtspVerifier, "", store)
|
|
persisted, ok := restarted.Get(item.ID)
|
|
if !ok || len(persisted.Profiles) != len(result.Profiles) {
|
|
t.Fatalf("persisted=%#v", persisted)
|
|
}
|
|
updated, err := deviceService.Get(context.Background(), item.ID)
|
|
if err != nil || updated.Status != device.StatusActive {
|
|
t.Fatalf("device=%#v err=%v", updated, err)
|
|
}
|
|
}
|
|
|