From: Thomas Markwalder Date: Tue, 16 Jul 2024 13:29:06 +0000 (-0400) Subject: [#3484] Corrected enum add UTs X-Git-Tag: Kea-2.6.1~11 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=73790ecadddddad3712065aff3f03122347f0239;p=thirdparty%2Fkea.git [#3484] Corrected enum add UTs modified: ChangeLog /src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc /src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp6_unittest.cc /src/hooks/dhcp/pgsql_cb/tests/pgsql_cb_dhcp4_unittest.cc /src/hooks/dhcp/pgsql_cb/tests/pgsql_cb_dhcp6_unittest.cc /src/lib/dhcp/option_data_types.h /src/lib/dhcp/tests/option_definition_unittest.cc /src/lib/dhcpsrv/testutils/generic_cb_dhcp4_unittest.* /src/lib/dhcpsrv/testutils/generic_cb_dhcp6_unittest.* --- diff --git a/ChangeLog b/ChangeLog index bfd33c1a60..de00531714 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,10 +1,17 @@ +2250. [bug] tmark + Corrected an issue with overlapping enum values + for option definition data type. This was causing + option definitions of type "record", created via + config backend commands, to not load properly when + fetched from the back end. + (Gitlab #3484, #3476) + 2249. [bug] marcin Corrected a bug in storing and fetching the encapsulated DHCP options from the configuration backend. These options were sometimes not returned when they were specified at the subnet, shared network or client class level. (Gitlab #3485) - 2248. [bug] razvan Fixed a file descriptor leak in the High Availability hook library. diff --git a/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc b/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc index eadb257ff5..72b873451c 100644 --- a/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc +++ b/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc @@ -319,6 +319,14 @@ TEST_F(MySqlConfigBackendDHCPv4Test, optionDefs4WithServerTagsTest) { optionDefs4WithServerTagsTest(); } +TEST_F(MySqlConfigBackendDHCPv4Test, invalidOptionDefDataType4Test) { + invalidOptionDefDataType4Test(); +} + +TEST_F(MySqlConfigBackendDHCPv4Test, allOptionDefDataTypes4Test) { + allOptionDefDataTypes4Test(); +} + TEST_F(MySqlConfigBackendDHCPv4Test, getAllOptionDefs4Test) { getAllOptionDefs4Test(); } diff --git a/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp6_unittest.cc b/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp6_unittest.cc index adbe576114..d758b54e05 100644 --- a/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp6_unittest.cc +++ b/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp6_unittest.cc @@ -319,6 +319,14 @@ TEST_F(MySqlConfigBackendDHCPv6Test, optionDefs6WithServerTagsTest) { optionDefs6WithServerTagsTest(); } +TEST_F(MySqlConfigBackendDHCPv6Test, invalidOptionDefDataType6Test) { + invalidOptionDefDataType6Test(); +} + +TEST_F(MySqlConfigBackendDHCPv6Test, allOptionDefDataTypes6Test) { + allOptionDefDataTypes6Test(); +} + TEST_F(MySqlConfigBackendDHCPv6Test, getAllOptionDefs6Test) { getAllOptionDefs6Test(); } diff --git a/src/hooks/dhcp/pgsql_cb/tests/pgsql_cb_dhcp4_unittest.cc b/src/hooks/dhcp/pgsql_cb/tests/pgsql_cb_dhcp4_unittest.cc index f6faa1bbd1..aa80e1a61d 100644 --- a/src/hooks/dhcp/pgsql_cb/tests/pgsql_cb_dhcp4_unittest.cc +++ b/src/hooks/dhcp/pgsql_cb/tests/pgsql_cb_dhcp4_unittest.cc @@ -317,6 +317,14 @@ TEST_F(PgSqlConfigBackendDHCPv4Test, optionDefs4WithServerTagsTest) { optionDefs4WithServerTagsTest(); } +TEST_F(PgSqlConfigBackendDHCPv4Test, invalidOptionDefDataType4Test) { + invalidOptionDefDataType4Test(); +} + +TEST_F(PgSqlConfigBackendDHCPv4Test, allOptionDefDataTypes4Test) { + allOptionDefDataTypes4Test(); +} + TEST_F(PgSqlConfigBackendDHCPv4Test, getAllOptionDefs4Test) { getAllOptionDefs4Test(); } diff --git a/src/hooks/dhcp/pgsql_cb/tests/pgsql_cb_dhcp6_unittest.cc b/src/hooks/dhcp/pgsql_cb/tests/pgsql_cb_dhcp6_unittest.cc index 44e2e6671b..c1720587f1 100644 --- a/src/hooks/dhcp/pgsql_cb/tests/pgsql_cb_dhcp6_unittest.cc +++ b/src/hooks/dhcp/pgsql_cb/tests/pgsql_cb_dhcp6_unittest.cc @@ -317,6 +317,14 @@ TEST_F(PgSqlConfigBackendDHCPv6Test, optionDefs6WithServerTagsTest) { optionDefs6WithServerTagsTest(); } +TEST_F(PgSqlConfigBackendDHCPv6Test, invalidOptionDefDataType6Test) { + invalidOptionDefDataType6Test(); +} + +TEST_F(PgSqlConfigBackendDHCPv6Test, allOptionDefDataTypes4Test) { + allOptionDefDataTypes6Test(); +} + TEST_F(PgSqlConfigBackendDHCPv6Test, getAllOptionDefs6Test) { getAllOptionDefs6Test(); } diff --git a/src/lib/dhcp/option_data_types.h b/src/lib/dhcp/option_data_types.h index 58bee3d1e6..52e8a2e18d 100644 --- a/src/lib/dhcp/option_data_types.h +++ b/src/lib/dhcp/option_data_types.h @@ -61,8 +61,8 @@ enum OptionDataType { OPT_FQDN_TYPE, // Type to be used only internally. Allows convenient notation of the option config. OPT_INTERNAL_TYPE, - OPT_RECORD_TYPE, - OPT_UNKNOWN_TYPE + OPT_RECORD_TYPE = 254, // Do not alter this value. + OPT_UNKNOWN_TYPE = 255 // Do not alter this value. }; /// @brief Parameters being used to make up an option definition. diff --git a/src/lib/dhcp/tests/option_definition_unittest.cc b/src/lib/dhcp/tests/option_definition_unittest.cc index 48c4b61115..5ca6175de7 100644 --- a/src/lib/dhcp/tests/option_definition_unittest.cc +++ b/src/lib/dhcp/tests/option_definition_unittest.cc @@ -2155,4 +2155,50 @@ TEST_F(OptionDefinitionTest, internalOptionTypeBinary) { option_cast->toText()); } +// Verify converstion of OptionDefintion type strings to type enums. +TEST(OptionDataTypeUtil, typeToString) { + EXPECT_EQ(OPT_EMPTY_TYPE, OptionDataTypeUtil::getDataType("empty")); + EXPECT_EQ(OPT_BINARY_TYPE, OptionDataTypeUtil::getDataType("binary")); + EXPECT_EQ(OPT_BOOLEAN_TYPE, OptionDataTypeUtil::getDataType("boolean")); + EXPECT_EQ(OPT_INT8_TYPE, OptionDataTypeUtil::getDataType("int8")); + EXPECT_EQ(OPT_INT16_TYPE, OptionDataTypeUtil::getDataType("int16")); + EXPECT_EQ(OPT_INT32_TYPE, OptionDataTypeUtil::getDataType("int32")); + EXPECT_EQ(OPT_UINT8_TYPE, OptionDataTypeUtil::getDataType("uint8")); + EXPECT_EQ(OPT_UINT16_TYPE, OptionDataTypeUtil::getDataType("uint16")); + EXPECT_EQ(OPT_UINT32_TYPE, OptionDataTypeUtil::getDataType("uint32")); + EXPECT_EQ(OPT_IPV4_ADDRESS_TYPE, OptionDataTypeUtil::getDataType("ipv4-address")); + EXPECT_EQ(OPT_IPV6_ADDRESS_TYPE, OptionDataTypeUtil::getDataType("ipv6-address")); + EXPECT_EQ(OPT_IPV6_PREFIX_TYPE, OptionDataTypeUtil::getDataType("ipv6-prefix")); + EXPECT_EQ(OPT_PSID_TYPE, OptionDataTypeUtil::getDataType("psid")); + EXPECT_EQ(OPT_STRING_TYPE, OptionDataTypeUtil::getDataType("string")); + EXPECT_EQ(OPT_TUPLE_TYPE, OptionDataTypeUtil::getDataType("tuple")); + EXPECT_EQ(OPT_FQDN_TYPE, OptionDataTypeUtil::getDataType("fqdn")); + // EXPECT_EQ(OPT_INTERNAL_TYPE, OptionDataTypeUtil::getDataType("internal")); + EXPECT_EQ(OPT_RECORD_TYPE, OptionDataTypeUtil::getDataType("record")); + EXPECT_EQ(OPT_UNKNOWN_TYPE, OptionDataTypeUtil::getDataType("bogus")); +} + +// Verify converstion of OptionDefintion type enums to type strings. +TEST(OptionDataTypeUtil, stringToType) { + EXPECT_EQ("empty", OptionDataTypeUtil::getDataTypeName(OPT_EMPTY_TYPE)); + EXPECT_EQ("binary", OptionDataTypeUtil::getDataTypeName( OPT_BINARY_TYPE)); + EXPECT_EQ("boolean", OptionDataTypeUtil::getDataTypeName(OPT_BOOLEAN_TYPE)); + EXPECT_EQ("int8", OptionDataTypeUtil::getDataTypeName(OPT_INT8_TYPE)); + EXPECT_EQ("int16", OptionDataTypeUtil::getDataTypeName(OPT_INT16_TYPE)); + EXPECT_EQ("int32", OptionDataTypeUtil::getDataTypeName(OPT_INT32_TYPE)); + EXPECT_EQ("uint8", OptionDataTypeUtil::getDataTypeName(OPT_UINT8_TYPE)); + EXPECT_EQ("uint16", OptionDataTypeUtil::getDataTypeName(OPT_UINT16_TYPE)); + EXPECT_EQ("uint32", OptionDataTypeUtil::getDataTypeName(OPT_UINT32_TYPE)); + EXPECT_EQ("ipv4-address", OptionDataTypeUtil::getDataTypeName(OPT_IPV4_ADDRESS_TYPE)); + EXPECT_EQ("ipv6-address", OptionDataTypeUtil::getDataTypeName(OPT_IPV6_ADDRESS_TYPE)); + EXPECT_EQ("ipv6-prefix", OptionDataTypeUtil::getDataTypeName(OPT_IPV6_PREFIX_TYPE)); + EXPECT_EQ("psid", OptionDataTypeUtil::getDataTypeName(OPT_PSID_TYPE)); + EXPECT_EQ("string", OptionDataTypeUtil::getDataTypeName(OPT_STRING_TYPE)); + EXPECT_EQ("tuple", OptionDataTypeUtil::getDataTypeName(OPT_TUPLE_TYPE)); + EXPECT_EQ("fqdn", OptionDataTypeUtil::getDataTypeName(OPT_FQDN_TYPE)); + // EXPECT_EQ("internal", OptionDataTypeUtil::getDataTypeName(OPT_INTERNAL_TYPE)); + EXPECT_EQ("record", OptionDataTypeUtil::getDataTypeName(OPT_RECORD_TYPE)); + EXPECT_EQ("unknown", OptionDataTypeUtil::getDataTypeName(OPT_UNKNOWN_TYPE)); +} + } // anonymous namespace diff --git a/src/lib/dhcpsrv/testutils/generic_cb_dhcp4_unittest.cc b/src/lib/dhcpsrv/testutils/generic_cb_dhcp4_unittest.cc index ca9a42366f..8409db06df 100644 --- a/src/lib/dhcpsrv/testutils/generic_cb_dhcp4_unittest.cc +++ b/src/lib/dhcpsrv/testutils/generic_cb_dhcp4_unittest.cc @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -320,7 +321,7 @@ GenericConfigBackendDHCPv4Test::initTestOptionDefs() { test_option_defs_.push_back(option_def); option_def.reset(new OptionDefinition("foobar", 234, DHCP4_OPTION_SPACE, - "uint64", true)); + "uint16", true)); test_option_defs_.push_back(option_def); } @@ -4619,3 +4620,113 @@ GenericConfigBackendDHCPv4Test::multipleAuditEntriesTest() { distance--; } } + +void +GenericConfigBackendDHCPv4Test::invalidOptionDefDataType4Test() { + OptionDefinitionPtr test_def; + ASSERT_NO_THROW_LOG(test_def.reset(new OptionDefinition("foobar", 234, DHCP4_OPTION_SPACE, + "unknown", true))); + ASSERT_TRUE(test_def); + ASSERT_THROW(cbptr_->createUpdateOptionDef4(ServerSelector::ALL(), test_def), + DbOperationError); +} + +void +GenericConfigBackendDHCPv4Test::allOptionDefDataTypes4Test() { + + OptionDefListParser parser(AF_INET); + std::string defs_str = R"([ + { + "name": "my-empty", "code": 221, "type": "empty", "array": false, + "record-types": "", "space": "dhcp4", "encapsulate": "" + }, + { + "name": "my-binary", "code": 222, "type": "binary", "array": false, + "record-types": "", "space": "dhcp4", "encapsulate": "" + }, + { + "name": "my-boolean", "code": 223, "type": "boolean", "array": false, + "record-types": "", "space": "dhcp4", "encapsulate": "" + }, + { + "name": "my-int8", "code": 224, "type": "int8", "array": false, + "record-types": "", "space": "dhcp4", "encapsulate": "" + }, + { + "name": "my-int16", "code": 225, "type": "int16", "array": false, + "record-types": "", "space": "dhcp4", "encapsulate": "" + }, + { + "name": "my-int32", "code": 226, "type": "int32", "array": false, + "record-types": "", "space": "dhcp4", "encapsulate": "" + }, + { + "name": "my-uint8", "code": 227, "type": "uint8", "array": false, + "record-types": "", "space": "dhcp4", "encapsulate": "" + }, + { + "name": "my-uint16", "code": 228, "type": "uint16", "array": false, + "record-types": "", "space": "dhcp4", "encapsulate": "" + }, + { + "name": "my-uint32", "code": 229, "type": "uint32", "array": false, + "record-types": "", "space": "dhcp4", "encapsulate": "" + }, + { + "name": "my-ipv4-address", "code": 230, "type": "ipv4-address", "array": false, + "record-types": "", "space": "dhcp4", "encapsulate": "" + }, + { + "name": "my-ipv6-address", "code": 231, "type": "ipv6-address", "array": false, + "record-types": "", "space": "dhcp4", "encapsulate": "" + }, + { + "name": "my-ipv6-prefix", "code": 232, "type": "ipv6-prefix", "array": false, + "record-types": "", "space": "dhcp4", "encapsulate": "" + }, + { + "name": "my-psid", "code": 233, "type": "psid", "array": false, + "record-types": "", "space": "dhcp4", "encapsulate": "" + }, + { + "name": "my-string", "code": 234, "type": "string", "array": false, + "record-types": "", "space": "dhcp4", "encapsulate": "" + }, + { + "name": "my-tuple", "code": 235, "type": "tuple", "array": false, + "record-types": "", "space": "dhcp4", "encapsulate": "" + }, + { + "name": "my-fqdn", "code": 236, "type": "fqdn", "array": false, + "record-types": "", "space": "dhcp4", "encapsulate": "" + }, + { + "name": "my-internal", "code": 237, "type": "internal", "array": false, + "record-types": "", "space": "dhcp4", "encapsulate": "" + }, + { + "name": "my-record", "code": 238, "type": "record", "array": false, + "record-types": "uint8, uint8", "space": "dhcp4", "encapsulate": "" + } + ])"; + + ConstElementPtr defs_elem; + ASSERT_NO_THROW_LOG(defs_elem = Element::fromJSON(defs_str)); + + CfgOptionDefPtr storage(new CfgOptionDef()); + ASSERT_NO_THROW_LOG(parser.parse(storage, defs_elem)); + + auto test_defs = storage->getAll("dhcp4"); + ASSERT_EQ(test_defs->size(), 18); + + // Insert each option definition into the database. + for (auto const& test_def : *test_defs) { + ASSERT_NO_THROW_LOG(cbptr_->createUpdateOptionDef4(ServerSelector::ALL(), test_def)); + auto found_def = cbptr_->getOptionDef4(ServerSelector::ALL(), + test_def->getCode(), "dhcp4"); + + ASSERT_TRUE(found_def) << "no option found for " << test_def->getName(); + ASSERT_EQ(*found_def, *test_def); + std::cout << "option ok for " << found_def->getName() << std::endl; + } +} diff --git a/src/lib/dhcpsrv/testutils/generic_cb_dhcp4_unittest.h b/src/lib/dhcpsrv/testutils/generic_cb_dhcp4_unittest.h index a2fa5dcea3..456d6a3aeb 100644 --- a/src/lib/dhcpsrv/testutils/generic_cb_dhcp4_unittest.h +++ b/src/lib/dhcpsrv/testutils/generic_cb_dhcp4_unittest.h @@ -287,6 +287,14 @@ public: /// all servers. void optionDefs4WithServerTagsTest(); + /// @brief This test verifies that the back end prevents storage + /// of definitions with invalid data types + void invalidOptionDefDataType4Test(); + + /// @brief This test verifies that it is possible to create options of each + /// valid data type. + void allOptionDefDataTypes4Test(); + /// @brief Test that all option definitions can be fetched. void getAllOptionDefs4Test(); diff --git a/src/lib/dhcpsrv/testutils/generic_cb_dhcp6_unittest.cc b/src/lib/dhcpsrv/testutils/generic_cb_dhcp6_unittest.cc index a778dcd563..c894e87cdf 100644 --- a/src/lib/dhcpsrv/testutils/generic_cb_dhcp6_unittest.cc +++ b/src/lib/dhcpsrv/testutils/generic_cb_dhcp6_unittest.cc @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -355,7 +356,7 @@ GenericConfigBackendDHCPv6Test::initTestOptionDefs() { test_option_defs_.push_back(option_def); option_def.reset(new OptionDefinition("bar", 1234, DHCP6_OPTION_SPACE, - "uint64", true)); + "uint16", true)); test_option_defs_.push_back(option_def); } @@ -4770,3 +4771,113 @@ GenericConfigBackendDHCPv6Test::multipleAuditEntriesTest() { distance--; } } + +void +GenericConfigBackendDHCPv6Test::invalidOptionDefDataType6Test() { + OptionDefinitionPtr test_def; + ASSERT_NO_THROW_LOG(test_def.reset(new OptionDefinition("foobar", 234, DHCP6_OPTION_SPACE, + "unknown", true))); + ASSERT_TRUE(test_def); + ASSERT_THROW(cbptr_->createUpdateOptionDef6(ServerSelector::ALL(), test_def), + DbOperationError); +} + +void +GenericConfigBackendDHCPv6Test::allOptionDefDataTypes6Test() { + + OptionDefListParser parser(AF_INET); + std::string defs_str = R"([ + { + "name": "my-empty", "code": 221, "type": "empty", "array": false, + "record-types": "", "space": "dhcp6", "encapsulate": "" + }, + { + "name": "my-binary", "code": 222, "type": "binary", "array": false, + "record-types": "", "space": "dhcp6", "encapsulate": "" + }, + { + "name": "my-boolean", "code": 223, "type": "boolean", "array": false, + "record-types": "", "space": "dhcp6", "encapsulate": "" + }, + { + "name": "my-int8", "code": 224, "type": "int8", "array": false, + "record-types": "", "space": "dhcp6", "encapsulate": "" + }, + { + "name": "my-int16", "code": 225, "type": "int16", "array": false, + "record-types": "", "space": "dhcp6", "encapsulate": "" + }, + { + "name": "my-int32", "code": 226, "type": "int32", "array": false, + "record-types": "", "space": "dhcp6", "encapsulate": "" + }, + { + "name": "my-uint8", "code": 227, "type": "uint8", "array": false, + "record-types": "", "space": "dhcp6", "encapsulate": "" + }, + { + "name": "my-uint16", "code": 228, "type": "uint16", "array": false, + "record-types": "", "space": "dhcp6", "encapsulate": "" + }, + { + "name": "my-uint32", "code": 229, "type": "uint32", "array": false, + "record-types": "", "space": "dhcp6", "encapsulate": "" + }, + { + "name": "my-ipv4-address", "code": 230, "type": "ipv4-address", "array": false, + "record-types": "", "space": "dhcp6", "encapsulate": "" + }, + { + "name": "my-ipv6-address", "code": 231, "type": "ipv6-address", "array": false, + "record-types": "", "space": "dhcp6", "encapsulate": "" + }, + { + "name": "my-ipv6-prefix", "code": 232, "type": "ipv6-prefix", "array": false, + "record-types": "", "space": "dhcp6", "encapsulate": "" + }, + { + "name": "my-psid", "code": 233, "type": "psid", "array": false, + "record-types": "", "space": "dhcp6", "encapsulate": "" + }, + { + "name": "my-string", "code": 234, "type": "string", "array": false, + "record-types": "", "space": "dhcp6", "encapsulate": "" + }, + { + "name": "my-tuple", "code": 235, "type": "tuple", "array": false, + "record-types": "", "space": "dhcp6", "encapsulate": "" + }, + { + "name": "my-fqdn", "code": 236, "type": "fqdn", "array": false, + "record-types": "", "space": "dhcp6", "encapsulate": "" + }, + { + "name": "my-internal", "code": 237, "type": "internal", "array": false, + "record-types": "", "space": "dhcp6", "encapsulate": "" + }, + { + "name": "my-record", "code": 238, "type": "record", "array": false, + "record-types": "uint8, uint8", "space": "dhcp6", "encapsulate": "" + } + ])"; + + ConstElementPtr defs_elem; + ASSERT_NO_THROW_LOG(defs_elem = Element::fromJSON(defs_str)); + + CfgOptionDefPtr storage(new CfgOptionDef()); + ASSERT_NO_THROW_LOG(parser.parse(storage, defs_elem)); + + auto test_defs = storage->getAll("dhcp6"); + ASSERT_EQ(test_defs->size(), 18); + + // Insert each option definition into the database. + for (auto const& test_def : *test_defs) { + ASSERT_NO_THROW_LOG(cbptr_->createUpdateOptionDef6(ServerSelector::ALL(), test_def)); + auto found_def = cbptr_->getOptionDef6(ServerSelector::ALL(), + test_def->getCode(), "dhcp6"); + + ASSERT_TRUE(found_def) << "no option found for " << test_def->getName(); + ASSERT_EQ(*found_def, *test_def); + std::cout << "option ok for " << found_def->getName() << std::endl; + } +} diff --git a/src/lib/dhcpsrv/testutils/generic_cb_dhcp6_unittest.h b/src/lib/dhcpsrv/testutils/generic_cb_dhcp6_unittest.h index 61e85647c1..6e74b1f8f8 100644 --- a/src/lib/dhcpsrv/testutils/generic_cb_dhcp6_unittest.h +++ b/src/lib/dhcpsrv/testutils/generic_cb_dhcp6_unittest.h @@ -1,4 +1,4 @@ -// Copyright (C) 2022 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2022-2024 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -287,6 +287,14 @@ public: /// all servers. void optionDefs6WithServerTagsTest(); + /// @brief This test verifies that the back end prevents storage + /// of definitions with invalid data types + void invalidOptionDefDataType6Test(); + + /// @brief This test verifies that it is possible to create options of each + /// valid data type. + void allOptionDefDataTypes6Test(); + /// @brief Test that all option definitions can be fetched. void getAllOptionDefs6Test();