122 lines
2.3 KiB
Go
122 lines
2.3 KiB
Go
package client
|
|
|
|
import (
|
|
"crypto/sha1"
|
|
"testing"
|
|
|
|
"storrent/bt"
|
|
)
|
|
|
|
func TestPut(t *testing.T) {
|
|
tests := []struct {
|
|
in string
|
|
hash [20]byte
|
|
want bool
|
|
}{
|
|
{
|
|
in: "hello",
|
|
hash: sha1.Sum([]byte("hello")),
|
|
want: true,
|
|
},
|
|
{
|
|
in: "wrong",
|
|
hash: sha1.Sum([]byte("hello")),
|
|
want: false,
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.in, func(t *testing.T) {
|
|
p := &piece{
|
|
hash: tt.hash,
|
|
size: int64(len(tt.in)),
|
|
data: make([]byte, len(tt.in)),
|
|
have: make([]bool, 1),
|
|
reqs: make([]bool, 1),
|
|
reqPeer: make([]*bt.Peer, 1),
|
|
}
|
|
if got := p.put(0, []byte(tt.in)); got != tt.want {
|
|
t.Errorf("got %v, want %v", got, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestPutMultiple(t *testing.T) {
|
|
data := make([]byte, bt.BlockSize+5)
|
|
for i := range data {
|
|
data[i] = byte(i)
|
|
}
|
|
p := &piece{
|
|
hash: sha1.Sum(data),
|
|
size: int64(len(data)),
|
|
data: make([]byte, len(data)),
|
|
have: make([]bool, 2),
|
|
reqs: make([]bool, 2),
|
|
reqPeer: make([]*bt.Peer, 2),
|
|
}
|
|
|
|
tests := []struct {
|
|
name string
|
|
begin int
|
|
data []byte
|
|
want bool
|
|
}{
|
|
{
|
|
name: "first block",
|
|
begin: 0,
|
|
data: data[:bt.BlockSize],
|
|
want: false,
|
|
},
|
|
{
|
|
name: "second block",
|
|
begin: bt.BlockSize,
|
|
data: data[bt.BlockSize:],
|
|
want: true,
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
if got := p.put(tt.begin, tt.data); got != tt.want {
|
|
t.Errorf("got %v, want %v", got, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestNextRequest(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
pieceSize int64
|
|
have []bool
|
|
wantLength uint32
|
|
}{
|
|
{
|
|
name: "last block partial",
|
|
pieceSize: bt.BlockSize + 100,
|
|
have: []bool{true, false},
|
|
wantLength: 100,
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
ps := &pieceScheduler{
|
|
pieces: []piece{{
|
|
size: tt.pieceSize,
|
|
have: tt.have,
|
|
reqs: make([]bool, len(tt.have)),
|
|
reqPeer: make([]*bt.Peer, len(tt.have)),
|
|
}},
|
|
incomplete: []int{0},
|
|
}
|
|
c := &bt.Peer{Have: []bool{true}}
|
|
msg := ps.nextRequest(c)
|
|
if msg == nil {
|
|
t.Fatal("expected request")
|
|
}
|
|
if msg.Length != tt.wantLength {
|
|
t.Errorf("got %d, want %d", msg.Length, tt.wantLength)
|
|
}
|
|
})
|
|
}
|
|
}
|