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  }