2020-04-29 11:06:39 +02:00
|
|
|
package packetcache
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"math/rand"
|
|
|
|
"testing"
|
2020-05-20 19:36:33 +02:00
|
|
|
"unsafe"
|
2020-04-29 11:06:39 +02:00
|
|
|
|
|
|
|
"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)
|
2020-05-20 20:37:25 +02:00
|
|
|
_, i1 := cache.Store(13, buf1)
|
|
|
|
_, i2 := cache.Store(17, buf2)
|
2020-04-29 11:06:39 +02:00
|
|
|
|
2020-05-20 20:32:30 +02:00
|
|
|
buf := make([]byte, BufSize)
|
|
|
|
|
|
|
|
l := cache.Get(13, buf)
|
|
|
|
if bytes.Compare(buf[:l], buf1) != 0 {
|
2020-04-29 11:06:39 +02:00
|
|
|
t.Errorf("Couldn't get 13")
|
|
|
|
}
|
2020-05-20 20:37:25 +02:00
|
|
|
l = cache.GetAt(13, i1, buf)
|
|
|
|
if bytes.Compare(buf[:l], buf1) != 0 {
|
|
|
|
t.Errorf("Couldn't get 13 at %v", i1)
|
|
|
|
}
|
2020-05-20 20:32:30 +02:00
|
|
|
|
|
|
|
l = cache.Get(17, buf)
|
|
|
|
if bytes.Compare(buf[:l], buf2) != 0 {
|
2020-04-29 11:06:39 +02:00
|
|
|
t.Errorf("Couldn't get 17")
|
|
|
|
}
|
2020-05-20 20:37:25 +02:00
|
|
|
l = cache.GetAt(17, i2, buf)
|
|
|
|
if bytes.Compare(buf[:l], buf2) != 0 {
|
|
|
|
t.Errorf("Couldn't get 17 at %v", i2)
|
|
|
|
}
|
2020-05-20 20:32:30 +02:00
|
|
|
|
|
|
|
l = cache.Get(42, buf)
|
|
|
|
if l != 0 {
|
2020-04-29 11:06:39 +02:00
|
|
|
t.Errorf("Creation ex nihilo")
|
|
|
|
}
|
2020-05-20 20:37:25 +02:00
|
|
|
|
|
|
|
l = cache.GetAt(17, i1, buf)
|
|
|
|
if l != 0 {
|
|
|
|
t.Errorf("Got 17 at %v", i1)
|
|
|
|
}
|
|
|
|
|
|
|
|
l = cache.GetAt(42, i2, buf)
|
|
|
|
if l != 0 {
|
|
|
|
t.Errorf("Got 42 at %v", i2)
|
|
|
|
}
|
2020-04-29 11:06:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
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++ {
|
2020-05-20 20:32:30 +02:00
|
|
|
buf := make([]byte, BufSize)
|
|
|
|
l := cache.Get(uint16(i), buf)
|
2020-04-29 11:06:39 +02:00
|
|
|
if i < 16 {
|
2020-05-20 20:32:30 +02:00
|
|
|
if l > 0 {
|
2020-04-29 11:06:39 +02:00
|
|
|
t.Errorf("Creation ex nihilo: %v", i)
|
|
|
|
}
|
|
|
|
} else {
|
2020-05-20 20:32:30 +02:00
|
|
|
if l != 1 || buf[0] != uint8(i) {
|
|
|
|
t.Errorf("Expected [%v], got %v", i, buf[:l])
|
2020-04-29 11:06:39 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-20 19:36:33 +02:00
|
|
|
func TestCacheAlignment(t *testing.T) {
|
|
|
|
cache := New(16)
|
|
|
|
for i := range cache.entries {
|
|
|
|
p := unsafe.Pointer(&cache.entries[i])
|
|
|
|
if uintptr(p) % 32 != 0 {
|
|
|
|
t.Errorf("%v: alignment %v", i, uintptr(p) % 32)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-29 11:06:39 +02:00
|
|
|
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 {
|
2020-05-20 20:37:25 +02:00
|
|
|
first, _ = cache.Store(uint16(42 + i), packet)
|
2020-04-29 11:06:39 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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 {
|
2020-05-20 20:37:25 +02:00
|
|
|
first, _ = cache.Store(uint16(42 + i), packet)
|
2020-04-29 11:06:39 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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 {
|
2020-05-02 22:26:09 +02:00
|
|
|
found, first, bitmap := cache.BitmapGet()
|
2020-04-29 11:06:39 +02:00
|
|
|
if first < pos || first >= pos+64 {
|
|
|
|
t.Errorf("First is %v, pos is %v", first, pos)
|
|
|
|
}
|
2020-05-02 22:26:09 +02:00
|
|
|
if !found {
|
|
|
|
t.Fatalf("Didn't find any 0 bits")
|
|
|
|
}
|
2020-04-29 11:06:39 +02:00
|
|
|
value >>= (first - pos)
|
|
|
|
pos = first
|
|
|
|
if (value & 1) != 0 {
|
|
|
|
t.Errorf("Value is odd")
|
|
|
|
}
|
|
|
|
value >>= 1
|
|
|
|
pos += 1
|
2020-05-02 22:26:09 +02:00
|
|
|
for bitmap != 0 {
|
|
|
|
if uint8(bitmap & 1) == uint8(value & 1) {
|
|
|
|
t.Errorf("Bitmap mismatch")
|
|
|
|
}
|
|
|
|
bitmap >>= 1
|
|
|
|
value >>= 1
|
|
|
|
pos += 1
|
2020-04-29 11:06:39 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
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)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-02 22:26:09 +02:00
|
|
|
found, first, bitmap := cache.BitmapGet()
|
|
|
|
|
|
|
|
if !found {
|
|
|
|
t.Fatalf("Didn't find any 0 bits")
|
|
|
|
}
|
2020-04-29 11:06:39 +02:00
|
|
|
|
2020-05-02 22:26:09 +02:00
|
|
|
p := rtcp.NackPair{first, rtcp.PacketBitmap(bitmap)}
|
2020-04-29 11:06:39 +02:00
|
|
|
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)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|