git-svn-id: https://svn.microneil.com/svn/SNFUtility/trunk@51 aa37657e-1934-4a5f-aa6d-2d8eab27ff7cmaster
@@ -125,6 +125,8 @@ PostfixMilterConf::AddIntegration() { | |||
} | |||
ConfigurationLine = Utility::Trim(ConfigurationLine); | |||
} | |||
void | |||
@@ -136,94 +138,73 @@ PostfixMilterConf::RemoveIntegration() { | |||
} | |||
if (IsMilterLine()) { // Remove from an existing milter line. | |||
std::string NewConfLine; | |||
NewConfLine = SmtpdMilterKeyword + " ="; | |||
// Skip to "=" in configuration line. | |||
std::string::size_type NextIndex; | |||
NextIndex = ConfigurationLine.find("="); | |||
if (std::string::npos == NextIndex) { // Check format. | |||
std::ostringstream Temp; | |||
std::string NewConfLine; | |||
Temp << "Error processing postfix main.cf file smtpd_milters line: '" | |||
<< ConfigurationLine << "'"; | |||
NewConfLine = SmtpdMilterKeyword + " ="; | |||
throw std::runtime_error(Temp.str()); | |||
// Skip to "=" in configuration line. | |||
std::string::size_type NextIndex; | |||
} | |||
std::string ExistingMilters; | |||
bool AddedMilter = false; | |||
NextIndex = ConfigurationLine.find("="); | |||
ExistingMilters = Utility::Trim(ConfigurationLine.substr(NextIndex + 1)); // Should contain existing milters. | |||
while (ExistingMilters != "") { | |||
NewConfLine += " "; | |||
std::string NextMilter; | |||
if (std::string::npos == NextIndex) { // Check format. | |||
NextIndex = ExistingMilters.find_first_of(" ,"); | |||
std::ostringstream Temp; | |||
if (std::string::npos == NextIndex) { | |||
Temp << "Error processing postfix main.cf file smtpd_milters line: '" | |||
<< ConfigurationLine << "'"; | |||
NextMilter = ExistingMilters; | |||
ExistingMilters = ""; | |||
throw std::runtime_error(Temp.str()); | |||
} else { | |||
} | |||
NextMilter = Utility::Trim(ExistingMilters.substr(0, NextIndex)); | |||
ExistingMilters = Utility::Trim(ExistingMilters.substr(NextIndex + 1)); | |||
std::string ExistingMilters; | |||
bool AddedMilter = false; | |||
} | |||
ExistingMilters = Utility::Trim(ConfigurationLine.substr(NextIndex + 1)); // Should contain existing milters. | |||
if (NextMilter == "") { | |||
while (std::string::npos != NextIndex) { | |||
std::ostringstream Temp; | |||
NewConfLine += " "; | |||
Temp << "Error processing postfix main.cf file smtpd_milters line: '" | |||
<< ConfigurationLine << "'"; | |||
std::string NextMilter; | |||
throw std::runtime_error(Temp.str()); | |||
NextIndex = ExistingMilters.find_first_of(Whitespace); | |||
NextMilter = Utility::Trim(ExistingMilters.substr(0, NextIndex)); | |||
ExistingMilters = Utility::Trim(ExistingMilters.substr(NextIndex + 1)); | |||
} | |||
if (NextMilter == "") { | |||
if (NextMilter != SnfMilterSocketSpec) { // Copy if not for SNFMilter. | |||
std::ostringstream Temp; | |||
NewConfLine += NextMilter; | |||
AddedMilter = true; | |||
Temp << "Error processing postfix main.cf file smtpd_milters line: '" | |||
<< ConfigurationLine << "'"; | |||
} | |||
throw std::runtime_error(Temp.str()); | |||
} | |||
if (AddedMilter) { | |||
ConfigurationLine = NewConfLine; | |||
} else { | |||
if (NextMilter != SnfMilterSocketSpec) { // Copy if not for SNFMilter. | |||
ConfigurationLine = ""; | |||
NewConfLine += NextMilter; | |||
AddedMilter = true; | |||
} | |||
} else { // Unexpected non-empty line. | |||
} | |||
std::ostringstream Temp; | |||
if (AddedMilter) { | |||
Temp << "Internal error: Attempted to modify a line in main.cf that does not begin with '" | |||
<< SmtpdMilterKeyword << "'"; | |||
ConfigurationLine = NewConfLine; | |||
throw std::runtime_error(Temp.str()); | |||
} else { | |||
ConfigurationLine = ""; | |||
} | |||
ConfigurationLine = Utility::Trim(ConfigurationLine); | |||
} | |||
std::string |
@@ -339,26 +339,116 @@ TestAddIntegration() { | |||
} | |||
bool | |||
TestRemoveIntegration() { | |||
// Object under test. | |||
PostfixMilterConf TestObj; | |||
// Container of test lines. | |||
std::vector<std::string> TestInput; | |||
// Container of expected output. | |||
std::vector<std::string> ExpectedOutput; | |||
// Test lines that are milter lines with SNFMilter already integrated. | |||
TestInput.push_back("smtpd_milters = unix:/var/snf-milter/socket"); | |||
ExpectedOutput.push_back(""); | |||
TestInput.push_back("smtpd_milters = unix:/var/snf-milter/socket "); | |||
ExpectedOutput.push_back(""); | |||
TestInput.push_back("smtpd_milters = unix:/var/snf-milter/socket\t "); | |||
ExpectedOutput.push_back(""); | |||
TestInput.push_back("smtpd_milters = otherMilterSpec unix:/var/snf-milter/socket"); | |||
ExpectedOutput.push_back("smtpd_milters = otherMilterSpec"); | |||
TestInput.push_back("smtpd_milters = otherMilterSpec\txxx qqq,unix:/var/snf-milter/socket"); | |||
ExpectedOutput.push_back("smtpd_milters = otherMilterSpec xxx qqq"); | |||
// Test lines that are milter lines with SNFMilter not integrated. | |||
TestInput.push_back("smtpd_milters = unix:/var/snf-milter/sockett"); | |||
ExpectedOutput.push_back("smtpd_milters = unix:/var/snf-milter/sockett"); | |||
TestInput.push_back("smtpd_milters = unix:/var/snf-milter/sock "); | |||
ExpectedOutput.push_back("smtpd_milters = unix:/var/snf-milter/sock"); | |||
TestInput.push_back("smtpd_milters = otherMilterSpec unix:/var/snf-milter\t\t"); | |||
ExpectedOutput.push_back("smtpd_milters = otherMilterSpec unix:/var/snf-milter"); | |||
TestInput.push_back("smtpd_milters = otherMilterSpec\tunix:/var/snf-milter\t\t"); | |||
ExpectedOutput.push_back("smtpd_milters = otherMilterSpec\tunix:/var/snf-milter"); | |||
// Test lines that are not milter lines. | |||
TestInput.push_back("smtpd_milterss = unix:/var/snf-milter/socketb"); | |||
ExpectedOutput.push_back("smtpd_milterss = unix:/var/snf-milter/socketb"); | |||
TestInput.push_back("smtpd_milters unix:/var/snf-milter/socket"); | |||
ExpectedOutput.push_back("smtpd_milters unix:/var/snf-milter/socket"); | |||
TestInput.push_back("smtpd_milters\tunix:/var/snf-milter/socketb"); | |||
ExpectedOutput.push_back("smtpd_milters\tunix:/var/snf-milter/socketb"); | |||
TestInput.push_back("#smtpd_milterss = unix:/var/snf-milter/socketb"); | |||
ExpectedOutput.push_back("#smtpd_milterss = unix:/var/snf-milter/socketb"); | |||
TestInput.push_back("manpage_directory = /usr/share/man"); | |||
ExpectedOutput.push_back("manpage_directory = /usr/share/man"); | |||
std::string ActualOutput; | |||
for (unsigned int i = 0; i < TestInput.size(); i++) { | |||
TestObj.ConfLine(TestInput[i]); | |||
TestObj.RemoveIntegration(); | |||
ActualOutput = TestObj.ConfLine(); | |||
if (ActualOutput != ExpectedOutput[i]) { | |||
std::string Temp; | |||
Temp = "***Error--RemoveItegration() returned\n\t'"; | |||
Temp += ActualOutput; | |||
Temp += "'\nwith input\n\t'"; | |||
Temp += TestInput[i]; | |||
Temp += "'\n"; | |||
Error(Temp); | |||
return false; | |||
} | |||
} | |||
return true; | |||
} | |||
/// Unit tests for PostfixMilterConf. | |||
// | |||
int main(int argc, char* argv[]) { | |||
try { // Catch anything that breaks loose. | |||
// Test IsIntegrated. | |||
if (!TestIsIntegrated()) { | |||
ErrorExit("TestIsIntegrated() failure.\n"); | |||
} | |||
// Test IsMilterLine. | |||
if (!TestIsMilterLine()) { | |||
ErrorExit("TestIsMilterLine() failure.\n"); | |||
} | |||
// Test AddItegration. | |||
if (!TestAddIntegration()) { | |||
ErrorExit("TestAddIntegration() failure.\n"); | |||
} | |||
if (!TestRemoveIntegration()) { | |||
ErrorExit("TestRemoveIntegration() failure.\n"); | |||
} | |||
} // That's all folks. | |||
catch(std::exception& e) { // Report any normal exceptions. |