105 lines
3.2 KiB
Go
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" }
|
|
}`
|
|
}
|