Files
silver_pose/v2/internal/config/config_test.go
T

105 lines
3.2 KiB
Go

package config
import (
"os"
"path/filepath"
"strings"
"testing"
)
const testSHA256 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
func TestLoadResolvesOnlyNamedEnvironmentURL(t *testing.T) {
t.Setenv("SILVER_POSE_RTSP_URL", "rtsp://operator:secret@192.0.2.9/Streaming/Channels/101")
cfg, err := Load(writeConfig(t, validConfigJSON()))
if err != nil {
t.Fatal(err)
}
if cfg.Source.URL != "rtsp://operator:secret@192.0.2.9/Streaming/Channels/101" {
t.Fatalf("resolved source URL = %q", cfg.Source.URL)
}
if !strings.HasPrefix(cfg.RuntimeConfigVersion, "cfg-") {
t.Fatalf("runtime config version = %q", cfg.RuntimeConfigVersion)
}
if strings.Contains(cfg.RuntimeConfigVersion, "secret") {
t.Fatalf("runtime config version leaked a credential: %q", cfg.RuntimeConfigVersion)
}
if !filepath.IsAbs(cfg.Model.ONNXPath) || !filepath.IsAbs(cfg.Tools.FFmpegPath) {
t.Fatalf("relative paths were not resolved: %#v", cfg)
}
}
func TestLoadRejectsEmbeddedRTSPURL(t *testing.T) {
t.Setenv("SILVER_POSE_RTSP_URL", "rtsp://operator:secret@192.0.2.9/Streaming/Channels/101")
configJSON := strings.Replace(validConfigJSON(), `"rtsp_url_env": "SILVER_POSE_RTSP_URL"`, `"rtsp_url_env": "SILVER_POSE_RTSP_URL", "url": "rtsp://secret"`, 1)
_, err := Load(writeConfig(t, configJSON))
if err == nil || !strings.Contains(err.Error(), "rtsp_url_env") {
t.Fatalf("embedded URL error = %v", err)
}
if strings.Contains(err.Error(), "secret") {
t.Fatalf("embedded URL error leaked a credential: %v", err)
}
}
func TestLoadRejectsMissingSourceEnvironment(t *testing.T) {
os.Unsetenv("SILVER_POSE_RTSP_URL")
_, err := Load(writeConfig(t, validConfigJSON()))
if err == nil || !strings.Contains(err.Error(), "SILVER_POSE_RTSP_URL") {
t.Fatalf("missing environment error = %v", err)
}
}
func TestLoadRejectsInvalidModelHash(t *testing.T) {
t.Setenv("SILVER_POSE_RTSP_URL", "rtsp://operator:secret@192.0.2.9/Streaming/Channels/101")
_, err := Load(writeConfig(t, strings.Replace(validConfigJSON(), testSHA256, "invalid", 1)))
if err == nil || !strings.Contains(err.Error(), "model.sha256") {
t.Fatalf("invalid hash error = %v", err)
}
}
func writeConfig(t *testing.T, content string) string {
t.Helper()
path := filepath.Join(t.TempDir(), "config.json")
if err := os.WriteFile(path, []byte(content), 0o600); err != nil {
t.Fatal(err)
}
return path
}
func validConfigJSON() string {
return `{
"source": {
"id": "lobby-camera-01",
"rtsp_url_env": "SILVER_POSE_RTSP_URL",
"transport": "tcp",
"timeout_seconds": 5,
"low_latency": true
},
"model": {
"onnx": "assets/best.onnx",
"sha256": "` + testSHA256 + `",
"ort_dll": "runtime/onnxruntime.dll",
"confidence_threshold": 0.25
},
"tools": {
"ffmpeg": "runtime/ffmpeg.exe",
"ffprobe": "runtime/ffprobe.exe"
},
"event": {
"keypoint_confidence_threshold": 0.4,
"suspect_window_seconds": 0.5,
"confirm_window_seconds": 1.8,
"recovery_window_seconds": 2,
"cooldown_seconds": 10,
"require_rapid_drop": false,
"require_lower_body": false,
"horizontal_angle_threshold_degrees": 45
},
"artifacts": { "event_dir": "../artifacts/events" }
}`
}