package com.leansoft.luxun.integration;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import com.leansoft.luxun.LuxunServerTestHarness;
import com.leansoft.luxun.broker.Broker;
import com.leansoft.luxun.consumer.ConsumerConfig;
import com.leansoft.luxun.consumer.FetchedDataChunk;
import com.leansoft.luxun.consumer.Fetcher;
import com.leansoft.luxun.consumer.StreamFactory;
import com.leansoft.luxun.consumer.TopicInfo;
import com.leansoft.luxun.message.Message;
import com.leansoft.luxun.message.MessageList;
import com.leansoft.luxun.producer.SyncProducer;
import com.leansoft.luxun.server.ServerConfig;
import com.leansoft.luxun.utils.TestUtils;
public class FetcherTest extends LuxunServerTestHarness {
int numNodes = 2;
Map<Integer, List<MessageList>> messages;
String topic = "topic";
FetchedDataChunk shutdown = StreamFactory.SHUTDOWN_COMMAND;
BlockingQueue<FetchedDataChunk> queue = new LinkedBlockingQueue<FetchedDataChunk>();
List<TopicInfo> topicInfos;
Fetcher fetcher = null;
@Override
public void setUp() throws Exception {
configs = new ArrayList<ServerConfig>();
List<Properties> propsList = TestUtils.createBrokerConfigs(numNodes);
for(Properties props : propsList) {
configs.add(new ServerConfig(props));
}
super.setUp();
messages = new HashMap<Integer, List<MessageList>>();
topicInfos = new ArrayList<TopicInfo>();
for(ServerConfig config : configs) {
TopicInfo ptInfo = new TopicInfo(
topic,
new Broker(config.getBrokerId(), String.valueOf(config.getBrokerId()), "127.0.0.1", config.getPort()),
queue
);
topicInfos.add(ptInfo);
}
fetcher = new Fetcher(new ConsumerConfig(TestUtils.createConsumerProperties("dummy.borker.list", "dummy.groupid", "")));
fetcher.stopConnectionsToAllBrokers();
fetcher.startConnections(topicInfos);
}
@Override
public void tearDown() throws Exception {
fetcher.stopConnectionsToAllBrokers();
super.tearDown();
}
public void testFetcher() throws InterruptedException {
int perNode = 2;
int count = sendMessages(perNode);
fetch(count);
Thread.sleep(1000);
assertQueueEmpty();
count = sendMessages(perNode);
fetch(count);
Thread.sleep(1000);
assertQueueEmpty();
}
private void assertQueueEmpty() {
assertEquals(0, queue.size());
}
public int sendMessages(int messagesPerNode) {
int count = 0;
for(ServerConfig conf : configs) {
SyncProducer producer = TestUtils.createProducer("127.0.0.1", conf.getPort());
MessageList messageList = new MessageList();
for(int i = 0; i < messagesPerNode; i++) {
byte[] message = String.valueOf(conf.getBrokerId() * 5 + i).getBytes();
messageList.add(new Message(message));
}
if (!messages.containsKey(conf.getBrokerId())) {
messages.put(conf.getBrokerId(), new ArrayList<MessageList>());
}
messages.get(conf.getBrokerId()).add(messageList);
producer.send(topic, messageList);
producer.close();
count += messageList.size();
}
return count;
}
public void fetch(int expected) throws InterruptedException {
int count = 0;
while(true) {
FetchedDataChunk chunk = queue.poll(2L, TimeUnit.SECONDS);
assertNotNull("Timed out waiting for data chunk " + (count + 1), chunk);
count += chunk.messageList.size();
if (count == expected) return;
}
}
}