Files
onvif-go/server copy/device_test.go
T
2026-01-16 04:11:59 +00:00

388 lines
9.0 KiB
Go

package server
import (
"encoding/xml"
"testing"
)
func TestHandleGetDeviceInformation(t *testing.T) {
config := createTestConfig()
server, _ := New(config)
resp, err := server.HandleGetDeviceInformation(nil)
if err != nil {
t.Fatalf("HandleGetDeviceInformation() error = %v", err)
}
deviceResp, ok := resp.(*GetDeviceInformationResponse)
if !ok {
t.Fatalf("Response is not GetDeviceInformationResponse, got %T", resp)
}
tests := []struct {
name string
got string
want string
}{
{"Manufacturer", deviceResp.Manufacturer, config.DeviceInfo.Manufacturer},
{"Model", deviceResp.Model, config.DeviceInfo.Model},
{"FirmwareVersion", deviceResp.FirmwareVersion, config.DeviceInfo.FirmwareVersion},
{"SerialNumber", deviceResp.SerialNumber, config.DeviceInfo.SerialNumber},
{"HardwareID", deviceResp.HardwareID, config.DeviceInfo.HardwareID},
}
for _, tt := range tests {
if tt.got != tt.want {
t.Errorf("%s mismatch: got %s, want %s", tt.name, tt.got, tt.want)
}
}
}
func TestHandleGetCapabilities(t *testing.T) {
config := createTestConfig()
server, _ := New(config)
resp, err := server.HandleGetCapabilities(nil)
if err != nil {
t.Fatalf("HandleGetCapabilities() error = %v", err)
}
capsResp, ok := resp.(*GetCapabilitiesResponse)
if !ok {
t.Fatalf("Response is not GetCapabilitiesResponse, got %T", resp)
}
if capsResp.Capabilities == nil {
t.Error("Capabilities is nil")
return
}
// Check device capabilities
if capsResp.Capabilities.Device == nil {
t.Error("Device capabilities is nil")
}
// Check media capabilities
if capsResp.Capabilities.Media == nil {
t.Error("Media capabilities is nil")
}
// Check PTZ capabilities if supported
if config.SupportPTZ && capsResp.Capabilities.PTZ == nil {
t.Error("PTZ capabilities is nil but PTZ is supported")
}
// Check Imaging capabilities if supported
if config.SupportImaging && capsResp.Capabilities.Imaging == nil {
t.Error("Imaging capabilities is nil but Imaging is supported")
}
}
func TestHandleGetSystemDateAndTime(t *testing.T) {
config := createTestConfig()
server, _ := New(config)
resp, err := server.HandleGetSystemDateAndTime(nil)
if err != nil {
t.Fatalf("HandleGetSystemDateAndTime() error = %v", err)
}
// Response should be a map or interface
if resp == nil {
t.Error("Response is nil")
return
}
}
func TestHandleGetServices(t *testing.T) {
config := createTestConfig()
server, _ := New(config)
resp, err := server.HandleGetServices(nil)
if err != nil {
t.Fatalf("HandleGetServices() error = %v", err)
}
servicesResp, ok := resp.(*GetServicesResponse)
if !ok {
t.Fatalf("Response is not GetServicesResponse, got %T", resp)
}
if len(servicesResp.Service) == 0 {
t.Error("No services returned")
return
}
// Check that device and media services are present
hasDeviceService := false
hasMediaService := false
for _, service := range servicesResp.Service {
if service.Namespace == "http://www.onvif.org/ver10/device/wsdl" {
hasDeviceService = true
}
if service.Namespace == "http://www.onvif.org/ver10/media/wsdl" {
hasMediaService = true
}
}
if !hasDeviceService {
t.Error("Device service not found")
}
if !hasMediaService {
t.Error("Media service not found")
}
}
func TestHandleSystemReboot(t *testing.T) {
config := createTestConfig()
server, _ := New(config)
resp, err := server.HandleSystemReboot(nil)
if err != nil {
t.Fatalf("HandleSystemReboot() error = %v", err)
}
rebootResp, ok := resp.(*SystemRebootResponse)
if !ok {
t.Fatalf("Response is not SystemRebootResponse, got %T", resp)
}
if rebootResp.Message == "" {
t.Error("Reboot message is empty")
}
}
func TestGetDeviceInformationResponseXML(t *testing.T) {
resp := &GetDeviceInformationResponse{
Manufacturer: "TestManu",
Model: "TestModel",
FirmwareVersion: "1.0.0",
SerialNumber: "SN123",
HardwareID: "HW001",
}
// Marshal to XML
data, err := xml.Marshal(resp)
if err != nil {
t.Fatalf("Failed to marshal response: %v", err)
}
// Unmarshal back
var unmarshaled GetDeviceInformationResponse
err = xml.Unmarshal(data, &unmarshaled)
if err != nil {
t.Fatalf("Failed to unmarshal response: %v", err)
}
if unmarshaled.Manufacturer != resp.Manufacturer {
t.Errorf("Manufacturer mismatch: %s != %s", unmarshaled.Manufacturer, resp.Manufacturer)
}
if unmarshaled.Model != resp.Model {
t.Errorf("Model mismatch: %s != %s", unmarshaled.Model, resp.Model)
}
}
func TestCapabilitiesStructure(t *testing.T) {
caps := &Capabilities{
Device: &DeviceCapabilities{
XAddr: "http://localhost:8080/onvif/device_service",
Network: &NetworkCapabilities{
IPFilter: true,
ZeroConfiguration: true,
IPVersion6: true,
DynDNS: false,
},
System: &SystemCapabilities{
DiscoveryResolve: true,
DiscoveryBye: true,
RemoteDiscovery: false,
SystemBackup: true,
SystemLogging: true,
FirmwareUpgrade: true,
},
},
Media: &MediaCapabilities{
XAddr: "http://localhost:8080/onvif/media_service",
StreamingCapabilities: &StreamingCapabilities{
RTPMulticast: true,
RTPTCP: true,
RTPRTSPTCP: true,
},
},
}
// Test that capabilities are properly structured
if caps.Device == nil || caps.Device.XAddr == "" {
t.Error("Device capabilities not properly set")
}
if caps.Media == nil || caps.Media.XAddr == "" {
t.Error("Media capabilities not properly set")
}
// Test network capabilities
if !caps.Device.Network.IPFilter {
t.Error("IPFilter should be true")
}
// Test system capabilities
if !caps.Device.System.SystemBackup {
t.Error("SystemBackup should be true")
}
}
func TestMediaCapabilitiesStructure(t *testing.T) {
caps := &MediaCapabilities{
XAddr: "http://localhost:8080/onvif/media_service",
StreamingCapabilities: &StreamingCapabilities{
RTPMulticast: true,
RTPTCP: true,
RTPRTSPTCP: true,
},
}
if caps.StreamingCapabilities == nil {
t.Error("StreamingCapabilities is nil")
}
if !caps.StreamingCapabilities.RTPMulticast {
t.Error("RTP Multicast should be supported")
}
if !caps.StreamingCapabilities.RTPTCP {
t.Error("RTP TCP should be supported")
}
if !caps.StreamingCapabilities.RTPRTSPTCP {
t.Error("RTSP should be supported")
}
}
func TestHandleSnapshot(t *testing.T) {
config := createTestConfig()
server, _ := New(config)
// The snapshot handler is tested via HTTP in integration tests
// Here we just verify the configuration is available
profiles := server.ListProfiles()
if len(profiles) == 0 {
t.Error("No profiles available for snapshot")
return
}
if !profiles[0].Snapshot.Enabled {
t.Error("Snapshot should be enabled in test config")
}
}
func TestHandleGetCapabilitiesDetails(t *testing.T) {
config := createTestConfig()
server, _ := New(config)
resp, err := server.HandleGetCapabilities(nil)
if err != nil {
t.Fatalf("HandleGetCapabilities error: %v", err)
}
capsResp, ok := resp.(*GetCapabilitiesResponse)
if !ok {
t.Fatalf("Response is not GetCapabilitiesResponse: %T", resp)
}
if capsResp.Capabilities == nil {
t.Error("Capabilities is nil")
return
}
if capsResp.Capabilities.Device == nil {
t.Error("Device capabilities is nil")
}
if capsResp.Capabilities.Media == nil {
t.Error("Media capabilities is nil")
}
// Check device capabilities structure
devCaps := capsResp.Capabilities.Device
if devCaps.XAddr == "" {
t.Error("Device XAddr is empty")
}
if devCaps.Network == nil {
t.Error("Network capabilities is nil")
}
if devCaps.System == nil {
t.Error("System capabilities is nil")
}
}
func TestHandleGetServicesDetails(t *testing.T) {
config := createTestConfig()
server, _ := New(config)
resp, err := server.HandleGetServices(nil)
if err != nil {
t.Fatalf("HandleGetServices error: %v", err)
}
servResp, ok := resp.(*GetServicesResponse)
if !ok {
t.Fatalf("Response is not GetServicesResponse: %T", resp)
}
if len(servResp.Service) == 0 {
t.Error("No services returned")
return
}
// Check service structure
for _, svc := range servResp.Service {
if svc.Namespace == "" {
t.Error("Service Namespace is empty")
}
if svc.XAddr == "" {
t.Error("Service XAddr is empty")
}
}
}
func TestGetCapabilitiesResponse(t *testing.T) {
caps := &Capabilities{
Device: &DeviceCapabilities{
XAddr: "http://localhost:8080/device",
Network: &NetworkCapabilities{
IPFilter: true,
ZeroConfiguration: true,
IPVersion6: true,
},
System: &SystemCapabilities{
DiscoveryResolve: true,
DiscoveryBye: true,
SystemBackup: true,
},
},
Media: &MediaCapabilities{
XAddr: "http://localhost:8080/media",
StreamingCapabilities: &StreamingCapabilities{
RTPMulticast: true,
RTPTCP: true,
RTPRTSPTCP: true,
},
},
}
resp := &GetCapabilitiesResponse{
Capabilities: caps,
}
if resp.Capabilities == nil {
t.Error("Capabilities is nil in response")
}
if resp.Capabilities.Device == nil {
t.Error("Device capabilities is nil in response")
}
}