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)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/bind.h"
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/bind_helpers.h"
7424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/callback.h"
8424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/files/file_path.h"
9424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
10424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/run_loop.h"
11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/values.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/device_network_configuration_updater.h"
13424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/browser/chromeos/policy/user_network_configuration_updater.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_service.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/settings/stub_cros_settings_provider.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chromeos/network/fake_network_device_handler.h"
19424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chromeos/network/mock_managed_network_configuration_handler.h"
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromeos/network/onc/onc_certificate_importer.h"
21424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chromeos/network/onc/onc_test_utils.h"
22424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chromeos/network/onc/onc_utils.h"
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "components/onc/onc_constants.h"
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/external_data_fetcher.h"
25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/mock_configuration_policy_provider.h"
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_map.h"
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/policy_service_impl.h"
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/user_manager/user.h"
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/user_manager/user_type.h"
30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h"
31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "content/public/test/test_utils.h"
32424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "net/base/test_data_directory.h"
33424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "net/cert/x509_certificate.h"
34424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "net/test/cert_test_util.h"
35424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "policy/policy_constants.h"
36424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
37424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
38424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
39424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)using testing::AnyNumber;
40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)using testing::AtLeast;
41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)using testing::Mock;
42424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)using testing::Ne;
43424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)using testing::Return;
44424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)using testing::StrictMock;
45424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)using testing::_;
46424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
47424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace policy {
48424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
49424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace {
50424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
51424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)const char kFakeUserEmail[] = "fake email";
52424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)const char kFakeUsernameHash[] = "fake hash";
53424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class FakeUser : public user_manager::User {
55424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) public:
56424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  FakeUser() : User(kFakeUserEmail) {
57424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    set_display_email(kFakeUserEmail);
58424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    set_username_hash(kFakeUsernameHash);
59424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
60424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual ~FakeUser() {}
61424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
62424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // User overrides
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual user_manager::UserType GetType() const OVERRIDE {
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return user_manager::USER_TYPE_REGULAR;
65424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
66424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
67424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) private:
68424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FakeUser);
69424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
70424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class FakeWebTrustedCertsObserver
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : public UserNetworkConfigurationUpdater::WebTrustedCertsObserver {
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FakeWebTrustedCertsObserver() {}
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void OnTrustAnchorsChanged(
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const net::CertificateList& trust_anchors) OVERRIDE {
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    trust_anchors_ = trust_anchors;
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  net::CertificateList trust_anchors_;
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(FakeWebTrustedCertsObserver);
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class FakeNetworkDeviceHandler : public chromeos::FakeNetworkDeviceHandler {
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  public:
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   FakeNetworkDeviceHandler() : allow_roaming_(false) {}
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   virtual void SetCellularAllowRoaming(bool allow_roaming) OVERRIDE {
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)     allow_roaming_ = allow_roaming;
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   }
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   bool allow_roaming_;
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(FakeNetworkDeviceHandler);
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass FakeCertificateImporter : public chromeos::onc::CertificateImporter {
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FakeCertificateImporter()
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : expected_onc_source_(::onc::ONC_SOURCE_UNKNOWN), call_count_(0) {}
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~FakeCertificateImporter() {}
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SetTrustedCertificatesResult(
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      net::CertificateList onc_trusted_certificates) {
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    onc_trusted_certificates_ = onc_trusted_certificates;
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SetExpectedONCCertificates(const base::ListValue& certificates) {
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    expected_onc_certificates_.reset(certificates.DeepCopy());
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SetExpectedONCSource(::onc::ONCSource source) {
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    expected_onc_source_ = source;
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unsigned int GetAndResetImportCount() {
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    unsigned int count = call_count_;
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    call_count_ = 0;
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return count;
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void ImportCertificates(const base::ListValue& certificates,
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  ::onc::ONCSource source,
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  const DoneCallback& done_callback) OVERRIDE {
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (expected_onc_source_ != ::onc::ONC_SOURCE_UNKNOWN)
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_EQ(expected_onc_source_, source);
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (expected_onc_certificates_) {
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_TRUE(chromeos::onc::test_utils::Equals(
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          expected_onc_certificates_.get(), &certificates));
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ++call_count_;
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    done_callback.Run(true, onc_trusted_certificates_);
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ::onc::ONCSource expected_onc_source_;
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<base::ListValue> expected_onc_certificates_;
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  net::CertificateList onc_trusted_certificates_;
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unsigned int call_count_;
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(FakeCertificateImporter);
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
147424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)const char kFakeONC[] =
148424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "{ \"NetworkConfigurations\": ["
149424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "    { \"GUID\": \"{485d6076-dd44-6b6d-69787465725f5040}\","
150424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "      \"Type\": \"WiFi\","
151424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "      \"Name\": \"My WiFi Network\","
152424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "      \"WiFi\": {"
153424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "        \"SSID\": \"ssid-none\","
154424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "        \"Security\": \"None\" }"
155424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "    }"
156424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "  ],"
1578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    "  \"GlobalNetworkConfiguration\": {"
1588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    "    \"AllowOnlyPolicyNetworksToAutoconnect\": true,"
1598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    "  },"
160424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "  \"Certificates\": ["
161424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "    { \"GUID\": \"{f998f760-272b-6939-4c2beffe428697ac}\","
162424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "      \"PKCS12\": \"abc\","
163424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "       \"Type\": \"Client\" }"
164424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "  ],"
165424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "  \"Type\": \"UnencryptedConfiguration\""
166424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "}";
167424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)std::string ValueToString(const base::Value& value) {
169424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  std::stringstream str;
1708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  str << value;
171424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return str.str();
172424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
173424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void AppendAll(const base::ListValue& from, base::ListValue* to) {
1758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  for (base::ListValue::const_iterator it = from.begin(); it != from.end();
1768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)       ++it) {
1778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    to->Append((*it)->DeepCopy());
1788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
1798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
1808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
181424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Matcher to match base::Value.
182424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)MATCHER_P(IsEqualTo,
183424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          value,
184424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          std::string(negation ? "isn't" : "is") + " equal to " +
1858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)              ValueToString(*value)) {
186424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return value->Equals(&arg);
187424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
188424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)MATCHER(IsEmpty, std::string(negation ? "isn't" : "is") + " empty.") {
1908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return arg.empty();
1918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
1928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
193424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)ACTION_P(SetCertificateList, list) {
194424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (arg2)
195424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    *arg2 = list;
196424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return true;
197424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
198424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
199424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}  // namespace
200424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
201424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class NetworkConfigurationUpdaterTest : public testing::Test {
202424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) protected:
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NetworkConfigurationUpdaterTest() : certificate_importer_(NULL) {}
204424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
205424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
206424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    EXPECT_CALL(provider_, IsInitializationComplete(_))
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        .WillRepeatedly(Return(false));
208424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    provider_.Init();
209424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    PolicyServiceImpl::Providers providers;
210424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    providers.push_back(&provider_);
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    policy_service_.reset(new PolicyServiceImpl(providers));
212424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
213424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    scoped_ptr<base::DictionaryValue> fake_toplevel_onc =
2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        chromeos::onc::ReadDictionaryFromJson(kFakeONC);
215424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
216424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    base::ListValue* network_configs = NULL;
2178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    fake_toplevel_onc->GetListWithoutPathExpansion(
2188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        onc::toplevel_config::kNetworkConfigurations, &network_configs);
2198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    AppendAll(*network_configs, &fake_network_configs_);
2208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    base::DictionaryValue* global_config = NULL;
2228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    fake_toplevel_onc->GetDictionaryWithoutPathExpansion(
2238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        onc::toplevel_config::kGlobalNetworkConfiguration, &global_config);
2248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    fake_global_network_config_.MergeDictionary(global_config);
225424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
226424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    base::ListValue* certs = NULL;
2278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    fake_toplevel_onc->GetListWithoutPathExpansion(
2288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        onc::toplevel_config::kCertificates, &certs);
2298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    AppendAll(*certs, &fake_certificates_);
230424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    certificate_importer_ = new FakeCertificateImporter;
232424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    certificate_importer_owned_.reset(certificate_importer_);
233424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
234424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
235424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
236424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    network_configuration_updater_.reset();
237424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    provider_.Shutdown();
238424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    base::RunLoop().RunUntilIdle();
239424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
240424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void MarkPolicyProviderInitialized() {
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Mock::VerifyAndClearExpectations(&provider_);
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_CALL(provider_, IsInitializationComplete(_))
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        .WillRepeatedly(Return(true));
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    provider_.SetAutoRefresh();
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    provider_.RefreshPolicies();
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::RunLoop().RunUntilIdle();
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
250424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  void UpdateProviderPolicy(const PolicyMap& policy) {
251424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    provider_.UpdateChromePolicy(policy);
252424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    base::RunLoop().RunUntilIdle();
253424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
254424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
255424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  UserNetworkConfigurationUpdater*
256424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  CreateNetworkConfigurationUpdaterForUserPolicy(
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bool allow_trusted_certs_from_policy,
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bool set_cert_importer) {
259424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    UserNetworkConfigurationUpdater* updater =
260424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        UserNetworkConfigurationUpdater::CreateForUserPolicy(
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            &profile_,
262424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            allow_trusted_certs_from_policy,
263424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            fake_user_,
264424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            policy_service_.get(),
265424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            &network_config_handler_).release();
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (set_cert_importer) {
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_TRUE(certificate_importer_owned_);
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      updater->SetCertificateImporterForTest(
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          certificate_importer_owned_.Pass());
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
271424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    network_configuration_updater_.reset(updater);
272424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return updater;
273424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
274424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
275424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  void CreateNetworkConfigurationUpdaterForDevicePolicy() {
276424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    network_configuration_updater_ =
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        DeviceNetworkConfigurationUpdater::CreateForDevicePolicy(
278424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            policy_service_.get(),
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            &network_config_handler_,
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            &network_device_handler_,
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            chromeos::CrosSettings::Get());
282424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
283424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::ListValue fake_network_configs_;
2858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::DictionaryValue fake_global_network_config_;
2868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::ListValue fake_certificates_;
287424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  StrictMock<chromeos::MockManagedNetworkConfigurationHandler>
288424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      network_config_handler_;
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FakeNetworkDeviceHandler network_device_handler_;
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Not used directly. Required for CrosSettings.
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  chromeos::ScopedTestDeviceSettingsService scoped_device_settings_service_;
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  chromeos::ScopedTestCrosSettings scoped_cros_settings_;
294424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
295424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Ownership of certificate_importer_owned_ is passed to the
296424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // NetworkConfigurationUpdater. When that happens, |certificate_importer_|
297424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // continues to point to that instance but |certificate_importer_owned_| is
298424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // released.
2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FakeCertificateImporter* certificate_importer_;
3004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<chromeos::onc::CertificateImporter> certificate_importer_owned_;
301424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
302424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  StrictMock<MockConfigurationPolicyProvider> provider_;
303424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_ptr<PolicyServiceImpl> policy_service_;
304424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  FakeUser fake_user_;
305424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestingProfile profile_;
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
308424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_ptr<NetworkConfigurationUpdater> network_configuration_updater_;
309424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  content::TestBrowserThreadBundle thread_bundle_;
310424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
311424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(NetworkConfigurationUpdaterTest, CellularAllowRoaming) {
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Ignore network config updates.
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(network_config_handler_, SetPolicy(_, _, _, _)).Times(AtLeast(1));
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Setup the DataRoaming device setting.
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  chromeos::CrosSettings* cros_settings = chromeos::CrosSettings::Get();
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  chromeos::CrosSettingsProvider* device_settings_provider =
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      cros_settings->GetProvider(chromeos::kSignedDataRoamingEnabled);
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cros_settings->RemoveSettingsProvider(device_settings_provider);
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  delete device_settings_provider;
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  chromeos::StubCrosSettingsProvider* stub_settings_provider =
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new chromeos::StubCrosSettingsProvider;
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cros_settings->AddSettingsProvider(stub_settings_provider);
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  chromeos::CrosSettings::Get()->Set(chromeos::kSignedDataRoamingEnabled,
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     base::FundamentalValue(false));
3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(network_device_handler_.allow_roaming_);
3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CreateNetworkConfigurationUpdaterForDevicePolicy();
3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MarkPolicyProviderInitialized();
3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  chromeos::CrosSettings::Get()->Set(chromeos::kSignedDataRoamingEnabled,
3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     base::FundamentalValue(true));
3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(network_device_handler_.allow_roaming_);
3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  chromeos::CrosSettings::Get()->Set(chromeos::kSignedDataRoamingEnabled,
3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     base::FundamentalValue(false));
3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(network_device_handler_.allow_roaming_);
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
341424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_F(NetworkConfigurationUpdaterTest, PolicyIsValidatedAndRepaired) {
342424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> onc_repaired =
3434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      chromeos::onc::test_utils::ReadTestDictionary(
344424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          "repaired_toplevel_partially_invalid.onc");
345424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
346424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::ListValue* network_configs_repaired = NULL;
347424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  onc_repaired->GetListWithoutPathExpansion(
348424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      onc::toplevel_config::kNetworkConfigurations, &network_configs_repaired);
349424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_TRUE(network_configs_repaired);
350424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
3518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::DictionaryValue* global_config_repaired = NULL;
3528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  onc_repaired->GetDictionaryWithoutPathExpansion(
3538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      onc::toplevel_config::kGlobalNetworkConfiguration,
3548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      &global_config_repaired);
3558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_TRUE(global_config_repaired);
3568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string onc_policy =
358f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      chromeos::onc::test_utils::ReadTestData("toplevel_partially_invalid.onc");
359424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  PolicyMap policy;
360424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  policy.Set(key::kOpenNetworkConfiguration,
361424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)             POLICY_LEVEL_MANDATORY,
362424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)             POLICY_SCOPE_USER,
363424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)             new base::StringValue(onc_policy),
364424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)             NULL);
365424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  UpdateProviderPolicy(policy);
366424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
3678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(network_config_handler_,
3688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)              SetPolicy(onc::ONC_SOURCE_USER_POLICY,
3698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                        _,
3708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                        IsEqualTo(network_configs_repaired),
3718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                        IsEqualTo(global_config_repaired)));
3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  certificate_importer_->SetExpectedONCSource(onc::ONC_SOURCE_USER_POLICY);
373424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
374424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  CreateNetworkConfigurationUpdaterForUserPolicy(
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      false /* do not allow trusted certs from policy */,
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      true /* set certificate importer */);
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MarkPolicyProviderInitialized();
3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1u, certificate_importer_->GetAndResetImportCount());
379424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
380424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
381424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_F(NetworkConfigurationUpdaterTest,
382424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)       DoNotAllowTrustedCertificatesFromPolicy) {
383424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  net::CertificateList cert_list;
384424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  cert_list =
385424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      net::CreateCertificateListFromFile(net::GetTestCertsDirectory(),
386424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                         "ok_cert.pem",
387424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                         net::X509Certificate::FORMAT_AUTO);
388424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_EQ(1u, cert_list.size());
389424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
390424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_CALL(network_config_handler_,
3918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)              SetPolicy(onc::ONC_SOURCE_USER_POLICY, _, _, _));
3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  certificate_importer_->SetTrustedCertificatesResult(cert_list);
393424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
394424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  UserNetworkConfigurationUpdater* updater =
395424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      CreateNetworkConfigurationUpdaterForUserPolicy(
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          false /* do not allow trusted certs from policy */,
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          true /* set certificate importer */);
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MarkPolicyProviderInitialized();
399424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
400f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Certificates with the "Web" trust flag set should not be forwarded to
401f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // observers.
402f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FakeWebTrustedCertsObserver observer;
403f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  updater->AddTrustedCertsObserver(&observer);
404f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
405424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
406424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
407f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  net::CertificateList trust_anchors;
408f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  updater->GetWebTrustedCertificates(&trust_anchors);
409f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(trust_anchors.empty());
410f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
411f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(observer.trust_anchors_.empty());
412f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  updater->RemoveTrustedCertsObserver(&observer);
413424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
414424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
415f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(NetworkConfigurationUpdaterTest,
416f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)       AllowTrustedCertificatesFromPolicyInitially) {
417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Ignore network configuration changes.
418f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(network_config_handler_, SetPolicy(_, _, _, _))
419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      .Times(AnyNumber());
420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
421424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  net::CertificateList cert_list;
422424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  cert_list =
423424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      net::CreateCertificateListFromFile(net::GetTestCertsDirectory(),
424424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                         "ok_cert.pem",
425424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                         net::X509Certificate::FORMAT_AUTO);
426424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_EQ(1u, cert_list.size());
427424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  certificate_importer_->SetExpectedONCSource(onc::ONC_SOURCE_USER_POLICY);
4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  certificate_importer_->SetTrustedCertificatesResult(cert_list);
430424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
431424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  UserNetworkConfigurationUpdater* updater =
432424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      CreateNetworkConfigurationUpdaterForUserPolicy(
4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          true /* allow trusted certs from policy */,
4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          true /* set certificate importer */);
4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MarkPolicyProviderInitialized();
436424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
437424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
438424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
439f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Certificates with the "Web" trust flag set will be returned.
440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  net::CertificateList trust_anchors;
441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  updater->GetWebTrustedCertificates(&trust_anchors);
442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1u, trust_anchors.size());
443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(NetworkConfigurationUpdaterTest,
446f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)       AllowTrustedCertificatesFromPolicyOnUpdate) {
447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Ignore network configuration changes.
448f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(network_config_handler_, SetPolicy(_, _, _, _))
449f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      .Times(AnyNumber());
450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Start with an empty certificate list.
452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  UserNetworkConfigurationUpdater* updater =
453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      CreateNetworkConfigurationUpdaterForUserPolicy(
4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          true /* allow trusted certs from policy */,
4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          true /* set certificate importer */);
4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MarkPolicyProviderInitialized();
457f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
458f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FakeWebTrustedCertsObserver observer;
459f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  updater->AddTrustedCertsObserver(&observer);
460f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
461f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
462f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
463f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Verify that the returned certificate list is empty.
464f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  {
465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    net::CertificateList trust_anchors;
466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    updater->GetWebTrustedCertificates(&trust_anchors);
467f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_TRUE(trust_anchors.empty());
468f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
469f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(observer.trust_anchors_.empty());
470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Now use a non-empty certificate list to test the observer notification.
472f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  net::CertificateList cert_list;
473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  cert_list =
474f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      net::CreateCertificateListFromFile(net::GetTestCertsDirectory(),
475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                         "ok_cert.pem",
476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                         net::X509Certificate::FORMAT_AUTO);
477f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(1u, cert_list.size());
4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  certificate_importer_->SetTrustedCertificatesResult(cert_list);
479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Change to any non-empty policy, so that updates are triggered. The actual
481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // content of the policy is irrelevant.
482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  PolicyMap policy;
483f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  policy.Set(key::kOpenNetworkConfiguration,
484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             POLICY_LEVEL_MANDATORY,
485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             POLICY_SCOPE_USER,
486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             new base::StringValue(kFakeONC),
487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             NULL);
488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  UpdateProviderPolicy(policy);
489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Certificates with the "Web" trust flag set will be returned and forwarded
492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // to observers.
493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  {
494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    net::CertificateList trust_anchors;
495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    updater->GetWebTrustedCertificates(&trust_anchors);
496f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(1u, trust_anchors.size());
497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1u, observer.trust_anchors_.size());
499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  updater->RemoveTrustedCertsObserver(&observer);
501424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
502424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(NetworkConfigurationUpdaterTest,
5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       DontImportCertificateBeforeCertificateImporterSet) {
5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PolicyMap policy;
5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  policy.Set(key::kOpenNetworkConfiguration, POLICY_LEVEL_MANDATORY,
5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             POLICY_SCOPE_USER, new base::StringValue(kFakeONC), NULL);
5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateProviderPolicy(policy);
5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(network_config_handler_,
5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              SetPolicy(onc::ONC_SOURCE_USER_POLICY,
5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        kFakeUsernameHash,
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        IsEqualTo(&fake_network_configs_),
5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        IsEqualTo(&fake_global_network_config_)));
5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UserNetworkConfigurationUpdater* updater =
5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      CreateNetworkConfigurationUpdaterForUserPolicy(
5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          true /* allow trusted certs from policy */,
5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          false /* do not set certificate importer */);
5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MarkPolicyProviderInitialized();
5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&network_config_handler_);
5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0u, certificate_importer_->GetAndResetImportCount());
5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  certificate_importer_->SetExpectedONCCertificates(fake_certificates_);
5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  certificate_importer_->SetExpectedONCSource(onc::ONC_SOURCE_USER_POLICY);
5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(certificate_importer_owned_);
5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  updater->SetCertificateImporterForTest(certificate_importer_owned_.Pass());
5301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1u, certificate_importer_->GetAndResetImportCount());
5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
533424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class NetworkConfigurationUpdaterTestWithParam
534424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    : public NetworkConfigurationUpdaterTest,
535424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      public testing::WithParamInterface<const char*> {
536424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) protected:
537424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Returns the currently tested ONC source.
538424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  onc::ONCSource CurrentONCSource() {
539424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (GetParam() == key::kOpenNetworkConfiguration)
540424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return onc::ONC_SOURCE_USER_POLICY;
541424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DCHECK(GetParam() == key::kDeviceOpenNetworkConfiguration);
542424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return onc::ONC_SOURCE_DEVICE_POLICY;
543424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
544424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
545424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Returns the expected username hash to push policies to
546424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // ManagedNetworkConfigurationHandler.
547424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  std::string ExpectedUsernameHash() {
548424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (GetParam() == key::kOpenNetworkConfiguration)
549424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return kFakeUsernameHash;
550424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return std::string();
551424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
552424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t ExpectedImportCertificatesCallCount() {
5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (GetParam() == key::kOpenNetworkConfiguration)
5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return 1u;
5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return 0u;
5575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
559424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  void CreateNetworkConfigurationUpdater() {
560424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (GetParam() == key::kOpenNetworkConfiguration) {
561424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      CreateNetworkConfigurationUpdaterForUserPolicy(
5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          false /* do not allow trusted certs from policy */,
5635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          true /* set certificate importer */);
564424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    } else {
565424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      CreateNetworkConfigurationUpdaterForDevicePolicy();
566424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
567424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
568424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
569424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
570424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_P(NetworkConfigurationUpdaterTestWithParam, InitialUpdates) {
571424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  PolicyMap policy;
572424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  policy.Set(GetParam(), POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
573424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)             new base::StringValue(kFakeONC), NULL);
574424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  UpdateProviderPolicy(policy);
575424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
576424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_CALL(network_config_handler_,
577424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)              SetPolicy(CurrentONCSource(),
578424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                        ExpectedUsernameHash(),
5798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                        IsEqualTo(&fake_network_configs_),
5808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                        IsEqualTo(&fake_global_network_config_)));
5811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  certificate_importer_->SetExpectedONCCertificates(fake_certificates_);
5821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  certificate_importer_->SetExpectedONCSource(CurrentONCSource());
583424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
584424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  CreateNetworkConfigurationUpdater();
5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MarkPolicyProviderInitialized();
5861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(ExpectedImportCertificatesCallCount(),
5871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            certificate_importer_->GetAndResetImportCount());
588424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
589424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_P(NetworkConfigurationUpdaterTestWithParam,
5915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       PolicyNotSetBeforePolicyProviderInitialized) {
5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PolicyMap policy;
5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  policy.Set(GetParam(), POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             new base::StringValue(kFakeONC), NULL);
5955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateProviderPolicy(policy);
5965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CreateNetworkConfigurationUpdater();
5985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&network_config_handler_);
6001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0u, certificate_importer_->GetAndResetImportCount());
6015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(network_config_handler_,
6035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              SetPolicy(CurrentONCSource(),
6045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        ExpectedUsernameHash(),
6055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        IsEqualTo(&fake_network_configs_),
6065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        IsEqualTo(&fake_global_network_config_)));
6071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  certificate_importer_->SetExpectedONCSource(CurrentONCSource());
6081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  certificate_importer_->SetExpectedONCCertificates(fake_certificates_);
6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MarkPolicyProviderInitialized();
6111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(ExpectedImportCertificatesCallCount(),
6121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            certificate_importer_->GetAndResetImportCount());
6135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_P(NetworkConfigurationUpdaterTestWithParam,
6165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       PolicyAppliedImmediatelyIfProvidersInitialized) {
6175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MarkPolicyProviderInitialized();
6185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PolicyMap policy;
6205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  policy.Set(GetParam(), POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
6215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             new base::StringValue(kFakeONC), NULL);
6225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateProviderPolicy(policy);
6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(network_config_handler_,
6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              SetPolicy(CurrentONCSource(),
6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        ExpectedUsernameHash(),
6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        IsEqualTo(&fake_network_configs_),
6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        IsEqualTo(&fake_global_network_config_)));
6291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  certificate_importer_->SetExpectedONCSource(CurrentONCSource());
6301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  certificate_importer_->SetExpectedONCCertificates(fake_certificates_);
6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CreateNetworkConfigurationUpdater();
6331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(ExpectedImportCertificatesCallCount(),
6351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            certificate_importer_->GetAndResetImportCount());
6365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
637424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
638424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_P(NetworkConfigurationUpdaterTestWithParam, PolicyChange) {
639424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Ignore the initial updates.
6408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(network_config_handler_, SetPolicy(_, _, _, _)).Times(AtLeast(1));
6415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
642424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  CreateNetworkConfigurationUpdater();
6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MarkPolicyProviderInitialized();
6445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
645424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&network_config_handler_);
6461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_LE(ExpectedImportCertificatesCallCount(),
6471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            certificate_importer_->GetAndResetImportCount());
648424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
649424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // The Updater should update if policy changes.
6508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(network_config_handler_,
6518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)              SetPolicy(CurrentONCSource(),
6528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                        _,
6538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                        IsEqualTo(&fake_network_configs_),
6548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                        IsEqualTo(&fake_global_network_config_)));
6551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  certificate_importer_->SetExpectedONCSource(CurrentONCSource());
6561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  certificate_importer_->SetExpectedONCCertificates(fake_certificates_);
657424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
658424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  PolicyMap policy;
659424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  policy.Set(GetParam(), POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
660424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)             new base::StringValue(kFakeONC), NULL);
661424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  UpdateProviderPolicy(policy);
662424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&network_config_handler_);
6631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(ExpectedImportCertificatesCallCount(),
6641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            certificate_importer_->GetAndResetImportCount());
665424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
666424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Another update is expected if the policy goes away.
6678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(network_config_handler_,
6688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)              SetPolicy(CurrentONCSource(), _, IsEmpty(), IsEmpty()));
6691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  certificate_importer_->SetExpectedONCCertificates(base::ListValue());
670424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
671424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  policy.Erase(GetParam());
672424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  UpdateProviderPolicy(policy);
6731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(ExpectedImportCertificatesCallCount(),
6741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            certificate_importer_->GetAndResetImportCount());
675424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
676424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
677424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(NetworkConfigurationUpdaterTestWithParamInstance,
678424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                        NetworkConfigurationUpdaterTestWithParam,
679424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                        testing::Values(key::kDeviceOpenNetworkConfiguration,
680424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                        key::kOpenNetworkConfiguration));
681424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
682424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}  // namespace policy
683