package com.linkedin.databus2.relay.config;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.fail;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.io.IOUtils;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.testng.annotations.Test;
import com.linkedin.databus.core.data_model.PhysicalPartition;
import com.linkedin.databus.core.data_model.PhysicalSource;
import com.linkedin.databus.core.util.InvalidConfigException;
public class TestPhysicalSourceConfig {
private final String _configSource = "{\n" +
" \"name\" : \"multBufferTest\",\n" +
" \"id\" : 100,\n" +
" \"uri\" : \"doesnot matter\",\n" +
" \"slowSourceQueryThreshold\" : 2000,\n" +
" \"sources\" :\n" +
" [\n" +
" {\"id\" : 2, \n" +
" \"name\" : \"com.linkedin.events.member2.profile.MemberProfile\",\n" +
" \"uri\": \"member2.member_profile\", \n" +
" \"partitionFunction\" : \"constant:1\"\n" +
" },\n" +
" {\"id\" : 3, \n" +
" \"name\" : \"com.linkedin.events.member2.account.MemberAccount\",\n" +
" \"uri\" : \"member2.member_account\", \n" +
" \"partitionFunction\" : \"constant:1\"\n" +
" },\n" +
" {\"id\" : 4, \n" +
" \"name\" : \"com.linkedin.events.member2.businessattr.MemberBusinessAttr\",\n" +
" \"uri\" : \"member2.member_business_attr\", \n" +
" \"partitionFunction\" : \"constant:1\"\n" +
" },\n" +
" {\"id\" : 5, \n" +
" \"name\" : \"com.linkedin.events.member2.setting.MemberSetting\",\n" +
" \"uri\" : \"member2.member_setting\", \n" +
" \"partitionFunction\" : \"constant:1\"\n" +
" }\n" +
" ]\n" +
"}";
// test partial constructor
@Test
public void testPhysicalSourceConfigConstructor() {
Integer pPartitionId = 10;
String name = "dbName";
PhysicalPartition pPartition = new PhysicalPartition(pPartitionId, name);
PhysicalSource pSource = new PhysicalSource("uri");
PhysicalSourceConfig pConfig = new PhysicalSourceConfig(pPartition.getName(), pSource.getUri(), pPartition.getId());
int lSourceId = 10;
String lSourceName = "lName";
for(int i=0; i< 10; i++) {
LogicalSourceConfig lSC = new LogicalSourceConfig();
lSourceId = lSourceId + i;
lSC.setId((short)lSourceId);
lSC.setName(lSourceName+lSourceId);
lSC.setPartition((short)0);
lSC.setUri("lUri");
pConfig.addSource(lSC);
}
assertEquals(10, pConfig.getSources().size(), "number of logical source doesn't match");
}
// test to see that we read and convert config correctly
@Test
public void testPhysicalSourceConfig() throws IOException {
ObjectMapper mapper = new ObjectMapper();
InputStreamReader isr = new InputStreamReader(IOUtils.toInputStream(_configSource));
//PhysicalSourceConfig physicalSourceConfig = mapper.readValue(sourcesJson, PhysicalSourceConfig.class);
PhysicalSourceConfig physicalSourceConfig = mapper.readValue(isr, PhysicalSourceConfig.class);
PhysicalSourceStaticConfig pStatic=null;
try {
physicalSourceConfig.checkForNulls();
pStatic = physicalSourceConfig.build();
} catch (InvalidConfigException e) {
fail("PhysicalSourceConfig.checkForNulls failed.", e);
}
// also assert basic stuff
assertNotNull("Uri is null.", pStatic.getUri());
assertNotNull("Name is null.", pStatic.getName());
assertEquals(100, pStatic.getId(),"physical source id mismatch:");
List<LogicalSourceConfig>lSources = physicalSourceConfig.getSources();
assertEquals(4, lSources.size(), "number of logical sources");
LogicalSourceStaticConfig lSource=null;
try
{
lSource = lSources.get(0).build();
}
catch (InvalidConfigException e)
{
fail("get LogicalSourceStaticConfig failed", e);
}
assertEquals(2, lSource.getId(), "logical source id");
}
@Test
public void testParsePhysicalPartitionString () throws IOException {
String partString = "abc_123";
PhysicalPartition pPart = PhysicalPartition.parsePhysicalPartitionString(partString, "_");
assertEquals("abc", pPart.getName());
assertEquals(123, pPart.getId().intValue());
partString = "abc.123";
pPart = PhysicalPartition.parsePhysicalPartitionString(partString, "\\.");
assertEquals("abc", pPart.getName());
assertEquals(123, pPart.getId().intValue());
String [] partStrings = new String [] {"abc.123","abc123", "123", "abc", "" };
for(String s : partStrings) {
try {
PhysicalPartition.parsePhysicalPartitionString(s, "_");
fail("should fail on invalid partition string");
} catch (IOException e) {
// expected
}
}
}
private String mapToJsonStr(Map<String,Object> map) throws JsonGenerationException, JsonMappingException, IOException
{
ObjectMapper mapper = new ObjectMapper();
StringWriter writer = new StringWriter();
mapper.writeValue(writer, map);
String str = writer.toString();
return str;
}
@Test
public void testPhysicalSourceConfigSerialize() throws JsonParseException, JsonMappingException, IOException
{
PhysicalSourceConfig pconfig = new PhysicalSourceConfig();
LogicalSourceConfig tab1 = new LogicalSourceConfig();
LogicalSourceConfig tab2 = new LogicalSourceConfig();
LogicalSourceConfig tab3 = new LogicalSourceConfig();
tab1.setId((short) 1); tab2.setId((short) 2); tab3.setId((short) 3);
ArrayList<LogicalSourceConfig> newSources = new ArrayList<LogicalSourceConfig>();
newSources.add(tab1); newSources.add(tab2); newSources.add(tab3);
pconfig.setSources(newSources);
String jsonStr = pconfig.toString();
System.out.println("json str=" + jsonStr);
PhysicalSourceConfig npConfig = PhysicalSourceConfig.fromString(jsonStr);
short id = npConfig.getSource(2).getId();
System.out.println("id=" + id);
Map<String,Object> map = pconfig.toMap();
String s = mapToJsonStr(map);
System.out.println("map=" + s);
ArrayList<Map<String,Object>> sconf = (ArrayList<Map<String,Object>>) map.get("sources");
sconf.get(2).put("id",(short)45);
PhysicalSourceConfig mConfig = PhysicalSourceConfig.fromMap(map);
System.out.println("new map obj=" + mConfig.toString());
}
}