mirror of
https://github.com/jech/galene.git
synced 2024-11-26 02:25:58 +01:00
159 lines
2.9 KiB
Go
159 lines
2.9 KiB
Go
|
package packetcache
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"math/rand"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/pion/rtcp"
|
||
|
)
|
||
|
|
||
|
func randomBuf() []byte {
|
||
|
length := rand.Int31n(BufSize-1) + 1
|
||
|
buf := make([]byte, length)
|
||
|
rand.Read(buf)
|
||
|
return buf
|
||
|
}
|
||
|
|
||
|
func TestCache(t *testing.T) {
|
||
|
buf1 := randomBuf()
|
||
|
buf2 := randomBuf()
|
||
|
cache := New(16)
|
||
|
cache.Store(13, buf1)
|
||
|
cache.Store(17, buf2)
|
||
|
|
||
|
if bytes.Compare(cache.Get(13), buf1) != 0 {
|
||
|
t.Errorf("Couldn't get 13")
|
||
|
}
|
||
|
if bytes.Compare(cache.Get(17), buf2) != 0 {
|
||
|
t.Errorf("Couldn't get 17")
|
||
|
}
|
||
|
if cache.Get(42) != nil {
|
||
|
t.Errorf("Creation ex nihilo")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestCacheOverflow(t *testing.T) {
|
||
|
cache := New(16)
|
||
|
|
||
|
for i := 0; i < 32; i++ {
|
||
|
cache.Store(uint16(i), []byte{uint8(i)})
|
||
|
}
|
||
|
|
||
|
for i := 0; i < 32; i++ {
|
||
|
buf := cache.Get(uint16(i))
|
||
|
if i < 16 {
|
||
|
if buf != nil {
|
||
|
t.Errorf("Creation ex nihilo: %v", i)
|
||
|
}
|
||
|
} else {
|
||
|
if len(buf) != 1 || buf[0] != uint8(i) {
|
||
|
t.Errorf("Expected [%v], got %v", i, buf)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestBitmap(t *testing.T) {
|
||
|
value := uint64(0xcdd58f1e035379c0)
|
||
|
packet := make([]byte, 1)
|
||
|
|
||
|
cache := New(16)
|
||
|
|
||
|
var first uint16
|
||
|
for i := 0; i < 64; i++ {
|
||
|
if (value & (1 << i)) != 0 {
|
||
|
first = cache.Store(uint16(42 + i), packet)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
value >>= uint16(first - 42)
|
||
|
if uint32(value) != cache.bitmap {
|
||
|
t.Errorf("Got %b, expected %b", cache.bitmap, value)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestBitmapWrap(t *testing.T) {
|
||
|
value := uint64(0xcdd58f1e035379c0)
|
||
|
packet := make([]byte, 1)
|
||
|
|
||
|
cache := New(16)
|
||
|
|
||
|
cache.Store(0x7000, packet)
|
||
|
cache.Store(0xA000, packet)
|
||
|
|
||
|
var first uint16
|
||
|
for i := 0; i < 64; i++ {
|
||
|
if (value & (1 << i)) != 0 {
|
||
|
first = cache.Store(uint16(42 + i), packet)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
value >>= uint16(first - 42)
|
||
|
if uint32(value) != cache.bitmap {
|
||
|
t.Errorf("Got %b, expected %b", cache.bitmap, value)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestBitmapGet(t *testing.T) {
|
||
|
value := uint64(0xcdd58f1e035379c0)
|
||
|
packet := make([]byte, 1)
|
||
|
|
||
|
cache := New(16)
|
||
|
|
||
|
for i := 0; i < 64; i++ {
|
||
|
if (value & (1 << i)) != 0 {
|
||
|
cache.Store(uint16(42 + i), packet)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
pos := uint16(42)
|
||
|
for cache.bitmap != 0 {
|
||
|
first, bitmap := cache.BitmapGet()
|
||
|
if first < pos || first >= pos+64 {
|
||
|
t.Errorf("First is %v, pos is %v", first, pos)
|
||
|
}
|
||
|
value >>= (first - pos)
|
||
|
pos = first
|
||
|
if (value & 1) != 0 {
|
||
|
t.Errorf("Value is odd")
|
||
|
}
|
||
|
value >>= 1
|
||
|
pos += 1
|
||
|
if bitmap != uint16(value&0xFFFF) {
|
||
|
t.Errorf("Got %b, expected %b", bitmap, (value & 0xFFFF))
|
||
|
}
|
||
|
value >>= 16
|
||
|
pos += 16
|
||
|
}
|
||
|
if value != 0 {
|
||
|
t.Errorf("Value is %v", value)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestBitmapPacket(t *testing.T) {
|
||
|
value := uint64(0xcdd58f1e035379c0)
|
||
|
packet := make([]byte, 1)
|
||
|
|
||
|
cache := New(16)
|
||
|
|
||
|
for i := 0; i < 64; i++ {
|
||
|
if (value & (1 << i)) != 0 {
|
||
|
cache.Store(uint16(42 + i), packet)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
first, bitmap := cache.BitmapGet()
|
||
|
|
||
|
p := rtcp.NackPair{first, rtcp.PacketBitmap(^bitmap)}
|
||
|
pl := p.PacketList()
|
||
|
|
||
|
for _, s := range pl {
|
||
|
if s < 42 || s >= 42+64 {
|
||
|
if (value & (1 << (s - 42))) != 0 {
|
||
|
t.Errorf("Bit %v unexpectedly set", s-42)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|