1 package torrent
2
3 import (
4 "bytes"
5 "encoding/binary"
6 "fmt"
7 "log"
8 "math"
9 "net"
10 "os"
11 "sync"
12 "testing"
13
14 "github.com/concurrency-8/parser"
15 "github.com/concurrency-8/piece"
16 "github.com/concurrency-8/queue"
17 "github.com/concurrency-8/tracker"
18 "github.com/stretchr/testify/assert"
19 )
20
21 func setLogs() {
22 Info = log.New(os.Stdout, "Testing ", 0)
23 Error = log.New(os.Stderr, "Testing ", 0)
24 }
25
26
100
101
102
103
104
105
106
107
108
109
110
111
112
113 func TestUnChokeHandler(t *testing.T) {
114 setLogs()
115 queue := queue.NewQueue(parser.TorrentFile{})
116 UnchokeHandler(tracker.Peer{}, nil, nil, queue)
117 assert.Equal(t, queue.Choked, false, "Choked attribute not set properly")
118 }
119
120
121 func TestRequestPiece(t *testing.T) {
122
123 file, _ := parser.ParseFromFile(parser.GetTorrentFileList()[0])
124 pieces := piece.NewPieceTracker(file)
125 queue := queue.NewQueue(file)
126 queue.Choked = false
127 pieceBlock := parser.RandomPieceBlock(file)
128 queue.Enqueue(pieceBlock.Index)
129 length := queue.Length()
130 client, server := net.Pipe()
131 fmt.Println(pieceBlock)
132 go func() {
133 for i := 0; i < length; i++ {
134 RequestPiece(tracker.Peer{}, server, pieces, queue)
135 }
136 defer server.Close()
137 }()
138
139 for i := 0; i < length; i++ {
140 resp := make([]byte, 17)
141 respLen, _ := client.Read(resp)
142 assert.Equal(t, respLen, 17, "Full message not received")
143 size, id, payload := ParseMsg(bytes.NewBuffer(resp))
144 assert.Equal(t, size, uint32(13), "Request: Size not equal")
145 assert.Equal(t, id, uint8(6), "Request: Message ID different")
146 assert.Equal(t, uint32(payload["index"].(uint32)), pieceBlock.Index, "Request: index field of payload not same")
147 assert.Equal(t, uint32(payload["begin"].(uint32)), uint32(i)*parser.BLOCK_LEN, "Request: begin field of payload not same")
148 }
149 }
150
151 func TestHaveHandler(t *testing.T) {
152 var flag sync.WaitGroup
153 flag.Add(1)
154 fmt.Println("Testing torrent/download.go : HaveHandler")
155 file, _ := parser.ParseFromFile(parser.GetTorrentFileList()[0])
156 pieces := piece.NewPieceTracker(file)
157 queue := queue.NewQueue(file)
158 queue.Choked = false
159 pieceBlock := parser.RandomPieceBlock(file)
160 client, server := net.Pipe()
161 actualsamplemsg, err := BuildHave(pieceBlock.Index)
162 assert.Nil(t, err, "error writing to Buffer in BuildHave")
163 go func() {
164 resp := make([]byte, 20)
165 _, err = server.Write(actualsamplemsg.Bytes())
166 flag.Wait()
167 respLen, err := server.Read(resp)
168 assert.Nil(t, err, "Error reading from server")
169 size, id, _ := ParseMsg(bytes.NewBuffer(resp[:respLen]))
170 assert.Equal(t, uint8(6), id, "Invalid id after reading from pipe.")
171 assert.Equal(t, uint32(13), size, "Invalid size")
172 defer server.Close()
173
174 }()
175 resp := make([]byte, 20)
176 buffer := new(bytes.Buffer)
177 respLen, err := client.Read(resp)
178 flag.Done()
179 assert.Nil(t, err, "Error reading from pipe")
180 err = binary.Write(buffer, binary.BigEndian, resp[:respLen])
181 assert.Nil(t, err, "Error writing to buffer.")
182 size, id, payload := ParseMsg(buffer)
183 assert.Equal(t, uint8(4), id, "Invalid id after reading from pipe.")
184 assert.Equal(t, uint32(5), size, "Invalid size")
185 assert.NotEmpty(t, payload["payload"], "Empty piece index in payload.")
186 var pieceIndex uint32
187 pieceIndex, err = HaveHandler(tracker.Peer{}, client, pieces, queue, payload)
188 assert.Nil(t, err, "Error in HaveHandler")
189 assert.Equal(t, pieceBlock.Index, pieceIndex, "Piece Index doesn't match.")
190 assert.True(t, pieces.Requested[pieceBlock.Index][0], "Requested not set.")
191 }
192
193 func TestBitFieldHandler(t *testing.T) {
194 var flag sync.WaitGroup
195 flag.Add(1)
196 fmt.Println("Testing torrent/download.go : BitFieldHandler")
197 file, _ := parser.ParseFromFile(parser.GetTorrentFileList()[0])
198
199 npieces := uint32(len(file.Piece) / 20)
200 nbytes := uint(math.Ceil(float64(npieces) / float64(8)))
201 msg := new(bytes.Buffer)
202 binary.Write(msg, binary.BigEndian, uint32(nbytes+1))
203 binary.Write(msg, binary.BigEndian, uint8(5))
204 binary.Write(msg, binary.BigEndian, getRandomByteArr(nbytes))
205 actualmsg := msg.Bytes()
206 pieces := piece.NewPieceTracker(file)
207 queue := queue.NewQueue(file)
208 queue.Choked = false
209 client, server := net.Pipe()
210 go func() {
211 resp := make([]byte, nbytes+1)
212 _, err := server.Write(actualmsg)
213 flag.Wait()
214 assert.Nil(t, err, "Error writing to pipe.")
215 respLen, err := server.Read(resp)
216 assert.Nil(t, err, "Error reading from server")
217 size, id, _ := ParseMsg(bytes.NewBuffer(resp[:respLen]))
218 assert.Equal(t, uint8(6), id, "Invalid id after reading from pipe.")
219 assert.Equal(t, uint32(13), size, "Invalid size")
220 defer server.Close()
221
222 }()
223 resp := make([]byte, nbytes+10)
224 respLen, err := client.Read(resp)
225 flag.Done()
226 assert.Nil(t, err, "Error reading from Pipe")
227 buffer := new(bytes.Buffer)
228 err = binary.Write(buffer, binary.BigEndian, int32(nbytes+1))
229 assert.Nil(t, err, "Error writing to buffer.")
230 err = binary.Write(buffer, binary.BigEndian, int8(5))
231 assert.Nil(t, err, "Error writing to buffer.")
232 err = binary.Write(buffer, binary.BigEndian, resp[:respLen])
233 assert.Nil(t, err, "Error writing to buffer.")
234 size, id, payload := ParseMsg(buffer)
235 assert.Equal(t, uint8(5), id, "Invalid id after reading from Pipe")
236 assert.Equal(t, uint32(nbytes+1), size, "Invalid size")
237 assert.NotEmpty(t, payload["payload"], "Empty pieces in payload")
238 err = BitFieldHandler(tracker.Peer{}, client, pieces, queue, payload)
239 assert.Nil(t, err, "Error in BitFieldHandler")
240
241 for i := 0; queue.Length() > 0; i++ {
242 nextitem, err := queue.Peek()
243 assert.Nil(t, err, "Error peeking into queue")
244 err = queue.Dequeue()
245 assert.Nil(t, err, "Error Dequeueing from queue")
246 index := nextitem.Index / 8
247
248 offset := nextitem.Index % 8
249
250 p := uint8(1 << (7 - offset))
251
252 assert.Equal(t, p, uint8(actualmsg[index])&p)
253 }
254
255 }
256
View as plain text