Skip to content

Commit e6de7a2

Browse files
committed
add tests for scraping a udp tracker (fix webtorrent#34)
1 parent 231ff57 commit e6de7a2

File tree

6 files changed

+112
-67
lines changed

6 files changed

+112
-67
lines changed

client.js

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
module.exports = Client
22

3-
var BN = require('bn.js')
43
var bencode = require('bencode')
4+
var BN = require('bn.js')
55
var common = require('./lib/common')
66
var compact2string = require('compact2string')
77
var concat = require('concat-stream')
@@ -12,6 +12,7 @@ var extend = require('extend.js')
1212
var hat = require('hat')
1313
var http = require('http')
1414
var inherits = require('inherits')
15+
var once = require('once')
1516
var querystring = require('querystring')
1617
var url = require('url')
1718

@@ -59,6 +60,31 @@ function Client (peerId, port, torrent, opts) {
5960
})
6061
}
6162

63+
/**
64+
* Simple convenience function to scrape a tracker for an infoHash without
65+
* needing to create a Client, pass it a parsed torrent, etc.
66+
* @param {string} announceUrl
67+
* @param {string} infoHash
68+
* @param {function} cb
69+
*/
70+
Client.scrape = function (announceUrl, infoHash, cb) {
71+
cb = once(cb)
72+
var dummy = {
73+
peerId: new Buffer('01234567890123456789'),
74+
port: 6881,
75+
torrent: {
76+
infoHash: infoHash,
77+
announce: [ announceUrl ]
78+
}
79+
}
80+
var client = new Client(dummy.peerId, dummy.port, dummy.torrent)
81+
client.once('error', cb)
82+
client.once('scrape', function (data) {
83+
cb(null, data)
84+
})
85+
client.scrape()
86+
}
87+
6288
Client.prototype.start = function (opts) {
6389
var self = this
6490
self._trackers.forEach(function (tracker) {

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"hat": "0.0.3",
2525
"inherits": "^2.0.1",
2626
"ip": "^0.3.0",
27+
"once": "^1.3.0",
2728
"querystring": "^0.2.0",
2829
"run-parallel": "^1.0.0",
2930
"string2compact": "^1.1.1"

test/client-magnet.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ test('magnet + udp: client.start/update/stop()', function (t) {
2525
portfinder.getPort(function (err, port) {
2626
t.error(err, 'found free port')
2727
server.listen(port)
28-
var announceUrl = 'udp://127.0.0.1:' + port // TODO: shouldn't rely on an external server!
28+
var announceUrl = 'udp://127.0.0.1:' + port
2929

3030
// remove all tracker servers except a single UDP one, for now
3131
parsedTorrent.announce = [ announceUrl ]

test/client.js

Lines changed: 11 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
var Client = require('../')
2+
var common = require('./common')
23
var fs = require('fs')
34
var parseTorrent = require('parse-torrent')
4-
var portfinder = require('portfinder')
5-
var Server = require('../').Server
65
var test = require('tape')
76

87
var torrent = fs.readFileSync(__dirname + '/torrents/bitlove-intro.torrent')
@@ -13,35 +12,10 @@ var peerId3 = new Buffer('23456789012345678901')
1312
var announceUrl = ''
1413
var port = 6881
1514

16-
function createServer (t, serverType, cb) {
17-
var opts = serverType === 'http' ? { udp: false } : { http: false }
18-
var server = new Server(opts)
19-
20-
server.on('error', function (err) {
21-
t.error(err)
22-
})
23-
24-
server.on('warning', function (err) {
25-
t.error(err)
26-
})
27-
28-
portfinder.getPort(function (err, port) {
29-
if (err) return t.error(err)
30-
31-
announceUrl = serverType === 'http'
32-
? 'http://127.0.0.1:' + port + '/announce'
33-
: 'udp://127.0.0.1:' + port
34-
35-
parsedTorrent.announce = [ announceUrl ]
36-
37-
server.listen(port)
38-
cb(server)
39-
})
40-
}
41-
4215
function testClientStart (t, serverType) {
4316
t.plan(5)
44-
createServer(t, serverType, function (server) {
17+
common.createServer(t, serverType, function (server, announceUrl) {
18+
parsedTorrent.announce = [ announceUrl ]
4519
var client = new Client(peerId1, port, parsedTorrent)
4620

4721
client.on('error', function (err) {
@@ -83,7 +57,8 @@ test('udp: client.start()', function (t) {
8357

8458
function testClientStop (t, serverType) {
8559
t.plan(4)
86-
createServer(t, serverType, function (server) {
60+
common.createServer(t, serverType, function (server, announceUrl) {
61+
parsedTorrent.announce = [ announceUrl ]
8762
var client = new Client(peerId1, port, parsedTorrent)
8863

8964
client.on('error', function (err) {
@@ -124,7 +99,8 @@ test('udp: client.stop()', function (t) {
12499

125100
function testClientUpdate (t, serverType) {
126101
t.plan(4)
127-
createServer(t, serverType, function (server) {
102+
common.createServer(t, serverType, function (server, announceUrl) {
103+
parsedTorrent.announce = [ announceUrl ]
128104
var client = new Client(peerId1, port, parsedTorrent, { interval: 5000 })
129105

130106
client.on('error', function (err) {
@@ -166,7 +142,8 @@ test('udp: client.update()', function (t) {
166142

167143
function testClientScrape (t, serverType) {
168144
t.plan(5)
169-
createServer(t, serverType, function (server) {
145+
common.createServer(t, serverType, function (server, announceUrl) {
146+
parsedTorrent.announce = [ announceUrl ]
170147
var client = new Client(peerId1, port, parsedTorrent)
171148

172149
client.on('error', function (err) {
@@ -202,7 +179,8 @@ test('udp: client.scrape()', function (t) {
202179

203180
function testClientAnnounceWithNumWant (t, serverType) {
204181
t.plan(1)
205-
createServer(t, serverType, function (server) {
182+
common.createServer(t, serverType, function (server, announceUrl) {
183+
parsedTorrent.announce = [ announceUrl ]
206184
var client1 = new Client(peerId1, port, parsedTorrent)
207185
client1.on('error', function (err) {
208186
t.error(err)

test/common.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
var portfinder = require('portfinder')
2+
var Server = require('../').Server
3+
4+
exports.createServer = function (t, serverType, cb) {
5+
var opts = serverType === 'http' ? { udp: false } : { http: false }
6+
var server = new Server(opts)
7+
8+
server.on('error', function (err) {
9+
t.error(err)
10+
})
11+
12+
server.on('warning', function (err) {
13+
t.error(err)
14+
})
15+
16+
portfinder.getPort(function (err, port) {
17+
if (err) return t.error(err)
18+
19+
announceUrl = serverType === 'http'
20+
? 'http://127.0.0.1:' + port + '/announce'
21+
: 'udp://127.0.0.1:' + port
22+
23+
server.listen(port)
24+
cb(server, announceUrl)
25+
})
26+
}

test/scrape.js

Lines changed: 46 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
var bencode = require('bencode')
22
var Client = require('../')
3-
var common = require('../lib/common')
3+
var commonLib = require('../lib/common')
4+
var commonTest = require('./common')
45
var concat = require('concat-stream')
56
var fs = require('fs')
67
var http = require('http')
@@ -25,46 +26,59 @@ var binaryBitlove = hexToBinary(parsedBitlove.infoHash)
2526

2627
var peerId = new Buffer('01234567890123456789')
2728

28-
test('server: single info_hash scrape', function (t) {
29-
var server = new Server({ udp: false })
30-
server.on('error', function (err) {
31-
t.error(err)
32-
})
33-
server.on('warning', function (err) {
34-
t.error(err)
29+
function testSingle (t, serverType) {
30+
commonTest.createServer(t, serverType, function (server, announceUrl) {
31+
var scrapeUrl = announceUrl.replace('announce', 'scrape')
32+
server.once('listening', function () {
33+
Client.scrape(announceUrl, infoHash1, function (err, data) {
34+
t.error(err)
35+
t.equal(data.announce, announceUrl)
36+
t.equal(typeof data.complete, 'number')
37+
t.equal(typeof data.incomplete, 'number')
38+
t.equal(typeof data.downloaded, 'number')
39+
server.close(function () {
40+
t.end()
41+
})
42+
})
43+
})
3544
})
45+
}
3646

37-
portfinder.getPort(function (err, port) {
38-
t.error(err)
39-
server.listen(port)
40-
var scrapeUrl = 'http://127.0.0.1:' + port + '/scrape'
47+
test('http: single info_hash scrape', function (t) {
48+
testSingle(t, 'http')
49+
})
4150

42-
server.once('listening', function () {
43-
var url = scrapeUrl + '?' + common.querystringStringify({
44-
info_hash: binaryInfoHash1
45-
})
46-
http.get(url, function (res) {
47-
t.equal(res.statusCode, 200)
48-
res.pipe(concat(function (data) {
49-
data = bencode.decode(data)
50-
t.ok(data.files)
51-
t.equal(Object.keys(data.files).length, 1)
52-
t.ok(data.files[binaryInfoHash1])
53-
t.equal(typeof data.files[binaryInfoHash1].complete, 'number')
54-
t.equal(typeof data.files[binaryInfoHash1].incomplete, 'number')
55-
t.equal(typeof data.files[binaryInfoHash1].downloaded, 'number')
51+
test('udp: single info_hash scrape', function (t) {
52+
testSingle(t, 'udp')
53+
})
5654

57-
server.close(function () {
58-
t.end()
59-
})
60-
}))
61-
}).on('error', function (e) {
55+
function clientScrapeStatic (t, serverType) {
56+
commonTest.createServer(t, serverType, function (server, announceUrl) {
57+
server.once('listening', function () {
58+
Client.scrape(announceUrl, infoHash1, function (err, data) {
6259
t.error(err)
60+
t.equal(data.announce, announceUrl)
61+
t.equal(typeof data.complete, 'number')
62+
t.equal(typeof data.incomplete, 'number')
63+
t.equal(typeof data.downloaded, 'number')
64+
server.close(function () {
65+
t.end()
66+
})
6367
})
6468
})
6569
})
70+
}
71+
72+
test('http: scrape using Client.scrape static method', function (t) {
73+
clientScrapeStatic(t, 'http')
6674
})
6775

76+
test('udp: scrape using Client.scrape static method', function (t) {
77+
clientScrapeStatic(t, 'udp')
78+
})
79+
80+
// TODO: test client for multiple scrape for UDP trackers
81+
6882
test('server: multiple info_hash scrape', function (t) {
6983
var server = new Server({ udp: false })
7084
server.on('error', function (err) {
@@ -80,7 +94,7 @@ test('server: multiple info_hash scrape', function (t) {
8094
var scrapeUrl = 'http://127.0.0.1:' + port + '/scrape'
8195

8296
server.once('listening', function () {
83-
var url = scrapeUrl + '?' + common.querystringStringify({
97+
var url = scrapeUrl + '?' + commonLib.querystringStringify({
8498
info_hash: [ binaryInfoHash1, binaryInfoHash2 ]
8599
})
86100
http.get(url, function (res) {

0 commit comments

Comments
 (0)