68 lines
2.7 KiB
Go
68 lines
2.7 KiB
Go
package callruntime
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"git.ipao.vip/rogee/go-sip/internal/ai"
|
|
)
|
|
|
|
func validConfig() Config {
|
|
return Config{ARIURL: "http://127.0.0.1:1/ari", ARIWebsocketURL: "ws://127.0.0.1:1/ari/events", ARIApplication: "test", ARIUsername: "local", ARIPassword: "isolated-test-only", Endpoint: "PJSIP/local-test", MediaBind: "127.0.0.1", MediaPort: 20000, MediaFormat: "slin16", MediaSampleRate: 16000, PayloadType: 96, Pipeline: ai.MockPipeline{}}
|
|
}
|
|
|
|
func TestRuntimeRejectsInvalidConfigurationBeforeNetwork(t *testing.T) {
|
|
for _, tc := range []struct {
|
|
name string
|
|
change func(*Config)
|
|
}{
|
|
{"ARI URL", func(c *Config) { c.ARIURL = "" }},
|
|
{"websocket", func(c *Config) { c.ARIWebsocketURL = "" }},
|
|
{"application", func(c *Config) { c.ARIApplication = "" }},
|
|
{"username", func(c *Config) { c.ARIUsername = "" }},
|
|
{"password", func(c *Config) { c.ARIPassword = "" }},
|
|
{"endpoint", func(c *Config) { c.Endpoint = "" }},
|
|
{"media bind", func(c *Config) { c.MediaBind = "" }},
|
|
{"low media port", func(c *Config) { c.MediaPort = 1023 }},
|
|
{"high media port", func(c *Config) { c.MediaPort = 65536 }},
|
|
{"media format", func(c *Config) { c.MediaFormat = "invalid" }},
|
|
{"pipeline", func(c *Config) { c.Pipeline = nil }},
|
|
} {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
cfg := validConfig()
|
|
tc.change(&cfg)
|
|
if err := cfg.validate(); err == nil {
|
|
t.Fatal("invalid configuration accepted")
|
|
}
|
|
if _, err := Run(context.Background(), cfg); err == nil {
|
|
t.Fatal("invalid configuration reached runtime")
|
|
}
|
|
})
|
|
}
|
|
if err := validConfig().validate(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func TestRuntimeNormalizationPreservesExplicitSettings(t *testing.T) {
|
|
cfg := validConfig()
|
|
cfg.AnswerTimeout = time.Second
|
|
cfg.TurnWindow = 2 * time.Second
|
|
cfg.FirstSpeechTimeout = 3 * time.Second
|
|
cfg.MaxTurnDuration = 4 * time.Second
|
|
cfg.EndSilence = 5 * time.Second
|
|
cfg.MaxCallDuration = 6 * time.Second
|
|
cfg.VoiceThreshold = 22
|
|
cfg.MaxTurns = 9
|
|
cfg.OpeningPrompt = "configured opening"
|
|
actual := cfg.normalized()
|
|
if actual.AnswerTimeout != cfg.AnswerTimeout || actual.TurnWindow != cfg.TurnWindow || actual.FirstSpeechTimeout != cfg.FirstSpeechTimeout || actual.MaxTurnDuration != cfg.MaxTurnDuration || actual.EndSilence != cfg.EndSilence || actual.MaxCallDuration != cfg.MaxCallDuration || actual.VoiceThreshold != cfg.VoiceThreshold || actual.MaxTurns != cfg.MaxTurns || actual.OpeningPrompt != cfg.OpeningPrompt {
|
|
t.Fatal("explicit conversation settings were overwritten")
|
|
}
|
|
defaults := (Config{}).normalized()
|
|
if defaults.MediaFormat != "slin16" || defaults.MediaSampleRate != 16000 || defaults.AnswerTimeout <= 0 || defaults.TurnWindow <= 0 {
|
|
t.Fatal("invalid normalized transport settings")
|
|
}
|
|
}
|