2021-09-18 11:50:55 +08:00
|
|
|
package torrent
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
pp "github.com/anacrolix/torrent/peer_protocol"
|
2021-12-12 13:56:00 +08:00
|
|
|
"github.com/bradfitz/iter"
|
2021-09-18 11:50:55 +08:00
|
|
|
qt "github.com/frankban/quicktest"
|
|
|
|
)
|
|
|
|
|
|
|
|
func keysAsSlice(m map[Request]struct{}) (sl []Request) {
|
|
|
|
for k := range m {
|
|
|
|
sl = append(sl, k)
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
func makeTypicalRequests() map[Request]struct{} {
|
|
|
|
m := make(map[Request]struct{})
|
|
|
|
for p := pp.Integer(0); p < 4; p++ {
|
|
|
|
for c := pp.Integer(0); c < 16; c++ {
|
|
|
|
m[Request{p, ChunkSpec{c * defaultChunkSize, defaultChunkSize}}] = struct{}{}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return m
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLogExampleRequestMapOrdering(t *testing.T) {
|
|
|
|
for k := range makeTypicalRequests() {
|
|
|
|
t.Log(k)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestRequestMapOrderingPersistent(t *testing.T) {
|
|
|
|
m := makeTypicalRequests()
|
|
|
|
// Shows that map order is persistent across separate range statements.
|
|
|
|
qt.Assert(t, keysAsSlice(m), qt.ContentEquals, keysAsSlice(m))
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestRequestMapOrderAcrossInstances(t *testing.T) {
|
|
|
|
// This shows that different map instances with the same contents can have the same range order.
|
|
|
|
qt.Assert(t, keysAsSlice(makeTypicalRequests()), qt.ContentEquals, keysAsSlice(makeTypicalRequests()))
|
|
|
|
}
|
2021-12-12 13:56:00 +08:00
|
|
|
|
|
|
|
// Added for testing repeating loop iteration after shuffling in Peer.applyRequestState.
|
|
|
|
func TestForLoopRepeatItem(t *testing.T) {
|
|
|
|
t.Run("ExplicitLoopVar", func(t *testing.T) {
|
|
|
|
once := false
|
|
|
|
var seen []int
|
|
|
|
for i := 0; i < 4; i++ {
|
|
|
|
seen = append(seen, i)
|
|
|
|
if !once && i == 2 {
|
|
|
|
once = true
|
|
|
|
i--
|
|
|
|
// Will i++ still run?
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// We can mutate i and it's observed by the loop. No special treatment of the loop var.
|
|
|
|
qt.Assert(t, seen, qt.DeepEquals, []int{0, 1, 2, 2, 3})
|
|
|
|
})
|
|
|
|
t.Run("Range", func(t *testing.T) {
|
|
|
|
once := false
|
|
|
|
var seen []int
|
|
|
|
for i := range iter.N(4) {
|
|
|
|
seen = append(seen, i)
|
|
|
|
if !once && i == 2 {
|
|
|
|
once = true
|
|
|
|
// Can we actually modify the next value of i produced by the range?
|
|
|
|
i--
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Range ignores any mutation to i.
|
|
|
|
qt.Assert(t, seen, qt.DeepEquals, []int{0, 1, 2, 3})
|
|
|
|
})
|
|
|
|
}
|