kvm/internal/audio/audio_test.go

204 lines
6.0 KiB
Go

package audio
import (
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// Unit tests for the audio package
func TestAudioQuality(t *testing.T) {
tests := []struct {
name string
quality AudioQuality
expected string
}{
{"Low Quality", AudioQualityLow, "low"},
{"Medium Quality", AudioQualityMedium, "medium"},
{"High Quality", AudioQualityHigh, "high"},
{"Ultra Quality", AudioQualityUltra, "ultra"},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// Test quality setting
SetAudioQuality(tt.quality)
config := GetAudioConfig()
assert.Equal(t, tt.quality, config.Quality)
assert.Greater(t, config.Bitrate, 0)
assert.Greater(t, config.SampleRate, 0)
assert.Greater(t, config.Channels, 0)
assert.Greater(t, config.FrameSize, time.Duration(0))
})
}
}
func TestMicrophoneQuality(t *testing.T) {
tests := []struct {
name string
quality AudioQuality
}{
{"Low Quality", AudioQualityLow},
{"Medium Quality", AudioQualityMedium},
{"High Quality", AudioQualityHigh},
{"Ultra Quality", AudioQualityUltra},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// Test microphone quality setting
SetMicrophoneQuality(tt.quality)
config := GetMicrophoneConfig()
assert.Equal(t, tt.quality, config.Quality)
assert.Equal(t, 1, config.Channels) // Microphone is always mono
assert.Greater(t, config.Bitrate, 0)
assert.Greater(t, config.SampleRate, 0)
})
}
}
func TestAudioQualityPresets(t *testing.T) {
presets := GetAudioQualityPresets()
require.NotEmpty(t, presets)
// Test that all quality levels have presets
for quality := AudioQualityLow; quality <= AudioQualityUltra; quality++ {
config, exists := presets[quality]
require.True(t, exists, "Preset should exist for quality %d", quality)
assert.Equal(t, quality, config.Quality)
assert.Greater(t, config.Bitrate, 0)
assert.Greater(t, config.SampleRate, 0)
assert.Greater(t, config.Channels, 0)
assert.Greater(t, config.FrameSize, time.Duration(0))
}
// Test that higher quality has higher bitrate
lowConfig := presets[AudioQualityLow]
mediumConfig := presets[AudioQualityMedium]
highConfig := presets[AudioQualityHigh]
ultraConfig := presets[AudioQualityUltra]
assert.Less(t, lowConfig.Bitrate, mediumConfig.Bitrate)
assert.Less(t, mediumConfig.Bitrate, highConfig.Bitrate)
assert.Less(t, highConfig.Bitrate, ultraConfig.Bitrate)
}
func TestMicrophoneQualityPresets(t *testing.T) {
presets := GetMicrophoneQualityPresets()
require.NotEmpty(t, presets)
// Test that all quality levels have presets
for quality := AudioQualityLow; quality <= AudioQualityUltra; quality++ {
config, exists := presets[quality]
require.True(t, exists, "Microphone preset should exist for quality %d", quality)
assert.Equal(t, quality, config.Quality)
assert.Equal(t, 1, config.Channels) // Always mono
assert.Greater(t, config.Bitrate, 0)
assert.Greater(t, config.SampleRate, 0)
}
}
func TestAudioMetrics(t *testing.T) {
// Test initial metrics
metrics := GetAudioMetrics()
assert.GreaterOrEqual(t, metrics.FramesReceived, int64(0))
assert.GreaterOrEqual(t, metrics.FramesDropped, int64(0))
assert.GreaterOrEqual(t, metrics.BytesProcessed, int64(0))
assert.GreaterOrEqual(t, metrics.ConnectionDrops, int64(0))
// Test recording metrics
RecordFrameReceived(1024)
metrics = GetAudioMetrics()
assert.Greater(t, metrics.BytesProcessed, int64(0))
assert.Greater(t, metrics.FramesReceived, int64(0))
RecordFrameDropped()
metrics = GetAudioMetrics()
assert.Greater(t, metrics.FramesDropped, int64(0))
RecordConnectionDrop()
metrics = GetAudioMetrics()
assert.Greater(t, metrics.ConnectionDrops, int64(0))
}
func TestMaxAudioFrameSize(t *testing.T) {
frameSize := GetMaxAudioFrameSize()
assert.Greater(t, frameSize, 0)
assert.Equal(t, GetConfig().MaxAudioFrameSize, frameSize)
}
func TestMetricsUpdateInterval(t *testing.T) {
// Test getting current interval
interval := GetMetricsUpdateInterval()
assert.Greater(t, interval, time.Duration(0))
// Test setting new interval
newInterval := 2 * time.Second
SetMetricsUpdateInterval(newInterval)
updatedInterval := GetMetricsUpdateInterval()
assert.Equal(t, newInterval, updatedInterval)
}
func TestAudioConfigConsistency(t *testing.T) {
// Test that setting audio quality updates the config consistently
for quality := AudioQualityLow; quality <= AudioQualityUltra; quality++ {
SetAudioQuality(quality)
config := GetAudioConfig()
presets := GetAudioQualityPresets()
expectedConfig := presets[quality]
assert.Equal(t, expectedConfig.Quality, config.Quality)
assert.Equal(t, expectedConfig.Bitrate, config.Bitrate)
assert.Equal(t, expectedConfig.SampleRate, config.SampleRate)
assert.Equal(t, expectedConfig.Channels, config.Channels)
assert.Equal(t, expectedConfig.FrameSize, config.FrameSize)
}
}
func TestMicrophoneConfigConsistency(t *testing.T) {
// Test that setting microphone quality updates the config consistently
for quality := AudioQualityLow; quality <= AudioQualityUltra; quality++ {
SetMicrophoneQuality(quality)
config := GetMicrophoneConfig()
presets := GetMicrophoneQualityPresets()
expectedConfig := presets[quality]
assert.Equal(t, expectedConfig.Quality, config.Quality)
assert.Equal(t, expectedConfig.Bitrate, config.Bitrate)
assert.Equal(t, expectedConfig.SampleRate, config.SampleRate)
assert.Equal(t, expectedConfig.Channels, config.Channels)
assert.Equal(t, expectedConfig.FrameSize, config.FrameSize)
}
}
// Benchmark tests
func BenchmarkGetAudioConfig(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = GetAudioConfig()
}
}
func BenchmarkGetAudioMetrics(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = GetAudioMetrics()
}
}
func BenchmarkRecordFrameReceived(b *testing.B) {
for i := 0; i < b.N; i++ {
RecordFrameReceived(1024)
}
}
func BenchmarkSetAudioQuality(b *testing.B) {
qualities := []AudioQuality{AudioQualityLow, AudioQualityMedium, AudioQualityHigh, AudioQualityUltra}
b.ResetTimer()
for i := 0; i < b.N; i++ {
SetAudioQuality(qualities[i%len(qualities)])
}
}