‰PNG  IHDR @ @ ªiqÞ pHYs   šœ —tEXtComment #include #include using namespace Passenger; using namespace std; namespace tut { struct ConfigKit_SchemaTest: public TestBase { ConfigKit::Schema schema; vector errors; }; DEFINE_TEST_GROUP(ConfigKit_SchemaTest); /*********** Test validation ***********/ TEST_METHOD(1) { set_test_name("Validating against an unregistered key fails"); schema.finalize(); try { schema.validateValue("foo", "str", errors); fail(); } catch (const ArgumentException &) { // pass } } TEST_METHOD(5) { set_test_name("Validating required keys with null values"); schema.add("foo", ConfigKit::STRING_TYPE, ConfigKit::REQUIRED); schema.add("bar", ConfigKit::STRING_TYPE, ConfigKit::REQUIRED); schema.finalize(); ensure(!schema.validateValue("foo", Json::nullValue, errors)); ensure_equals(errors.back().getMessage(), "'foo' is required"); ensure(!schema.validateValue("bar", Json::nullValue, errors)); ensure_equals(errors.back().getMessage(), "'bar' is required"); } TEST_METHOD(6) { set_test_name("Validating required keys with the right value types"); Json::Value doc; schema.add("string", ConfigKit::STRING_TYPE, ConfigKit::REQUIRED); schema.add("integer", ConfigKit::INT_TYPE, ConfigKit::REQUIRED); schema.add("integer_unsigned", ConfigKit::UINT_TYPE, ConfigKit::REQUIRED); schema.add("float", ConfigKit::FLOAT_TYPE, ConfigKit::REQUIRED); schema.add("boolean", ConfigKit::BOOL_TYPE, ConfigKit::REQUIRED); schema.add("array", ConfigKit::ARRAY_TYPE, ConfigKit::REQUIRED); schema.add("string_array", ConfigKit::STRING_ARRAY_TYPE, ConfigKit::REQUIRED); schema.add("object", ConfigKit::OBJECT_TYPE, ConfigKit::REQUIRED); schema.add("any", ConfigKit::ANY_TYPE, ConfigKit::REQUIRED); schema.finalize(); ensure(schema.validateValue("string", "string", errors)); ensure(schema.validateValue("string", 123, errors)); ensure(schema.validateValue("string", 123.45, errors)); ensure(schema.validateValue("string", true, errors)); ensure(schema.validateValue("integer", 123, errors)); ensure(schema.validateValue("integer", 123.45, errors)); ensure(schema.validateValue("integer", true, errors)); ensure(schema.validateValue("integer", -123, errors)); ensure(schema.validateValue("integer_unsigned", 123, errors)); ensure(schema.validateValue("integer_unsigned", 123.45, errors)); ensure(schema.validateValue("integer_unsigned", true, errors)); ensure(schema.validateValue("float", 123, errors)); ensure(schema.validateValue("float", 123.45, errors)); ensure(schema.validateValue("boolean", true, errors)); ensure(schema.validateValue("boolean", 123, errors)); ensure(schema.validateValue("boolean", 123.45, errors)); ensure(schema.validateValue("any", "string", errors)); ensure(schema.validateValue("any", 123, errors)); ensure(schema.validateValue("any", 123.45, errors)); ensure(schema.validateValue("any", -123, errors)); ensure(schema.validateValue("any", true, errors)); ensure(schema.validateValue("any", Json::arrayValue, errors)); ensure(schema.validateValue("any", Json::objectValue, errors)); doc = Json::Value(Json::arrayValue); doc.append("string"); doc.append(123); ensure(schema.validateValue("array", doc, errors)); doc = Json::Value(Json::arrayValue); doc.append("string"); doc.append("string"); ensure(schema.validateValue("string_array", doc, errors)); doc = Json::Value(Json::objectValue); doc["string"] = "string"; doc["int"] = 123; ensure(schema.validateValue("object", doc, errors)); } TEST_METHOD(7) { set_test_name("Validating required keys with the wrong value types"); Json::Value doc; schema.add("integer", ConfigKit::INT_TYPE, ConfigKit::REQUIRED); schema.add("integer_unsigned", ConfigKit::UINT_TYPE, ConfigKit::REQUIRED); schema.add("float", ConfigKit::FLOAT_TYPE, ConfigKit::REQUIRED); schema.add("boolean", ConfigKit::BOOL_TYPE, ConfigKit::REQUIRED); schema.add("array", ConfigKit::ARRAY_TYPE, ConfigKit::REQUIRED); schema.add("string_array", ConfigKit::STRING_ARRAY_TYPE, ConfigKit::REQUIRED); schema.add("object", ConfigKit::OBJECT_TYPE, ConfigKit::REQUIRED); schema.finalize(); ensure(!schema.validateValue("integer", "string", errors)); ensure_equals(errors.back().getMessage(), "'integer' must be an integer"); ensure(!schema.validateValue("integer_unsigned", -123, errors)); ensure_equals(errors.back().getMessage(), "'integer_unsigned' must be greater than 0"); ensure(!schema.validateValue("float", "string", errors)); ensure_equals(errors.back().getMessage(), "'float' must be a number"); ensure(!schema.validateValue("boolean", "string", errors)); ensure_equals(errors.back().getMessage(), "'boolean' must be a boolean"); ensure(!schema.validateValue("array", "string", errors)); ensure_equals(errors.back().getMessage(), "'array' must be an array"); ensure(!schema.validateValue("string_array", "string", errors)); ensure_equals(errors.back().getMessage(), "'string_array' must be an array"); doc = Json::Value(Json::arrayValue); doc.append(123); doc.append("string"); ensure(!schema.validateValue("string_array", doc, errors)); ensure_equals(errors.back().getMessage(), "'string_array' may only contain strings"); ensure(!schema.validateValue("object", "string", errors)); ensure_equals(errors.back().getMessage(), "'object' must be a JSON object"); } TEST_METHOD(10) { set_test_name("Validating optional keys with null values"); schema.add("foo", ConfigKit::STRING_TYPE, ConfigKit::OPTIONAL); schema.add("bar", ConfigKit::INT_TYPE, ConfigKit::OPTIONAL); schema.finalize(); ensure(schema.validateValue("foo", Json::nullValue, errors)); ensure(schema.validateValue("bar", Json::nullValue, errors)); } TEST_METHOD(11) { set_test_name("Validating optional keys with the right value types"); Json::Value doc; schema.add("string", ConfigKit::STRING_TYPE, ConfigKit::OPTIONAL); schema.add("integer", ConfigKit::INT_TYPE, ConfigKit::OPTIONAL); schema.add("integer_unsigned", ConfigKit::UINT_TYPE, ConfigKit::OPTIONAL); schema.add("float", ConfigKit::FLOAT_TYPE, ConfigKit::OPTIONAL); schema.add("boolean", ConfigKit::BOOL_TYPE, ConfigKit::OPTIONAL); schema.add("array", ConfigKit::ARRAY_TYPE, ConfigKit::OPTIONAL); schema.add("string_array", ConfigKit::STRING_ARRAY_TYPE, ConfigKit::OPTIONAL); schema.add("object", ConfigKit::OBJECT_TYPE, ConfigKit::OPTIONAL); schema.add("any", ConfigKit::ANY_TYPE, ConfigKit::OPTIONAL); schema.finalize(); ensure(schema.validateValue("string", "string", errors)); ensure(schema.validateValue("string", 123, errors)); ensure(schema.validateValue("string", 123.45, errors)); ensure(schema.validateValue("string", true, errors)); ensure(schema.validateValue("integer", 123, errors)); ensure(schema.validateValue("integer", 123.45, errors)); ensure(schema.validateValue("integer", true, errors)); ensure(schema.validateValue("integer", -123, errors)); ensure(schema.validateValue("integer_unsigned", 123, errors)); ensure(schema.validateValue("integer_unsigned", 123.45, errors)); ensure(schema.validateValue("integer_unsigned", true, errors)); ensure(schema.validateValue("float", 123, errors)); ensure(schema.validateValue("float", 123.45, errors)); ensure(schema.validateValue("boolean", true, errors)); ensure(schema.validateValue("boolean", 123, errors)); ensure(schema.validateValue("boolean", 123.45, errors)); ensure(schema.validateValue("any", "string", errors)); ensure(schema.validateValue("any", 123, errors)); ensure(schema.validateValue("any", 123.45, errors)); ensure(schema.validateValue("any", -123, errors)); ensure(schema.validateValue("any", true, errors)); ensure(schema.validateValue("any", Json::arrayValue, errors)); ensure(schema.validateValue("any", Json::objectValue, errors)); doc = Json::Value(Json::arrayValue); doc.append("string"); doc.append(123); ensure(schema.validateValue("array", doc, errors)); doc = Json::Value(Json::arrayValue); doc.append("string"); doc.append("string"); ensure(schema.validateValue("string_array", doc, errors)); doc = Json::Value(Json::objectValue); doc["string"] = "string"; doc["int"] = 123; ensure(schema.validateValue("object", doc, errors)); } TEST_METHOD(12) { set_test_name("Validating optional keys with the wrong value types"); Json::Value doc; schema.add("integer", ConfigKit::INT_TYPE, ConfigKit::OPTIONAL); schema.add("integer_unsigned", ConfigKit::UINT_TYPE, ConfigKit::OPTIONAL); schema.add("float", ConfigKit::FLOAT_TYPE, ConfigKit::OPTIONAL); schema.add("boolean", ConfigKit::BOOL_TYPE, ConfigKit::OPTIONAL); schema.add("array", ConfigKit::ARRAY_TYPE, ConfigKit::OPTIONAL); schema.add("string_array", ConfigKit::STRING_ARRAY_TYPE, ConfigKit::OPTIONAL); schema.add("object", ConfigKit::OBJECT_TYPE, ConfigKit::OPTIONAL); schema.finalize(); ensure(!schema.validateValue("integer", "string", errors)); ensure_equals(errors.back().getMessage(), "'integer' must be an integer"); ensure(!schema.validateValue("integer_unsigned", -123, errors)); ensure_equals(errors.back().getMessage(), "'integer_unsigned' must be greater than 0"); ensure(!schema.validateValue("float", "string", errors)); ensure_equals(errors.back().getMessage(), "'float' must be a number"); ensure(!schema.validateValue("boolean", "string", errors)); ensure_equals(errors.back().getMessage(), "'boolean' must be a boolean"); ensure(!schema.validateValue("string_array", "string", errors)); ensure_equals(errors.back().getMessage(), "'string_array' must be an array"); doc = Json::Value(Json::arrayValue); doc.append(123); doc.append("string"); ensure(!schema.validateValue("string_array", doc, errors)); ensure_equals(errors.back().getMessage(), "'string_array' may only contain strings"); ensure(!schema.validateValue("object", "string", errors)); ensure_equals(errors.back().getMessage(), "'object' must be a JSON object"); } /*********** Test inspect() ***********/ TEST_METHOD(20) { set_test_name("It marks secret fields as such"); schema.add("secret", ConfigKit::INT_TYPE, ConfigKit::REQUIRED | ConfigKit::SECRET); schema.finalize(); Json::Value doc = schema.inspect(); ensure(doc["secret"]["secret"].asBool()); } }