12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/onc/onc_validator.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <utility> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/onc/onc_constants.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/onc/onc_signature.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/onc/onc_test_utils.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/onc/onc_utils.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos { 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace onc { 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ONCValidatorTest : public ::testing::Test { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Validate |onc_object| with the given |signature|. The object is considered 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to be managed if |managed_onc| is true. A strict validator is used if 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |strict| is true. |onc_object| and the resulting repaired object of the 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // validation is stored, so that expectations can be checked afterwards using 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // one of the Expect* functions below. 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Validate(bool strict, 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> onc_object, 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const OncValueSignature* signature, 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool managed_onc, 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ONCSource onc_source) { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<Validator> validator; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (strict) { 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create a strict validator that complains about every error. 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) validator.reset(new Validator(true, true, true, managed_onc)); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create a liberal validator that ignores or repairs non-critical errors. 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) validator.reset(new Validator(false, false, false, managed_onc)); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) validator->SetOncSource(onc_source); 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) original_object_ = onc_object.Pass(); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) repaired_object_ = validator->ValidateAndRepairObject(signature, 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *original_object_, 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &validation_result_); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ExpectValid() { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(Validator::VALID, validation_result_); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(test_utils::Equals(original_object_.get(), 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) repaired_object_.get())); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ExpectRepairWithWarnings( 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue& expected_repaired) { 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(Validator::VALID_WITH_WARNINGS, validation_result_); 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(test_utils::Equals(&expected_repaired, repaired_object_.get())); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ExpectInvalid() { 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(Validator::INVALID, validation_result_); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(NULL, repaired_object_.get()); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Validator::Result validation_result_; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<const base::DictionaryValue> original_object_; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<const base::DictionaryValue> repaired_object_; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct OncParams { 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |location_of_object| is a string to identify the object to be tested. It 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // may be used as a filename or as a dictionary key. 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OncParams(const std::string& location_of_object, 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const OncValueSignature* onc_signature, 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_managed_onc, 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ONCSource onc_source = ONC_SOURCE_NONE) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : location(location_of_object), 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) signature(onc_signature), 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_managed(is_managed_onc), 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) onc_source(onc_source) { 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string location; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const OncValueSignature* signature; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_managed; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ONCSource onc_source; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)::std::ostream& operator<<(::std::ostream& os, const OncParams& onc) { 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return os << "(" << onc.location << ", " << onc.signature << ", " 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << (onc.is_managed ? "managed" : "unmanaged") << ", " 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << GetSourceAsString(onc.onc_source) << ")"; 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Ensure that the constant |kEmptyUnencryptedConfiguration| describes a valid 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ONC toplevel object. 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ONCValidatorTest, EmptyUnencryptedConfiguration) { 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Validate(true, ReadDictionaryFromJson(kEmptyUnencryptedConfiguration), 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kToplevelConfigurationSignature, false, ONC_SOURCE_NONE); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExpectValid(); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This test case is about validating valid ONC objects without any errors. Both 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the strict and the liberal validator accept the object. 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ONCValidatorValidTest : public ONCValidatorTest, 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public ::testing::WithParamInterface<OncParams> { 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(ONCValidatorValidTest, StrictValidationValid) { 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OncParams onc = GetParam(); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Validate(true, test_utils::ReadTestDictionary(onc.location), onc.signature, 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) onc.is_managed, onc.onc_source); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExpectValid(); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(ONCValidatorValidTest, LiberalValidationValid) { 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OncParams onc = GetParam(); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Validate(false, test_utils::ReadTestDictionary(onc.location), onc.signature, 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) onc.is_managed, onc.onc_source); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExpectValid(); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The parameters are: 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// OncParams(string: Filename of a ONC file that is to be validated, 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// OncValueSignature: signature of that ONC, 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// bool: true if the ONC is managed). 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)INSTANTIATE_TEST_CASE_P( 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ONCValidatorValidTest, 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ONCValidatorValidTest, 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ::testing::Values(OncParams("managed_toplevel1.onc", 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kToplevelConfigurationSignature, 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true), 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OncParams("managed_toplevel2.onc", 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kToplevelConfigurationSignature, 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true), 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check that at least one configuration is accepted for 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // device policies. 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OncParams("managed_toplevel_wifi_peap.onc", 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kToplevelConfigurationSignature, 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ONC_SOURCE_DEVICE_POLICY), 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OncParams("toplevel_wifi_wpa_psk.onc", 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kToplevelConfigurationSignature, 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false), 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OncParams("encrypted.onc", 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kToplevelConfigurationSignature, 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true), 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OncParams("managed_vpn.onc", 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kNetworkConfigurationSignature, 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true), 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OncParams("managed_ethernet.onc", 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kNetworkConfigurationSignature, 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true), 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OncParams("translation_of_shill_wifi_with_state.onc", 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kNetworkWithStateSignature, 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false))); 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct RepairParams { 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Both arguments are strings to identify the object that is expected as the 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // validation result. They may either be used as filenames or as dictionary 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // keys. 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RepairParams(std::string strict_repaired, 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string liberal_repaired) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : location_of_strict_repaired(strict_repaired), 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) location_of_liberal_repaired(liberal_repaired) { 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string location_of_strict_repaired; 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string location_of_liberal_repaired; 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)::std::ostream& operator<<(::std::ostream& os, const RepairParams& rp) { 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return os << "(" << rp.location_of_strict_repaired << ", " 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << rp.location_of_liberal_repaired << ")"; 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This test case is about validating ONC objects that contain errors which can 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// be repaired (then the errors count as warnings). If a location of the 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// expected repaired object is given, then it is checked that the validator 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// (either strict or liberal) returns this repaired object and the result is 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// VALID_WITH_WARNINGS. If the location is the empty string, then it is expected 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// that the validator returns NULL and the result INVALID. 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ONCValidatorTestRepairable 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public ONCValidatorTest, 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public ::testing::WithParamInterface<std::pair<OncParams, 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RepairParams> > { 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Load the common test data and return the dictionary at the field with 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // name |name|. 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> GetDictionaryFromTestFile( 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string &name) { 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<const base::DictionaryValue> dict( 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_utils::ReadTestDictionary("invalid_settings_with_repairs.json")); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* onc_object = NULL; 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(dict->GetDictionary(name, &onc_object)); 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return make_scoped_ptr(onc_object->DeepCopy()); 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(ONCValidatorTestRepairable, StrictValidation) { 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OncParams onc = GetParam().first; 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Validate(true, GetDictionaryFromTestFile(onc.location), onc.signature, 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) onc.is_managed, onc.onc_source); 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string location_of_repaired = 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetParam().second.location_of_strict_repaired; 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (location_of_repaired.empty()) 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExpectInvalid(); 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExpectRepairWithWarnings(*GetDictionaryFromTestFile(location_of_repaired)); 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(ONCValidatorTestRepairable, LiberalValidation) { 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OncParams onc = GetParam().first; 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Validate(false, GetDictionaryFromTestFile(onc.location), onc.signature, 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) onc.is_managed, onc.onc_source); 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string location_of_repaired = 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetParam().second.location_of_liberal_repaired; 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (location_of_repaired.empty()) 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExpectInvalid(); 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExpectRepairWithWarnings(*GetDictionaryFromTestFile(location_of_repaired)); 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The parameters for all test case instantations below are: 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// OncParams(string: A fieldname in the dictionary from the file 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// "invalid_settings_with_repairs.json". That nested 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// dictionary will be tested. 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// OncValueSignature: signature of that ONC, 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// bool: true if the ONC is managed). 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RepairParams(string: A fieldname in the dictionary from the file 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// "invalid_settings_with_repairs.json". That nested 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// dictionary is the expected result from strict 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// validation, 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// string: A fieldname in the dictionary from the file 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// "invalid_settings_with_repairs.json". That nested 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// dictionary is the expected result from liberal 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// validation). 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Strict validator returns INVALID. Liberal validator repairs. 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)INSTANTIATE_TEST_CASE_P( 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StrictInvalidLiberalRepair, 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ONCValidatorTestRepairable, 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ::testing::Values( 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(OncParams("network-unknown-fieldname", 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kNetworkConfigurationSignature, 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false), 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RepairParams("", "network-repaired")), 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(OncParams("managed-network-unknown-fieldname", 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kNetworkConfigurationSignature, 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true), 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RepairParams("", "managed-network-repaired")), 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(OncParams("managed-network-unknown-recommended", 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kNetworkConfigurationSignature, 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true), 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RepairParams("", "managed-network-repaired")), 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(OncParams("managed-network-dict-recommended", 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kNetworkConfigurationSignature, 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true), 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RepairParams("", "managed-network-repaired")), 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(OncParams("network-missing-required", 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kNetworkConfigurationSignature, 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false), 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RepairParams("", "network-missing-required")), 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(OncParams("managed-network-missing-required", 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kNetworkConfigurationSignature, 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true), 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RepairParams("", "managed-network-missing-required")), 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure that state values from Shill aren't accepted as 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // configuration. 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(OncParams("network-state-field", 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kNetworkConfigurationSignature, 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false), 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RepairParams("", "network-repaired")), 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(OncParams("network-nested-state-field", 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kNetworkConfigurationSignature, 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false), 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RepairParams("", 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "network-nested-state-field-repaired")), 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::make_pair(OncParams("toplevel-with-repairable-networks", 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &kToplevelConfigurationSignature, 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ONC_SOURCE_DEVICE_POLICY), 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RepairParams("", "toplevel-with-repaired-networks")))); 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Strict and liberal validator repair identically. 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)INSTANTIATE_TEST_CASE_P( 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StrictAndLiberalRepairIdentically, 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ONCValidatorTestRepairable, 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ::testing::Values( 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(OncParams("toplevel-invalid-network", 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kToplevelConfigurationSignature, 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false), 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RepairParams("toplevel-repaired", 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "toplevel-repaired")), 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(OncParams("toplevel-invalid-network", 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kToplevelConfigurationSignature, 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true), 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RepairParams("toplevel-repaired", 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "toplevel-repaired")), 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ignore recommended arrays in unmanaged ONC. 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(OncParams("network-with-illegal-recommended", 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kNetworkConfigurationSignature, 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false), 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RepairParams("network-repaired", "network-repaired")), 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(OncParams("toplevel-with-vpn", 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kToplevelConfigurationSignature, 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ONC_SOURCE_DEVICE_POLICY), 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RepairParams("toplevel-empty", "toplevel-empty")), 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(OncParams("toplevel-with-server-and-ca-cert", 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kToplevelConfigurationSignature, 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ONC_SOURCE_DEVICE_POLICY), 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RepairParams("toplevel-server-and-ca-cert-dropped", 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "toplevel-server-and-ca-cert-dropped")))); 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Strict and liberal validator both repair, but with different results. 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)INSTANTIATE_TEST_CASE_P( 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StrictAndLiberalRepairDifferently, 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ONCValidatorTestRepairable, 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ::testing::Values( 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(OncParams("toplevel-with-nested-warning", 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kToplevelConfigurationSignature, 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false), 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RepairParams("toplevel-empty", "toplevel-repaired")))); 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Strict and liberal validator return both INVALID. 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)INSTANTIATE_TEST_CASE_P( 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StrictAndLiberalInvalid, 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ONCValidatorTestRepairable, 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ::testing::Values( 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(OncParams("network-unknown-value", 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kNetworkConfigurationSignature, false), 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RepairParams("", "")), 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(OncParams("managed-network-unknown-value", 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kNetworkConfigurationSignature, true), 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RepairParams("", "")), 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(OncParams("network-value-out-of-range", 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kNetworkConfigurationSignature, false), 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RepairParams("", "")), 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(OncParams("managed-network-value-out-of-range", 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kNetworkConfigurationSignature, true), 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RepairParams("", "")), 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(OncParams("network-wrong-type", 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kNetworkConfigurationSignature, false), 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RepairParams("", "")), 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(OncParams("managed-network-wrong-type", 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kNetworkConfigurationSignature, true), 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RepairParams("", "")), 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(OncParams("network-with-client-cert-pattern", 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &kNetworkConfigurationSignature, true, 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ONC_SOURCE_DEVICE_POLICY), 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RepairParams("", "")))); 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace onc 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace chromeos 367