package com.linkedin.databus.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Arrays;
import java.util.List;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.linkedin.databus.core.util.FileUtils;
import com.linkedin.databus2.relay.config.LogicalSourceConfig;
import com.linkedin.databus2.relay.config.PhysicalSourceConfig;
public class TestDevRelaySrcConfigGen
{
@Test
/**
*
* Steps:
* 1. Generate new Schema_registry with some example schemas.
* 2. Construct schemaDataMAnager and generate RelayDevConfigs for the example DB.
* 3. Open the newly generated json file containing physical-sources config and de-serialize to construct a physicalSourcesConfig object
* 4. Ensure physicalSourcesConfig object have expected source configurations.
*
* @throws Exception
*/
public void testDevRelaySrcConfigGen()
throws Exception
{
// Schema
String[] personSchema = { "{\"type\":\"record\",\"name\":\"Person\",\"namespace\":\"com.linkedin.events.example\",\"fields\":[{\"name\":\"txn\",\"type\":[\"long\",\"null\"],\"meta\":\"dbFieldName=TXN;dbFieldPosition=0;\"},{\"name\":\"key\",\"type\":[\"long\",\"null\"],\"meta\":\"dbFieldName=KEY;dbFieldPosition=1;\"},{\"name\":\"firstName\",\"type\":[\"string\",\"null\"],\"meta\":\"dbFieldName=FIRST_NAME;dbFieldPosition=2;\"},{\"name\":\"lastName\",\"type\":[\"string\",\"null\"],\"meta\":\"dbFieldName=LAST_NAME;dbFieldPosition=3;\"},{\"name\":\"birthDate\",\"type\":[\"long\",\"null\"],\"meta\":\"dbFieldName=BIRTH_DATE;dbFieldPosition=4;\"},{\"name\":\"deleted\",\"type\":[\"string\",\"null\"],\"meta\":\"dbFieldName=DELETED;dbFieldPosition=5;\"}],\"meta\":\"dbFieldName=sy$person;\"}"};
String[] addressSchema = { "{\"type\":\"record\",\"name\":\"Address\",\"namespace\":\"com.linkedin.events.example\",\"fields\":[{\"name\":\"txn\",\"type\":[\"long\",\"null\"],\"meta\":\"dbFieldName=TXN;dbFieldPosition=0;\"},{\"name\":\"key\",\"type\":[\"long\",\"null\"],\"meta\":\"dbFieldName=KEY;dbFieldPosition=1;\"},{\"name\":\"addressLine1\",\"type\":[\"string\",\"null\"],\"meta\":\"dbFieldName=ADDRESS_LINE_1;dbFieldPosition=2;\"},{\"name\":\"addressLine2\",\"type\":[\"string\",\"null\"],\"meta\":\"dbFieldName=ADDRESS_LINE_2;dbFieldPosition=3;\"},{\"name\":\"zipCode\",\"type\":[\"long\",\"null\"],\"meta\":\"dbFieldName=ZIP_CODE;dbFieldPosition=4;\"},{\"name\":\"deleted\",\"type\":[\"string\",\"null\"],\"meta\":\"dbFieldName=DELETED;dbFieldPosition=5;\"}],\"meta\":\"dbFieldName=sy$address;\"}"};
// Index Schema registry contents
String[] indexContents = { "com.linkedin.events.example.person.avsc",
"com.linkedin.events.example.address.avsc"};
// Meta-Data contents
String[] idNameMapContents = {
"1:com.linkedin.events.example.person",
"2:com.linkedin.events.example.address"};
String[] dbToSrcMapContents = { "{",
" \"example\" : [ \"com.linkedin.events.example.Address\", \"com.linkedin.events.example.Person\" ]",
"}"
};
File schemaDir = FileUtils.createTempDir("dir_testDevRelaySrcConfigGen");
String dbToSrcFile1 = schemaDir.getAbsolutePath() + "/physical_logical_src_map.json";
String idNameMapFile1 = schemaDir.getAbsolutePath() + "/idToName.map";
String indexRegistry = schemaDir.getAbsolutePath() + "/index.schemas_registry";
String personSchemaFile = schemaDir.getAbsolutePath() + "/com.linkedin.events.example.person.1.avsc";
String addressSchemaFile = schemaDir.getAbsolutePath() + "/com.linkedin.events.example.address.1.avsc";
FileUtils.storeLinesToTempFile(dbToSrcFile1, dbToSrcMapContents);
FileUtils.storeLinesToTempFile(idNameMapFile1, idNameMapContents);
FileUtils.storeLinesToTempFile(indexRegistry, indexContents);
FileUtils.storeLinesToTempFile(personSchemaFile, personSchema);
FileUtils.storeLinesToTempFile(addressSchemaFile, addressSchema);
SchemaMetaDataManager mgr = new SchemaMetaDataManager(schemaDir.getAbsolutePath());
String uri = "jdbc:oracle:thin:liar/liar@devdb:DB";
List<String> exampleSrcs = Arrays.asList("com.linkedin.events.example.person", "com.linkedin.events.example.address");
DevRelayConfigGenerator.generateRelayConfig(schemaDir.getAbsolutePath(), "example", uri, schemaDir.getAbsolutePath(), exampleSrcs, mgr);
File f = new File(schemaDir.getAbsolutePath() + "/sources-example.json");
Assert.assertTrue( f.exists(),"Physical Src Config file present?");
BufferedReader r = new BufferedReader(new FileReader(f));
String json = r.readLine();
PhysicalSourceConfig config = PhysicalSourceConfig.fromString(json);
config.checkForNulls();
Assert.assertEquals(config.getUri(), uri);
Assert.assertEquals(config.getName(), "example");
List<LogicalSourceConfig> srcs = config.getSources();
Assert.assertEquals(srcs.size(),2 );
Assert.assertEquals(srcs.get(0).getId(), 1);
Assert.assertEquals(srcs.get(0).getName(), "com.linkedin.events.example.person");
Assert.assertEquals(srcs.get(0).getUri(), "example.sy$person");
Assert.assertEquals(srcs.get(1).getId(), 2);
Assert.assertEquals(srcs.get(1).getName(), "com.linkedin.events.example.address");
Assert.assertEquals(srcs.get(1).getUri(), "example.sy$address");
}
}