network_configuration_updater_unittest.cc revision 8bcbed890bc3ce4d7a057a8f32cab53fa534672e
1424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// found in the LICENSE file.
4424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
5424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
6424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/callback.h"
7424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/files/file_path.h"
8424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
9424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/run_loop.h"
10424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/values.h"
11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/browser/chromeos/login/user.h"
12424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/browser/chromeos/policy/policy_cert_verifier.h"
13424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/browser/chromeos/policy/user_network_configuration_updater.h"
14424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/browser/policy/external_data_fetcher.h"
15424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/browser/policy/mock_configuration_policy_provider.h"
16424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/browser/policy/policy_map.h"
17424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/browser/policy/policy_service_impl.h"
18424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chromeos/network/mock_managed_network_configuration_handler.h"
19424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chromeos/network/onc/mock_certificate_importer.h"
20424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chromeos/network/onc/onc_test_utils.h"
21424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chromeos/network/onc/onc_utils.h"
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "components/onc/onc_constants.h"
23424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h"
24424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "content/public/test/test_utils.h"
25424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "net/base/test_data_directory.h"
26424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "net/cert/x509_certificate.h"
27424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "net/test/cert_test_util.h"
28424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "policy/policy_constants.h"
29424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
32424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)using testing::AnyNumber;
33424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)using testing::AtLeast;
34424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)using testing::Mock;
35424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)using testing::Ne;
36424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)using testing::Return;
37424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)using testing::StrictMock;
38424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)using testing::_;
39424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace policy {
41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
42424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace {
43424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
44424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)const char kFakeUserEmail[] = "fake email";
45424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)const char kFakeUsernameHash[] = "fake hash";
46424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
47424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class FakeUser : public chromeos::User {
48424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) public:
49424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  FakeUser() : User(kFakeUserEmail) {
50424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    set_display_email(kFakeUserEmail);
51424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    set_username_hash(kFakeUsernameHash);
52424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
53424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual ~FakeUser() {}
54424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
55424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // User overrides
56424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual UserType GetType() const OVERRIDE {
57424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return USER_TYPE_REGULAR;
58424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
59424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
60424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) private:
61424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FakeUser);
62424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
63424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
64424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)const char kFakeONC[] =
65424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "{ \"NetworkConfigurations\": ["
66424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "    { \"GUID\": \"{485d6076-dd44-6b6d-69787465725f5040}\","
67424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "      \"Type\": \"WiFi\","
68424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "      \"Name\": \"My WiFi Network\","
69424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "      \"WiFi\": {"
70424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "        \"SSID\": \"ssid-none\","
71424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "        \"Security\": \"None\" }"
72424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "    }"
73424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "  ],"
748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    "  \"GlobalNetworkConfiguration\": {"
758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    "    \"AllowOnlyPolicyNetworksToAutoconnect\": true,"
768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    "  },"
77424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "  \"Certificates\": ["
78424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "    { \"GUID\": \"{f998f760-272b-6939-4c2beffe428697ac}\","
79424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "      \"PKCS12\": \"abc\","
80424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "       \"Type\": \"Client\" }"
81424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "  ],"
82424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "  \"Type\": \"UnencryptedConfiguration\""
83424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "}";
84424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)std::string ValueToString(const base::Value& value) {
86424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  std::stringstream str;
878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  str << value;
88424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return str.str();
89424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
90424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void AppendAll(const base::ListValue& from, base::ListValue* to) {
928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  for (base::ListValue::const_iterator it = from.begin(); it != from.end();
938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)       ++it) {
948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    to->Append((*it)->DeepCopy());
958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
98424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Matcher to match base::Value.
99424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)MATCHER_P(IsEqualTo,
100424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          value,
101424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          std::string(negation ? "isn't" : "is") + " equal to " +
1028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)              ValueToString(*value)) {
103424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return value->Equals(&arg);
104424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
105424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)MATCHER(IsEmpty, std::string(negation ? "isn't" : "is") + " empty.") {
1078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return arg.empty();
1088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
1098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
110424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)ACTION_P(SetCertificateList, list) {
111424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (arg2)
112424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    *arg2 = list;
113424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return true;
114424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
115424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
116424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}  // namespace
117424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
118424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class NetworkConfigurationUpdaterTest : public testing::Test {
119424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) protected:
120424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  NetworkConfigurationUpdaterTest() {
121424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
122424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
123424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
124424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    EXPECT_CALL(provider_, IsInitializationComplete(_))
125424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        .WillRepeatedly(Return(true));
126424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    provider_.Init();
127424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    PolicyServiceImpl::Providers providers;
128424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    providers.push_back(&provider_);
129424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    policy_service_.reset(new PolicyServiceImpl(providers));
130424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
131424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    scoped_ptr<base::DictionaryValue> fake_toplevel_onc =
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        chromeos::onc::ReadDictionaryFromJson(kFakeONC);
133424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
134424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    base::ListValue* network_configs = NULL;
1358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    fake_toplevel_onc->GetListWithoutPathExpansion(
1368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        onc::toplevel_config::kNetworkConfigurations, &network_configs);
1378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    AppendAll(*network_configs, &fake_network_configs_);
1388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    base::DictionaryValue* global_config = NULL;
1408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    fake_toplevel_onc->GetDictionaryWithoutPathExpansion(
1418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        onc::toplevel_config::kGlobalNetworkConfiguration, &global_config);
1428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    fake_global_network_config_.MergeDictionary(global_config);
143424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
144424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    base::ListValue* certs = NULL;
1458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    fake_toplevel_onc->GetListWithoutPathExpansion(
1468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        onc::toplevel_config::kCertificates, &certs);
1478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    AppendAll(*certs, &fake_certificates_);
148424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    certificate_importer_ =
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        new StrictMock<chromeos::onc::MockCertificateImporter>();
151424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    certificate_importer_owned_.reset(certificate_importer_);
152424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
153424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
154424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
155424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    network_configuration_updater_.reset();
156424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    provider_.Shutdown();
157424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    base::RunLoop().RunUntilIdle();
158424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
159424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
160424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  void UpdateProviderPolicy(const PolicyMap& policy) {
161424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    provider_.UpdateChromePolicy(policy);
162424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    base::RunLoop().RunUntilIdle();
163424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
164424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
165424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  UserNetworkConfigurationUpdater*
166424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  CreateNetworkConfigurationUpdaterForUserPolicy(
167424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      bool allow_trusted_certs_from_policy) {
168424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    UserNetworkConfigurationUpdater* updater =
169424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        UserNetworkConfigurationUpdater::CreateForUserPolicy(
170424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            allow_trusted_certs_from_policy,
171424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            fake_user_,
172424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            certificate_importer_owned_.Pass(),
173424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            policy_service_.get(),
174424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            &network_config_handler_).release();
175424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    network_configuration_updater_.reset(updater);
176424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return updater;
177424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
178424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
179424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  void CreateNetworkConfigurationUpdaterForDevicePolicy() {
180424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    network_configuration_updater_ =
181424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        NetworkConfigurationUpdater::CreateForDevicePolicy(
182424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            certificate_importer_owned_.Pass(),
183424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            policy_service_.get(),
184424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            &network_config_handler_);
185424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
186424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::ListValue fake_network_configs_;
1888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::DictionaryValue fake_global_network_config_;
1898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::ListValue fake_certificates_;
190424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  StrictMock<chromeos::MockManagedNetworkConfigurationHandler>
191424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      network_config_handler_;
192424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
193424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Ownership of certificate_importer_owned_ is passed to the
194424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // NetworkConfigurationUpdater. When that happens, |certificate_importer_|
195424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // continues to point to that instance but |certificate_importer_owned_| is
196424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // released.
1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  StrictMock<chromeos::onc::MockCertificateImporter>* certificate_importer_;
1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<chromeos::onc::CertificateImporter> certificate_importer_owned_;
199424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
200424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  StrictMock<MockConfigurationPolicyProvider> provider_;
201424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_ptr<PolicyServiceImpl> policy_service_;
202424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  FakeUser fake_user_;
203424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
204424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_ptr<NetworkConfigurationUpdater> network_configuration_updater_;
205424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  content::TestBrowserThreadBundle thread_bundle_;
206424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
207424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
208424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_F(NetworkConfigurationUpdaterTest, PolicyIsValidatedAndRepaired) {
209424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  std::string onc_policy =
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      chromeos::onc::test_utils::ReadTestData("toplevel_partially_invalid.onc");
211424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
212424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> onc_repaired =
2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      chromeos::onc::test_utils::ReadTestDictionary(
214424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          "repaired_toplevel_partially_invalid.onc");
215424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
216424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::ListValue* network_configs_repaired = NULL;
217424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  onc_repaired->GetListWithoutPathExpansion(
218424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      onc::toplevel_config::kNetworkConfigurations, &network_configs_repaired);
219424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_TRUE(network_configs_repaired);
220424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::DictionaryValue* global_config_repaired = NULL;
2228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  onc_repaired->GetDictionaryWithoutPathExpansion(
2238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      onc::toplevel_config::kGlobalNetworkConfiguration,
2248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      &global_config_repaired);
2258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_TRUE(global_config_repaired);
2268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
227424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  PolicyMap policy;
228424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  policy.Set(key::kOpenNetworkConfiguration,
229424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)             POLICY_LEVEL_MANDATORY,
230424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)             POLICY_SCOPE_USER,
231424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)             new base::StringValue(onc_policy),
232424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)             NULL);
233424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  UpdateProviderPolicy(policy);
234424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(network_config_handler_,
2368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)              SetPolicy(onc::ONC_SOURCE_USER_POLICY,
2378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                        _,
2388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                        IsEqualTo(network_configs_repaired),
2398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                        IsEqualTo(global_config_repaired)));
240424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_CALL(*certificate_importer_,
241424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)              ImportCertificates(_, onc::ONC_SOURCE_USER_POLICY, _));
242424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
243424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  CreateNetworkConfigurationUpdaterForUserPolicy(
244424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      false /* do not allow trusted certs from policy */ );
245424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
246424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
247424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_F(NetworkConfigurationUpdaterTest,
248424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)       DoNotAllowTrustedCertificatesFromPolicy) {
249424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  net::CertificateList cert_list;
250424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  cert_list =
251424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      net::CreateCertificateListFromFile(net::GetTestCertsDirectory(),
252424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                         "ok_cert.pem",
253424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                         net::X509Certificate::FORMAT_AUTO);
254424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_EQ(1u, cert_list.size());
255424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
256424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_CALL(network_config_handler_,
2578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)              SetPolicy(onc::ONC_SOURCE_USER_POLICY, _, _, _));
258424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_CALL(*certificate_importer_, ImportCertificates(_, _, _))
259424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      .WillRepeatedly(SetCertificateList(cert_list));
260424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
261424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  UserNetworkConfigurationUpdater* updater =
262424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      CreateNetworkConfigurationUpdaterForUserPolicy(
263424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          false /* do not allow trusted certs from policy */);
264424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
265424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Certificates with the "Web" trust flag set should not be forwarded to the
266424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // trust provider.
267424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  policy::PolicyCertVerifier cert_verifier((
268424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      base::Closure() /* no policy cert trusted callback */));
269424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  updater->SetPolicyCertVerifier(&cert_verifier);
270424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
271424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_TRUE(cert_verifier.GetAdditionalTrustAnchors().empty());
272424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
273424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // |cert_verifier| must outlive the updater.
274424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  network_configuration_updater_.reset();
275424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
276424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
277424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_F(NetworkConfigurationUpdaterTest, AllowTrustedCertificatesFromPolicy) {
278424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  net::CertificateList cert_list;
279424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  cert_list =
280424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      net::CreateCertificateListFromFile(net::GetTestCertsDirectory(),
281424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                         "ok_cert.pem",
282424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                         net::X509Certificate::FORMAT_AUTO);
283424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_EQ(1u, cert_list.size());
284424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
285424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_CALL(network_config_handler_,
2868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)              SetPolicy(onc::ONC_SOURCE_USER_POLICY, _, _, _));
287424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_CALL(*certificate_importer_,
288424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)              ImportCertificates(_, onc::ONC_SOURCE_USER_POLICY, _))
289424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      .WillRepeatedly(SetCertificateList(cert_list));
290424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
291424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  UserNetworkConfigurationUpdater* updater =
292424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      CreateNetworkConfigurationUpdaterForUserPolicy(
293424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          true /* allow trusted certs from policy */);
294424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
295424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Certificates with the "Web" trust flag set should be forwarded to the
296424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // trust provider.
297424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  policy::PolicyCertVerifier cert_verifier((
298424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      base::Closure() /* no policy cert trusted callback */));
299424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  updater->SetPolicyCertVerifier(&cert_verifier);
300424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
301424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(1u, cert_verifier.GetAdditionalTrustAnchors().size());
302424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
303424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // |cert_verifier| must outlive the updater.
304424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  network_configuration_updater_.reset();
305424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
306424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
307424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class NetworkConfigurationUpdaterTestWithParam
308424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    : public NetworkConfigurationUpdaterTest,
309424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      public testing::WithParamInterface<const char*> {
310424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) protected:
311424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Returns the currently tested ONC source.
312424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  onc::ONCSource CurrentONCSource() {
313424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (GetParam() == key::kOpenNetworkConfiguration)
314424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return onc::ONC_SOURCE_USER_POLICY;
315424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DCHECK(GetParam() == key::kDeviceOpenNetworkConfiguration);
316424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return onc::ONC_SOURCE_DEVICE_POLICY;
317424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
318424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
319424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Returns the expected username hash to push policies to
320424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // ManagedNetworkConfigurationHandler.
321424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  std::string ExpectedUsernameHash() {
322424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (GetParam() == key::kOpenNetworkConfiguration)
323424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return kFakeUsernameHash;
324424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return std::string();
325424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
326424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
327424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  void CreateNetworkConfigurationUpdater() {
328424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (GetParam() == key::kOpenNetworkConfiguration) {
329424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      CreateNetworkConfigurationUpdaterForUserPolicy(
330424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          false /* do not allow trusted certs from policy */);
331424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    } else {
332424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      CreateNetworkConfigurationUpdaterForDevicePolicy();
333424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
334424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
335424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
336424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
337424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_P(NetworkConfigurationUpdaterTestWithParam, InitialUpdates) {
338424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  PolicyMap policy;
339424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  policy.Set(GetParam(), POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
340424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)             new base::StringValue(kFakeONC), NULL);
341424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  UpdateProviderPolicy(policy);
342424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
343424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_CALL(network_config_handler_,
344424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)              SetPolicy(CurrentONCSource(),
345424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                        ExpectedUsernameHash(),
3468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                        IsEqualTo(&fake_network_configs_),
3478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                        IsEqualTo(&fake_global_network_config_)));
348424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_CALL(*certificate_importer_,
349424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)              ImportCertificates(
3508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                  IsEqualTo(&fake_certificates_), CurrentONCSource(), _));
351424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
352424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  CreateNetworkConfigurationUpdater();
353424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
354424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
355424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
356424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_P(NetworkConfigurationUpdaterTestWithParam, PolicyChange) {
357424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Ignore the initial updates.
3588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(network_config_handler_, SetPolicy(_, _, _, _)).Times(AtLeast(1));
359424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_CALL(*certificate_importer_, ImportCertificates(_, _, _))
360424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      .Times(AtLeast(1));
361424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  CreateNetworkConfigurationUpdater();
362424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&network_config_handler_);
363424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  Mock::VerifyAndClearExpectations(certificate_importer_);
364424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
365424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // The Updater should update if policy changes.
3668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(network_config_handler_,
3678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)              SetPolicy(CurrentONCSource(),
3688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                        _,
3698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                        IsEqualTo(&fake_network_configs_),
3708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                        IsEqualTo(&fake_global_network_config_)));
371424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_CALL(*certificate_importer_,
372424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)              ImportCertificates(
3738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                  IsEqualTo(&fake_certificates_), CurrentONCSource(), _));
374424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
375424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  PolicyMap policy;
376424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  policy.Set(GetParam(), POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
377424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)             new base::StringValue(kFakeONC), NULL);
378424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  UpdateProviderPolicy(policy);
379424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&network_config_handler_);
380424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  Mock::VerifyAndClearExpectations(certificate_importer_);
381424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
382424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Another update is expected if the policy goes away.
3838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(network_config_handler_,
3848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)              SetPolicy(CurrentONCSource(), _, IsEmpty(), IsEmpty()));
385424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_CALL(*certificate_importer_,
3868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)              ImportCertificates(IsEmpty(), CurrentONCSource(), _));
387424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
388424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  policy.Erase(GetParam());
389424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  UpdateProviderPolicy(policy);
390424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
391424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
392424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(NetworkConfigurationUpdaterTestWithParamInstance,
393424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                        NetworkConfigurationUpdaterTestWithParam,
394424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                        testing::Values(key::kDeviceOpenNetworkConfiguration,
395424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                        key::kOpenNetworkConfiguration));
396424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
397424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}  // namespace policy
398