mirror of
https://github.com/GopeedLab/gopeed.git
synced 2026-11-08 09:30:27 +00:00
123 lines
2.1 KiB
Go
123 lines
2.1 KiB
Go
package torrent
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/monkeyWie/gopeed/protocol/bt/peer"
|
|
"github.com/monkeyWie/gopeed/protocol/bt/tracker"
|
|
"os"
|
|
"sync"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func Test_peerState_ready(t *testing.T) {
|
|
|
|
ps := getUsablePeer()
|
|
fmt.Println("get a peer")
|
|
|
|
// 下载前准备
|
|
err := ps.ready()
|
|
fmt.Println("ready end")
|
|
if err != nil {
|
|
fmt.Println(ps.peer.Address())
|
|
t.Fatal(err)
|
|
}
|
|
|
|
}
|
|
|
|
func Test_peerState_downloadPiece(t *testing.T) {
|
|
|
|
ps := getUsablePeer()
|
|
fmt.Println("get a peer")
|
|
|
|
// 下载前准备
|
|
err := ps.ready()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
have := ps.getHavePieces(ps.bitfield)
|
|
fmt.Printf("download is ready,have %d\n", len(have))
|
|
if len(have) > 0 {
|
|
// 获取分片的长度
|
|
for _, index := range have {
|
|
fmt.Printf("download index %d\n", index)
|
|
ps.downloadPiece(int(index))
|
|
}
|
|
return
|
|
}
|
|
}
|
|
|
|
// 获取一个能连接上的peer
|
|
func getUsablePeer() *peerConn {
|
|
ch := getUsablePeerMore()
|
|
ps := <-ch
|
|
return ps
|
|
}
|
|
|
|
// 获取多个能连接上的peer
|
|
func getUsablePeerMore() chan *peerConn {
|
|
torrent := buildTorrent()
|
|
tracker := &tracker.Tracker{
|
|
PeerID: torrent.PeerID,
|
|
MetaInfo: torrent.MetaInfo,
|
|
}
|
|
peers := <-tracker.Tracker()
|
|
ch := make(chan *peerConn)
|
|
for i := range peers {
|
|
go peerTest(torrent, &peers[i], ch)
|
|
}
|
|
return ch
|
|
}
|
|
|
|
func peerTest(torrent *Torrent, peer *peer.Peer, ch chan *peerConn) {
|
|
ps := &peerConn{
|
|
torrent: torrent,
|
|
peer: peer,
|
|
}
|
|
// 连接至peer
|
|
err := ps.ready()
|
|
if err != nil {
|
|
return
|
|
}
|
|
ps.conn.Close()
|
|
ch <- ps
|
|
}
|
|
|
|
func TestSome(t *testing.T) {
|
|
ch := make(chan interface{})
|
|
|
|
go func() {
|
|
time.Sleep(time.Second)
|
|
select {
|
|
case ch <- nil:
|
|
fmt.Println("write")
|
|
case <-time.After(time.Second * 3):
|
|
fmt.Println("timeout")
|
|
}
|
|
}()
|
|
|
|
time.Sleep(time.Second * 5)
|
|
r := <-ch
|
|
fmt.Println(r)
|
|
fmt.Println("111")
|
|
|
|
}
|
|
|
|
func TestSome2(t *testing.T) {
|
|
wg := sync.WaitGroup{}
|
|
wg.Add(10)
|
|
file, err := os.OpenFile("e:/testbt/test.data", os.O_RDWR|os.O_CREATE, 0644)
|
|
for i := 0; i < 10; i++ {
|
|
go func(i int) {
|
|
for j := 0; j < 100; j++ {
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
_, err = file.WriteAt([]byte{byte(i)}, int64(i*8))
|
|
}
|
|
wg.Done()
|
|
}(i)
|
|
}
|
|
wg.Wait()
|
|
}
|