package org.apache.hadoop.corona;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import junit.framework.TestCase;
public class TestConfigManager extends TestCase {
final static String TEST_DIR = new File(System.getProperty("test.build.data",
"build/contrib/corona/test/data")).getAbsolutePath();
final static String CONFIG_FILE_PATH = new File(TEST_DIR,
CoronaConf.POOL_CONFIG_FILE).getAbsolutePath();
final static List<String> TYPES =
Collections.unmodifiableList((Arrays.asList("M", "R")));
final static String M = TYPES.get(0);
final static String R = TYPES.get(1);
@Override
protected void setUp() throws Exception {
new File(TEST_DIR).mkdirs();
}
@Override
protected void tearDown() throws Exception {
new File(TEST_DIR).delete();
}
public void testEmptyFile() throws IOException {
// Create an empty pools file (so we can add/remove pools later)
FileWriter out = new FileWriter(CONFIG_FILE_PATH);
out.write("<?xml version=\"1.0\"?>\n");
out.write("<configuration />\n");
out.close();
ConfigManager configManager = new ConfigManager(TYPES, CONFIG_FILE_PATH);
String poolName = "myPool";
assertEquals(ScheduleComparator.FIFO, configManager.getComparator(poolName));
assertEquals(Integer.MAX_VALUE, configManager.getMaximum(poolName, M));
assertEquals(Integer.MAX_VALUE, configManager.getMaximum(poolName, R));
assertEquals(0, configManager.getMinimum(poolName, M));
assertEquals(0, configManager.getMinimum(poolName, R));
assertEquals(0, configManager.getLocalityWait(M, LocalityLevel.NODE));
assertEquals(0, configManager.getLocalityWait(R, LocalityLevel.NODE));
assertEquals(0, configManager.getLocalityWait(M, LocalityLevel.RACK));
assertEquals(0, configManager.getLocalityWait(R, LocalityLevel.RACK));
assertEquals(1.0, configManager.getWeight(poolName));
}
public void testComparator() throws IOException {
FileWriter out = new FileWriter(CONFIG_FILE_PATH);
out.write("<?xml version=\"1.0\"?>\n");
out.write("<configuration>\n");
out.write(" <defaultSchedulingMode>FAIR</defaultSchedulingMode>\n");
out.write(" <pool name=\"poolA\">\n");
out.write(" <schedulingMode>FIFO</schedulingMode>\n");
out.write(" </pool>");
out.write(" <pool name=\"poolB\">\n");
out.write(" <schedulingMode>FAIR</schedulingMode>\n");
out.write(" </pool>");
out.write("</configuration>\n");
out.close();
ConfigManager configManager = new ConfigManager(TYPES, CONFIG_FILE_PATH);
assertEquals(ScheduleComparator.FIFO, configManager.getComparator("poolA"));
assertEquals(ScheduleComparator.FAIR, configManager.getComparator("poolB"));
assertEquals(ScheduleComparator.FAIR, configManager.getComparator("poolC"));
}
public void testMinTasks() throws IOException {
FileWriter out = new FileWriter(CONFIG_FILE_PATH);
out.write("<?xml version=\"1.0\"?>\n");
out.write("<configuration>\n");
out.write(" <pool name=\"poolA\">\n");
out.write(" <minM>1</minM>\n");
out.write(" <minR>2</minR>\n");
out.write(" </pool>");
out.write(" <pool name=\"poolB\">\n");
out.write(" <minM>3</minM>\n");
out.write(" </pool>");
out.write(" <pool name=\"poolC\">\n");
out.write(" <minR>4</minR>\n");
out.write(" </pool>");
out.write("</configuration>\n");
out.close();
ConfigManager configManager = new ConfigManager(TYPES, CONFIG_FILE_PATH);
assertEquals(1, configManager.getMinimum("poolA", M));
assertEquals(2, configManager.getMinimum("poolA", R));
assertEquals(3, configManager.getMinimum("poolB", M));
assertEquals(0, configManager.getMinimum("poolB", R));
assertEquals(0, configManager.getMinimum("poolC", M));
assertEquals(4, configManager.getMinimum("poolC", R));
assertEquals(0, configManager.getMinimum("poolD", M));
assertEquals(0, configManager.getMinimum("poolD", R));
}
public void testMaxTasks() throws IOException {
FileWriter out = new FileWriter(CONFIG_FILE_PATH);
out.write("<?xml version=\"1.0\"?>\n");
out.write("<configuration>\n");
out.write(" <pool name=\"poolA\">\n");
out.write(" <maxM>1</maxM>\n");
out.write(" <maxR>2</maxR>\n");
out.write(" </pool>");
out.write(" <pool name=\"poolB\">\n");
out.write(" <maxM>3</maxM>\n");
out.write(" </pool>");
out.write(" <pool name=\"poolC\">\n");
out.write(" <maxR>4</maxR>\n");
out.write(" </pool>");
out.write("</configuration>\n");
out.close();
ConfigManager configManager = new ConfigManager(TYPES, CONFIG_FILE_PATH);
assertEquals(1, configManager.getMaximum("poolA", M));
assertEquals(2, configManager.getMaximum("poolA", R));
assertEquals(3, configManager.getMaximum("poolB", M));
assertEquals(Integer.MAX_VALUE, configManager.getMaximum("poolB", R));
assertEquals(Integer.MAX_VALUE, configManager.getMaximum("poolC", M));
assertEquals(4, configManager.getMaximum("poolC", R));
assertEquals(Integer.MAX_VALUE, configManager.getMaximum("poolD", M));
assertEquals(Integer.MAX_VALUE, configManager.getMaximum("poolD", R));
}
public void testWeight() throws IOException {
FileWriter out = new FileWriter(CONFIG_FILE_PATH);
out.write("<?xml version=\"1.0\"?>\n");
out.write("<configuration>\n");
out.write(" <pool name=\"poolA\">\n");
out.write(" <weight>2.0</weight>\n");
out.write(" <maxR>2</maxR>\n");
out.write(" </pool>");
out.write("</configuration>\n");
out.close();
ConfigManager configManager = new ConfigManager(TYPES, CONFIG_FILE_PATH);
assertEquals(2.0, configManager.getWeight("poolA"));
assertEquals(1.0, configManager.getWeight("poolB"));
}
public void testLocalityWait() throws IOException {
FileWriter out = new FileWriter(CONFIG_FILE_PATH);
out.write("<?xml version=\"1.0\"?>\n");
out.write("<configuration>\n");
out.write(" <nodeLocalityWaitM>1000</nodeLocalityWaitM>\n");
out.write(" <rackLocalityWaitM>3000</rackLocalityWaitM>\n");
out.write(" <pool name=\"poolA\">\n");
out.write(" <weight>2.0</weight>\n");
out.write(" </pool>");
out.write("</configuration>\n");
out.close();
ConfigManager configManager = new ConfigManager(TYPES, CONFIG_FILE_PATH);
assertEquals(1000L, configManager.getLocalityWait(M, LocalityLevel.NODE));
assertEquals(3000L, configManager.getLocalityWait(M, LocalityLevel.RACK));
assertEquals(0L, configManager.getLocalityWait(R, LocalityLevel.NODE));
assertEquals(0L, configManager.getLocalityWait(R, LocalityLevel.RACK));
}
public void testPreemptParameters() throws IOException {
FileWriter out = new FileWriter(CONFIG_FILE_PATH);
out.write("<?xml version=\"1.0\"?>\n");
out.write("<configuration>\n");
out.write(" <shareStarvingRatio>0.1</shareStarvingRatio>\n");
out.write(" <starvingTimeForShare>3000</starvingTimeForShare>\n");
out.write(" <starvingTimeForMinimum>4000</starvingTimeForMinimum>\n");
out.write(" <preemptedTaskMaxRunningTime>5000</preemptedTaskMaxRunningTime>\n");
out.write("</configuration>\n");
out.close();
ConfigManager configManager = new ConfigManager(TYPES, CONFIG_FILE_PATH);
assertEquals(0.1, configManager.getShareStarvingRatio());
assertEquals(3000L, configManager.getStarvingTimeForShare());
assertEquals(4000L, configManager.getStarvingTimeForMinimum());
assertEquals(5000L, configManager.getPreemptedTaskMaxRunningTime());
}
public void testReload() throws IOException, SAXException, ParserConfigurationException {
FileWriter out = new FileWriter(CONFIG_FILE_PATH);
out.write("<?xml version=\"1.0\"?>\n");
out.write("<configuration>\n");
out.write(" <nodeLocalityWaitM>1000</nodeLocalityWaitM>\n");
out.write("</configuration>\n");
out.close();
ConfigManager configManager = new ConfigManager(TYPES, CONFIG_FILE_PATH);
assertEquals(1000L, configManager.getLocalityWait(M, LocalityLevel.NODE));
out = new FileWriter(CONFIG_FILE_PATH);
out.write("<?xml version=\"1.0\"?>\n");
out.write("<configuration>\n");
out.write(" <nodeLocalityWaitM>3000</nodeLocalityWaitM>\n");
out.write("</configuration>\n");
out.close();
// Set the modification time so it gets reloaded
new File(CONFIG_FILE_PATH).setLastModified(0);
configManager.reloadConfig();
assertEquals(3000L, configManager.getLocalityWait(M, LocalityLevel.NODE));
}
}