launch_daemon: Added events parsing.
* Including tests, also for the environment parsing.
This commit is contained in:
@@ -9,7 +9,37 @@
|
|||||||
#include <DriverSettingsMessageAdapter.h>
|
#include <DriverSettingsMessageAdapter.h>
|
||||||
|
|
||||||
|
|
||||||
class ConditionConverter : public DriverSettingsConverter {
|
class AbstractArgsConverter : public DriverSettingsConverter {
|
||||||
|
public:
|
||||||
|
status_t ConvertEmptyFromDriverSettings(
|
||||||
|
const driver_parameter& parameter, const char* name, uint32 type,
|
||||||
|
BMessage& target)
|
||||||
|
{
|
||||||
|
if (parameter.parameter_count != 0)
|
||||||
|
return B_OK;
|
||||||
|
|
||||||
|
BMessage message;
|
||||||
|
return target.AddMessage(name, &message);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
status_t AddSubMessage(const driver_parameter& parameter, int32 index,
|
||||||
|
BMessage& target)
|
||||||
|
{
|
||||||
|
const char* condition = parameter.values[index];
|
||||||
|
BMessage args;
|
||||||
|
for (index++; index < parameter.value_count; index++) {
|
||||||
|
status_t status = args.AddString("args",
|
||||||
|
parameter.values[index]);
|
||||||
|
if (status != B_OK)
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
return target.AddMessage(condition, &args);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class ConditionConverter : public AbstractArgsConverter {
|
||||||
public:
|
public:
|
||||||
status_t ConvertFromDriverSettings(const driver_parameter& parameter,
|
status_t ConvertFromDriverSettings(const driver_parameter& parameter,
|
||||||
const char* name, int32 index, uint32 type, BMessage& target)
|
const char* name, int32 index, uint32 type, BMessage& target)
|
||||||
@@ -29,7 +59,7 @@ public:
|
|||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
|
|
||||||
status_t status = _AddSubMessage(parameter, index, *add);
|
status_t status = AddSubMessage(parameter, index, *add);
|
||||||
if (status == B_OK && not)
|
if (status == B_OK && not)
|
||||||
status = target.AddMessage("not", &message);
|
status = target.AddMessage("not", &message);
|
||||||
|
|
||||||
@@ -39,37 +69,31 @@ public:
|
|||||||
if (index != 0)
|
if (index != 0)
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
|
||||||
return _AddSubMessage(parameter, index, target);
|
return AddSubMessage(parameter, index, target);
|
||||||
}
|
}
|
||||||
|
|
||||||
message.AddString("args", parameter.values[index]);
|
message.AddString("args", parameter.values[index]);
|
||||||
return target.AddMessage(parameter.name, &message);
|
return target.AddMessage(parameter.name, &message);
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
status_t ConvertEmptyFromDriverSettings(
|
|
||||||
const driver_parameter& parameter, const char* name, uint32 type,
|
class EventConverter : public AbstractArgsConverter {
|
||||||
BMessage& target)
|
public:
|
||||||
|
status_t ConvertFromDriverSettings(const driver_parameter& parameter,
|
||||||
|
const char* name, int32 index, uint32 type, BMessage& target)
|
||||||
{
|
{
|
||||||
if (parameter.parameter_count != 0)
|
BMessage message;
|
||||||
|
if (strcmp(parameter.name, "on") == 0) {
|
||||||
|
// Parse values directly following "on"
|
||||||
|
if (index != 0)
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
|
||||||
BMessage message;
|
return AddSubMessage(parameter, index, target);
|
||||||
return target.AddMessage(name, &message);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
message.AddString("args", parameter.values[index]);
|
||||||
status_t _AddSubMessage(const driver_parameter& parameter, int32 index,
|
return target.AddMessage(parameter.name, &message);
|
||||||
BMessage& target)
|
|
||||||
{
|
|
||||||
const char* condition = parameter.values[index];
|
|
||||||
BMessage args;
|
|
||||||
for (index++; index < parameter.value_count; index++) {
|
|
||||||
status_t status = args.AddString("args",
|
|
||||||
parameter.values[index]);
|
|
||||||
if (status != B_OK)
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
return target.AddMessage(condition, &args);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -105,6 +129,13 @@ const static settings_template kConditionTemplate[] = {
|
|||||||
{0, NULL, NULL}
|
{0, NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const static settings_template kEventTemplate[] = {
|
||||||
|
{B_STRING_TYPE, NULL, NULL, true, new EventConverter()},
|
||||||
|
{B_MESSAGE_TYPE, "and", kEventTemplate},
|
||||||
|
{B_MESSAGE_TYPE, "or", kEventTemplate},
|
||||||
|
{0, NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
const static settings_template kPortTemplate[] = {
|
const static settings_template kPortTemplate[] = {
|
||||||
{B_STRING_TYPE, "name", NULL, true},
|
{B_STRING_TYPE, "name", NULL, true},
|
||||||
{B_INT32_TYPE, "capacity", NULL},
|
{B_INT32_TYPE, "capacity", NULL},
|
||||||
@@ -122,6 +153,7 @@ const static settings_template kJobTemplate[] = {
|
|||||||
{B_STRING_TYPE, "requires", NULL},
|
{B_STRING_TYPE, "requires", NULL},
|
||||||
{B_BOOL_TYPE, "legacy", NULL},
|
{B_BOOL_TYPE, "legacy", NULL},
|
||||||
{B_MESSAGE_TYPE, "port", kPortTemplate},
|
{B_MESSAGE_TYPE, "port", kPortTemplate},
|
||||||
|
{B_MESSAGE_TYPE, "on", kEventTemplate},
|
||||||
{B_MESSAGE_TYPE, "if", kConditionTemplate},
|
{B_MESSAGE_TYPE, "if", kConditionTemplate},
|
||||||
{B_BOOL_TYPE, "no_safemode", NULL},
|
{B_BOOL_TYPE, "no_safemode", NULL},
|
||||||
{B_MESSAGE_TYPE, "env", kEnvTemplate},
|
{B_MESSAGE_TYPE, "env", kEnvTemplate},
|
||||||
@@ -131,6 +163,7 @@ const static settings_template kJobTemplate[] = {
|
|||||||
const static settings_template kTargetTemplate[] = {
|
const static settings_template kTargetTemplate[] = {
|
||||||
{B_STRING_TYPE, "name", NULL, true},
|
{B_STRING_TYPE, "name", NULL, true},
|
||||||
{B_BOOL_TYPE, "reset", NULL},
|
{B_BOOL_TYPE, "reset", NULL},
|
||||||
|
{B_MESSAGE_TYPE, "on", kEventTemplate},
|
||||||
{B_MESSAGE_TYPE, "if", kConditionTemplate},
|
{B_MESSAGE_TYPE, "if", kConditionTemplate},
|
||||||
{B_BOOL_TYPE, "no_safemode", NULL},
|
{B_BOOL_TYPE, "no_safemode", NULL},
|
||||||
{B_MESSAGE_TYPE, "env", kEnvTemplate},
|
{B_MESSAGE_TYPE, "env", kEnvTemplate},
|
||||||
|
|||||||
@@ -10,10 +10,12 @@ UnitTestLib liblaunch_daemontest.so :
|
|||||||
LaunchDaemonTestAddon.cpp
|
LaunchDaemonTestAddon.cpp
|
||||||
|
|
||||||
SettingsParserTest.cpp
|
SettingsParserTest.cpp
|
||||||
SettingsParser.cpp
|
|
||||||
|
|
||||||
ConditionsTest.cpp
|
ConditionsTest.cpp
|
||||||
|
|
||||||
|
# from the launch_daemon
|
||||||
|
SettingsParser.cpp
|
||||||
Conditions.cpp
|
Conditions.cpp
|
||||||
|
Utility.cpp
|
||||||
|
|
||||||
: be libshared.a [ TargetLibstdc++ ] [ TargetLibsupc++ ]
|
: be libshared.a [ TargetLibstdc++ ] [ TargetLibsupc++ ]
|
||||||
;
|
;
|
||||||
|
|||||||
@@ -27,6 +27,9 @@ SettingsParserTest::~SettingsParserTest()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark - conditions
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
SettingsParserTest::TestConditionsMultiLine()
|
SettingsParserTest::TestConditionsMultiLine()
|
||||||
{
|
{
|
||||||
@@ -178,6 +181,101 @@ SettingsParserTest::TestConditionsMultiLineNot()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark - events
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
SettingsParserTest::TestEventsMultiLine()
|
||||||
|
{
|
||||||
|
BMessage message;
|
||||||
|
CPPUNIT_ASSERT_EQUAL(B_OK, _ParseEvent("on {\n"
|
||||||
|
"\tfile_created one\n"
|
||||||
|
"\tdemand\n"
|
||||||
|
"}\n", message));
|
||||||
|
CPPUNIT_ASSERT_EQUAL(2, message.CountNames(B_ANY_TYPE));
|
||||||
|
|
||||||
|
BMessage subMessage;
|
||||||
|
CPPUNIT_ASSERT_EQUAL(B_OK, message.FindMessage("demand", &subMessage));
|
||||||
|
CPPUNIT_ASSERT(subMessage.IsEmpty());
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT_EQUAL(B_OK, message.FindMessage("file_created",
|
||||||
|
&subMessage));
|
||||||
|
CPPUNIT_ASSERT_EQUAL(BString("one"),
|
||||||
|
BString(subMessage.GetString("args", 0, "-")));
|
||||||
|
CPPUNIT_ASSERT_EQUAL(1, subMessage.CountNames(B_ANY_TYPE));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
SettingsParserTest::TestEventsFlat()
|
||||||
|
{
|
||||||
|
BMessage message;
|
||||||
|
CPPUNIT_ASSERT_EQUAL(B_OK, _ParseEvent("on demand\n", message));
|
||||||
|
CPPUNIT_ASSERT_EQUAL(1, message.CountNames(B_ANY_TYPE));
|
||||||
|
|
||||||
|
BMessage args;
|
||||||
|
CPPUNIT_ASSERT_EQUAL(B_OK, message.FindMessage("demand", &args));
|
||||||
|
CPPUNIT_ASSERT(args.IsEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
SettingsParserTest::TestEventsFlatWithArgs()
|
||||||
|
{
|
||||||
|
BMessage message;
|
||||||
|
CPPUNIT_ASSERT_EQUAL(B_OK, _ParseEvent("on file_created one\n", message));
|
||||||
|
CPPUNIT_ASSERT_EQUAL(1, message.CountNames(B_ANY_TYPE));
|
||||||
|
|
||||||
|
BMessage args;
|
||||||
|
CPPUNIT_ASSERT_EQUAL(B_OK, message.FindMessage("file_created", &args));
|
||||||
|
CPPUNIT_ASSERT_EQUAL(BString("one"),
|
||||||
|
BString(args.GetString("args", 0, "-")));
|
||||||
|
CPPUNIT_ASSERT_EQUAL(1, args.CountNames(B_ANY_TYPE));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark - environment
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
SettingsParserTest::TestEnvironmentMultiLine()
|
||||||
|
{
|
||||||
|
BMessage message;
|
||||||
|
CPPUNIT_ASSERT_EQUAL(B_OK, _ParseName("env", "env {\n"
|
||||||
|
"from_script SetupEnvironment\n"
|
||||||
|
"TEST well, yes\n"
|
||||||
|
"}\n", message));
|
||||||
|
CPPUNIT_ASSERT_EQUAL(2, message.CountNames(B_ANY_TYPE));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT_EQUAL(BString("SetupEnvironment"),
|
||||||
|
BString(message.GetString("from_script", "-")));
|
||||||
|
CPPUNIT_ASSERT_EQUAL(1, _ArrayCount(message, "from_script"));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT_EQUAL(BString("well,"),
|
||||||
|
BString(message.GetString("TEST", 0, "-")));
|
||||||
|
CPPUNIT_ASSERT_EQUAL(BString("yes"),
|
||||||
|
BString(message.GetString("TEST", 1, "-")));
|
||||||
|
CPPUNIT_ASSERT_EQUAL(2, _ArrayCount(message, "TEST"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
SettingsParserTest::TestEnvironmentFlat()
|
||||||
|
{
|
||||||
|
BMessage message;
|
||||||
|
CPPUNIT_ASSERT_EQUAL(B_OK, _ParseName("env", "env SetupEnvironment\n",
|
||||||
|
message));
|
||||||
|
CPPUNIT_ASSERT_EQUAL(1, message.CountNames(B_ANY_TYPE));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT_EQUAL(BString("SetupEnvironment"),
|
||||||
|
BString(message.GetString("from_script", "-")));
|
||||||
|
CPPUNIT_ASSERT_EQUAL(1, _ArrayCount(message, "from_script"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark - run
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
SettingsParserTest::TestRunFlat()
|
SettingsParserTest::TestRunFlat()
|
||||||
{
|
{
|
||||||
@@ -288,6 +386,9 @@ SettingsParserTest::TestRunIfThenElseMultiLine()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
/*static*/ void
|
/*static*/ void
|
||||||
SettingsParserTest::AddTests(BTestSuite& parent)
|
SettingsParserTest::AddTests(BTestSuite& parent)
|
||||||
{
|
{
|
||||||
@@ -319,6 +420,25 @@ SettingsParserTest::AddTests(BTestSuite& parent)
|
|||||||
"SettingsParserTest::TestConditionsMultiLineNot",
|
"SettingsParserTest::TestConditionsMultiLineNot",
|
||||||
&SettingsParserTest::TestConditionsMultiLineNot));
|
&SettingsParserTest::TestConditionsMultiLineNot));
|
||||||
|
|
||||||
|
// Events
|
||||||
|
suite.addTest(new CppUnit::TestCaller<SettingsParserTest>(
|
||||||
|
"SettingsParserTest::TestEventsMultiLine",
|
||||||
|
&SettingsParserTest::TestEventsMultiLine));
|
||||||
|
suite.addTest(new CppUnit::TestCaller<SettingsParserTest>(
|
||||||
|
"SettingsParserTest::TestEventsFlat",
|
||||||
|
&SettingsParserTest::TestEventsFlat));
|
||||||
|
suite.addTest(new CppUnit::TestCaller<SettingsParserTest>(
|
||||||
|
"SettingsParserTest::TestEventsFlatWithArgs",
|
||||||
|
&SettingsParserTest::TestEventsFlatWithArgs));
|
||||||
|
|
||||||
|
// Environment
|
||||||
|
suite.addTest(new CppUnit::TestCaller<SettingsParserTest>(
|
||||||
|
"SettingsParserTest::TestEnvironmentMultiLine",
|
||||||
|
&SettingsParserTest::TestEnvironmentMultiLine));
|
||||||
|
suite.addTest(new CppUnit::TestCaller<SettingsParserTest>(
|
||||||
|
"SettingsParserTest::TestEnvironmentFlat",
|
||||||
|
&SettingsParserTest::TestEnvironmentFlat));
|
||||||
|
|
||||||
// Run
|
// Run
|
||||||
suite.addTest(new CppUnit::TestCaller<SettingsParserTest>(
|
suite.addTest(new CppUnit::TestCaller<SettingsParserTest>(
|
||||||
"SettingsParserTest::TestRunFlat",
|
"SettingsParserTest::TestRunFlat",
|
||||||
@@ -339,6 +459,21 @@ SettingsParserTest::AddTests(BTestSuite& parent)
|
|||||||
|
|
||||||
status_t
|
status_t
|
||||||
SettingsParserTest::_ParseCondition(const char* text, BMessage& message)
|
SettingsParserTest::_ParseCondition(const char* text, BMessage& message)
|
||||||
|
{
|
||||||
|
return _ParseName("if", text, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
SettingsParserTest::_ParseEvent(const char* text, BMessage& message)
|
||||||
|
{
|
||||||
|
return _ParseName("on", text, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
SettingsParserTest::_ParseName(const char* name, const char* text,
|
||||||
|
BMessage& message)
|
||||||
{
|
{
|
||||||
SettingsParser parser;
|
SettingsParser parser;
|
||||||
BString input("job A {\n");
|
BString input("job A {\n");
|
||||||
@@ -357,7 +492,7 @@ SettingsParserTest::_ParseCondition(const char* text, BMessage& message)
|
|||||||
CPPUNIT_ASSERT_EQUAL(2, job.CountNames(B_ANY_TYPE));
|
CPPUNIT_ASSERT_EQUAL(2, job.CountNames(B_ANY_TYPE));
|
||||||
CPPUNIT_ASSERT_EQUAL(BString("A"), BString(job.GetString("name")));
|
CPPUNIT_ASSERT_EQUAL(BString("A"), BString(job.GetString("name")));
|
||||||
|
|
||||||
return job.FindMessage("if", &message);
|
return job.FindMessage(name, &message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,13 @@ public:
|
|||||||
void TestConditionsMultiLineFlatNotWithArgs();
|
void TestConditionsMultiLineFlatNotWithArgs();
|
||||||
void TestConditionsMultiLineNot();
|
void TestConditionsMultiLineNot();
|
||||||
|
|
||||||
|
void TestEventsMultiLine();
|
||||||
|
void TestEventsFlat();
|
||||||
|
void TestEventsFlatWithArgs();
|
||||||
|
|
||||||
|
void TestEnvironmentMultiLine();
|
||||||
|
void TestEnvironmentFlat();
|
||||||
|
|
||||||
void TestRunFlat();
|
void TestRunFlat();
|
||||||
void TestRunMultiLine();
|
void TestRunMultiLine();
|
||||||
void TestRunIfThenElseFlat();
|
void TestRunIfThenElseFlat();
|
||||||
@@ -36,6 +43,10 @@ public:
|
|||||||
private:
|
private:
|
||||||
status_t _ParseCondition(const char* text,
|
status_t _ParseCondition(const char* text,
|
||||||
BMessage& message);
|
BMessage& message);
|
||||||
|
status_t _ParseEvent(const char* text,
|
||||||
|
BMessage& message);
|
||||||
|
status_t _ParseName(const char* name, const char* text,
|
||||||
|
BMessage& message);
|
||||||
int32 _ArrayCount(BMessage& message,
|
int32 _ArrayCount(BMessage& message,
|
||||||
const char* name);
|
const char* name);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user