package com.linkedin.databus2.relay.config;
/*
*
* Copyright 2013 LinkedIn Corp. All rights reserved
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;
import junit.framework.Assert;
import org.apache.log4j.Level;
import org.testng.annotations.Test;
import com.linkedin.databus2.test.TestUtil;
public class TestDatabusRelaySourcesInFile
{
public static final String tmpDir ="/tmp";
static
{
TestUtil.setupLogging(true, "./TestDatabusRelaySourcesInFile.log", Level.WARN);
}
PhysicalSourceConfig createPhysicalSourceConfig(String pSourceName, int startLogicalId,int numSources)
{
PhysicalSourceConfig pconfig = new PhysicalSourceConfig();
pconfig.setName(pSourceName);
pconfig.setUri("http://"+pSourceName);
ArrayList<LogicalSourceConfig> newSources = new ArrayList<LogicalSourceConfig>();
for (int i=0; i < numSources;++i)
{
short lid = (short) (i+startLogicalId);
LogicalSourceConfig tab = new LogicalSourceConfig();
tab.setName("ls"+lid);
tab.setId(lid);
tab.setUri("tab_"+ lid);
newSources.add(tab);
}
pconfig.setSources(newSources);
return pconfig;
}
void checkIfEqual(PhysicalSourceConfig p1, PhysicalSourceConfig p2)
{
Assert.assertNotNull(p1);
Assert.assertNotNull(p2);
String p1String = p1.toString();
String p2String = p2.toString();
Assert.assertEquals(p1String,p2String);
}
@Test
public void testSourceInfoSaveLoad() throws Exception
{
//create a physcial source config object
int numConfigs = 3;
PhysicalSourceConfig[] pConfigs = new PhysicalSourceConfig[numConfigs];
DatabusRelaySourcesInFiles databusSources = new DatabusRelaySourcesInFiles(tmpDir);
String[] pNames = new String[numConfigs];
for (int i=0; i < numConfigs;++i)
{
String pName = "physical"+i;
pNames[i] = pName;
pConfigs[i] = createPhysicalSourceConfig(pName, 100*(i+1), i+1);
Assert.assertTrue(databusSources.add(pName,pConfigs[i]));
}
Assert.assertTrue(databusSources.save());
DatabusRelaySourcesInFiles readSources = new DatabusRelaySourcesInFiles(tmpDir);
Assert.assertTrue(readSources.load());
PhysicalSourceConfig[] readConfigs = readSources.getAll();
Assert.assertEquals(numConfigs,readConfigs.length);
//now compare configs; what was written is what was read
for (String pSrcName: pNames)
{
PhysicalSourceConfig p1 = databusSources.get(pSrcName);
PhysicalSourceConfig p2 = readSources.get(pSrcName);
checkIfEqual(p1,p2);
}
//remove all entries;
databusSources.removePersistedEntries();
//read empty dir
Assert.assertTrue(readSources.load());
PhysicalSourceConfig[] pNoConfigs=readSources.getAll();
Assert.assertEquals(0,pNoConfigs.length);
Assert.assertEquals(0,readSources.size());
}
@Test
public void testLoadWithBadFiles() throws Exception
{
int numConfigs = 1;
PhysicalSourceConfig[] pConfigs = new PhysicalSourceConfig[numConfigs];
DatabusRelaySourcesInFiles databusSources = new DatabusRelaySourcesInFiles(tmpDir);
String[] pNames = new String[numConfigs];
for (int i=0; i < numConfigs;++i)
{
String pName = "physical"+i;
pNames[i] = pName;
pConfigs[i] = createPhysicalSourceConfig(pName, 100*(i+1), i+1);
Assert.assertTrue(databusSources.add(pName,pConfigs[i]));
}
//save 1 legal json file
Assert.assertTrue(databusSources.save());
//now add bad jsob files
String badJson = tmpDir+"/bad.json";
String emptyJson = tmpDir+"/empty.json";
File fBad = new File(badJson);
fBad.createNewFile();
File fEmpty= new File(emptyJson);
fEmpty.createNewFile();
FileWriter w1 = new FileWriter(fBad);
w1.append("This is bad json");
w1.close();
DatabusRelaySourcesInFiles readSources = new DatabusRelaySourcesInFiles(tmpDir);
boolean t = readSources.load();
//delete old files after reading it
fBad.delete();
readSources.removePersistedEntries();
fEmpty.delete();
Assert.assertTrue(t);
PhysicalSourceConfig[] pNoConfigs=readSources.getAll();
Assert.assertEquals(1,pNoConfigs.length);
Assert.assertEquals(1,readSources.size());
}
}