[haiku-commits] BRANCH axeld-github.launch_daemon [2f3ab7206c1f] in src: tests/servers/launch servers/launch tests/kits/shared

  • From: axeld-github.launch_daemon <community@xxxxxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Fri, 19 Jun 2015 13:16:45 +0200 (CEST)

added 2 changesets to branch 'refs/remotes/axeld-github/launch_daemon'
old head: 2b00293705c1db8a3b38e09651f88a614d7422f9
new head: 2f3ab7206c1fa0877fc8727acc437fc07644a1bd
overview: https://github.com/axeld/haiku/compare/2b00293705c1...2f3ab7206c1f

----------------------------------------------------------------------------

240662ecf52c: launch_daemon: Moved settings parsing into its own file.

2f3ab7206c1f: launch_daemon: Started working on condition parsing.

* Moved related test code from DriverSettingsMessageAdapterTest to the
SettingsParser class.
* Added SettingsParserTest class -- most tests already succeed, but not
all; support for the flattened "not" is not working yet.

[ Axel Dörfler <axeld@xxxxxxxxxxxxxxxx> ]

----------------------------------------------------------------------------

10 files changed, 455 insertions(+), 86 deletions(-)
src/servers/launch/Jamfile | 1 +
src/servers/launch/LaunchDaemon.cpp | 40 +---
src/servers/launch/SettingsParser.cpp | 137 ++++++++++++
src/servers/launch/SettingsParser.h | 24 +++
.../shared/DriverSettingsMessageAdapterTest.cpp | 49 -----
src/tests/servers/Jamfile | 1 +
src/tests/servers/launch/Jamfile | 16 ++
.../servers/launch/LaunchDaemonTestAddon.cpp | 21 ++
src/tests/servers/launch/SettingsParserTest.cpp | 215 +++++++++++++++++++
src/tests/servers/launch/SettingsParserTest.h | 37 ++++

############################################################################

Commit: 240662ecf52c52449e46e5ce6cd70b85fb64b005
Author: Axel Dörfler <axeld@xxxxxxxxxxxxxxxx>
Date: Thu Jun 18 07:27:37 2015 UTC

launch_daemon: Moved settings parsing into its own file.

----------------------------------------------------------------------------

diff --git a/src/servers/launch/Jamfile b/src/servers/launch/Jamfile
index 637e649..ba29a02 100644
--- a/src/servers/launch/Jamfile
+++ b/src/servers/launch/Jamfile
@@ -9,6 +9,7 @@ Server launch_daemon
:
LaunchDaemon.cpp
Job.cpp
+ SettingsParser.cpp
Target.cpp
Worker.cpp

diff --git a/src/servers/launch/LaunchDaemon.cpp
b/src/servers/launch/LaunchDaemon.cpp
index 7af14fd..8a0303c 100644
--- a/src/servers/launch/LaunchDaemon.cpp
+++ b/src/servers/launch/LaunchDaemon.cpp
@@ -23,7 +23,6 @@
#include <Server.h>

#include <AppMisc.h>
-#include <DriverSettingsMessageAdapter.h>
#include <LaunchDaemonDefs.h>
#include <LaunchRosterPrivate.h>
#include <RosterPrivate.h>
@@ -35,6 +34,7 @@
#include "InitSharedMemoryDirectoryJob.h"
#include "InitTemporaryDirectoryJob.h"
#include "Job.h"
+#include "SettingsParser.h"
#include "Target.h"
#include "Worker.h"

@@ -47,38 +47,6 @@ using BSupportKit::BPrivate::JobQueue;
static const char* kLaunchDirectory = "launch";


-const static settings_template kPortTemplate[] = {
- {B_STRING_TYPE, "name", NULL, true},
- {B_INT32_TYPE, "capacity", NULL},
-};
-
-const static settings_template kJobTemplate[] = {
- {B_STRING_TYPE, "name", NULL, true},
- {B_BOOL_TYPE, "disabled", NULL},
- {B_STRING_TYPE, "launch", NULL},
- {B_STRING_TYPE, "requires", NULL},
- {B_BOOL_TYPE, "legacy", NULL},
- {B_MESSAGE_TYPE, "port", kPortTemplate},
- {B_BOOL_TYPE, "no_safemode", NULL},
- {0, NULL, NULL}
-};
-
-const static settings_template kTargetTemplate[] = {
- {B_STRING_TYPE, "name", NULL, true},
- {B_BOOL_TYPE, "reset", NULL},
- {B_MESSAGE_TYPE, "job", kJobTemplate},
- {B_MESSAGE_TYPE, "service", kJobTemplate},
- {0, NULL, NULL}
-};
-
-const static settings_template kSettingsTemplate[] = {
- {B_MESSAGE_TYPE, "target", kTargetTemplate},
- {B_MESSAGE_TYPE, "job", kJobTemplate},
- {B_MESSAGE_TYPE, "service", kJobTemplate},
- {0, NULL, NULL}
-};
-
-
class Session {
public:
Session(uid_t
user, const BMessenger& target);
@@ -462,16 +430,14 @@ LaunchDaemon::_ReadDirectory(const char* context, BEntry&
directoryEntry)
status_t
LaunchDaemon::_ReadFile(const char* context, BEntry& entry)
{
- DriverSettingsMessageAdapter adapter;
-
BPath path;
status_t status = path.SetTo(&entry);
if (status != B_OK)
return status;

+ SettingsParser parser;
BMessage message;
- status = adapter.ConvertFromDriverSettings(path.Path(),
kSettingsTemplate,
- message);
+ status = parser.ParseFile(path.Path(), message);
if (status == B_OK) {
_AddJobs(NULL, message);

diff --git a/src/servers/launch/SettingsParser.cpp
b/src/servers/launch/SettingsParser.cpp
new file mode 100644
index 0000000..d9e61a3
--- /dev/null
+++ b/src/servers/launch/SettingsParser.cpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2015, Axel Dörfler, axeld@xxxxxxxxxxxxxxxx.
+ * Distributed under the terms of the MIT License.
+ */
+
+
+#include "SettingsParser.h"
+
+#include <DriverSettingsMessageAdapter.h>
+
+
+const static settings_template kPortTemplate[] = {
+ {B_STRING_TYPE, "name", NULL, true},
+ {B_INT32_TYPE, "capacity", NULL},
+};
+
+const static settings_template kJobTemplate[] = {
+ {B_STRING_TYPE, "name", NULL, true},
+ {B_BOOL_TYPE, "disabled", NULL},
+ {B_STRING_TYPE, "launch", NULL},
+ {B_STRING_TYPE, "requires", NULL},
+ {B_BOOL_TYPE, "legacy", NULL},
+ {B_MESSAGE_TYPE, "port", kPortTemplate},
+ {B_BOOL_TYPE, "no_safemode", NULL},
+ {0, NULL, NULL}
+};
+
+const static settings_template kConditionTemplate[] = {
+ {B_STRING_TYPE, NULL, NULL, true},
+ {B_MESSAGE_TYPE, "not", kConditionTemplate},
+ {B_MESSAGE_TYPE, "and", kConditionTemplate},
+ {B_MESSAGE_TYPE, "or", kConditionTemplate},
+ {0, NULL, NULL}
+};
+
+const static settings_template kTargetTemplate[] = {
+ {B_STRING_TYPE, "name", NULL, true},
+ {B_BOOL_TYPE, "reset", NULL},
+ {B_MESSAGE_TYPE, "if", kConditionTemplate},
+ {B_MESSAGE_TYPE, "job", kJobTemplate},
+ {B_MESSAGE_TYPE, "service", kJobTemplate},
+ {0, NULL, NULL}
+};
+
+const static settings_template kSettingsTemplate[] = {
+ {B_MESSAGE_TYPE, "target", kTargetTemplate},
+ {B_MESSAGE_TYPE, "job", kJobTemplate},
+ {B_MESSAGE_TYPE, "service", kJobTemplate},
+ {0, NULL, NULL}
+};
+
+
+SettingsParser::SettingsParser()
+{
+}
+
+
+status_t
+SettingsParser::ParseFile(const char* path, BMessage& settings)
+{
+ DriverSettingsMessageAdapter adapter;
+ return adapter.ConvertFromDriverSettings(path, kSettingsTemplate,
settings);
+}
diff --git a/src/servers/launch/SettingsParser.h
b/src/servers/launch/SettingsParser.h
new file mode 100644
index 0000000..673e8e7
--- /dev/null
+++ b/src/servers/launch/SettingsParser.h
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2015, Axel Dörfler, axeld@xxxxxxxxxxxxxxxx.
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef SETTINGS_PARSER_H
+#define SETTINGS_PARSER_H
+
+
+#include <Message.h>
+
+
+class SettingsParser {
+public:
+
SettingsParser();
+
+ status_t ParseFile(const char*
path, BMessage& settings);
+};
+
+
+#endif // SETTINGS_PARSER_H

############################################################################

Commit: 2f3ab7206c1fa0877fc8727acc437fc07644a1bd
Author: Axel Dörfler <axeld@xxxxxxxxxxxxxxxx>
Date: Thu Jun 18 16:08:05 2015 UTC

launch_daemon: Started working on condition parsing.

* Moved related test code from DriverSettingsMessageAdapterTest to the
SettingsParser class.
* Added SettingsParserTest class -- most tests already succeed, but not
all; support for the flattened "not" is not working yet.

----------------------------------------------------------------------------

diff --git a/src/servers/launch/SettingsParser.cpp
b/src/servers/launch/SettingsParser.cpp
index d9e61a3..71b78c8 100644
--- a/src/servers/launch/SettingsParser.cpp
+++ b/src/servers/launch/SettingsParser.cpp
@@ -9,6 +9,65 @@
#include <DriverSettingsMessageAdapter.h>


+class ConditionConverter : public DriverSettingsConverter {
+public:
+ status_t ConvertFromDriverSettings(const driver_parameter& parameter,
+ const char* name, int32 index, uint32 type, BMessage& target)
+ {
+ BMessage message;
+ if (strcmp(parameter.name, "if") == 0) {
+ // Parse values directly following "if", with special
+ // handling for the "not" operator.
+ if (index != 0)
+ return B_OK;
+
+ BMessage* add = &target;
+ bool not = parameter.value_count > 1
+ && strcmp(parameter.values[0], "not") == 0;
+ if (not) {
+ add = &message;
+ index++;
+ }
+ 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;
+ }
+ status_t status = add->AddMessage(condition, &args);
+ if (status == B_OK && not)
+ status = target.AddMessage("not", &message);
+
+ return status;
+ }
+
+ message.AddString("args", parameter.values[index]);
+ return target.AddMessage(parameter.name, &message);
+ }
+
+ 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);
+ }
+};
+
+
+const static settings_template kConditionTemplate[] = {
+ {B_STRING_TYPE, NULL, NULL, true, new ConditionConverter()},
+ {B_MESSAGE_TYPE, "not", kConditionTemplate},
+ {B_MESSAGE_TYPE, "and", kConditionTemplate},
+ {B_MESSAGE_TYPE, "or", kConditionTemplate},
+ {0, NULL, NULL}
+};
+
const static settings_template kPortTemplate[] = {
{B_STRING_TYPE, "name", NULL, true},
{B_INT32_TYPE, "capacity", NULL},
@@ -21,18 +80,11 @@ const static settings_template kJobTemplate[] = {
{B_STRING_TYPE, "requires", NULL},
{B_BOOL_TYPE, "legacy", NULL},
{B_MESSAGE_TYPE, "port", kPortTemplate},
+ {B_MESSAGE_TYPE, "if", kConditionTemplate},
{B_BOOL_TYPE, "no_safemode", NULL},
{0, NULL, NULL}
};

-const static settings_template kConditionTemplate[] = {
- {B_STRING_TYPE, NULL, NULL, true},
- {B_MESSAGE_TYPE, "not", kConditionTemplate},
- {B_MESSAGE_TYPE, "and", kConditionTemplate},
- {B_MESSAGE_TYPE, "or", kConditionTemplate},
- {0, NULL, NULL}
-};
-
const static settings_template kTargetTemplate[] = {
{B_STRING_TYPE, "name", NULL, true},
{B_BOOL_TYPE, "reset", NULL},
@@ -61,3 +113,25 @@ SettingsParser::ParseFile(const char* path, BMessage&
settings)
DriverSettingsMessageAdapter adapter;
return adapter.ConvertFromDriverSettings(path, kSettingsTemplate,
settings);
}
+
+
+#ifdef TEST_HAIKU
+
+
+status_t
+SettingsParser::Parse(const char* text, BMessage& settings)
+{
+ void* driverSettings = parse_driver_settings_string(text);
+ if (driverSettings == NULL)
+ return B_BAD_VALUE;
+
+ DriverSettingsMessageAdapter adapter;
+ status_t status = adapter.ConvertFromDriverSettings(
+ *get_driver_settings(driverSettings), kSettingsTemplate,
settings);
+
+ delete_driver_settings(driverSettings);
+ return status;
+}
+
+
+#endif // TEST_HAIKU
diff --git a/src/servers/launch/SettingsParser.h
b/src/servers/launch/SettingsParser.h
index 673e8e7..4ae40b9 100644
--- a/src/servers/launch/SettingsParser.h
+++ b/src/servers/launch/SettingsParser.h
@@ -14,6 +14,10 @@ public:

SettingsParser();

status_t ParseFile(const char*
path, BMessage& settings);
+
+#ifdef TEST_HAIKU
+ status_t Parse(const char* text,
BMessage& settings);
+#endif
};


diff --git a/src/tests/kits/shared/DriverSettingsMessageAdapterTest.cpp
b/src/tests/kits/shared/DriverSettingsMessageAdapterTest.cpp
index 5afa763..b369a6b 100644
--- a/src/tests/kits/shared/DriverSettingsMessageAdapterTest.cpp
+++ b/src/tests/kits/shared/DriverSettingsMessageAdapterTest.cpp
@@ -325,55 +325,6 @@ DriverSettingsMessageAdapterTest::TestWildcard()
CPPUNIT_ASSERT_EQUAL(BString("works"),
BString(subMessage.GetString("still", "-")));
CPPUNIT_ASSERT_EQUAL(1, subMessage.CountNames(B_ANY_TYPE));
-
- class WildcardConverter : public DriverSettingsConverter {
- public:
- status_t ConvertFromDriverSettings(const driver_parameter&
parameter,
- const char* name, int32 index, uint32 type, BMessage&
target)
- {
- BMessage message;
- message.AddString("args", parameter.values[index]);
- return target.AddMessage(parameter.name, &message);
- }
-
- 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);
- }
- } converter;
-
- const settings_template kSubTemplateC[] = {
- {B_STRING_TYPE, NULL, NULL, true, &converter},
- {}
- };
- const settings_template kTemplateC[] = {
- {B_MESSAGE_TYPE, "if", kSubTemplateC},
- {}
- };
-
- Settings settingsD("if {\n"
- "\tsafemode\n"
- "\tfile_exists one\n"
- "}\n");
- CPPUNIT_ASSERT_EQUAL(B_OK, settingsD.ToMessage(kTemplateC, message));
- CPPUNIT_ASSERT_EQUAL(1, message.CountNames(B_ANY_TYPE));
- CPPUNIT_ASSERT_EQUAL(B_OK, message.FindMessage("if", &subMessage));
- CPPUNIT_ASSERT_EQUAL(2, subMessage.CountNames(B_ANY_TYPE));
- BMessage subSubMessage;
- CPPUNIT_ASSERT_EQUAL(B_OK, subMessage.FindMessage("safemode",
- &subSubMessage));
- CPPUNIT_ASSERT(subSubMessage.IsEmpty());
- CPPUNIT_ASSERT_EQUAL(B_OK, subMessage.FindMessage("file_exists",
- &subSubMessage));
- CPPUNIT_ASSERT_EQUAL(BString("one"),
- BString(subSubMessage.GetString("args", 0, "-")));
- CPPUNIT_ASSERT_EQUAL(1, subSubMessage.CountNames(B_ANY_TYPE));
}


diff --git a/src/tests/servers/Jamfile b/src/tests/servers/Jamfile
index 1b5753e..49dd470 100644
--- a/src/tests/servers/Jamfile
+++ b/src/tests/servers/Jamfile
@@ -3,4 +3,5 @@ SubDir HAIKU_TOP src tests servers ;
SubInclude HAIKU_TOP src tests servers app ;
SubInclude HAIKU_TOP src tests servers debug ;
SubInclude HAIKU_TOP src tests servers input ;
+SubInclude HAIKU_TOP src tests servers launch ;
SubInclude HAIKU_TOP src tests servers registrar ;
diff --git a/src/tests/servers/launch/Jamfile b/src/tests/servers/launch/Jamfile
new file mode 100644
index 0000000..90be9b7
--- /dev/null
+++ b/src/tests/servers/launch/Jamfile
@@ -0,0 +1,16 @@
+SubDir HAIKU_TOP src tests servers launch ;
+
+AddSubDirSupportedPlatforms libbe_test ;
+
+UsePrivateHeaders app shared support ;
+
+SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src servers launch ] ;
+
+UnitTestLib liblaunch_daemontest.so :
+ LaunchDaemonTestAddon.cpp
+
+ SettingsParserTest.cpp
+ SettingsParser.cpp
+
+ : be libshared.a [ TargetLibstdc++ ] [ TargetLibsupc++ ]
+;
diff --git a/src/tests/servers/launch/LaunchDaemonTestAddon.cpp
b/src/tests/servers/launch/LaunchDaemonTestAddon.cpp
new file mode 100644
index 0000000..38e272e
--- /dev/null
+++ b/src/tests/servers/launch/LaunchDaemonTestAddon.cpp
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2015, Axel Dörfler, axeld@xxxxxxxxxxxxxxxx.
+ * Distributed under the terms of the MIT License.
+ */
+
+
+#include <TestSuite.h>
+#include <TestSuiteAddon.h>
+
+#include "SettingsParserTest.h"
+
+
+BTestSuite*
+getTestSuite()
+{
+ BTestSuite* suite = new BTestSuite("LaunchDaemon");
+
+ SettingsParserTest::AddTests(*suite);
+
+ return suite;
+}
diff --git a/src/tests/servers/launch/SettingsParserTest.cpp
b/src/tests/servers/launch/SettingsParserTest.cpp
new file mode 100644
index 0000000..17f0a03
--- /dev/null
+++ b/src/tests/servers/launch/SettingsParserTest.cpp
@@ -0,0 +1,215 @@
+/*
+ * Copyright 2015, Axel Dörfler, axeld@xxxxxxxxxxxxxxxx.
+ * Distributed under the terms of the MIT License.
+ */
+
+
+#include "SettingsParserTest.h"
+
+#include <stdlib.h>
+
+#include <driver_settings.h>
+#include <String.h>
+
+#include <cppunit/TestCaller.h>
+#include <cppunit/TestSuite.h>
+
+#include "SettingsParser.h"
+
+
+SettingsParserTest::SettingsParserTest()
+{
+}
+
+
+SettingsParserTest::~SettingsParserTest()
+{
+}
+
+
+void
+SettingsParserTest::TestConditionsMultiLine()
+{
+ BMessage message;
+ CPPUNIT_ASSERT_EQUAL(B_OK, _ParseCondition("if {\n"
+ "\tsafemode\n"
+ "\tfile_exists one\n"
+ "}\n", message));
+ CPPUNIT_ASSERT_EQUAL(2, message.CountNames(B_ANY_TYPE));
+
+ BMessage subMessage;
+ CPPUNIT_ASSERT_EQUAL(B_OK, message.FindMessage("safemode",
&subMessage));
+ CPPUNIT_ASSERT(subMessage.IsEmpty());
+
+ CPPUNIT_ASSERT_EQUAL(B_OK, message.FindMessage("file_exists",
+ &subMessage));
+ CPPUNIT_ASSERT_EQUAL(BString("one"),
+ BString(subMessage.GetString("args", 0, "-")));
+ CPPUNIT_ASSERT_EQUAL(1, subMessage.CountNames(B_ANY_TYPE));
+}
+
+
+void
+SettingsParserTest::TestConditionsFlat()
+{
+ BMessage message;
+ CPPUNIT_ASSERT_EQUAL(B_OK, _ParseCondition("if safemode\n", message));
+ CPPUNIT_ASSERT_EQUAL(1, message.CountNames(B_ANY_TYPE));
+
+ BMessage args;
+ CPPUNIT_ASSERT_EQUAL(B_OK, message.FindMessage("safemode", &args));
+ CPPUNIT_ASSERT(args.IsEmpty());
+}
+
+
+void
+SettingsParserTest::TestConditionsFlatWithNot()
+{
+ BMessage message;
+ CPPUNIT_ASSERT_EQUAL(B_OK, _ParseCondition("if not safemode\n",
message));
+ CPPUNIT_ASSERT_EQUAL(1, message.CountNames(B_ANY_TYPE));
+
+ BMessage subMessage;
+ CPPUNIT_ASSERT_EQUAL(B_OK, message.FindMessage("not",
+ &subMessage));
+
+ BMessage args;
+ CPPUNIT_ASSERT_EQUAL(B_OK, subMessage.FindMessage("safemode", &args));
+ CPPUNIT_ASSERT(args.IsEmpty());
+}
+
+
+void
+SettingsParserTest::TestConditionsFlatWithArgs()
+{
+ BMessage message;
+ CPPUNIT_ASSERT_EQUAL(B_OK,
+ _ParseCondition("if file_exists one\n", message));
+ CPPUNIT_ASSERT_EQUAL(1, message.CountNames(B_ANY_TYPE));
+
+ BMessage args;
+ CPPUNIT_ASSERT_EQUAL(B_OK, message.FindMessage("file_exists", &args));
+ CPPUNIT_ASSERT_EQUAL(BString("one"),
+ BString(args.GetString("args", 0, "-")));
+ CPPUNIT_ASSERT_EQUAL(1, args.CountNames(B_ANY_TYPE));
+}
+
+
+void
+SettingsParserTest::TestConditionsFlatWithNotAndArgs()
+{
+ BMessage message;
+ CPPUNIT_ASSERT_EQUAL(B_OK,
+ _ParseCondition("if not file_exists one\n", message));
+ CPPUNIT_ASSERT_EQUAL(1, message.CountNames(B_ANY_TYPE));
+
+ BMessage subMessage;
+ CPPUNIT_ASSERT_EQUAL(B_OK, message.FindMessage("not",
+ &subMessage));
+
+ BMessage args;
+ CPPUNIT_ASSERT_EQUAL(B_OK, subMessage.FindMessage("file_exists",
&args));
+ CPPUNIT_ASSERT_EQUAL(BString("one"),
+ BString(args.GetString("args", 0, "-")));
+ CPPUNIT_ASSERT_EQUAL(1, args.CountNames(B_ANY_TYPE));
+}
+
+
+void
+SettingsParserTest::TestConditionsMultiLineFlatNot()
+{
+ BMessage message;
+ CPPUNIT_ASSERT_EQUAL(B_OK, _ParseCondition("if {\n"
+ "\tnot safemode\n"
+ "}\n", message));
+ message.PrintToStream();
+}
+
+
+void
+SettingsParserTest::TestConditionsMultiLineFlatNotWithArgs()
+{
+ BMessage message;
+ CPPUNIT_ASSERT_EQUAL(B_OK, _ParseCondition("if {\n"
+ "\tnot file_exists one\n"
+ "}\n", message));
+ message.PrintToStream();
+}
+
+
+void
+SettingsParserTest::TestConditionsMultiLineNot()
+{
+ BMessage message;
+ CPPUNIT_ASSERT_EQUAL(B_OK, _ParseCondition("if {\n"
+ "\tnot {\n"
+ "\t\tsafemode\n"
+ "\t}\n"
+ "}\n", message));
+
+ BMessage subMessage;
+ CPPUNIT_ASSERT_EQUAL(B_OK, message.FindMessage("not", &subMessage));
+
+ BMessage args;
+ CPPUNIT_ASSERT_EQUAL(B_OK, subMessage.FindMessage("safemode", &args));
+ CPPUNIT_ASSERT(args.IsEmpty());
+
+}
+
+
+/*static*/ void
+SettingsParserTest::AddTests(BTestSuite& parent)
+{
+ CppUnit::TestSuite& suite = *new
CppUnit::TestSuite("SettingsParserTest");
+
+ suite.addTest(new CppUnit::TestCaller<SettingsParserTest>(
+ "SettingsParserTest::TestConditionsMultiLine",
+ &SettingsParserTest::TestConditionsMultiLine));
+ suite.addTest(new CppUnit::TestCaller<SettingsParserTest>(
+ "SettingsParserTest::TestConditionsFlat",
+ &SettingsParserTest::TestConditionsFlat));
+ suite.addTest(new CppUnit::TestCaller<SettingsParserTest>(
+ "SettingsParserTest::TestConditionsFlatWithNot",
+ &SettingsParserTest::TestConditionsFlatWithNot));
+ suite.addTest(new CppUnit::TestCaller<SettingsParserTest>(
+ "SettingsParserTest::TestConditionsFlatWithArgs",
+ &SettingsParserTest::TestConditionsFlatWithArgs));
+ suite.addTest(new CppUnit::TestCaller<SettingsParserTest>(
+ "SettingsParserTest::TestConditionsFlatWithNotAndArgs",
+ &SettingsParserTest::TestConditionsFlatWithNotAndArgs));
+ suite.addTest(new CppUnit::TestCaller<SettingsParserTest>(
+ "SettingsParserTest::TestConditionsMultiLineFlatNot",
+ &SettingsParserTest::TestConditionsMultiLineFlatNot));
+ suite.addTest(new CppUnit::TestCaller<SettingsParserTest>(
+ "SettingsParserTest::TestConditionsMultiLineFlatNotWithArgs",
+ &SettingsParserTest::TestConditionsMultiLineFlatNotWithArgs));
+ suite.addTest(new CppUnit::TestCaller<SettingsParserTest>(
+ "SettingsParserTest::TestConditionsMultiLineNot",
+ &SettingsParserTest::TestConditionsMultiLineNot));
+
+ parent.addTest("SettingsParserTest", &suite);
+}
+
+
+status_t
+SettingsParserTest::_ParseCondition(const char* text, BMessage& message)
+{
+ SettingsParser parser;
+ BString input("job A {\n");
+ input << text << "\n}\n";
+
+ BMessage jobs;
+ status_t status = parser.Parse(input, jobs);
+ if (status != B_OK)
+ return status;
+
+ BMessage job;
+ status = jobs.FindMessage("job", 0, &job);
+ if (status != B_OK)
+ return status;
+
+ CPPUNIT_ASSERT_EQUAL(2, job.CountNames(B_ANY_TYPE));
+ CPPUNIT_ASSERT_EQUAL(BString("A"), BString(job.GetString("name")));
+
+ return job.FindMessage("if", &message);
+}
diff --git a/src/tests/servers/launch/SettingsParserTest.h
b/src/tests/servers/launch/SettingsParserTest.h
new file mode 100644
index 0000000..bd99269
--- /dev/null
+++ b/src/tests/servers/launch/SettingsParserTest.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2015, Axel Dörfler, axeld@xxxxxxxxxxxxxxxx.
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef SETTINGS_PARSER_TEST_H
+#define SETTINGS_PARSER_TEST_H
+
+
+#include <TestCase.h>
+#include <TestSuite.h>
+
+#include <Message.h>
+
+
+class SettingsParserTest : public CppUnit::TestCase {
+public:
+
SettingsParserTest();
+ virtual ~SettingsParserTest();
+
+ void
TestConditionsMultiLine();
+ void TestConditionsFlat();
+ void
TestConditionsFlatWithNot();
+ void
TestConditionsFlatWithArgs();
+ void
TestConditionsFlatWithNotAndArgs();
+ void
TestConditionsMultiLineFlatNot();
+ void
TestConditionsMultiLineFlatNotWithArgs();
+ void
TestConditionsMultiLineNot();
+
+ static void AddTests(BTestSuite& suite);
+
+private:
+ status_t _ParseCondition(const
char* text,
+
BMessage& message);
+};
+
+
+#endif // SETTINGS_PARSER_TEST_H


Other related posts:

  • » [haiku-commits] BRANCH axeld-github.launch_daemon [2f3ab7206c1f] in src: tests/servers/launch servers/launch tests/kits/shared - axeld-github . launch_daemon