package onvif import ( "html" "net/url" "strings" "testing" "github.com/stretchr/testify/require" ) func TestGetStreamUri(t *testing.T) { tests := []struct { name string xml string url string }{ { name: "Dahua stream default", xml: `rtsp://192.168.1.123:554/cam/realmonitor?channel=1&subtype=1&unicast=true&proto=OnviftruetruePT0S`, url: "rtsp://192.168.1.123:554/cam/realmonitor?channel=1&subtype=1&unicast=true&proto=Onvif", }, { name: "Dahua snapshot default", xml: `http://192.168.1.123/onvifsnapshot/media_service/snapshot?channel=1&subtype=1falsefalsePT0S`, url: "http://192.168.1.123/onvifsnapshot/media_service/snapshot?channel=1&subtype=1", }, { name: "Dahua stream formatted", xml: ` rtsp://192.168.1.123:554/cam/realmonitor?channel=1&subtype=1&unicast=true&proto=Onvif true true PT0S `, url: "rtsp://192.168.1.123:554/cam/realmonitor?channel=1&subtype=1&unicast=true&proto=Onvif", }, { name: "Dahua snapshot formatted", xml: ` http://192.168.1.123/onvifsnapshot/media_service/snapshot?channel=1&subtype=1 false false PT0S `, url: "http://192.168.1.123/onvifsnapshot/media_service/snapshot?channel=1&subtype=1", }, { name: "Unknown", xml: ` rtsp://192.168.5.53:8090/profile1=r `, url: "rtsp://192.168.5.53:8090/profile1=r", }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { uri := FindTagValue([]byte(test.xml), "Uri") uri = strings.TrimSpace(html.UnescapeString(uri)) u, err := url.Parse(uri) require.Nil(t, err) require.Equal(t, test.url, u.String()) }) } } func TestGetCapabilities(t *testing.T) { tests := []struct { name string xml string }{ { name: "Dahua default", xml: `http://192.168.1.123/onvif/analytics_servicetruetruehttp://192.168.1.123/onvif/device_servicefalsefalsefalsefalsefalsefalsetruefalsefalsetruetrue200210220230240242161218061812190619122006truefalsefalsefalse21falsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalse0falsehttp://192.168.1.123/onvif/event_servicetruetruefalsehttp://192.168.1.123/onvif/imaging_servicehttp://192.168.1.123/onvif/media_servicetruetruetrue6http://192.168.1.123/onvif/deviceIO_service10111`, }, { name: "Dahua formatted", xml: ` http://192.168.1.123/onvif/analytics_service true true http://192.168.1.123/onvif/device_service false false false false false ... 2 1 false ... http://192.168.1.123/onvif/event_service true true false http://192.168.1.123/onvif/imaging_service http://192.168.1.123/onvif/media_service true true true 6 http://192.168.1.123/onvif/deviceIO_service 1 0 1 1 1 `, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { rawURL := FindTagValue([]byte(test.xml), "Media.+?XAddr") require.Equal(t, "http://192.168.1.123/onvif/media_service", rawURL) rawURL = FindTagValue([]byte(test.xml), "Imaging.+?XAddr") require.Equal(t, "http://192.168.1.123/onvif/imaging_service", rawURL) }) } }