[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