Files
onvif-go/device_storage_test.go
T

272 lines
7.7 KiB
Go

package onvif
import (
"context"
"net/http"
"net/http/httptest"
"strings"
"testing"
)
func newMockDeviceStorageServer() *httptest.Server {
return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/soap+xml")
// Parse request to determine which operation
buf := make([]byte, r.ContentLength)
_, _ = r.Body.Read(buf)
requestBody := string(buf)
var response string
switch {
case strings.Contains(requestBody, "GetStorageConfigurations"):
response = `<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope">
<SOAP-ENV:Body>
<tds:GetStorageConfigurationsResponse>
<tds:StorageConfigurations>
<tt:Token>storage-001</tt:Token>
<tt:Data>
<tt:LocalPath>/var/media/storage1</tt:LocalPath>
<tt:StorageUri>file:///var/media/storage1</tt:StorageUri>
<tt:Type>NFS</tt:Type>
</tt:Data>
</tds:StorageConfigurations>
<tds:StorageConfigurations>
<tt:Token>storage-002</tt:Token>
<tt:Data>
<tt:LocalPath>/var/media/storage2</tt:LocalPath>
<tt:StorageUri>cifs://nas.local/recordings</tt:StorageUri>
<tt:Type>CIFS</tt:Type>
</tt:Data>
</tds:StorageConfigurations>
</tds:GetStorageConfigurationsResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>`
case strings.Contains(requestBody, "GetStorageConfiguration"):
response = `<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope">
<SOAP-ENV:Body>
<tds:GetStorageConfigurationResponse>
<tds:StorageConfiguration>
<tt:Token>storage-001</tt:Token>
<tt:Data>
<tt:LocalPath>/var/media/storage1</tt:LocalPath>
<tt:StorageUri>file:///var/media/storage1</tt:StorageUri>
<tt:Type>NFS</tt:Type>
</tt:Data>
</tds:StorageConfiguration>
</tds:GetStorageConfigurationResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>`
case strings.Contains(requestBody, "CreateStorageConfiguration"):
response = `<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope">
<SOAP-ENV:Body>
<tds:CreateStorageConfigurationResponse>
<tds:Token>storage-new</tds:Token>
</tds:CreateStorageConfigurationResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>`
case strings.Contains(requestBody, "SetStorageConfiguration"):
response = `<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope">
<SOAP-ENV:Body>
<tds:SetStorageConfigurationResponse/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>`
case strings.Contains(requestBody, "DeleteStorageConfiguration"):
response = `<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope">
<SOAP-ENV:Body>
<tds:DeleteStorageConfigurationResponse/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>`
case strings.Contains(requestBody, "SetHashingAlgorithm"):
response = `<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope">
<SOAP-ENV:Body>
<tds:SetHashingAlgorithmResponse/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>`
default:
response = `<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<SOAP-ENV:Code><SOAP-ENV:Value>SOAP-ENV:Receiver</SOAP-ENV:Value></SOAP-ENV:Code>
<SOAP-ENV:Reason><SOAP-ENV:Text>Unknown operation</SOAP-ENV:Text></SOAP-ENV:Reason>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>`
}
w.Write([]byte(response))
}))
}
func TestGetStorageConfigurations(t *testing.T) {
server := newMockDeviceStorageServer()
defer server.Close()
client, err := NewClient(server.URL)
if err != nil {
t.Fatalf("NewClient failed: %v", err)
}
ctx := context.Background()
configs, err := client.GetStorageConfigurations(ctx)
if err != nil {
t.Fatalf("GetStorageConfigurations failed: %v", err)
}
if len(configs) != 2 {
t.Fatalf("Expected 2 storage configurations, got %d", len(configs))
}
if configs[0].Token != "storage-001" {
t.Errorf("Expected first config token 'storage-001', got '%s'", configs[0].Token)
}
if configs[0].Data.LocalPath != "/var/media/storage1" {
t.Errorf("Expected first config path '/var/media/storage1', got '%s'", configs[0].Data.LocalPath)
}
if configs[0].Data.Type != "NFS" {
t.Errorf("Expected first config type 'NFS', got '%s'", configs[0].Data.Type)
}
if configs[1].Token != "storage-002" {
t.Errorf("Expected second config token 'storage-002', got '%s'", configs[1].Token)
}
if configs[1].Data.StorageUri != "cifs://nas.local/recordings" {
t.Errorf("Expected second config URI 'cifs://nas.local/recordings', got '%s'", configs[1].Data.StorageUri)
}
}
func TestGetStorageConfiguration(t *testing.T) {
server := newMockDeviceStorageServer()
defer server.Close()
client, err := NewClient(server.URL)
if err != nil {
t.Fatalf("NewClient failed: %v", err)
}
ctx := context.Background()
config, err := client.GetStorageConfiguration(ctx, "storage-001")
if err != nil {
t.Fatalf("GetStorageConfiguration failed: %v", err)
}
if config.Token != "storage-001" {
t.Errorf("Expected config token 'storage-001', got '%s'", config.Token)
}
if config.Data.LocalPath != "/var/media/storage1" {
t.Errorf("Expected config path '/var/media/storage1', got '%s'", config.Data.LocalPath)
}
if config.Data.StorageUri != "file:///var/media/storage1" {
t.Errorf("Expected config URI 'file:///var/media/storage1', got '%s'", config.Data.StorageUri)
}
if config.Data.Type != "NFS" {
t.Errorf("Expected config type 'NFS', got '%s'", config.Data.Type)
}
}
func TestCreateStorageConfiguration(t *testing.T) {
server := newMockDeviceStorageServer()
defer server.Close()
client, err := NewClient(server.URL)
if err != nil {
t.Fatalf("NewClient failed: %v", err)
}
ctx := context.Background()
config := &StorageConfiguration{
Token: "storage-new",
Data: StorageConfigurationData{
LocalPath: "/var/media/storage3",
StorageUri: "file:///var/media/storage3",
Type: "Local",
},
}
token, err := client.CreateStorageConfiguration(ctx, config)
if err != nil {
t.Fatalf("CreateStorageConfiguration failed: %v", err)
}
if token != "storage-new" {
t.Errorf("Expected token 'storage-new', got '%s'", token)
}
}
func TestSetStorageConfiguration(t *testing.T) {
server := newMockDeviceStorageServer()
defer server.Close()
client, err := NewClient(server.URL)
if err != nil {
t.Fatalf("NewClient failed: %v", err)
}
ctx := context.Background()
config := &StorageConfiguration{
Token: "storage-001",
Data: StorageConfigurationData{
LocalPath: "/var/media/updated",
StorageUri: "file:///var/media/updated",
Type: "NFS",
},
}
err = client.SetStorageConfiguration(ctx, config)
if err != nil {
t.Fatalf("SetStorageConfiguration failed: %v", err)
}
}
func TestDeleteStorageConfiguration(t *testing.T) {
server := newMockDeviceStorageServer()
defer server.Close()
client, err := NewClient(server.URL)
if err != nil {
t.Fatalf("NewClient failed: %v", err)
}
ctx := context.Background()
err = client.DeleteStorageConfiguration(ctx, "storage-old")
if err != nil {
t.Fatalf("DeleteStorageConfiguration failed: %v", err)
}
}
func TestSetHashingAlgorithm(t *testing.T) {
server := newMockDeviceStorageServer()
defer server.Close()
client, err := NewClient(server.URL)
if err != nil {
t.Fatalf("NewClient failed: %v", err)
}
ctx := context.Background()
err = client.SetHashingAlgorithm(ctx, "SHA-256")
if err != nil {
t.Fatalf("SetHashingAlgorithm failed: %v", err)
}
}