Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(180)

Side by Side Diff: chromeos/network/network_state_handler_unittest.cc

Issue 2945643002: [CrOS Tether] Sort Tether network lists. (Closed)
Patch Set: stevenjb@ comments. Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chromeos/network/network_state_handler.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chromeos/network/network_state_handler.h" 5 #include "chromeos/network/network_state_handler.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm>
9 #include <map> 10 #include <map>
10 #include <memory> 11 #include <memory>
11 #include <set> 12 #include <set>
12 #include <string> 13 #include <string>
13 14
14 #include "base/bind.h" 15 #include "base/bind.h"
15 #include "base/command_line.h" 16 #include "base/command_line.h"
16 #include "base/macros.h" 17 #include "base/macros.h"
17 #include "base/run_loop.h" 18 #include "base/run_loop.h"
18 #include "base/test/scoped_task_environment.h" 19 #include "base/test/scoped_task_environment.h"
19 #include "base/values.h" 20 #include "base/values.h"
20 #include "chromeos/chromeos_switches.h" 21 #include "chromeos/chromeos_switches.h"
21 #include "chromeos/dbus/dbus_thread_manager.h" 22 #include "chromeos/dbus/dbus_thread_manager.h"
22 #include "chromeos/dbus/shill_device_client.h" 23 #include "chromeos/dbus/shill_device_client.h"
23 #include "chromeos/dbus/shill_ipconfig_client.h" 24 #include "chromeos/dbus/shill_ipconfig_client.h"
24 #include "chromeos/dbus/shill_manager_client.h" 25 #include "chromeos/dbus/shill_manager_client.h"
25 #include "chromeos/dbus/shill_profile_client.h" 26 #include "chromeos/dbus/shill_profile_client.h"
26 #include "chromeos/dbus/shill_service_client.h" 27 #include "chromeos/dbus/shill_service_client.h"
27 #include "chromeos/network/device_state.h" 28 #include "chromeos/network/device_state.h"
28 #include "chromeos/network/network_state.h" 29 #include "chromeos/network/network_state.h"
29 #include "chromeos/network/network_state_handler.h" 30 #include "chromeos/network/network_state_handler.h"
30 #include "chromeos/network/network_state_handler_observer.h" 31 #include "chromeos/network/network_state_handler_observer.h"
31 #include "chromeos/network/tether_constants.h" 32 #include "chromeos/network/tether_constants.h"
32 #include "dbus/object_path.h" 33 #include "dbus/object_path.h"
33 #include "testing/gtest/include/gtest/gtest.h" 34 #include "testing/gtest/include/gtest/gtest.h"
34 #include "third_party/cros_system_api/dbus/service_constants.h" 35 #include "third_party/cros_system_api/dbus/service_constants.h"
35 36
37 namespace chromeos {
38
36 namespace { 39 namespace {
37 40
38 void ErrorCallbackFunction(const std::string& error_name, 41 void ErrorCallbackFunction(const std::string& error_name,
39 const std::string& error_message) { 42 const std::string& error_message) {
40 LOG(ERROR) << "Shill Error: " << error_name << " : " << error_message; 43 LOG(ERROR) << "Shill Error: " << error_name << " : " << error_message;
41 } 44 }
42 45
43 const char kShillManagerClientStubWifiDevice[] = "/device/stub_wifi_device1"; 46 const char kShillManagerClientStubWifiDevice[] = "/device/stub_wifi_device1";
44 const char kShillManagerClientStubCellularDevice[] = 47 const char kShillManagerClientStubCellularDevice[] =
45 "/device/stub_cellular_device1"; 48 "/device/stub_cellular_device1";
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 std::string default_network_; 195 std::string default_network_;
193 std::string default_network_connection_state_; 196 std::string default_network_connection_state_;
194 std::map<std::string, int> property_updates_; 197 std::map<std::string, int> property_updates_;
195 std::map<std::string, int> device_property_updates_; 198 std::map<std::string, int> device_property_updates_;
196 std::map<std::string, int> connection_state_changes_; 199 std::map<std::string, int> connection_state_changes_;
197 std::map<std::string, std::string> network_connection_state_; 200 std::map<std::string, std::string> network_connection_state_;
198 201
199 DISALLOW_COPY_AND_ASSIGN(TestObserver); 202 DISALLOW_COPY_AND_ASSIGN(TestObserver);
200 }; 203 };
201 204
205 class TestTetherSortDelegate : public NetworkStateHandler::TetherSortDelegate {
206 public:
207 TestTetherSortDelegate() {}
208 ~TestTetherSortDelegate() {}
209
210 // NetworkStateHandler::TetherSortDelegate:
211 void SortTetherNetworkList(
212 NetworkStateHandler::ManagedStateList* tether_networks) const override {
213 std::sort(tether_networks->begin(), tether_networks->end(),
214 [](const std::unique_ptr<ManagedState>& first,
215 const std::unique_ptr<ManagedState>& second) {
216 const NetworkState* first_network =
217 static_cast<const NetworkState*>(first.get());
218 const NetworkState* second_network =
219 static_cast<const NetworkState*>(second.get());
220
221 // Sort by reverse-alphabetical order of GUIDs.
222 return first_network->guid() >= second_network->guid();
223 });
224 }
225
226 private:
227 DISALLOW_COPY_AND_ASSIGN(TestTetherSortDelegate);
228 };
229
202 } // namespace 230 } // namespace
203 231
204 namespace chromeos {
205
206 class NetworkStateHandlerTest : public testing::Test { 232 class NetworkStateHandlerTest : public testing::Test {
207 public: 233 public:
208 NetworkStateHandlerTest() 234 NetworkStateHandlerTest()
209 : scoped_task_environment_( 235 : scoped_task_environment_(
210 base::test::ScopedTaskEnvironment::MainThreadType::UI), 236 base::test::ScopedTaskEnvironment::MainThreadType::UI),
211 device_test_(nullptr), 237 device_test_(nullptr),
212 manager_test_(nullptr), 238 manager_test_(nullptr),
213 profile_test_(nullptr), 239 profile_test_(nullptr),
214 service_test_(nullptr) {} 240 service_test_(nullptr) {}
215 ~NetworkStateHandlerTest() override {} 241 ~NetworkStateHandlerTest() override {}
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 void SetServiceProperty(const std::string& service_path, 321 void SetServiceProperty(const std::string& service_path,
296 const std::string& key, 322 const std::string& key,
297 const base::Value& value) { 323 const base::Value& value) {
298 DBusThreadManager::Get()->GetShillServiceClient()->SetProperty( 324 DBusThreadManager::Get()->GetShillServiceClient()->SetProperty(
299 dbus::ObjectPath(service_path), key, value, 325 dbus::ObjectPath(service_path), key, value,
300 base::Bind(&base::DoNothing), base::Bind(&ErrorCallbackFunction)); 326 base::Bind(&base::DoNothing), base::Bind(&ErrorCallbackFunction));
301 } 327 }
302 328
303 void GetTetherNetworkList(int limit, 329 void GetTetherNetworkList(int limit,
304 NetworkStateHandler::NetworkStateList* list) { 330 NetworkStateHandler::NetworkStateList* list) {
305 network_state_handler_->GetTetherNetworkList(limit, list); 331 network_state_handler_->GetNetworkListByType(
332 NetworkTypePattern::Tether(), false /* configured_only */,
333 false /* visible_only */, limit, list);
306 } 334 }
307 335
308 base::test::ScopedTaskEnvironment scoped_task_environment_; 336 base::test::ScopedTaskEnvironment scoped_task_environment_;
309 std::unique_ptr<NetworkStateHandler> network_state_handler_; 337 std::unique_ptr<NetworkStateHandler> network_state_handler_;
310 std::unique_ptr<TestObserver> test_observer_; 338 std::unique_ptr<TestObserver> test_observer_;
311 ShillDeviceClient::TestInterface* device_test_; 339 ShillDeviceClient::TestInterface* device_test_;
312 ShillManagerClient::TestInterface* manager_test_; 340 ShillManagerClient::TestInterface* manager_test_;
313 ShillProfileClient::TestInterface* profile_test_; 341 ShillProfileClient::TestInterface* profile_test_;
314 ShillServiceClient::TestInterface* service_test_; 342 ShillServiceClient::TestInterface* service_test_;
315 343
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
456 kTetherGuid2, kTetherName2, kTetherCarrier2, kTetherBatteryPercentage2, 484 kTetherGuid2, kTetherName2, kTetherCarrier2, kTetherBatteryPercentage2,
457 kTetherSignalStrength2, kTetherHasConnectedToHost2); 485 kTetherSignalStrength2, kTetherHasConnectedToHost2);
458 486
459 GetTetherNetworkList(0 /* no limit */, &tether_networks); 487 GetTetherNetworkList(0 /* no limit */, &tether_networks);
460 EXPECT_EQ(2u, tether_networks.size()); 488 EXPECT_EQ(2u, tether_networks.size());
461 489
462 GetTetherNetworkList(1 /* no limit */, &tether_networks); 490 GetTetherNetworkList(1 /* no limit */, &tether_networks);
463 EXPECT_EQ(1u, tether_networks.size()); 491 EXPECT_EQ(1u, tether_networks.size());
464 } 492 }
465 493
494 TEST_F(NetworkStateHandlerTest, SortTetherNetworkList) {
495 network_state_handler_->SetTetherTechnologyState(
496 NetworkStateHandler::TECHNOLOGY_ENABLED);
497
498 TestTetherSortDelegate sort_delegate;
499 network_state_handler_->set_tether_sort_delegate(&sort_delegate);
500
501 network_state_handler_->AddTetherNetworkState(
502 kTetherGuid1, kTetherName1, kTetherCarrier1, kTetherBatteryPercentage1,
503 kTetherSignalStrength1, kTetherHasConnectedToHost1);
504 network_state_handler_->AddTetherNetworkState(
505 kTetherGuid2, kTetherName2, kTetherCarrier2, kTetherBatteryPercentage2,
506 kTetherSignalStrength2, kTetherHasConnectedToHost2);
507
508 // Note: GetVisibleNetworkListByType() sorts before outputting networks.
509 NetworkStateHandler::NetworkStateList tether_networks;
510 network_state_handler_->GetVisibleNetworkListByType(
511 NetworkTypePattern::Tether(), &tether_networks);
512
513 // The list should have been reversed due to reverse-alphabetical sorting.
514 EXPECT_EQ(2u, tether_networks.size());
515 EXPECT_EQ(kTetherGuid2, tether_networks[0]->guid());
516 EXPECT_EQ(kTetherGuid1, tether_networks[1]->guid());
517 }
518
519 TEST_F(NetworkStateHandlerTest, SortTetherNetworkList_NoSortingDelegate) {
520 network_state_handler_->SetTetherTechnologyState(
521 NetworkStateHandler::TECHNOLOGY_ENABLED);
522
523 // Do not set a TetherSortDelegate.
524
525 network_state_handler_->AddTetherNetworkState(
526 kTetherGuid1, kTetherName1, kTetherCarrier1, kTetherBatteryPercentage1,
527 kTetherSignalStrength1, kTetherHasConnectedToHost1);
528 network_state_handler_->AddTetherNetworkState(
529 kTetherGuid2, kTetherName2, kTetherCarrier2, kTetherBatteryPercentage2,
530 kTetherSignalStrength2, kTetherHasConnectedToHost2);
531
532 // Note: GetVisibleNetworkListByType() sorts before outputting networks.
533 NetworkStateHandler::NetworkStateList tether_networks;
534 network_state_handler_->GetVisibleNetworkListByType(
535 NetworkTypePattern::Tether(), &tether_networks);
536
537 // The list should be in the original order.
538 EXPECT_EQ(2u, tether_networks.size());
539 EXPECT_EQ(kTetherGuid1, tether_networks[0]->guid());
540 EXPECT_EQ(kTetherGuid2, tether_networks[1]->guid());
541 }
542
543 TEST_F(NetworkStateHandlerTest,
544 GetNetworks_TetherIncluded_ActiveBeforeInactive) {
545 network_state_handler_->SetTetherTechnologyState(
546 NetworkStateHandler::TECHNOLOGY_ENABLED);
547
548 TestTetherSortDelegate sort_delegate;
549 network_state_handler_->set_tether_sort_delegate(&sort_delegate);
550
551 // To start the test, |eth1| and |wifi1| are connected, while |wifi2| and
552 // |cellular| are not.
553 const std::string eth1 = kShillManagerClientStubDefaultService;
554 const std::string wifi1 = kShillManagerClientStubDefaultWifi;
555 const std::string wifi2 = kShillManagerClientStubWifi2;
556 const std::string cellular = kShillManagerClientStubCellular;
557
558 // Disconnect |wifi1|, which will serve as the underlying connection
559 // for the Tether network under test.
560 service_test_->SetServiceProperty(wifi1, shill::kStateProperty,
561 base::Value(shill::kStateIdle));
562
563 // Connect |cellular| for this test.
564 service_test_->SetServiceProperty(cellular, shill::kStateProperty,
565 base::Value(shill::kStateOnline));
566 base::RunLoop().RunUntilIdle();
567
568 // Add two Tether networks. Neither is connected yet.
569 network_state_handler_->AddTetherNetworkState(
570 kTetherGuid1, kTetherName1, kTetherCarrier1, kTetherBatteryPercentage1,
571 kTetherSignalStrength1, kTetherHasConnectedToHost1);
572 network_state_handler_->AddTetherNetworkState(
573 kTetherGuid2, kTetherName2, kTetherCarrier2, kTetherBatteryPercentage2,
574 kTetherSignalStrength2, kTetherHasConnectedToHost2);
575
576 // Connect to the first Tether network (and the underlying Wi-Fi hotspot
577 // network, |wifi1|).
578 network_state_handler_->SetTetherNetworkStateConnecting(kTetherGuid1);
579 network_state_handler_->AssociateTetherNetworkStateWithWifiNetwork(
580 kTetherGuid1, "wifi1_guid");
581 service_test_->SetServiceProperty(wifi1, shill::kStateProperty,
582 base::Value(shill::kStateOnline));
583 base::RunLoop().RunUntilIdle();
584 network_state_handler_->SetTetherNetworkStateConnected(kTetherGuid1);
585
586 // At this point, |eth1|, |cellular|, and |kTetherGuid1| are connected.
587 // |wifi1| is also connected, but it is not considered visible since it is the
588 // underlying network for the Tether connection.
589 NetworkStateHandler::NetworkStateList list;
590
591 // Get Tether networks. Even though the networks should be sorted according to
592 // reverse-alphabetical order, |kTetherGuid1| should be listed first since it
593 // is active.
594 network_state_handler_->GetVisibleNetworkListByType(
595 NetworkTypePattern::Tether(), &list);
596 ASSERT_EQ(2u, list.size());
597 EXPECT_EQ(kTetherGuid1, list[0]->guid());
598 EXPECT_EQ(kTetherGuid2, list[1]->guid());
599
600 // Get Mobile networks. The connected Tether network should be first, followed
601 // by the connected Cellular network, followed by the non-connected Tether
602 // network.
603 network_state_handler_->GetVisibleNetworkListByType(
604 NetworkTypePattern::Mobile(), &list);
605 ASSERT_EQ(3u, list.size());
606 EXPECT_EQ(kTetherGuid1, list[0]->guid());
607 EXPECT_EQ(cellular, list[1]->path());
608 EXPECT_EQ(kTetherGuid2, list[2]->guid());
609
610 // Get all networks. The connected Ethernet network should be first, followed
611 // by the connected Tether network, followed by the connected Cellular
612 // network, followed by the non-connected Tether network, followed by the
613 // non-connected Wi-Fi network.
614 network_state_handler_->GetVisibleNetworkListByType(
615 NetworkTypePattern::Default(), &list);
616 EXPECT_EQ(5u, list.size());
617 EXPECT_EQ(eth1, list[0]->path());
618 EXPECT_EQ(kTetherGuid1, list[1]->guid());
619 EXPECT_EQ(cellular, list[2]->path());
620 EXPECT_EQ(kTetherGuid2, list[3]->guid());
621 EXPECT_EQ(wifi2, list[4]->path());
622 }
623
466 TEST_F(NetworkStateHandlerTest, NetworkListChanged) { 624 TEST_F(NetworkStateHandlerTest, NetworkListChanged) {
467 size_t stub_network_count = test_observer_->network_count(); 625 size_t stub_network_count = test_observer_->network_count();
468 // Set up two additional visible networks. 626 // Set up two additional visible networks.
469 const std::string wifi3 = "/service/wifi3"; 627 const std::string wifi3 = "/service/wifi3";
470 const std::string wifi4 = "/service/wifi4"; 628 const std::string wifi4 = "/service/wifi4";
471 service_test_->SetServiceProperties( 629 service_test_->SetServiceProperties(
472 wifi3, "wifi3_guid", "wifi3", 630 wifi3, "wifi3_guid", "wifi3",
473 shill::kTypeWifi, shill::kStateIdle, true /* visible */); 631 shill::kTypeWifi, shill::kStateIdle, true /* visible */);
474 service_test_->SetServiceProperties( 632 service_test_->SetServiceProperties(
475 wifi4, "wifi4_guid", "wifi4", 633 wifi4, "wifi4_guid", "wifi4",
(...skipping 1013 matching lines...) Expand 10 before | Expand all | Expand 10 after
1489 shill::kIPConfigProperty, 1647 shill::kIPConfigProperty,
1490 base::Value(kIPConfigPath)); 1648 base::Value(kIPConfigPath));
1491 UpdateManagerProperties(); 1649 UpdateManagerProperties();
1492 EXPECT_EQ(1, test_observer_->PropertyUpdatesForDevice( 1650 EXPECT_EQ(1, test_observer_->PropertyUpdatesForDevice(
1493 kShillManagerClientStubWifiDevice)); 1651 kShillManagerClientStubWifiDevice));
1494 EXPECT_EQ(1, test_observer_->PropertyUpdatesForService( 1652 EXPECT_EQ(1, test_observer_->PropertyUpdatesForService(
1495 kShillManagerClientStubDefaultWifi)); 1653 kShillManagerClientStubDefaultWifi));
1496 } 1654 }
1497 1655
1498 } // namespace chromeos 1656 } // namespace chromeos
OLDNEW
« no previous file with comments | « chromeos/network/network_state_handler.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698