| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- package toc
- import (
- "testing"
- "time"
- "github.com/stretchr/testify/assert"
- "github.com/mk6i/open-oscar-server/wire"
- )
- func TestSNACCache_addAndTake(t *testing.T) {
- c := newSNACCache()
- first := wire.SNACFrame{FoodGroup: wire.Locate, SubGroup: wire.LocateUserInfoQuery}
- c.add(&first, getStatusReqCtx{screenName: "them"})
- second := wire.SNACFrame{FoodGroup: wire.ICBM, SubGroup: wire.ICBMEvilRequest}
- c.add(&second, evilReqCtx{})
- assert.Equal(t, uint32(1), first.RequestID)
- assert.Equal(t, uint32(2), second.RequestID)
- req, ok := c.take(wire.SNACFrame{FoodGroup: wire.Locate, SubGroup: wire.LocateUserInfoReply, RequestID: 1})
- assert.True(t, ok)
- assert.Equal(t, first, req.frame)
- assert.Equal(t, getStatusReqCtx{screenName: "them"}, req.data)
- // an entry is removed once taken
- _, ok = c.take(wire.SNACFrame{FoodGroup: wire.Locate, RequestID: 1})
- assert.False(t, ok)
- req, ok = c.take(wire.SNACFrame{FoodGroup: wire.ICBM, SubGroup: wire.ICBMErr, RequestID: 2})
- assert.True(t, ok)
- assert.Equal(t, evilReqCtx{}, req.data)
- }
- func TestSNACCache_takeRequiresMatchingFoodGroup(t *testing.T) {
- c := newSNACCache()
- frame := wire.SNACFrame{FoodGroup: wire.Locate, SubGroup: wire.LocateUserInfoQuery}
- c.add(&frame, getStatusReqCtx{screenName: "them"})
- // a relayed SNAC that happens to carry the same request ID is not a reply
- _, ok := c.take(wire.SNACFrame{FoodGroup: wire.ICBM, SubGroup: wire.ICBMClientEvent, RequestID: 1})
- assert.False(t, ok)
- // the real reply still finds the request
- _, ok = c.take(wire.SNACFrame{FoodGroup: wire.Locate, SubGroup: wire.LocateUserInfoReply, RequestID: 1})
- assert.True(t, ok)
- }
- func TestSNACCache_remove(t *testing.T) {
- c := newSNACCache()
- frame := wire.SNACFrame{FoodGroup: wire.Locate, SubGroup: wire.LocateUserInfoQuery}
- c.add(&frame, nil)
- c.remove(frame.RequestID)
- _, ok := c.take(wire.SNACFrame{FoodGroup: wire.Locate, RequestID: frame.RequestID})
- assert.False(t, ok)
- }
- func TestSNACCache_sweepsExpiredEntries(t *testing.T) {
- now := time.Now()
- c := newSNACCache()
- c.timeNow = func() time.Time { return now }
- old := wire.SNACFrame{FoodGroup: wire.ICBM, SubGroup: wire.ICBMChannelMsgToHost}
- c.add(&old, nil)
- now = now.Add(snacCacheTTL + time.Second)
- fresh := wire.SNACFrame{FoodGroup: wire.ICBM, SubGroup: wire.ICBMChannelMsgToHost}
- c.add(&fresh, nil)
- _, ok := c.take(wire.SNACFrame{FoodGroup: wire.ICBM, RequestID: old.RequestID})
- assert.False(t, ok)
- _, ok = c.take(wire.SNACFrame{FoodGroup: wire.ICBM, RequestID: fresh.RequestID})
- assert.True(t, ok)
- }
- func TestSNACCache_requestIDWrapsBeforeServerRange(t *testing.T) {
- c := newSNACCache()
- c.lastID = wire.ReqIDFromServer - 1
- frame := wire.SNACFrame{FoodGroup: wire.ICBM}
- c.add(&frame, nil)
- assert.Equal(t, uint32(1), frame.RequestID)
- }
|