wip on crawler and tests
This commit is contained in:
@@ -6,14 +6,16 @@ class Crawler {
|
|||||||
|
|
||||||
final def pinger
|
final def pinger
|
||||||
final def hostPool
|
final def hostPool
|
||||||
|
final int parallel
|
||||||
|
|
||||||
final Map<Destination, Host> inFlight = new HashMap<>()
|
final Map<Destination, Host> inFlight = new HashMap<>()
|
||||||
|
|
||||||
UUID currentUUID
|
UUID currentUUID
|
||||||
|
|
||||||
Crawler(pinger, hostPool) {
|
Crawler(pinger, hostPool, int parallel) {
|
||||||
this.pinger = pinger
|
this.pinger = pinger
|
||||||
this.hostPool = hostPool
|
this.hostPool = hostPool
|
||||||
|
this.parallel = parallel
|
||||||
}
|
}
|
||||||
|
|
||||||
synchronized def handleCrawlerPong(pong, Destination source) {
|
synchronized def handleCrawlerPong(pong, Destination source) {
|
||||||
@@ -61,4 +63,16 @@ class Crawler {
|
|||||||
private static boolean parseBoolean(value) {
|
private static boolean parseBoolean(value) {
|
||||||
return Boolean.parseBoolean(value.toString())
|
return Boolean.parseBoolean(value.toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
synchronized def startCrawl() {
|
||||||
|
if (!inFlight.isEmpty()) {
|
||||||
|
inFlight.values().each { hostPool.fail(it) }
|
||||||
|
inFlight.clear()
|
||||||
|
}
|
||||||
|
currentUUID = UUID.randomUUID()
|
||||||
|
hostPool.getUnverified(parallel).each {
|
||||||
|
inFlight.put(it.destination, it)
|
||||||
|
pinger.ping(it, currentUUID)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
package com.muwire.hostcache
|
package com.muwire.hostcache
|
||||||
|
|
||||||
|
import org.junit.After
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
||||||
@@ -17,21 +18,58 @@ class CrawlerTest {
|
|||||||
|
|
||||||
def crawler
|
def crawler
|
||||||
|
|
||||||
|
final Host host = new Host(destination: new Destination())
|
||||||
|
|
||||||
|
final int parallel = 5
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
void before() {
|
void before() {
|
||||||
pingerMock = new MockFor(Pinger)
|
pingerMock = new MockFor(Pinger)
|
||||||
pinger = pingerMock.proxyInstance()
|
|
||||||
|
|
||||||
hostPoolMock = new MockFor(HostPool)
|
hostPoolMock = new MockFor(HostPool)
|
||||||
hostPool = hostPoolMock.proxyInstance()
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
void after() {
|
||||||
|
hostPoolMock.verify hostPool
|
||||||
|
pingerMock.verify pinger
|
||||||
|
}
|
||||||
|
|
||||||
|
private def initCrawler() {
|
||||||
|
pinger = pingerMock.proxyInstance()
|
||||||
|
hostPool = hostPoolMock.proxyInstance()
|
||||||
|
crawler = new Crawler(pinger, hostPool, parallel)
|
||||||
|
|
||||||
crawler = new Crawler(pinger, hostPool)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testBadJson() {
|
void testBadJson() {
|
||||||
|
initCrawler()
|
||||||
def unpingedHost = new Host(destination : new Destination())
|
def unpingedHost = new Host(destination : new Destination())
|
||||||
crawler.handleCrawlerPong(null, new Destination())
|
crawler.handleCrawlerPong(null, new Destination())
|
||||||
hostPoolMock.verify hostPool
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testStartCrawl() {
|
||||||
|
hostPoolMock.demand.getUnverified { n ->
|
||||||
|
assert n == parallel
|
||||||
|
[host]
|
||||||
|
}
|
||||||
|
pingerMock.demand.ping { h,uuid -> assert h == host }
|
||||||
|
|
||||||
|
initCrawler()
|
||||||
|
crawler.startCrawl()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testFailsUnanswered() {
|
||||||
|
hostPoolMock.demand.getUnverified {n -> [host]}
|
||||||
|
hostPoolMock.demand.fail { h -> assert h == host }
|
||||||
|
hostPoolMock.demand.getUnverified {n -> [:]}
|
||||||
|
pingerMock.demand.ping {h,uuid -> }
|
||||||
|
initCrawler()
|
||||||
|
|
||||||
|
crawler.startCrawl()
|
||||||
|
crawler.startCrawl()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user