Files
monibuca/pkg/ring_test.go
langhuihui 8a9fffb987 refactor: frame converter and mp4 track improvements
- Refactor frame converter implementation
- Update mp4 track to use ICodex
- General refactoring and code improvements

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-28 19:55:37 +08:00

106 lines
2.1 KiB
Go

package pkg
import (
"context"
"log/slog"
"testing"
"time"
"m7s.live/v5/pkg/util"
)
func TestRing(t *testing.T) {
w := NewRingWriter([2]int{10, 10})
w.SLogger = slog.Default()
ctx, _ := context.WithTimeout(context.Background(), time.Second*5)
go t.Run("writer", func(t *testing.T) {
for i := 0; ctx.Err() == nil; i++ {
w.Value.Raw = &util.Memory{}
normal := w.Step()
t.Log("write", i, normal)
time.Sleep(time.Millisecond * 50)
}
w.Value.Unlock()
})
go t.Run("reader1", func(t *testing.T) {
var reader RingReader
err := reader.StartRead(w.Ring)
if err != nil {
t.Error(err)
return
}
for ctx.Err() == nil {
err = reader.ReadNext()
t.Log("read1", reader.Value.Raw)
if err != nil {
t.Error(err)
break
}
time.Sleep(time.Millisecond * 10)
}
reader.StopRead()
<-ctx.Done()
})
// slow reader
t.Run("reader2", func(t *testing.T) {
var reader RingReader
err := reader.StartRead(w.Ring)
if err != nil {
t.Error(err)
return
}
for ctx.Err() == nil {
err = reader.ReadNext()
t.Log("read2", reader.Value.Raw)
if err != nil {
// t.Error(err)
return
}
time.Sleep(time.Millisecond * 100)
}
reader.StopRead()
<-ctx.Done()
})
}
func TestRingWriter_Resize(t *testing.T) {
t.Run("resize", func(t *testing.T) {
w := NewRingWriter([2]int{10, 20})
w.SLogger = slog.Default()
w.Resize(5)
w.Resize(-5)
w.Resize(5)
w.Resize(-5)
})
}
func BenchmarkRing(b *testing.B) {
w := NewRingWriter([2]int{10, 10})
w.SLogger = slog.Default()
ctx, _ := context.WithTimeout(context.Background(), time.Second*5)
go func() {
for i := 0; ctx.Err() == nil; i++ {
w.Value.Raw = &util.Memory{}
w.Step()
time.Sleep(time.Millisecond * 50)
}
w.Value.Unlock()
}()
b.SetParallelism(1000)
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
var reader RingReader
err := reader.StartRead(w.Ring)
if err != nil {
break
}
for ctx.Err() == nil {
err = reader.ReadNext()
if err != nil {
break
}
time.Sleep(time.Millisecond * 10)
}
reader.Value.RUnlock()
}
})
}