added 1 changeset to branch 'refs/remotes/axeld-github/network-preferences' old head: d044166a7a66af2b7bb9ab2f57cf4860db7daa67 new head: 8f6c99f53118b386a4c2111309ef3f50e30e6aa3 overview: https://github.com/axeld/haiku/compare/d044166a7a66...8f6c99f53118 ---------------------------------------------------------------------------- 8f6c99f53118: DriverSettingsMessageAdapter: fixed various issues. * _AddParameter() would ignore all BMessage::Add*() errors. * _ConvertFromDriverParameter() would ignore most intermediate error, but would fail badly over some incorrect settings file. * Also, it checked for the parent value for each parameter, which doesn't make any sense, but would add as often as there are parameters -- which also may be none, in which case the value got ignored. [ Axel Dörfler <axeld@xxxxxxxxxxxxxxxx> ] ---------------------------------------------------------------------------- Commit: 8f6c99f53118b386a4c2111309ef3f50e30e6aa3 Author: Axel Dörfler <axeld@xxxxxxxxxxxxxxxx> Date: Fri Mar 20 23:09:11 2015 UTC ---------------------------------------------------------------------------- 5 files changed, 290 insertions(+), 21 deletions(-) src/kits/shared/DriverSettingsMessageAdapter.cpp | 53 +++-- .../shared/DriverSettingsMessageAdapterTest.cpp | 226 +++++++++++++++++++ .../shared/DriverSettingsMessageAdapterTest.h | 27 +++ src/tests/kits/shared/Jamfile | 1 + src/tests/kits/shared/SharedTestAddon.cpp | 4 +- ---------------------------------------------------------------------------- diff --git a/src/kits/shared/DriverSettingsMessageAdapter.cpp b/src/kits/shared/DriverSettingsMessageAdapter.cpp index c3ca6bc..526797c 100644 --- a/src/kits/shared/DriverSettingsMessageAdapter.cpp +++ b/src/kits/shared/DriverSettingsMessageAdapter.cpp @@ -179,24 +179,36 @@ DriverSettingsMessageAdapter::_AddParameter(const driver_parameter& parameter, return status; } + status_t status = B_OK; + switch (settingsTemplate.type) { case B_STRING_TYPE: - message.AddString(settingsTemplate.name, parameter.values[i]); + status = message.AddString(settingsTemplate.name, + parameter.values[i]); break; case B_INT32_TYPE: - message.AddInt32(settingsTemplate.name, + status = message.AddInt32(settingsTemplate.name, atoi(parameter.values[i])); break; case B_BOOL_TYPE: - if (!strcasecmp(parameter.values[i], "true") + { + bool value=!strcasecmp(parameter.values[i], "true") || !strcasecmp(parameter.values[i], "on") + || !strcasecmp(parameter.values[i], "yes") || !strcasecmp(parameter.values[i], "enabled") - || !strcasecmp(parameter.values[i], "1")) - message.AddBool(settingsTemplate.name, true); - else - message.AddBool(settingsTemplate.name, false); + || !strcasecmp(parameter.values[i], "1"); + status = message.AddBool(settingsTemplate.name, value); + break; + } + case B_MESSAGE_TYPE: + // Is handled outside of this method break; + + default: + return B_BAD_VALUE; } + if (status != B_OK) + return status; } if (settingsTemplate.type == B_BOOL_TYPE && parameter.value_count == 0) { // Empty boolean parameters are always true @@ -214,32 +226,33 @@ DriverSettingsMessageAdapter::_ConvertFromDriverParameter( { settingsTemplate = _FindSettingsTemplate(settingsTemplate, parameter.name); if (settingsTemplate == NULL) { + // We almost silently ignore this kind of issues fprintf(stderr, "unknown parameter %s\n", parameter.name); - return B_BAD_VALUE; + return B_OK; } - _AddParameter(parameter, *settingsTemplate, message); + status_t status = _AddParameter(parameter, *settingsTemplate, message); + if (status != B_OK) + return status; - if (settingsTemplate->type == B_MESSAGE_TYPE - && parameter.parameter_count > 0) { - status_t status = B_OK; + if (settingsTemplate->type == B_MESSAGE_TYPE) { BMessage subMessage; for (int32 j = 0; j < parameter.parameter_count; j++) { status = _ConvertFromDriverParameter(parameter.parameters[j], settingsTemplate->sub_template, subMessage); if (status != B_OK) - break; - - const settings_template* parentValueTemplate - = _FindParentValueTemplate(settingsTemplate); - if (parentValueTemplate != NULL) - _AddParameter(parameter, *parentValueTemplate, subMessage); + return status; } + + const settings_template* parentValueTemplate + = _FindParentValueTemplate(settingsTemplate); + if (parentValueTemplate != NULL) + status = _AddParameter(parameter, *parentValueTemplate, subMessage); if (status == B_OK) - message.AddMessage(parameter.name, &subMessage); + status = message.AddMessage(parameter.name, &subMessage); } - return B_OK; + return status; } diff --git a/src/tests/kits/shared/DriverSettingsMessageAdapterTest.cpp b/src/tests/kits/shared/DriverSettingsMessageAdapterTest.cpp new file mode 100644 index 0000000..a989b61 --- /dev/null +++ b/src/tests/kits/shared/DriverSettingsMessageAdapterTest.cpp @@ -0,0 +1,226 @@ +/* + * Copyright 2015, Axel Dörfler, axeld@xxxxxxxxxxxxxxxx. + * Distributed under the terms of the MIT License. + */ + + +#include "DriverSettingsMessageAdapterTest.h" + +#include <driver_settings.h> +#include <String.h> + +#include <DriverSettingsMessageAdapter.h> + +#include <cppunit/TestCaller.h> +#include <cppunit/TestSuite.h> + + +namespace { + + +class Settings { +public: + Settings(const char* string) + { + fSettings = parse_driver_settings_string(string); + CppUnit::Asserter::failIf(fSettings == NULL, + "Could not parse settings"); + } + + status_t ToMessage(const settings_template* settingsTemplate, + BMessage& message) + { + message.MakeEmpty(); + + DriverSettingsMessageAdapter adapter; + return adapter.ConvertFromDriverSettings( + *get_driver_settings(fSettings), settingsTemplate, message); + } + + ~Settings() + { + delete_driver_settings(fSettings); + } + +private: + void* fSettings; +}; + + +} // empty namespace + + +// #pragma mark - + + +DriverSettingsMessageAdapterTest::DriverSettingsMessageAdapterTest() +{ +} + + +DriverSettingsMessageAdapterTest::~DriverSettingsMessageAdapterTest() +{ +} + + +void +DriverSettingsMessageAdapterTest::TestPrimitivesToMessage() +{ + const settings_template kTemplate[] = { + {B_BOOL_TYPE, "bool1", NULL}, + {B_BOOL_TYPE, "bool2", NULL}, + {B_BOOL_TYPE, "bool3", NULL}, + {B_BOOL_TYPE, "bool4", NULL}, + {B_BOOL_TYPE, "bool5", NULL}, + {B_BOOL_TYPE, "bool6", NULL}, + {B_BOOL_TYPE, "bool7", NULL}, + {B_BOOL_TYPE, "bool8", NULL}, + {B_BOOL_TYPE, "bool9", NULL}, + {B_BOOL_TYPE, "empty_bool", NULL}, + {B_INT32_TYPE, "int32", NULL}, + {B_INT32_TYPE, "negative_int32", NULL}, + {B_INT32_TYPE, "empty_int32", NULL}, + {B_STRING_TYPE, "string", NULL}, + {B_STRING_TYPE, "long_string", NULL}, + {B_STRING_TYPE, "empty_string", NULL}, + {} + }; + Settings settings("bool1 true\n" + "bool2 1\n" + "bool3 on\n" + "bool4 yes\n" + "bool5 enabled\n" + "bool6 false\n" + "bool7 off\n" + "bool8 gurkensalat\n" + "bool9 0\n" + "empty_bool\n" + "int32 42\n" + "negative_int32 -42\n" + "empty_int32\n" + "string Hey\n" + "long_string \"This is but a test\"\n" + "empty_string\n"); + + BMessage message; + CPPUNIT_ASSERT_EQUAL(B_OK, settings.ToMessage(kTemplate, message)); + CPPUNIT_ASSERT_EQUAL(10, message.CountNames(B_BOOL_TYPE)); + CPPUNIT_ASSERT_EQUAL(2, message.CountNames(B_INT32_TYPE)); + CPPUNIT_ASSERT_EQUAL(2, message.CountNames(B_STRING_TYPE)); + + // bool values + CPPUNIT_ASSERT_EQUAL_MESSAGE("bool1", true, message.GetBool("bool1")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("bool2", true, message.GetBool("bool2")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("bool3", true, message.GetBool("bool3")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("bool4", true, message.GetBool("bool4")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("bool5", true, message.GetBool("bool5")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("bool6", false, + message.GetBool("bool6", true)); + CPPUNIT_ASSERT_EQUAL_MESSAGE("bool7", false, + message.GetBool("bool7", true)); + CPPUNIT_ASSERT_EQUAL_MESSAGE("bool8", false, + message.GetBool("bool8", true)); + CPPUNIT_ASSERT_EQUAL_MESSAGE("bool9", false, + message.GetBool("bool9", true)); + CPPUNIT_ASSERT_EQUAL_MESSAGE("empty_bool", true, + message.GetBool("empty_bool")); + + // int32 values + CPPUNIT_ASSERT_EQUAL(42, message.GetInt32("int32", 0)); + CPPUNIT_ASSERT_EQUAL(-42, message.GetInt32("negative_int32", 0)); + CPPUNIT_ASSERT_EQUAL(false, message.HasInt32("empty_int32")); + + // string values + CPPUNIT_ASSERT_EQUAL(BString("Hey"), BString(message.GetString("string"))); + CPPUNIT_ASSERT_EQUAL(BString("This is but a test"), + BString(message.GetString("long_string"))); + CPPUNIT_ASSERT_EQUAL(false, message.HasString("empty_string")); +} + + +void +DriverSettingsMessageAdapterTest::TestMessage() +{ +} + + +void +DriverSettingsMessageAdapterTest::TestEmptyMessage() +{ +} + + +void +DriverSettingsMessageAdapterTest::TestParent() +{ + const settings_template kSubTemplate[] = { + {B_STRING_TYPE, "name", NULL, true}, + {B_BOOL_TYPE, "bool", NULL}, + {} + }; + const settings_template kTemplate[] = { + {B_MESSAGE_TYPE, "message", kSubTemplate}, + {} + }; + Settings settingsA("message first {\n" + " bool\n" + "}\n"); + BMessage message; + CPPUNIT_ASSERT_EQUAL(B_OK, settingsA.ToMessage(kTemplate, message)); + BMessage subMessage; + CPPUNIT_ASSERT_EQUAL(B_OK, message.FindMessage("message", &subMessage)); + CPPUNIT_ASSERT_EQUAL_MESSAGE("bool", true, subMessage.GetBool("bool")); + CPPUNIT_ASSERT_EQUAL(BString("first"), + BString(subMessage.GetString("name"))); + + Settings settingsB("message second\n"); + CPPUNIT_ASSERT_EQUAL(B_OK, settingsB.ToMessage(kTemplate, message)); + CPPUNIT_ASSERT_EQUAL(B_OK, message.FindMessage("message", &subMessage)); + CPPUNIT_ASSERT_EQUAL(false, subMessage.HasBool("bool")); + CPPUNIT_ASSERT_EQUAL(BString("second"), + BString(subMessage.GetString("name", "-/-"))); + + const settings_template kSubSubTemplateC[] = { + {B_STRING_TYPE, "subname", NULL, true}, + {B_BOOL_TYPE, "bool", NULL}, + {} + }; + const settings_template kSubTemplateC[] = { + {B_STRING_TYPE, "name", NULL, true}, + {B_MESSAGE_TYPE, "sub", kSubSubTemplateC}, + {} + }; + const settings_template kTemplateC[] = { + {B_MESSAGE_TYPE, "message", kSubTemplateC}, + {} + }; + + Settings settingsC("message other {\n" + " sub third {\n" + " hun audo\n" + " }\n" + " sub fourth\n" + "}"); + CPPUNIT_ASSERT_EQUAL(B_OK, settingsC.ToMessage(kTemplateC, message)); + CPPUNIT_ASSERT_EQUAL(B_OK, message.FindMessage("message", &subMessage)); + CPPUNIT_ASSERT_EQUAL(false, subMessage.HasBool("bool")); + CPPUNIT_ASSERT_EQUAL(BString("other"), + BString(subMessage.GetString("name", "-/-"))); +} + + +/*static*/ void +DriverSettingsMessageAdapterTest::AddTests(BTestSuite& parent) +{ + CppUnit::TestSuite& suite = *new CppUnit::TestSuite( + "DriverSettingsMessageAdapterTest"); + +// suite.addTest(new CppUnit::TestCaller<DriverSettingsMessageAdapterTest>( +// "DriverSettingsMessageAdapterTest::TestPrimitivesToMessage", +// &DriverSettingsMessageAdapterTest::TestPrimitivesToMessage)); + suite.addTest(new CppUnit::TestCaller<DriverSettingsMessageAdapterTest>( + "DriverSettingsMessageAdapterTest::TestParent", + &DriverSettingsMessageAdapterTest::TestParent)); + + parent.addTest("DriverSettingsMessageAdapterTest", &suite); +} diff --git a/src/tests/kits/shared/DriverSettingsMessageAdapterTest.h b/src/tests/kits/shared/DriverSettingsMessageAdapterTest.h new file mode 100644 index 0000000..934cc35 --- /dev/null +++ b/src/tests/kits/shared/DriverSettingsMessageAdapterTest.h @@ -0,0 +1,27 @@ +/* + * Copyright 2015, Axel Dörfler, axeld@xxxxxxxxxxxxxxxx. + * Distributed under the terms of the MIT License. + */ +#ifndef DRIVER_SETTINGS_MESSAGE_ADAPTER_TEST_H +#define DRIVER_SETTINGS_MESSAGE_ADAPTER_TEST_H + + +#include <TestCase.h> +#include <TestSuite.h> + + +class DriverSettingsMessageAdapterTest : public CppUnit::TestCase { +public: + DriverSettingsMessageAdapterTest(); + virtual ~DriverSettingsMessageAdapterTest(); + + void TestPrimitivesToMessage(); + void TestMessage(); + void TestEmptyMessage(); + void TestParent(); + + static void AddTests(BTestSuite& suite); +}; + + +#endif // DRIVER_SETTINGS_MESSAGE_ADAPTER_TEST_H diff --git a/src/tests/kits/shared/Jamfile b/src/tests/kits/shared/Jamfile index 209fffb..db95dc9 100644 --- a/src/tests/kits/shared/Jamfile +++ b/src/tests/kits/shared/Jamfile @@ -9,6 +9,7 @@ UnitTestLib libsharedtest.so : SharedTestAddon.cpp CalendarViewTest.cpp + DriverSettingsMessageAdapterTest.cpp GeolocationTest.cpp NaturalCompareTest.cpp diff --git a/src/tests/kits/shared/SharedTestAddon.cpp b/src/tests/kits/shared/SharedTestAddon.cpp index 0009052..c5130f5 100644 --- a/src/tests/kits/shared/SharedTestAddon.cpp +++ b/src/tests/kits/shared/SharedTestAddon.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2012, Axel Dörfler, axeld@xxxxxxxxxxxxxxxx. + * Copyright 2012-2015, Axel Dörfler, axeld@xxxxxxxxxxxxxxxx. * Distributed under the terms of the MIT License. */ @@ -8,6 +8,7 @@ #include <TestSuiteAddon.h> #include "CalendarViewTest.h" +#include "DriverSettingsMessageAdapterTest.h" #include "GeolocationTest.h" #include "NaturalCompareTest.h" @@ -18,6 +19,7 @@ getTestSuite() BTestSuite* suite = new BTestSuite("Shared"); CalendarViewTest::AddTests(*suite); + DriverSettingsMessageAdapterTest::AddTests(*suite); GeolocationTest::AddTests(*suite); NaturalCompareTest::AddTests(*suite);