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