package com.neverwinterdp.sparkngin.http;
import static org.junit.Assert.assertEquals;
import io.netty.buffer.ByteBuf;
import io.netty.handler.codec.http.HttpContent;
import io.netty.handler.codec.http.HttpResponse;
import java.util.HashMap;
import java.util.Map;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.neverwinterdp.message.Message;
import com.neverwinterdp.netty.http.HttpServer;
import com.neverwinterdp.netty.http.client.AsyncHttpClient;
import com.neverwinterdp.netty.http.client.ResponseHandler;
import com.neverwinterdp.sparkngin.MessageForwarder;
import com.neverwinterdp.sparkngin.Sparkngin;
import com.neverwinterdp.util.FileUtil;
import com.neverwinterdp.yara.MetricRegistry;
/**
* @author Tuan Nguyen
* @email tuan08@gmail.com
*/
public class TrackingPixelRouteHandlerUnitTest {
static {
System.setProperty("log4j.configuration", "file:src/main/resources/log4j.properties") ;
//TODO: To enable the netty leak report.
//No idea why there is a ByteBuf memory leak. Not sure it is our bug.
//System.setProperty("io.netty.leakDetectionLevel", "advanced") ;
}
private HttpServer server ;
private AssertMessageForwarder forwarder ;
@Before
public void setup() throws Exception {
FileUtil.removeIfExist("build/queue", false) ;
forwarder = new AssertMessageForwarder() ;
MetricRegistry mRegistry = new MetricRegistry() ;
Sparkngin sparkngin = new Sparkngin(mRegistry, forwarder, "build/queue/data") ;
server = new HttpServer() ;
server.startAsDeamon() ;
Map<String, String> config = new HashMap<String, String>() ;
config.put("tracking.site.extract-headers", "Host.*,content.*") ;
server.add("/tracker/:trackerName/:site", new TrackingPixelRouteHandler(sparkngin, config)) ;
Thread.sleep(2000) ;
}
@After
public void teardown() {
server.shutdown() ;
}
@Test
public void testPixel() throws Exception {
TrackingPixelResponseHandler handler = new TrackingPixelResponseHandler();
AsyncHttpClient client = new AsyncHttpClient ("127.0.0.1", server.getPort(), handler) ;
int LOOP = 1;
for(int i = 0; i < LOOP; i++) {
client.get("/tracker/metrics.tracker/githup.com") ;
}
//Wait to make sure all the ack are return to the client
Thread.sleep(3000);
//Make sure testCount responses have been received
assertEquals(LOOP, handler.getCount());
assertEquals(LOOP, forwarder.getForwardCount());
//Make sure no failure was caught since ResponseHandler doesn't have error handling
//and it eats up the error without reporting a test failure
assertEquals(0,handler.getFailure());
client.close();
//TODO: the client current does not support the cookie. If we want to test the cookie. Need to enable this sleep
//method and use the browser with http://localhost:8080/pixel to test. You can use browser header inspector to check
//the cookie.
//Thread.sleep(60000000);
}
/**
* Handler to make sure when HTTP response is received,
* it matches the content served from TrackingPixelRouteHandler
*/
static public class TrackingPixelResponseHandler implements ResponseHandler {
int count = 0;
int failure = 0;
public void onResponse(HttpResponse response) {
count++;
HttpContent content = (HttpContent) response;
ByteBuf buf = content.content();
try {
assertEquals(TrackingPixelRouteHandler.getImageBytes(), buf);
} catch(AssertionError e){
failure++;
}
}
public int getCount(){ return this.count; }
public int getFailure(){ return this.failure; }
}
static public class AssertMessageForwarder implements MessageForwarder {
private int count = 0 ;
public int getForwardCount() { return count; }
public void forward(Message message) throws Exception {
count++ ;
Assert.assertEquals("metrics.tracker", message.getHeader().getTopic()) ;
RequestLog log = message.getData().getDataAs(RequestLog.class) ;
Assert.assertEquals(2, log.getRequestHeaders().size());
Assert.assertNotNull(log.getRequestHeaders().get("Host"));
}
@Override
public void close() { }
public boolean hasError() { return false; }
public void setError(Throwable error) {
}
public boolean reconnect() {
return true;
}
}
}