package com.github.kristofa.brave.scribe;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.server.THsHaServer;
import org.apache.thrift.server.TServer;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TNonblockingServerSocket;
import org.apache.thrift.transport.TNonblockingServerTransport;
import org.apache.thrift.transport.TTransportException;
import com.twitter.zipkin.gen.Span;
import com.twitter.zipkin.gen.scribe.Iface;
import com.twitter.zipkin.gen.scribe.Processor;
/**
* Scribe server used for testing.
*/
class ScribeServer {
private final TServer server;
private final ScribeReceiver receiver;
public ScribeServer(final int port) throws TTransportException {
receiver = new ScribeReceiver();
final Processor<Iface> processor = new Processor<Iface>(receiver);
final TNonblockingServerTransport transport = new TNonblockingServerSocket(port);
final THsHaServer.Args args = new THsHaServer.Args(transport);
args.minWorkerThreads(1);
args.maxWorkerThreads(1);
args.processor(processor);
args.protocolFactory(new TBinaryProtocol.Factory());
args.transportFactory(new TFramedTransport.Factory());
server = new THsHaServer(args);
}
public void start() {
new Thread(server::serve).start();
}
public void clearReceivedSpans() {
receiver.clearReceivedSpans();
}
public List<Span> getReceivedSpans() {
return receiver.getSpans();
}
public void introduceDelay(int duration, TimeUnit unit) {
receiver.setDelayMs((int) TimeUnit.MILLISECONDS.convert(duration, unit));
}
public void clearDelay() {
receiver.setDelayMs(0);
}
public void stop() {
server.stop();
}
}