1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
9 #include "base/bind_helpers.h"
10 #include "base/location.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/message_loop/message_loop.h"
13 #include "base/single_thread_task_runner.h"
14 #include "base/stl_util.h"
15 #include "base/thread_task_runner_handle.h"
16 #include "base/values.h"
17 #include "chromeos/dbus/dbus_thread_manager.h"
18 #include "chromeos/dbus/mock_shill_manager_client.h"
19 #include "chromeos/dbus/mock_shill_profile_client.h"
20 #include "chromeos/dbus/mock_shill_service_client.h"
21 #include "chromeos/dbus/shill_client_helper.h"
22 #include "chromeos/network/managed_network_configuration_handler_impl.h"
23 #include "chromeos/network/network_configuration_handler.h"
24 #include "chromeos/network/network_policy_observer.h"
25 #include "chromeos/network/network_profile_handler.h"
26 #include "chromeos/network/network_state_handler.h"
27 #include "chromeos/network/onc/onc_test_utils.h"
28 #include "chromeos/network/onc/onc_utils.h"
29 #include "dbus/object_path.h"
30 #include "testing/gmock/include/gmock/gmock.h"
31 #include "testing/gtest/include/gtest/gtest.h"
32 #include "third_party/cros_system_api/dbus/service_constants.h"
34 using ::testing::AnyNumber
;
35 using ::testing::Invoke
;
36 using ::testing::Mock
;
37 using ::testing::Pointee
;
38 using ::testing::Return
;
39 using ::testing::SaveArg
;
40 using ::testing::StrEq
;
41 using ::testing::StrictMock
;
44 namespace test_utils
= ::chromeos::onc::test_utils
;
50 std::string
ValueToString(const base::Value
* value
) {
51 std::stringstream str
;
56 void DereferenceAndCall(
57 base::Callback
<void(const base::DictionaryValue
& result
)> callback
,
58 const base::DictionaryValue
* value
) {
62 const char kUser1
[] = "user1";
63 const char kUser1ProfilePath
[] = "/profile/user1/shill";
65 // Matcher to match base::Value.
68 std::string(negation
? "isn't" : "is") + " equal to " +
69 ValueToString(value
)) {
70 return value
->Equals(&arg
);
73 // Match properties in |value| to |arg|. |arg| may contain extra properties).
74 MATCHER_P(MatchesProperties
,
76 std::string(negation
? "does't match " : "matches ") +
77 ValueToString(value
)) {
78 for (base::DictionaryValue::Iterator
iter(*value
); !iter
.IsAtEnd();
80 const base::Value
* property
;
81 if (!arg
.GetWithoutPathExpansion(iter
.key(), &property
) ||
82 !iter
.value().Equals(property
)) {
89 class ShillProfileTestClient
{
91 typedef ShillClientHelper::DictionaryValueCallbackWithoutStatus
92 DictionaryValueCallbackWithoutStatus
;
93 typedef ShillClientHelper::ErrorCallback ErrorCallback
;
95 void AddProfile(const std::string
& profile_path
,
96 const std::string
& userhash
) {
97 if (profile_entries_
.HasKey(profile_path
))
100 base::DictionaryValue
* profile
= new base::DictionaryValue
;
101 profile_entries_
.SetWithoutPathExpansion(profile_path
, profile
);
102 profile_to_user_
[profile_path
] = userhash
;
105 void AddEntry(const std::string
& profile_path
,
106 const std::string
& entry_path
,
107 const base::DictionaryValue
& entry
) {
108 base::DictionaryValue
* entries
= NULL
;
109 profile_entries_
.GetDictionaryWithoutPathExpansion(profile_path
, &entries
);
110 ASSERT_TRUE(entries
);
112 base::DictionaryValue
* new_entry
= entry
.DeepCopy();
113 new_entry
->SetStringWithoutPathExpansion(shill::kProfileProperty
,
115 entries
->SetWithoutPathExpansion(entry_path
, new_entry
);
118 void GetProperties(const dbus::ObjectPath
& profile_path
,
119 const DictionaryValueCallbackWithoutStatus
& callback
,
120 const ErrorCallback
& error_callback
) {
121 base::DictionaryValue
* entries
= NULL
;
122 profile_entries_
.GetDictionaryWithoutPathExpansion(profile_path
.value(),
124 ASSERT_TRUE(entries
);
126 scoped_ptr
<base::DictionaryValue
> result(new base::DictionaryValue
);
127 base::ListValue
* entry_paths
= new base::ListValue
;
128 result
->SetWithoutPathExpansion(shill::kEntriesProperty
, entry_paths
);
129 for (base::DictionaryValue::Iterator
it(*entries
); !it
.IsAtEnd();
131 entry_paths
->AppendString(it
.key());
134 ASSERT_TRUE(ContainsKey(profile_to_user_
, profile_path
.value()));
135 const std::string
& userhash
= profile_to_user_
[profile_path
.value()];
136 result
->SetStringWithoutPathExpansion(shill::kUserHashProperty
, userhash
);
138 base::ThreadTaskRunnerHandle::Get()->PostTask(
139 FROM_HERE
, base::Bind(base::Bind(&DereferenceAndCall
, callback
),
140 base::Owned(result
.release())));
143 void GetEntry(const dbus::ObjectPath
& profile_path
,
144 const std::string
& entry_path
,
145 const DictionaryValueCallbackWithoutStatus
& callback
,
146 const ErrorCallback
& error_callback
) {
147 base::DictionaryValue
* entries
= NULL
;
148 profile_entries_
.GetDictionaryWithoutPathExpansion(profile_path
.value(),
150 ASSERT_TRUE(entries
);
152 base::DictionaryValue
* entry
= NULL
;
153 entries
->GetDictionaryWithoutPathExpansion(entry_path
, &entry
);
155 base::ThreadTaskRunnerHandle::Get()->PostTask(
156 FROM_HERE
, base::Bind(base::Bind(&DereferenceAndCall
, callback
),
157 base::Owned(entry
->DeepCopy())));
161 base::DictionaryValue profile_entries_
;
162 std::map
<std::string
, std::string
> profile_to_user_
;
165 class ShillServiceTestClient
{
167 typedef ShillClientHelper::DictionaryValueCallback DictionaryValueCallback
;
168 void SetFakeProperties(const base::DictionaryValue
& service_properties
) {
169 service_properties_
.Clear();
170 service_properties_
.MergeDictionary(&service_properties
);
173 void GetProperties(const dbus::ObjectPath
& service_path
,
174 const DictionaryValueCallback
& callback
) {
175 base::ThreadTaskRunnerHandle::Get()->PostTask(
176 FROM_HERE
, base::Bind(callback
, DBUS_METHOD_CALL_SUCCESS
,
177 base::ConstRef(service_properties_
)));
181 base::DictionaryValue service_properties_
;
184 class TestNetworkProfileHandler
: public NetworkProfileHandler
{
186 TestNetworkProfileHandler() {
189 ~TestNetworkProfileHandler() override
{}
191 void AddProfileForTest(const NetworkProfile
& profile
) {
196 DISALLOW_COPY_AND_ASSIGN(TestNetworkProfileHandler
);
199 class TestNetworkPolicyObserver
: public NetworkPolicyObserver
{
201 TestNetworkPolicyObserver() : policies_applied_count_(0) {}
203 void PoliciesApplied(const std::string
& userhash
) override
{
204 policies_applied_count_
++;
207 int GetPoliciesAppliedCountAndReset() {
208 int count
= policies_applied_count_
;
209 policies_applied_count_
= 0;
214 int policies_applied_count_
;
216 DISALLOW_COPY_AND_ASSIGN(TestNetworkPolicyObserver
);
221 class ManagedNetworkConfigurationHandlerTest
: public testing::Test
{
223 ManagedNetworkConfigurationHandlerTest()
224 : mock_manager_client_(NULL
),
225 mock_profile_client_(NULL
),
226 mock_service_client_(NULL
) {
229 ~ManagedNetworkConfigurationHandlerTest() override
{}
231 void SetUp() override
{
232 scoped_ptr
<DBusThreadManagerSetter
> dbus_setter
=
233 DBusThreadManager::GetSetterForTesting();
234 mock_manager_client_
= new StrictMock
<MockShillManagerClient
>();
235 mock_profile_client_
= new StrictMock
<MockShillProfileClient
>();
236 mock_service_client_
= new StrictMock
<MockShillServiceClient
>();
237 dbus_setter
->SetShillManagerClient(
238 scoped_ptr
<ShillManagerClient
>(mock_manager_client_
).Pass());
239 dbus_setter
->SetShillProfileClient(
240 scoped_ptr
<ShillProfileClient
>(mock_profile_client_
).Pass());
241 dbus_setter
->SetShillServiceClient(
242 scoped_ptr
<ShillServiceClient
>(mock_service_client_
).Pass());
244 SetNetworkConfigurationHandlerExpectations();
246 ON_CALL(*mock_profile_client_
, GetProperties(_
,_
,_
))
247 .WillByDefault(Invoke(&profiles_stub_
,
248 &ShillProfileTestClient::GetProperties
));
250 ON_CALL(*mock_profile_client_
, GetEntry(_
,_
,_
,_
))
251 .WillByDefault(Invoke(&profiles_stub_
,
252 &ShillProfileTestClient::GetEntry
));
254 ON_CALL(*mock_service_client_
, GetProperties(_
,_
))
255 .WillByDefault(Invoke(&services_stub_
,
256 &ShillServiceTestClient::GetProperties
));
258 network_state_handler_
.reset(NetworkStateHandler::InitializeForTest());
259 network_profile_handler_
.reset(new TestNetworkProfileHandler());
260 network_configuration_handler_
.reset(
261 NetworkConfigurationHandler::InitializeForTest(
262 network_state_handler_
.get(),
263 NULL
/* no NetworkDeviceHandler */));
264 managed_network_configuration_handler_
.reset(
265 new ManagedNetworkConfigurationHandlerImpl());
266 managed_network_configuration_handler_
->Init(
267 network_state_handler_
.get(),
268 network_profile_handler_
.get(),
269 network_configuration_handler_
.get(),
270 NULL
/* no DeviceHandler */);
271 managed_network_configuration_handler_
->AddObserver(&policy_observer_
);
273 message_loop_
.RunUntilIdle();
276 void TearDown() override
{
277 if (managed_network_configuration_handler_
)
278 managed_network_configuration_handler_
->RemoveObserver(&policy_observer_
);
279 network_state_handler_
.reset();
280 managed_network_configuration_handler_
.reset();
281 network_configuration_handler_
.reset();
282 network_profile_handler_
.reset();
283 DBusThreadManager::Shutdown();
286 void VerifyAndClearExpectations() {
287 Mock::VerifyAndClearExpectations(mock_manager_client_
);
288 Mock::VerifyAndClearExpectations(mock_profile_client_
);
289 SetNetworkConfigurationHandlerExpectations();
292 void InitializeStandardProfiles() {
293 profiles_stub_
.AddProfile(kUser1ProfilePath
, kUser1
);
294 network_profile_handler_
->
295 AddProfileForTest(NetworkProfile(kUser1ProfilePath
, kUser1
));
297 profiles_stub_
.AddProfile(NetworkProfileHandler::GetSharedProfilePath(),
298 std::string() /* no userhash */);
299 network_profile_handler_
->AddProfileForTest(
300 NetworkProfile(NetworkProfileHandler::GetSharedProfilePath(),
301 std::string() /* no userhash */));
304 void SetUpEntry(const std::string
& path_to_shill_json
,
305 const std::string
& profile_path
,
306 const std::string
& entry_path
) {
307 scoped_ptr
<base::DictionaryValue
> entry
=
308 test_utils::ReadTestDictionary(path_to_shill_json
);
309 profiles_stub_
.AddEntry(profile_path
, entry_path
, *entry
);
312 void SetPolicy(::onc::ONCSource onc_source
,
313 const std::string
& userhash
,
314 const std::string
& path_to_onc
) {
315 scoped_ptr
<base::DictionaryValue
> policy
;
316 if (path_to_onc
.empty())
317 policy
= onc::ReadDictionaryFromJson(onc::kEmptyUnencryptedConfiguration
);
319 policy
= test_utils::ReadTestDictionary(path_to_onc
);
321 base::ListValue empty_network_configs
;
322 base::ListValue
* network_configs
= &empty_network_configs
;
323 policy
->GetListWithoutPathExpansion(
324 ::onc::toplevel_config::kNetworkConfigurations
, &network_configs
);
326 base::DictionaryValue empty_global_config
;
327 base::DictionaryValue
* global_network_config
= &empty_global_config
;
328 policy
->GetDictionaryWithoutPathExpansion(
329 ::onc::toplevel_config::kGlobalNetworkConfiguration
,
330 &global_network_config
);
332 managed_handler()->SetPolicy(
333 onc_source
, userhash
, *network_configs
, *global_network_config
);
336 void SetNetworkConfigurationHandlerExpectations() {
337 // These calls occur in NetworkConfigurationHandler.
338 EXPECT_CALL(*mock_manager_client_
, GetProperties(_
)).Times(AnyNumber());
339 EXPECT_CALL(*mock_manager_client_
,
340 AddPropertyChangedObserver(_
)).Times(AnyNumber());
341 EXPECT_CALL(*mock_manager_client_
,
342 RemovePropertyChangedObserver(_
)).Times(AnyNumber());
345 ManagedNetworkConfigurationHandler
* managed_handler() {
346 return managed_network_configuration_handler_
.get();
349 void GetManagedProperties(const std::string
& userhash
,
350 const std::string
& service_path
) {
351 managed_handler()->GetManagedProperties(
355 &ManagedNetworkConfigurationHandlerTest::GetPropertiesCallback
,
356 base::Unretained(this)),
357 base::Bind(&ManagedNetworkConfigurationHandlerTest::UnexpectedError
));
360 void GetPropertiesCallback(const std::string
& service_path
,
361 const base::DictionaryValue
& dictionary
) {
362 get_properties_service_path_
= service_path
;
363 get_properties_result_
.Clear();
364 get_properties_result_
.MergeDictionary(&dictionary
);
367 static void UnexpectedError(const std::string
& error_name
,
368 scoped_ptr
<base::DictionaryValue
> error_data
) {
373 MockShillManagerClient
* mock_manager_client_
;
374 MockShillProfileClient
* mock_profile_client_
;
375 MockShillServiceClient
* mock_service_client_
;
376 ShillProfileTestClient profiles_stub_
;
377 ShillServiceTestClient services_stub_
;
378 TestNetworkPolicyObserver policy_observer_
;
379 scoped_ptr
<NetworkStateHandler
> network_state_handler_
;
380 scoped_ptr
<TestNetworkProfileHandler
> network_profile_handler_
;
381 scoped_ptr
<NetworkConfigurationHandler
> network_configuration_handler_
;
382 scoped_ptr
<ManagedNetworkConfigurationHandlerImpl
>
383 managed_network_configuration_handler_
;
384 base::MessageLoop message_loop_
;
386 std::string get_properties_service_path_
;
387 base::DictionaryValue get_properties_result_
;
390 DISALLOW_COPY_AND_ASSIGN(ManagedNetworkConfigurationHandlerTest
);
393 TEST_F(ManagedNetworkConfigurationHandlerTest
, ProfileInitialization
) {
394 InitializeStandardProfiles();
395 message_loop_
.RunUntilIdle();
398 TEST_F(ManagedNetworkConfigurationHandlerTest
, RemoveIrrelevantFields
) {
399 InitializeStandardProfiles();
400 scoped_ptr
<base::DictionaryValue
> expected_shill_properties
=
401 test_utils::ReadTestDictionary(
402 "policy/shill_policy_on_unconfigured_wifi1.json");
404 EXPECT_CALL(*mock_profile_client_
,
405 GetProperties(dbus::ObjectPath(kUser1ProfilePath
), _
, _
));
407 EXPECT_CALL(*mock_manager_client_
,
408 ConfigureServiceForProfile(
409 dbus::ObjectPath(kUser1ProfilePath
),
410 IsEqualTo(expected_shill_properties
.get()),
413 SetPolicy(::onc::ONC_SOURCE_USER_POLICY
,
415 "policy/policy_wifi1_with_redundant_fields.onc");
416 message_loop_
.RunUntilIdle();
419 TEST_F(ManagedNetworkConfigurationHandlerTest
, SetPolicyManageUnconfigured
) {
420 InitializeStandardProfiles();
421 scoped_ptr
<base::DictionaryValue
> expected_shill_properties
=
422 test_utils::ReadTestDictionary(
423 "policy/shill_policy_on_unconfigured_wifi1.json");
425 EXPECT_CALL(*mock_profile_client_
,
426 GetProperties(dbus::ObjectPath(kUser1ProfilePath
), _
, _
));
428 EXPECT_CALL(*mock_manager_client_
,
429 ConfigureServiceForProfile(
430 dbus::ObjectPath(kUser1ProfilePath
),
431 IsEqualTo(expected_shill_properties
.get()),
434 SetPolicy(::onc::ONC_SOURCE_USER_POLICY
, kUser1
, "policy/policy_wifi1.onc");
435 message_loop_
.RunUntilIdle();
438 TEST_F(ManagedNetworkConfigurationHandlerTest
, EnableManagedCredentialsWiFi
) {
439 InitializeStandardProfiles();
440 scoped_ptr
<base::DictionaryValue
> expected_shill_properties
=
441 test_utils::ReadTestDictionary(
442 "policy/shill_policy_autoconnect_on_unconfigured_wifi1.json");
444 EXPECT_CALL(*mock_profile_client_
,
445 GetProperties(dbus::ObjectPath(kUser1ProfilePath
), _
, _
));
447 EXPECT_CALL(*mock_manager_client_
,
448 ConfigureServiceForProfile(
449 dbus::ObjectPath(kUser1ProfilePath
),
450 IsEqualTo(expected_shill_properties
.get()),
453 SetPolicy(::onc::ONC_SOURCE_USER_POLICY
, kUser1
,
454 "policy/policy_wifi1_autoconnect.onc");
455 message_loop_
.RunUntilIdle();
458 TEST_F(ManagedNetworkConfigurationHandlerTest
, EnableManagedCredentialsVPN
) {
459 InitializeStandardProfiles();
460 scoped_ptr
<base::DictionaryValue
> expected_shill_properties
=
461 test_utils::ReadTestDictionary(
462 "policy/shill_policy_autoconnect_on_unconfigured_vpn.json");
464 EXPECT_CALL(*mock_profile_client_
,
465 GetProperties(dbus::ObjectPath(kUser1ProfilePath
), _
, _
));
467 EXPECT_CALL(*mock_manager_client_
,
468 ConfigureServiceForProfile(
469 dbus::ObjectPath(kUser1ProfilePath
),
470 IsEqualTo(expected_shill_properties
.get()),
473 SetPolicy(::onc::ONC_SOURCE_USER_POLICY
, kUser1
,
474 "policy/policy_vpn_autoconnect.onc");
475 message_loop_
.RunUntilIdle();
478 // Ensure that EAP settings for ethernet are matched with the right profile
479 // entry and written to the dedicated EthernetEAP service.
480 TEST_F(ManagedNetworkConfigurationHandlerTest
,
481 SetPolicyManageUnmanagedEthernetEAP
) {
482 InitializeStandardProfiles();
483 scoped_ptr
<base::DictionaryValue
> expected_shill_properties
=
484 test_utils::ReadTestDictionary(
486 "shill_policy_on_unmanaged_ethernet_eap.json");
488 SetUpEntry("policy/shill_unmanaged_ethernet_eap.json",
492 // Also setup an unrelated WiFi configuration to verify that the right entry
494 SetUpEntry("policy/shill_unmanaged_wifi1.json",
498 EXPECT_CALL(*mock_profile_client_
,
499 GetProperties(dbus::ObjectPath(kUser1ProfilePath
), _
, _
));
501 EXPECT_CALL(*mock_profile_client_
,
502 GetEntry(dbus::ObjectPath(kUser1ProfilePath
), _
, _
, _
)).Times(2);
505 *mock_profile_client_
,
506 DeleteEntry(dbus::ObjectPath(kUser1ProfilePath
), "eth_entry", _
, _
));
509 *mock_manager_client_
,
510 ConfigureServiceForProfile(dbus::ObjectPath(kUser1ProfilePath
),
511 IsEqualTo(expected_shill_properties
.get()),
515 ::onc::ONC_SOURCE_USER_POLICY
, kUser1
, "policy/policy_ethernet_eap.onc");
516 message_loop_
.RunUntilIdle();
519 TEST_F(ManagedNetworkConfigurationHandlerTest
, SetPolicyIgnoreUnmodified
) {
520 InitializeStandardProfiles();
521 EXPECT_CALL(*mock_profile_client_
, GetProperties(_
, _
, _
));
523 EXPECT_CALL(*mock_manager_client_
, ConfigureServiceForProfile(_
, _
, _
, _
));
525 SetPolicy(::onc::ONC_SOURCE_USER_POLICY
, kUser1
, "policy/policy_wifi1.onc");
526 message_loop_
.RunUntilIdle();
527 EXPECT_EQ(1, policy_observer_
.GetPoliciesAppliedCountAndReset());
528 VerifyAndClearExpectations();
530 SetUpEntry("policy/shill_policy_on_unmanaged_wifi1.json",
534 EXPECT_CALL(*mock_profile_client_
, GetProperties(_
, _
, _
));
537 *mock_profile_client_
,
538 GetEntry(dbus::ObjectPath(kUser1ProfilePath
), "some_entry_path", _
, _
));
540 SetPolicy(::onc::ONC_SOURCE_USER_POLICY
, kUser1
, "policy/policy_wifi1.onc");
542 message_loop_
.RunUntilIdle();
543 EXPECT_EQ(1, policy_observer_
.GetPoliciesAppliedCountAndReset());
546 TEST_F(ManagedNetworkConfigurationHandlerTest
, PolicyApplicationRunning
) {
547 InitializeStandardProfiles();
548 EXPECT_CALL(*mock_profile_client_
, GetProperties(_
, _
, _
)).Times(AnyNumber());
549 EXPECT_CALL(*mock_manager_client_
, ConfigureServiceForProfile(_
, _
, _
, _
))
551 EXPECT_CALL(*mock_profile_client_
, GetEntry(_
, _
, _
, _
)).Times(AnyNumber());
553 EXPECT_FALSE(managed_handler()->IsAnyPolicyApplicationRunning());
555 SetPolicy(::onc::ONC_SOURCE_USER_POLICY
, kUser1
, "policy/policy_wifi1.onc");
556 managed_handler()->SetPolicy(
557 ::onc::ONC_SOURCE_DEVICE_POLICY
,
558 std::string(), // no userhash
559 base::ListValue(), // no device network policy
560 base::DictionaryValue()); // no device global config
562 EXPECT_TRUE(managed_handler()->IsAnyPolicyApplicationRunning());
563 message_loop_
.RunUntilIdle();
564 EXPECT_FALSE(managed_handler()->IsAnyPolicyApplicationRunning());
566 SetUpEntry("policy/shill_policy_on_unmanaged_wifi1.json",
571 ::onc::ONC_SOURCE_USER_POLICY
, kUser1
, "policy/policy_wifi1_update.onc");
572 EXPECT_TRUE(managed_handler()->IsAnyPolicyApplicationRunning());
573 message_loop_
.RunUntilIdle();
574 EXPECT_FALSE(managed_handler()->IsAnyPolicyApplicationRunning());
577 TEST_F(ManagedNetworkConfigurationHandlerTest
, UpdatePolicyAfterFinished
) {
578 InitializeStandardProfiles();
579 EXPECT_CALL(*mock_profile_client_
, GetProperties(_
, _
, _
));
580 EXPECT_CALL(*mock_manager_client_
, ConfigureServiceForProfile(_
, _
, _
, _
));
582 SetPolicy(::onc::ONC_SOURCE_USER_POLICY
, kUser1
, "policy/policy_wifi1.onc");
583 message_loop_
.RunUntilIdle();
584 EXPECT_EQ(1, policy_observer_
.GetPoliciesAppliedCountAndReset());
585 VerifyAndClearExpectations();
587 SetUpEntry("policy/shill_policy_on_unmanaged_wifi1.json",
591 EXPECT_CALL(*mock_profile_client_
, GetProperties(_
, _
, _
));
593 *mock_profile_client_
,
594 GetEntry(dbus::ObjectPath(kUser1ProfilePath
), "some_entry_path", _
, _
));
595 EXPECT_CALL(*mock_manager_client_
, ConfigureServiceForProfile(_
, _
, _
, _
));
598 ::onc::ONC_SOURCE_USER_POLICY
, kUser1
, "policy/policy_wifi1_update.onc");
599 message_loop_
.RunUntilIdle();
600 EXPECT_EQ(1, policy_observer_
.GetPoliciesAppliedCountAndReset());
603 TEST_F(ManagedNetworkConfigurationHandlerTest
, UpdatePolicyBeforeFinished
) {
604 InitializeStandardProfiles();
605 EXPECT_CALL(*mock_profile_client_
, GetProperties(_
, _
, _
)).Times(2);
606 EXPECT_CALL(*mock_manager_client_
, ConfigureServiceForProfile(_
, _
, _
, _
))
609 SetPolicy(::onc::ONC_SOURCE_USER_POLICY
, kUser1
, "policy/policy_wifi1.onc");
610 // Usually the first call will cause a profile entry to be created, which we
613 ::onc::ONC_SOURCE_USER_POLICY
, kUser1
, "policy/policy_wifi1_update.onc");
615 message_loop_
.RunUntilIdle();
616 EXPECT_EQ(1, policy_observer_
.GetPoliciesAppliedCountAndReset());
619 TEST_F(ManagedNetworkConfigurationHandlerTest
, SetPolicyManageUnmanaged
) {
620 InitializeStandardProfiles();
621 SetUpEntry("policy/shill_unmanaged_wifi1.json",
625 scoped_ptr
<base::DictionaryValue
> expected_shill_properties
=
626 test_utils::ReadTestDictionary(
627 "policy/shill_policy_on_unmanaged_wifi1.json");
629 EXPECT_CALL(*mock_profile_client_
,
630 GetProperties(dbus::ObjectPath(kUser1ProfilePath
), _
, _
));
633 *mock_profile_client_
,
634 GetEntry(dbus::ObjectPath(kUser1ProfilePath
), "old_entry_path", _
, _
));
637 *mock_profile_client_
,
638 DeleteEntry(dbus::ObjectPath(kUser1ProfilePath
), "old_entry_path", _
, _
));
640 EXPECT_CALL(*mock_manager_client_
,
641 ConfigureServiceForProfile(
642 dbus::ObjectPath(kUser1ProfilePath
),
643 IsEqualTo(expected_shill_properties
.get()),
646 SetPolicy(::onc::ONC_SOURCE_USER_POLICY
, kUser1
, "policy/policy_wifi1.onc");
647 message_loop_
.RunUntilIdle();
650 // Old ChromeOS versions may not have used the UIData property
651 TEST_F(ManagedNetworkConfigurationHandlerTest
,
652 SetPolicyManageUnmanagedWithoutUIData
) {
653 InitializeStandardProfiles();
654 SetUpEntry("policy/shill_unmanaged_wifi1.json",
658 scoped_ptr
<base::DictionaryValue
> expected_shill_properties
=
659 test_utils::ReadTestDictionary(
660 "policy/shill_policy_on_unmanaged_wifi1.json");
662 EXPECT_CALL(*mock_profile_client_
,
663 GetProperties(dbus::ObjectPath(kUser1ProfilePath
), _
, _
));
666 *mock_profile_client_
,
667 GetEntry(dbus::ObjectPath(kUser1ProfilePath
), "old_entry_path", _
, _
));
670 *mock_profile_client_
,
671 DeleteEntry(dbus::ObjectPath(kUser1ProfilePath
), "old_entry_path", _
, _
));
673 EXPECT_CALL(*mock_manager_client_
,
674 ConfigureServiceForProfile(
675 dbus::ObjectPath(kUser1ProfilePath
),
676 IsEqualTo(expected_shill_properties
.get()),
679 SetPolicy(::onc::ONC_SOURCE_USER_POLICY
, kUser1
, "policy/policy_wifi1.onc");
680 message_loop_
.RunUntilIdle();
683 TEST_F(ManagedNetworkConfigurationHandlerTest
, SetPolicyUpdateManagedNewGUID
) {
684 InitializeStandardProfiles();
685 SetUpEntry("policy/shill_managed_wifi1.json",
689 scoped_ptr
<base::DictionaryValue
> expected_shill_properties
=
690 test_utils::ReadTestDictionary(
691 "policy/shill_policy_on_unmanaged_wifi1.json");
693 // The passphrase isn't sent again, because it's configured by the user and
694 // Shill doesn't send it on GetProperties calls.
695 expected_shill_properties
->RemoveWithoutPathExpansion(
696 shill::kPassphraseProperty
, NULL
);
698 EXPECT_CALL(*mock_profile_client_
,
699 GetProperties(dbus::ObjectPath(kUser1ProfilePath
), _
, _
));
702 *mock_profile_client_
,
703 GetEntry(dbus::ObjectPath(kUser1ProfilePath
), "old_entry_path", _
, _
));
706 *mock_profile_client_
,
707 DeleteEntry(dbus::ObjectPath(kUser1ProfilePath
), "old_entry_path", _
, _
));
709 EXPECT_CALL(*mock_manager_client_
,
710 ConfigureServiceForProfile(
711 dbus::ObjectPath(kUser1ProfilePath
),
712 IsEqualTo(expected_shill_properties
.get()),
715 SetPolicy(::onc::ONC_SOURCE_USER_POLICY
, kUser1
, "policy/policy_wifi1.onc");
716 message_loop_
.RunUntilIdle();
719 TEST_F(ManagedNetworkConfigurationHandlerTest
, SetPolicyUpdateManagedVPN
) {
720 InitializeStandardProfiles();
721 SetUpEntry("policy/shill_managed_vpn.json", kUser1ProfilePath
, "entry_path");
723 scoped_ptr
<base::DictionaryValue
> expected_shill_properties
=
724 test_utils::ReadTestDictionary(
725 "policy/shill_policy_on_managed_vpn.json");
727 EXPECT_CALL(*mock_profile_client_
,
728 GetProperties(dbus::ObjectPath(kUser1ProfilePath
), _
, _
));
731 *mock_profile_client_
,
732 GetEntry(dbus::ObjectPath(kUser1ProfilePath
), "entry_path", _
, _
));
734 EXPECT_CALL(*mock_manager_client_
,
735 ConfigureServiceForProfile(
736 dbus::ObjectPath(kUser1ProfilePath
),
737 IsEqualTo(expected_shill_properties
.get()),
740 SetPolicy(::onc::ONC_SOURCE_USER_POLICY
, kUser1
, "policy/policy_vpn.onc");
741 message_loop_
.RunUntilIdle();
742 VerifyAndClearExpectations();
745 TEST_F(ManagedNetworkConfigurationHandlerTest
, SetPolicyReapplyToManaged
) {
746 InitializeStandardProfiles();
747 SetUpEntry("policy/shill_policy_on_unmanaged_wifi1.json",
751 scoped_ptr
<base::DictionaryValue
> expected_shill_properties
=
752 test_utils::ReadTestDictionary(
753 "policy/shill_policy_on_unmanaged_wifi1.json");
755 // The passphrase isn't sent again, because it's configured by the user and
756 // Shill doesn't send it on GetProperties calls.
757 expected_shill_properties
->RemoveWithoutPathExpansion(
758 shill::kPassphraseProperty
, NULL
);
760 EXPECT_CALL(*mock_profile_client_
,
761 GetProperties(dbus::ObjectPath(kUser1ProfilePath
), _
, _
));
764 *mock_profile_client_
,
765 GetEntry(dbus::ObjectPath(kUser1ProfilePath
), "old_entry_path", _
, _
));
767 EXPECT_CALL(*mock_manager_client_
,
768 ConfigureServiceForProfile(
769 dbus::ObjectPath(kUser1ProfilePath
),
770 IsEqualTo(expected_shill_properties
.get()),
773 SetPolicy(::onc::ONC_SOURCE_USER_POLICY
, kUser1
, "policy/policy_wifi1.onc");
774 message_loop_
.RunUntilIdle();
775 VerifyAndClearExpectations();
777 // If we apply the policy again, without change, then the Shill profile will
779 EXPECT_CALL(*mock_profile_client_
,
780 GetProperties(dbus::ObjectPath(kUser1ProfilePath
), _
, _
));
783 *mock_profile_client_
,
784 GetEntry(dbus::ObjectPath(kUser1ProfilePath
), "old_entry_path", _
, _
));
786 SetPolicy(::onc::ONC_SOURCE_USER_POLICY
, kUser1
, "policy/policy_wifi1.onc");
787 message_loop_
.RunUntilIdle();
790 TEST_F(ManagedNetworkConfigurationHandlerTest
, SetPolicyUnmanageManaged
) {
791 InitializeStandardProfiles();
792 SetUpEntry("policy/shill_policy_on_unmanaged_wifi1.json",
796 EXPECT_CALL(*mock_profile_client_
,
797 GetProperties(dbus::ObjectPath(kUser1ProfilePath
), _
, _
));
799 EXPECT_CALL(*mock_profile_client_
,
800 GetEntry(dbus::ObjectPath(kUser1ProfilePath
),
804 EXPECT_CALL(*mock_profile_client_
,
805 DeleteEntry(dbus::ObjectPath(kUser1ProfilePath
),
809 SetPolicy(::onc::ONC_SOURCE_USER_POLICY
, kUser1
, "");
810 message_loop_
.RunUntilIdle();
813 TEST_F(ManagedNetworkConfigurationHandlerTest
, SetEmptyPolicyIgnoreUnmanaged
) {
814 InitializeStandardProfiles();
815 SetUpEntry("policy/shill_unmanaged_wifi1.json",
819 EXPECT_CALL(*mock_profile_client_
,
820 GetProperties(dbus::ObjectPath(kUser1ProfilePath
), _
, _
));
822 EXPECT_CALL(*mock_profile_client_
,
823 GetEntry(dbus::ObjectPath(kUser1ProfilePath
),
827 SetPolicy(::onc::ONC_SOURCE_USER_POLICY
, kUser1
, "");
828 message_loop_
.RunUntilIdle();
829 EXPECT_EQ(1, policy_observer_
.GetPoliciesAppliedCountAndReset());
832 TEST_F(ManagedNetworkConfigurationHandlerTest
, SetPolicyIgnoreUnmanaged
) {
833 InitializeStandardProfiles();
834 SetUpEntry("policy/shill_unmanaged_wifi2.json",
838 EXPECT_CALL(*mock_profile_client_
,
839 GetProperties(dbus::ObjectPath(kUser1ProfilePath
), _
, _
));
842 *mock_profile_client_
,
843 GetEntry(dbus::ObjectPath(kUser1ProfilePath
), "wifi2_entry_path", _
, _
));
845 scoped_ptr
<base::DictionaryValue
> expected_shill_properties
=
846 test_utils::ReadTestDictionary(
847 "policy/shill_policy_on_unconfigured_wifi1.json");
849 EXPECT_CALL(*mock_manager_client_
,
850 ConfigureServiceForProfile(
851 dbus::ObjectPath(kUser1ProfilePath
),
852 IsEqualTo(expected_shill_properties
.get()),
855 SetPolicy(::onc::ONC_SOURCE_USER_POLICY
, kUser1
, "policy/policy_wifi1.onc");
856 message_loop_
.RunUntilIdle();
859 TEST_F(ManagedNetworkConfigurationHandlerTest
, AutoConnectDisallowed
) {
860 InitializeStandardProfiles();
861 // Setup an unmanaged network.
862 SetUpEntry("policy/shill_unmanaged_wifi2.json",
866 // Apply the user policy with global autoconnect config and expect that
867 // autoconnect is disabled in the network's profile entry.
868 EXPECT_CALL(*mock_profile_client_
,
869 GetProperties(dbus::ObjectPath(kUser1ProfilePath
), _
, _
));
872 *mock_profile_client_
,
873 GetEntry(dbus::ObjectPath(kUser1ProfilePath
), "wifi2_entry_path", _
, _
));
875 scoped_ptr
<base::DictionaryValue
> expected_shill_properties
=
876 test_utils::ReadTestDictionary(
877 "policy/shill_disallow_autoconnect_on_unmanaged_wifi2.json");
879 EXPECT_CALL(*mock_manager_client_
,
880 ConfigureServiceForProfile(
881 dbus::ObjectPath(kUser1ProfilePath
),
882 MatchesProperties(expected_shill_properties
.get()), _
, _
));
884 SetPolicy(::onc::ONC_SOURCE_USER_POLICY
,
886 "policy/policy_disallow_autoconnect.onc");
887 message_loop_
.RunUntilIdle();
889 // Verify that GetManagedProperties correctly augments the properties with the
890 // global config from the user policy.
892 // GetManagedProperties requires the device policy to be set or explicitly
894 EXPECT_CALL(*mock_profile_client_
,
895 GetProperties(dbus::ObjectPath(
896 NetworkProfileHandler::GetSharedProfilePath()),
899 managed_handler()->SetPolicy(
900 ::onc::ONC_SOURCE_DEVICE_POLICY
,
901 std::string(), // no userhash
902 base::ListValue(), // no device network policy
903 base::DictionaryValue()); // no device global config
905 services_stub_
.SetFakeProperties(*expected_shill_properties
);
906 EXPECT_CALL(*mock_service_client_
,
907 GetProperties(dbus::ObjectPath(
910 GetManagedProperties(kUser1
, "wifi2");
911 message_loop_
.RunUntilIdle();
913 EXPECT_EQ("wifi2", get_properties_service_path_
);
915 scoped_ptr
<base::DictionaryValue
> expected_managed_onc
=
916 test_utils::ReadTestDictionary(
917 "policy/managed_onc_disallow_autoconnect_on_unmanaged_wifi2.onc");
918 EXPECT_TRUE(onc::test_utils::Equals(expected_managed_onc
.get(),
919 &get_properties_result_
));
922 TEST_F(ManagedNetworkConfigurationHandlerTest
, LateProfileLoading
) {
923 SetPolicy(::onc::ONC_SOURCE_USER_POLICY
, kUser1
, "policy/policy_wifi1.onc");
925 message_loop_
.RunUntilIdle();
926 VerifyAndClearExpectations();
928 scoped_ptr
<base::DictionaryValue
> expected_shill_properties
=
929 test_utils::ReadTestDictionary(
930 "policy/shill_policy_on_unconfigured_wifi1.json");
932 EXPECT_CALL(*mock_profile_client_
,
933 GetProperties(dbus::ObjectPath(kUser1ProfilePath
), _
, _
));
935 EXPECT_CALL(*mock_manager_client_
,
936 ConfigureServiceForProfile(
937 dbus::ObjectPath(kUser1ProfilePath
),
938 IsEqualTo(expected_shill_properties
.get()),
941 InitializeStandardProfiles();
942 message_loop_
.RunUntilIdle();
945 class ManagedNetworkConfigurationHandlerShutdownTest
946 : public ManagedNetworkConfigurationHandlerTest
{
948 void SetUp() override
{
949 ManagedNetworkConfigurationHandlerTest::SetUp();
950 ON_CALL(*mock_profile_client_
, GetProperties(_
, _
, _
)).WillByDefault(
951 Invoke(&ManagedNetworkConfigurationHandlerShutdownTest::GetProperties
));
954 static void GetProperties(
955 const dbus::ObjectPath
& profile_path
,
956 const ShillClientHelper::DictionaryValueCallbackWithoutStatus
& callback
,
957 const ShillClientHelper::ErrorCallback
& error_callback
) {
958 base::ThreadTaskRunnerHandle::Get()->PostTask(
959 FROM_HERE
, base::Bind(ManagedNetworkConfigurationHandlerShutdownTest::
960 CallbackWithEmptyDictionary
,
964 static void CallbackWithEmptyDictionary(
965 const ShillClientHelper::DictionaryValueCallbackWithoutStatus
& callback
) {
966 callback
.Run(base::DictionaryValue());
970 TEST_F(ManagedNetworkConfigurationHandlerShutdownTest
,
971 DuringPolicyApplication
) {
972 InitializeStandardProfiles();
974 EXPECT_CALL(*mock_profile_client_
,
975 GetProperties(dbus::ObjectPath(kUser1ProfilePath
), _
, _
));
977 SetPolicy(::onc::ONC_SOURCE_USER_POLICY
, kUser1
, "policy/policy_wifi1.onc");
978 managed_network_configuration_handler_
->RemoveObserver(&policy_observer_
);
979 managed_network_configuration_handler_
.reset();
980 message_loop_
.RunUntilIdle();
983 } // namespace chromeos