@Test
public final void test_isValidConfigs_failures() {

	assertTrue(_validator.isValidConfigs(null, null, _failures));
	assertTrue(_failures.isEmpty());
	
	Object[][] config_def_data_bad = new Object[][] {
		//  { id,  name, type, subtype, default-value }	
			{ null, null, "" }, // id and name both null, type is empty
			{ 1L, "security", "blah" }, // bad type for service def
			{ 1L, "port", "int" }, // duplicate id
			{ 2L, "security", "string" }, // duplicate name
			{ 3L, "timeout", "enum", "units", null }, // , sub-type (units) is not among known enum types
			{ 4L, "auth", "enum", "authentication-type", "dimple" }, // default value is not among known values for the enum (sub-type)
	};
	
	List<RangerServiceConfigDef> configs = _utils.createServiceDefConfigs(config_def_data_bad);
	List<RangerEnumDef> enumDefs = _utils.createEnumDefs(enums_good);
	assertFalse(_validator.isValidConfigs(configs, enumDefs, _failures));
	_utils.checkFailureForMissingValue(_failures, "config def name");
	_utils.checkFailureForMissingValue(_failures, "config def itemId");
	_utils.checkFailureForMissingValue(_failures, "config def type");
	_utils.checkFailureForSemanticError(_failures, "config def name", "security"); // there were two configs with same name as security
	_utils.checkFailureForSemanticError(_failures, "config def itemId", "1"); // a config with duplicate had id of 1
	_utils.checkFailureForSemanticError(_failures, "config def type", "security"); // type for config security was invalid
	_utils.checkFailureForSemanticError(_failures, "config def subtype", "timeout"); // type for config security was invalid
	_utils.checkFailureForSemanticError(_failures, "config def default value", "auth"); // type for config security was invalid
}