package org.asteriskjava.config; import junit.framework.TestCase; import java.nio.CharBuffer; public class ConfigFileParserTest extends TestCase { ConfigFileReader configFileReader; public void setUp() { configFileReader = new ConfigFileReader(); } public void testProcessLine() throws Exception { String s = " a ;-- comment --; = b ; a line comment"; CharBuffer buffer = CharBuffer.allocate(s.length()); buffer.put(s); buffer.flip(); configFileReader.appendCategory(new Category("cat")); ConfigElement configElement = configFileReader.processLine("test.conf", 1, buffer); assertEquals("Incorrect type of configElement", ConfigVariable.class, configElement.getClass()); ConfigVariable configVariable = (ConfigVariable) configElement; assertEquals("Incorrect variable name", "a", configVariable.getName()); assertEquals("Incorrect variable value", "b", configVariable.getValue()); assertEquals("Incorrect comment", "a line comment", configElement.getComment()); } public void testParseCategoryHeader() throws Exception { Category category; category = configFileReader.parseCategoryHeader("test.conf", 1, "[foo]"); assertEquals("Incorrect category name", "foo", category.getName()); assertEquals("Incorrect line number", 1, category.getLineNumber()); assertEquals("Incorrect file name", "test.conf", category.getFileName()); category = configFileReader.parseCategoryHeader("test.conf", 1, "[foo](!)"); assertEquals("Incorrect category name", "foo", category.getName()); assertTrue("Category not flagged as template", category.isTemplate()); category = configFileReader.parseCategoryHeader("test.conf", 1, "[foo](+)"); assertEquals("Incorrect category name", "foo", category.getName()); try { configFileReader.parseCategoryHeader("test.conf", 1, "[foo](a)"); fail("Expected exception when requesting inheritance from a non-existing catagory"); } catch (ConfigParseException e) { assertEquals("Inheritance requested, but category 'a' does not exist, line 1 of test.conf", e.getMessage()); assertEquals("Incorrect line number", 1, e.getLineNumber()); assertEquals("Incorrect file name", "test.conf", e.getFileName()); } try { configFileReader.parseCategoryHeader("test.conf", 1, "[foo"); fail("Expected exception when closing ']' is missing"); } catch (ConfigParseException e) { assertEquals(e.getMessage(), "parse error: no closing ']', line 1 of test.conf"); } try { configFileReader.parseCategoryHeader("test.conf", 1, "[foo](bar"); fail("Expected exception when closing ')' is missing"); } catch (ConfigParseException e) { assertEquals(e.getMessage(), "parse error: no closing ')', line 1 of test.conf"); } } public void testParseDirective() throws ConfigParseException { ConfigDirective configDirective; configDirective = configFileReader.parseDirective("abc.conf", 20, "#include \"/etc/asterisk/inc.conf\""); assertEquals("Incorrect type of configDirective", IncludeDirective.class, configDirective.getClass()); assertEquals("Incorrect include file", "/etc/asterisk/inc.conf", ((IncludeDirective) configDirective).getIncludeFile()); assertEquals("Incorrect line number", 20, configDirective.getLineNumber()); assertEquals("Incorrect file name", "abc.conf", configDirective.getFileName()); configDirective = configFileReader.parseDirective("abc.conf", 20, "#exec </usr/local/test.sh> "); assertEquals("Incorrect type of configDirective", ExecDirective.class, configDirective.getClass()); assertEquals("Incorrect exec file", "/usr/local/test.sh", ((ExecDirective) configDirective).getExecFile()); assertEquals("Incorrect line number", 20, configDirective.getLineNumber()); assertEquals("Incorrect file name", "abc.conf", configDirective.getFileName()); try { configFileReader.parseDirective("abc.conf", 20, "#foo"); fail("Expected exception when parsing a line with an unknown directive"); } catch (UnknownDirectiveException e) { assertEquals("Unknown directive 'foo' at line 20 of abc.conf", e.getMessage()); } try { configFileReader.parseDirective("/etc/asterisk/sip.conf", 805, "#include "); fail("Expected exception when parsing a line with a directive but no parameter"); } catch (MissingDirectiveParameterException e) { assertEquals("Directive '#include' needs an argument (filename) at line 805 of /etc/asterisk/sip.conf", e.getMessage()); } } public void testParseVariable() throws ConfigParseException { ConfigVariable variable; variable = configFileReader.parseVariable("extensions.conf", 20, "exten => s-NOANSWER,1,Hangup"); assertEquals("Incorrect name", "exten", variable.getName()); assertEquals("Incorrect value", "s-NOANSWER,1,Hangup", variable.getValue()); assertEquals("Incorrect line number", 20, variable.getLineNumber()); assertEquals("Incorrect file name", "extensions.conf", variable.getFileName()); variable = configFileReader.parseVariable("extensions.conf", 20, "foo="); assertEquals("Incorrect name", "foo", variable.getName()); assertEquals("Incorrect value", "", variable.getValue()); try { configFileReader.parseVariable("extensions.conf", 20, "foo"); fail("Expected exception when parsing a line without a '='"); } catch (MissingEqualSignException e) { assertEquals("No '=' (equal sign) in line 20 of extensions.conf", e.getMessage()); } } public void XtestReadConfig() throws Exception { configFileReader.readFile("/etc/asterisk/sip2.conf"); for (Category category : configFileReader.getCategories()) { System.out.println(category.format()); } } }