Index: chromeos/network/onc/onc_validator_unittest.cc |
diff --git a/chromeos/network/onc/onc_validator_unittest.cc b/chromeos/network/onc/onc_validator_unittest.cc |
index 5d543fe761050be74159961b4d5399645759f964..06f35dc0e0cd8bf4cd4ac52e0844b2bb3967c55e 100644 |
--- a/chromeos/network/onc/onc_validator_unittest.cc |
+++ b/chromeos/network/onc/onc_validator_unittest.cc |
@@ -7,6 +7,7 @@ |
#include <string> |
#include <utility> |
+#include "base/logging.h" |
#include "base/memory/scoped_ptr.h" |
#include "base/values.h" |
#include "chromeos/network/onc/onc_constants.h" |
@@ -17,167 +18,287 @@ |
namespace chromeos { |
namespace onc { |
+ |
+class ONCValidatorTest : public ::testing::Test { |
+ public: |
+ // Validate |onc_object| with the given |signature|. The object is considered |
+ // to be managed if |managed_onc| is true. A strict validator is used if |
+ // |strict| is true. |onc_object| and the resulting repaired object of the |
+ // validation is stored, so that expectations can be checked afterwards using |
+ // one of the Expect* functions below. |
+ void Validate(bool strict, |
+ scoped_ptr<base::DictionaryValue> onc_object, |
+ const OncValueSignature* signature, |
+ bool managed_onc) { |
+ scoped_ptr<Validator> validator; |
+ if (strict) { |
+ // Create a strict validator that complains about every error. |
+ validator.reset(new Validator(true, true, true, managed_onc)); |
+ } else { |
+ // Create a liberal validator that ignores or repairs non-critical errors. |
+ validator.reset(new Validator(false, false, false, managed_onc)); |
+ } |
+ original_object_ = onc_object.Pass(); |
+ repaired_object_ = validator->ValidateAndRepairObject(signature, |
+ *original_object_, |
+ &validation_result_); |
+ } |
+ |
+ void ExpectValid() { |
+ EXPECT_EQ(Validator::VALID, validation_result_); |
+ EXPECT_TRUE(test_utils::Equals(original_object_.get(), |
+ repaired_object_.get())); |
+ } |
+ |
+ void ExpectRepairWithWarnings( |
+ const base::DictionaryValue& expected_repaired) { |
+ EXPECT_EQ(Validator::VALID_WITH_WARNINGS, validation_result_); |
+ EXPECT_TRUE(test_utils::Equals(&expected_repaired, repaired_object_.get())); |
+ } |
+ |
+ void ExpectInvalid() { |
+ EXPECT_EQ(Validator::INVALID, validation_result_); |
+ EXPECT_EQ(NULL, repaired_object_.get()); |
+ } |
+ |
+ private: |
+ Validator::Result validation_result_; |
+ scoped_ptr<const base::DictionaryValue> original_object_; |
+ scoped_ptr<const base::DictionaryValue> repaired_object_; |
+}; |
+ |
namespace { |
-// Create a strict validator that complains about every error. |
-scoped_ptr<Validator> CreateStrictValidator(bool managed_onc) { |
- return make_scoped_ptr(new Validator(true, true, true, managed_onc)); |
-} |
+struct OncParams { |
+ // |location_of_object| is a string to identify the object to be tested. It |
+ // may be used as a filename or as a dictionary key. |
+ OncParams(std::string location_of_object, |
+ const OncValueSignature* onc_signature, |
+ bool is_managed_onc) |
+ : location(location_of_object), |
+ signature(onc_signature), |
+ is_managed(is_managed_onc) { |
+ } |
-// Create a liberal validator that ignores or repairs non-critical errors. |
-scoped_ptr<Validator> CreateLiberalValidator(bool managed_onc) { |
- return make_scoped_ptr(new Validator(false, false, false, managed_onc)); |
+ std::string location; |
+ const OncValueSignature* signature; |
+ bool is_managed; |
+}; |
+ |
+::std::ostream& operator<<(::std::ostream& os, const OncParams& onc) { |
+ return os << "(" << onc.location << ", " << onc.signature << ", " |
+ << (onc.is_managed ? "managed" : "unmanaged") << ")"; |
} |
+ |
} // namespace |
-TEST(ONCValidatorValidTest, EmptyUnencryptedConfiguration) { |
- scoped_ptr<Validator> validator(CreateStrictValidator(true)); |
- scoped_ptr<const base::DictionaryValue> original( |
- ReadDictionaryFromJson(kEmptyUnencryptedConfiguration)); |
- |
- Validator::Result result; |
- scoped_ptr<const base::DictionaryValue> repaired( |
- validator->ValidateAndRepairObject(&kToplevelConfigurationSignature, |
- *original, &result)); |
- EXPECT_EQ(Validator::VALID, result); |
- EXPECT_TRUE(test_utils::Equals(original.get(), repaired.get())); |
+// Ensure that the constant |kEmptyUnencryptedConfiguration| describes a valid |
+// ONC toplevel object. |
+TEST_F(ONCValidatorTest, EmptyUnencryptedConfiguration) { |
+ Validate(true, ReadDictionaryFromJson(kEmptyUnencryptedConfiguration), |
+ &kToplevelConfigurationSignature, false); |
+ ExpectValid(); |
} |
-// This test case is about validating valid ONC objects. |
-class ONCValidatorValidTest |
- : public ::testing::TestWithParam< |
- std::pair<std::string, const OncValueSignature*> > { |
- protected: |
- std::string GetFilename() const { |
- return GetParam().first; |
- } |
- |
- const OncValueSignature* GetSignature() const { |
- return GetParam().second; |
- } |
+// This test case is about validating valid ONC objects without any errors. Both |
+// the strict and the liberal validator accept the object. |
+class ONCValidatorValidTest : public ONCValidatorTest, |
+ public ::testing::WithParamInterface<OncParams> { |
}; |
-TEST_P(ONCValidatorValidTest, ValidPolicyOnc) { |
- scoped_ptr<Validator> validator(CreateStrictValidator(true)); |
- scoped_ptr<const base::DictionaryValue> original( |
- test_utils::ReadTestDictionary(GetFilename())); |
+TEST_P(ONCValidatorValidTest, StrictValidationValid) { |
+ OncParams onc = GetParam(); |
+ Validate(true, test_utils::ReadTestDictionary(onc.location), onc.signature, |
+ onc.is_managed); |
+ ExpectValid(); |
+} |
- Validator::Result result; |
- scoped_ptr<const base::DictionaryValue> repaired( |
- validator->ValidateAndRepairObject(GetSignature(), *original, &result)); |
- EXPECT_EQ(Validator::VALID, result); |
- EXPECT_TRUE(test_utils::Equals(original.get(), repaired.get())); |
+TEST_P(ONCValidatorValidTest, LiberalValidationValid) { |
+ OncParams onc = GetParam(); |
+ Validate(false, test_utils::ReadTestDictionary(onc.location), onc.signature, |
+ onc.is_managed); |
+ ExpectValid(); |
} |
+// The parameters are: |
+// OncParams(string: Filename of a ONC file that is to be validated, |
+// OncValueSignature: signature of that ONC, |
+// bool: true if the ONC is managed). |
INSTANTIATE_TEST_CASE_P( |
ONCValidatorValidTest, |
ONCValidatorValidTest, |
- ::testing::Values(std::make_pair("managed_toplevel.onc", |
- &kToplevelConfigurationSignature), |
- std::make_pair("encrypted.onc", |
- &kToplevelConfigurationSignature), |
- std::make_pair("managed_vpn.onc", |
- &kNetworkConfigurationSignature), |
- std::make_pair("managed_ethernet.onc", |
- &kNetworkConfigurationSignature), |
- // Ignore recommended arrays in unmanaged ONC: |
- std::make_pair("recommended_in_unmanaged.onc", |
- &kNetworkConfigurationSignature))); |
- |
-// Validate invalid ONC objects and check the resulting repaired object. This |
-// test fixture loads a test json file into |invalid_| containing several test |
-// objects which can be accessed by their path. The test boolean parameter |
-// determines wether to use the strict or the liberal validator. |
-class ONCValidatorInvalidTest : public ::testing::TestWithParam<bool> { |
- public: |
- // Validate the entry at |path_to_object| with the given |
- // |signature|. Depending on |managed_onc| the object is interpreted as a |
- // managed onc (with recommended fields) or not. The resulting repaired object |
- // must match the entry at |path_to_repaired| if the liberal validator is |
- // used. |
- void ValidateInvalid(const std::string& path_to_object, |
- const std::string& path_to_repaired, |
- const OncValueSignature* signature, |
- bool managed_onc) { |
- scoped_ptr<Validator> validator; |
- if (GetParam()) |
- validator = CreateStrictValidator(managed_onc); |
- else |
- validator = CreateLiberalValidator(managed_onc); |
- |
- const base::DictionaryValue* object = NULL; |
- ASSERT_TRUE(invalid_->GetDictionary(path_to_object, &object)); |
- |
- Validator::Result result; |
- scoped_ptr<base::DictionaryValue> actual_repaired = |
- validator->ValidateAndRepairObject(signature, *object, &result); |
- if (GetParam() || path_to_repaired == "") { |
- EXPECT_EQ(Validator::INVALID, result); |
- EXPECT_EQ(NULL, actual_repaired.get()); |
- } else { |
- EXPECT_EQ(Validator::VALID_WITH_WARNINGS, result); |
- const base::DictionaryValue* expected_repaired = NULL; |
- invalid_->GetDictionary(path_to_repaired, &expected_repaired); |
- EXPECT_TRUE(test_utils::Equals(expected_repaired, actual_repaired.get())); |
- } |
- } |
+ ::testing::Values(OncParams("managed_toplevel.onc", |
+ &kToplevelConfigurationSignature, |
+ true), |
+ OncParams("encrypted.onc", |
+ &kToplevelConfigurationSignature, |
+ true), |
+ OncParams("managed_vpn.onc", |
+ &kNetworkConfigurationSignature, |
+ true), |
+ OncParams("managed_ethernet.onc", |
+ &kNetworkConfigurationSignature, |
+ true))); |
+ |
+namespace { |
- virtual void SetUp() { |
- invalid_ = |
- test_utils::ReadTestDictionary("invalid_settings_with_repairs.json"); |
+struct RepairParams { |
+ // Both arguments are strings to identify the object that is expected as the |
+ // validation result. They may either be used as filenames or as dictionary |
+ // keys. |
+ RepairParams(std::string strict_repaired, |
+ std::string liberal_repaired) |
+ : location_of_strict_repaired(strict_repaired), |
+ location_of_liberal_repaired(liberal_repaired) { |
} |
- scoped_ptr<const base::DictionaryValue> invalid_; |
+ std::string location_of_strict_repaired; |
+ std::string location_of_liberal_repaired; |
}; |
-TEST_P(ONCValidatorInvalidTest, UnknownFieldName) { |
- ValidateInvalid("network-unknown-fieldname", |
- "network-repaired", |
- &kNetworkConfigurationSignature, false); |
- ValidateInvalid("managed-network-unknown-fieldname", |
- "managed-network-repaired", |
- &kNetworkConfigurationSignature, true); |
+::std::ostream& operator<<(::std::ostream& os, const RepairParams& rp) { |
+ return os << "(" << rp.location_of_strict_repaired << ", " |
+ << rp.location_of_liberal_repaired << ")"; |
} |
-TEST_P(ONCValidatorInvalidTest, UnknownType) { |
- ValidateInvalid("network-unknown-type", |
- "", |
- &kNetworkConfigurationSignature, false); |
- ValidateInvalid("managed-network-unknown-type", |
- "", |
- &kNetworkConfigurationSignature, true); |
-} |
+} // namespace |
-TEST_P(ONCValidatorInvalidTest, UnknownRecommendedFieldName) { |
- ValidateInvalid("managed-network-unknown-recommended", |
- "managed-network-repaired", |
- &kNetworkConfigurationSignature, true); |
-} |
+// This test case is about validating ONC objects that contain errors which can |
+// be repaired (then the errors count as warnings). If a location of the |
+// expected repaired object is given, then it is checked that the validator |
+// (either strict or liberal) returns this repaired object and the result is |
+// VALID_WITH_WARNINGS. If the location is the empty string, then it is expected |
+// that the validator returns NULL and the result INVALID. |
+class ONCValidatorTestRepairable |
+ : public ONCValidatorTest, |
+ public ::testing::WithParamInterface<std::pair<OncParams, |
+ RepairParams> > { |
+ public: |
+ // Load the common test data and return the dictionary at the field with |
+ // name |name|. |
+ scoped_ptr<base::DictionaryValue> GetDictionaryFromTestFile( |
+ const std::string &name) { |
+ scoped_ptr<const base::DictionaryValue> dict( |
+ test_utils::ReadTestDictionary("invalid_settings_with_repairs.json")); |
+ const base::DictionaryValue* onc_object = NULL; |
+ CHECK(dict->GetDictionary(name, &onc_object)); |
+ return make_scoped_ptr(onc_object->DeepCopy()); |
+ } |
+}; |
-TEST_P(ONCValidatorInvalidTest, DictionaryRecommended) { |
- ValidateInvalid("managed-network-dict-recommended", |
- "managed-network-repaired", |
- &kNetworkConfigurationSignature, true); |
+TEST_P(ONCValidatorTestRepairable, StrictValidation) { |
+ OncParams onc = GetParam().first; |
+ Validate(true, GetDictionaryFromTestFile(onc.location), onc.signature, |
+ onc.is_managed); |
+ std::string location_of_repaired = |
+ GetParam().second.location_of_strict_repaired; |
+ if (location_of_repaired.empty()) |
+ ExpectInvalid(); |
+ else |
+ ExpectRepairWithWarnings(*GetDictionaryFromTestFile(location_of_repaired)); |
} |
-TEST_P(ONCValidatorInvalidTest, MissingRequiredField) { |
- ValidateInvalid("network-missing-required", |
- "network-missing-required", |
- &kNetworkConfigurationSignature, false); |
- ValidateInvalid("managed-network-missing-required", |
- "managed-network-missing-required", |
- &kNetworkConfigurationSignature, true); |
+TEST_P(ONCValidatorTestRepairable, LiberalValidation) { |
+ OncParams onc = GetParam().first; |
+ Validate(false, GetDictionaryFromTestFile(onc.location), onc.signature, |
+ onc.is_managed); |
+ std::string location_of_repaired = |
+ GetParam().second.location_of_liberal_repaired; |
+ if (location_of_repaired.empty()) |
+ ExpectInvalid(); |
+ else |
+ ExpectRepairWithWarnings(*GetDictionaryFromTestFile(location_of_repaired)); |
} |
-TEST_P(ONCValidatorInvalidTest, RecommendedInUnmanaged) { |
- ValidateInvalid("network-illegal-recommended", |
- "network-repaired", |
- &kNetworkConfigurationSignature, false); |
-} |
+// The parameters for all test case instantations below are: |
+// OncParams(string: A fieldname in the dictionary from the file |
+// "invalid_settings_with_repairs.json". That nested |
+// dictionary will be tested. |
+// OncValueSignature: signature of that ONC, |
+// bool: true if the ONC is managed). |
+// RepairParams(string: A fieldname in the dictionary from the file |
+// "invalid_settings_with_repairs.json". That nested |
+// dictionary is the expected result from strict |
+// validation, |
+// string: A fieldname in the dictionary from the file |
+// "invalid_settings_with_repairs.json". That nested |
+// dictionary is the expected result from liberal |
+// validation). |
-INSTANTIATE_TEST_CASE_P(ONCValidatorInvalidTest, |
- ONCValidatorInvalidTest, |
- ::testing::Bool()); |
+// Strict validator returns INVALID. Liberal validator repairs. |
+INSTANTIATE_TEST_CASE_P( |
+ StrictInvalidLiberalRepair, |
+ ONCValidatorTestRepairable, |
+ ::testing::Values( |
+ std::make_pair(OncParams("network-unknown-fieldname", |
+ &kNetworkConfigurationSignature, |
+ false), |
+ RepairParams("", "network-repaired")), |
+ std::make_pair(OncParams("managed-network-unknown-fieldname", |
+ &kNetworkConfigurationSignature, |
+ true), |
+ RepairParams("", "managed-network-repaired")), |
+ std::make_pair(OncParams("managed-network-unknown-recommended", |
+ &kNetworkConfigurationSignature, |
+ true), |
+ RepairParams("", "managed-network-repaired")), |
+ std::make_pair(OncParams("managed-network-dict-recommended", |
+ &kNetworkConfigurationSignature, |
+ true), |
+ RepairParams("", "managed-network-repaired")), |
+ std::make_pair(OncParams("network-missing-required", |
+ &kNetworkConfigurationSignature, |
+ false), |
+ RepairParams("", "network-missing-required")), |
+ std::make_pair(OncParams("managed-network-missing-required", |
+ &kNetworkConfigurationSignature, |
+ true), |
+ RepairParams("", "managed-network-missing-required")))); |
+ |
+// Strict and liberal validator repair identically. |
+INSTANTIATE_TEST_CASE_P( |
+ StrictAndLiberalRepairIdentically, |
+ ONCValidatorTestRepairable, |
+ ::testing::Values( |
+ std::make_pair(OncParams("toplevel-invalid-network", |
+ &kToplevelConfigurationSignature, |
+ false), |
+ RepairParams("toplevel-repaired", |
+ "toplevel-repaired")), |
+ std::make_pair(OncParams("toplevel-invalid-network", |
+ &kToplevelConfigurationSignature, |
+ true), |
+ RepairParams("toplevel-repaired", |
+ "toplevel-repaired")), |
+ // Ignore recommended arrays in unmanaged ONC. |
+ std::make_pair(OncParams("network-with-illegal-recommended", |
+ &kNetworkConfigurationSignature, |
+ false), |
+ RepairParams("network-repaired", "network-repaired")))); |
+ |
+// Strict and liberal validator return both INVALID. |
+INSTANTIATE_TEST_CASE_P( |
+ StrictAndLiberalInvalid, |
+ ONCValidatorTestRepairable, |
+ ::testing::Values( |
+ std::make_pair(OncParams("network-unknown-value", |
+ &kNetworkConfigurationSignature, false), |
+ RepairParams("", "")), |
+ std::make_pair(OncParams("managed-network-unknown-value", |
+ &kNetworkConfigurationSignature, true), |
+ RepairParams("", "")), |
+ std::make_pair(OncParams("network-value-out-of-range", |
+ &kNetworkConfigurationSignature, false), |
+ RepairParams("", "")), |
+ std::make_pair(OncParams("managed-network-value-out-of-range", |
+ &kNetworkConfigurationSignature, true), |
+ RepairParams("", "")), |
+ std::make_pair(OncParams("network-wrong-type", |
+ &kNetworkConfigurationSignature, false), |
+ RepairParams("", "")), |
+ std::make_pair(OncParams("managed-network-wrong-type", |
+ &kNetworkConfigurationSignature, true), |
+ RepairParams("", "")))); |
} // namespace onc |
} // namespace chromeos |