github.com/status-im/status-go@v1.1.0/peers/topic_peer_queue_test.go (about) 1 package peers 2 3 import ( 4 "container/heap" 5 "math/rand" 6 "testing" 7 "time" 8 9 "github.com/stretchr/testify/require" 10 ) 11 12 func TestPeerPriorityQueueSorting(t *testing.T) { 13 count := 5 14 discTimes := make([]time.Time, count) 15 16 // generate a slice of monotonic times 17 for i := 0; i < count; i++ { 18 discTimes[i] = time.Now() 19 } 20 21 // shuffle discTimes 22 for i := range discTimes { 23 j := rand.Intn(i + 1) //nolint: gosec 24 discTimes[i], discTimes[j] = discTimes[j], discTimes[i] 25 } 26 27 // make a priority queue 28 q := make(peerPriorityQueue, count) 29 for i := 0; i < count; i++ { 30 q[i] = &peerInfoItem{ 31 peerInfo: &peerInfo{ 32 discoveredTime: discTimes[i], 33 }, 34 } 35 } 36 heap.Init(&q) 37 38 // verify that the slice is sorted ascending by `discoveredTime` 39 var item *peerInfoItem 40 for q.Len() > 0 { 41 newItem := heap.Pop(&q).(*peerInfoItem) 42 if item != nil { 43 require.True(t, item.discoveredTime.After(newItem.discoveredTime)) 44 } 45 item = newItem 46 } 47 } 48 49 func TestPeerPriorityQueueIndexUpdating(t *testing.T) { 50 q := make(peerPriorityQueue, 0) 51 heap.Init(&q) 52 53 item1 := &peerInfoItem{ 54 index: -1, 55 peerInfo: &peerInfo{ 56 discoveredTime: time.Now(), 57 }, 58 } 59 item2 := &peerInfoItem{ 60 index: -1, 61 peerInfo: &peerInfo{ 62 discoveredTime: time.Now(), 63 }, 64 } 65 66 // insert older item first 67 heap.Push(&q, item1) 68 require.Equal(t, item1.index, 0) 69 heap.Push(&q, item2) 70 require.Equal(t, item2.index, 0) 71 require.Equal(t, item1.index, 1) 72 73 // pop operation should reset index 74 poppedItem := heap.Pop(&q) 75 require.Equal(t, item2, poppedItem) 76 require.Equal(t, item2.index, -1) 77 require.Equal(t, item1.index, 0) 78 }