[svn] commit: r710 - in /branches/parkinglot/src/lib: cc/cpp/ config/cpp/ config/testdata/
BIND 10 source code commits
bind10-changes at lists.isc.org
Wed Feb 3 15:59:40 UTC 2010
Author: jelte
Date: Wed Feb 3 15:59:40 2010
New Revision: 710
Log:
more tests, data_def.cc is not covered as much as possible
Added:
branches/parkinglot/src/lib/config/testdata/data22_1.data
branches/parkinglot/src/lib/config/testdata/data22_2.data
branches/parkinglot/src/lib/config/testdata/data22_3.data
branches/parkinglot/src/lib/config/testdata/data22_4.data
branches/parkinglot/src/lib/config/testdata/data22_5.data
branches/parkinglot/src/lib/config/testdata/data22_6.data
branches/parkinglot/src/lib/config/testdata/data22_7.data
branches/parkinglot/src/lib/config/testdata/data22_8.data
branches/parkinglot/src/lib/config/testdata/spec10.spec
branches/parkinglot/src/lib/config/testdata/spec11.spec
branches/parkinglot/src/lib/config/testdata/spec12.spec
branches/parkinglot/src/lib/config/testdata/spec13.spec
branches/parkinglot/src/lib/config/testdata/spec14.spec
branches/parkinglot/src/lib/config/testdata/spec15.spec
branches/parkinglot/src/lib/config/testdata/spec16.spec
branches/parkinglot/src/lib/config/testdata/spec17.spec
branches/parkinglot/src/lib/config/testdata/spec18.spec
branches/parkinglot/src/lib/config/testdata/spec19.spec
branches/parkinglot/src/lib/config/testdata/spec20.spec
branches/parkinglot/src/lib/config/testdata/spec21.spec
branches/parkinglot/src/lib/config/testdata/spec22.spec
branches/parkinglot/src/lib/config/testdata/spec23.spec
branches/parkinglot/src/lib/config/testdata/spec9.spec
Modified:
branches/parkinglot/src/lib/cc/cpp/data.h
branches/parkinglot/src/lib/cc/cpp/data_unittests.cc
branches/parkinglot/src/lib/config/cpp/data_def.cc
branches/parkinglot/src/lib/config/cpp/data_def_unittests.cc
Modified: branches/parkinglot/src/lib/cc/cpp/data.h
==============================================================================
--- branches/parkinglot/src/lib/cc/cpp/data.h (original)
+++ branches/parkinglot/src/lib/cc/cpp/data.h Wed Feb 3 15:59:40 2010
@@ -96,7 +96,9 @@
Element(int t) { type = t; }
public:
- enum types { integer, real, boolean, string, list, map };
+ // any is a special type used in list specifications, specifying
+ // that the elements can be of any type
+ enum types { integer, real, boolean, string, list, map, any };
// base class; make dtor virtual
virtual ~Element() {};
Modified: branches/parkinglot/src/lib/cc/cpp/data_unittests.cc
==============================================================================
--- branches/parkinglot/src/lib/cc/cpp/data_unittests.cc (original)
+++ branches/parkinglot/src/lib/cc/cpp/data_unittests.cc Wed Feb 3 15:59:40 2010
@@ -61,6 +61,7 @@
sv.push_back("\"asdf\"");
sv.push_back("[ 1, 2, 3, 4 ]");
sv.push_back("{\"name\": \"foo\", \"value\": 47806}");
+ sv.push_back("[ {\"a\": 1, \"b\": \"c\"}, {\"a\": 2, \"b\": \"d\"} ]");
BOOST_FOREACH(std::string s, sv) {
// also test << operator, which uses Element::str()
Modified: branches/parkinglot/src/lib/config/cpp/data_def.cc
==============================================================================
--- branches/parkinglot/src/lib/config/cpp/data_def.cc (original)
+++ branches/parkinglot/src/lib/config/cpp/data_def.cc Wed Feb 3 15:59:40 2010
@@ -48,6 +48,8 @@
return Element::list;
} else if (type_name == "map") {
return Element::map;
+ } else if (type_name == "any") {
+ return Element::any;
} else {
throw DataDefinitionError(type_name + " is not a valid type name");
}
@@ -97,7 +99,6 @@
static void
check_config_item_list(const ElementPtr& spec) {
if (spec->getType() != Element::list) {
- std::cout << "[XX] ERROR IN: " << spec << std::endl;
throw DataDefinitionError("config_data is not a list of elements");
}
BOOST_FOREACH(ElementPtr item, spec->listValue()) {
@@ -210,16 +211,22 @@
bool
DataDefinition::validate_item(const ElementPtr spec, const ElementPtr data) {
- std::cout << "Validating type of " << data << std::endl;
if (!check_type(spec, data)) {
- std::cout << "type mismatch; not " << spec->get("item_type") << ": " << data << std::endl;
- std::cout << spec << std::endl;
+ // we should do some proper error feedback here
+ // std::cout << "type mismatch; not " << spec->get("item_type") << ": " << data << std::endl;
+ // std::cout << spec << std::endl;
return false;
}
if (data->getType() == Element::list) {
+ ElementPtr list_spec = spec->get("list_item_spec");
BOOST_FOREACH(ElementPtr list_el, data->listValue()) {
- if (!validate_spec(spec->get("list_item_spec"), list_el)) {
+ if (!check_type(list_spec, list_el)) {
return false;
+ }
+ if (list_spec->get("item_type")->stringValue() == "map") {
+ if (!validate_item(list_spec, list_el)) {
+ return false;
+ }
}
}
}
@@ -238,7 +245,6 @@
bool optional = spec->get("item_optional")->boolValue();
ElementPtr data_el;
- std::cout << "check for item with name " << item_name << std::endl;
data_el = data->get(item_name);
if (data_el) {
if (!validate_item(spec, data_el)) {
@@ -246,7 +252,6 @@
}
} else {
if (!optional) {
- std::cout << "non-optional value not found" << std::endl;
return false;
}
}
Modified: branches/parkinglot/src/lib/config/cpp/data_def_unittests.cc
==============================================================================
--- branches/parkinglot/src/lib/config/cpp/data_def_unittests.cc (original)
+++ branches/parkinglot/src/lib/config/cpp/data_def_unittests.cc Wed Feb 3 15:59:40 2010
@@ -17,6 +17,8 @@
#include <gtest/gtest.h>
#include <data_def.h>
+
+#include <fstream>
#include "data_def_unittests_config.h"
@@ -41,7 +43,7 @@
}
}
-TEST(DataDefinition, Specfiles) {
+TEST(DataDefinition, ReadingSpecfiles) {
// Tests whether we can open specfiles and if we get the
// right parse errors
DataDefinition dd = DataDefinition(specfile("spec1.spec"));
@@ -55,6 +57,16 @@
"Error opening ",
specfile("doesnotexist"),
": No such file or directory");
+
+ std::ifstream file;
+ file.open(specfile("spec1.spec").c_str());
+ dd = DataDefinition(file);
+ EXPECT_EQ(dd.getDefinition()->get("data_specification")
+ ->get("module_name")
+ ->stringValue(), "Spec1");
+}
+
+TEST(DataDefinition, SpecfileItems) {
data_def_error("spec3.spec",
"item_name missing in {\"item_default\": 1, \"item_optional\": False, \"item_type\": \"integer\"}");
data_def_error("spec4.spec",
@@ -63,8 +75,71 @@
"item_optional missing in {\"item_default\": 1, \"item_name\": \"item1\", \"item_type\": \"integer\"}");
data_def_error("spec6.spec",
"item_default missing in {\"item_name\": \"item1\", \"item_optional\": False, \"item_type\": \"integer\"}");
+ data_def_error("spec9.spec",
+ "item_default not of type integer");
+ data_def_error("spec10.spec",
+ "item_default not of type real");
+ data_def_error("spec11.spec",
+ "item_default not of type boolean");
+ data_def_error("spec12.spec",
+ "item_default not of type string");
+ data_def_error("spec13.spec",
+ "item_default not of type list");
+ data_def_error("spec14.spec",
+ "item_default not of type map");
+ data_def_error("spec15.spec",
+ "badname is not a valid type name");
+}
+
+TEST(DataDefinition, SpecfileConfigData)
+{
data_def_error("spec7.spec",
"module_name missing in {}");
data_def_error("spec8.spec",
"Data specification does not contain data_specification element");
+ data_def_error("spec16.spec",
+ "config_data is not a list of elements");
+ data_def_error("spec21.spec",
+ "commands is not a list of elements");
}
+
+TEST(DataDefinition, SpecfileCommands)
+{
+ data_def_error("spec17.spec",
+ "command_name missing in {\"command_args\": [ {\"item_default\": \"\", \"item_name\": \"message\", \"item_optional\": False, \"item_type\": \"string\"} ], \"command_description\": \"Print the given message to stdout\"}");
+ data_def_error("spec18.spec",
+ "command_args missing in {\"command_description\": \"Print the given message to stdout\", \"command_name\": \"print_message\"}");
+ data_def_error("spec19.spec",
+ "command_args not of type list");
+ data_def_error("spec20.spec",
+ "somethingbad is not a valid type name");
+/*
+ data_def_error("spec22.spec",
+ "");
+*/
+}
+
+bool
+data_test(DataDefinition dd, const std::string& data_file_name)
+{
+ std::ifstream data_file;
+
+ data_file.open(specfile(data_file_name).c_str());
+ ElementPtr data = Element::createFromString(data_file, data_file_name);
+ data_file.close();
+
+ return dd.validate(data);
+}
+
+TEST(DataDefinition, DataValidation) {
+ DataDefinition dd = DataDefinition(specfile("spec22.spec"));
+
+ EXPECT_TRUE(data_test(dd, "data22_1.data"));
+ EXPECT_FALSE(data_test(dd, "data22_2.data"));
+ EXPECT_FALSE(data_test(dd, "data22_3.data"));
+ EXPECT_FALSE(data_test(dd, "data22_4.data"));
+ EXPECT_FALSE(data_test(dd, "data22_5.data"));
+ EXPECT_TRUE(data_test(dd, "data22_6.data"));
+ EXPECT_TRUE(data_test(dd, "data22_7.data"));
+ EXPECT_FALSE(data_test(dd, "data22_8.data"));
+}
More information about the bind10-changes
mailing list