network_detailed_view_controller_unittest.cc 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631
  1. // Copyright 2022 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.
  4. #include "ash/system/network/network_detailed_view_controller.h"
  5. #include <memory>
  6. #include "ash/constants/ash_features.h"
  7. #include "ash/public/cpp/test/test_system_tray_client.h"
  8. #include "ash/shell.h"
  9. #include "ash/system/network/network_utils.h"
  10. #include "ash/test/ash_test_base.h"
  11. #include "ash/test/ash_test_helper.h"
  12. #include "base/strings/strcat.h"
  13. #include "base/test/metrics/histogram_tester.h"
  14. #include "base/test/metrics/user_action_tester.h"
  15. #include "base/test/scoped_feature_list.h"
  16. #include "chromeos/ash/components/network/network_connect.h"
  17. #include "chromeos/ash/components/network/network_handler.h"
  18. #include "chromeos/ash/components/network/network_state_handler.h"
  19. #include "chromeos/services/bluetooth_config/fake_adapter_state_controller.h"
  20. #include "chromeos/services/bluetooth_config/scoped_bluetooth_config_test_helper.h"
  21. #include "chromeos/services/network_config/public/cpp/cros_network_config_test_helper.h"
  22. #include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
  23. namespace ash {
  24. namespace {
  25. using chromeos::network_config::mojom::ActivationStateType;
  26. using chromeos::network_config::mojom::ConnectionStateType;
  27. using chromeos::network_config::mojom::NetworkStatePropertiesPtr;
  28. using chromeos::network_config::mojom::NetworkType;
  29. using chromeos::bluetooth_config::ScopedBluetoothConfigTestHelper;
  30. using chromeos::bluetooth_config::mojom::BluetoothSystemState;
  31. const std::string kCellular = "cellular";
  32. constexpr char kCellularDevicePath[] = "/device/cellular_device";
  33. constexpr char kWifi[] = "Wifi";
  34. constexpr char kTetherName[] = "tether";
  35. constexpr char kTetherGuid[] = "tetherNetworkGuid";
  36. constexpr char kTetherCarrier[] = "TetherNetworkCarrier";
  37. constexpr char kWifiServiceGuid[] = "wifiServiceGuid";
  38. constexpr char kServicePatternTetherWiFi[] = R"({
  39. "GUID": "%s", "Type": "wifi", "State": "ready"})";
  40. const int kSignalStrength = 50;
  41. constexpr char kUser1Email[] = "user1@quicksettings.com";
  42. constexpr char kNetworkConnectConfigured[] =
  43. "StatusArea_Network_ConnectConfigured";
  44. constexpr char kNetworkConnectionDetails[] =
  45. "StatusArea_Network_ConnectionDetails";
  46. const std::string kNetworkTechnologyWiFi = "WiFi";
  47. const std::string kNetworkTechnologyMobile = "Mobile";
  48. class NetworkConnectTestDelegate : public NetworkConnect::Delegate {
  49. public:
  50. NetworkConnectTestDelegate() {}
  51. NetworkConnectTestDelegate(const NetworkConnectTestDelegate&) = delete;
  52. NetworkConnectTestDelegate& operator=(const NetworkConnectTestDelegate&) =
  53. delete;
  54. ~NetworkConnectTestDelegate() override {}
  55. void ShowNetworkConfigure(const std::string& network_id) override {}
  56. void ShowNetworkSettings(const std::string& network_id) override {}
  57. bool ShowEnrollNetwork(const std::string& network_id) override {
  58. return false;
  59. }
  60. void ShowMobileSetupDialog(const std::string& network_id) override {}
  61. void ShowCarrierAccountDetail(const std::string& network_id) override {}
  62. void ShowNetworkConnectError(const std::string& error_name,
  63. const std::string& network_id) override {}
  64. void ShowMobileActivationError(const std::string& network_id) override {}
  65. };
  66. } // namespace
  67. class NetworkDetailedViewControllerTest : public AshTestBase {
  68. public:
  69. void SetUp() override {
  70. // Initialize CrosNetworkConfigTestHelper here, so we can initialize
  71. // a unique network handler and also use NetworkConnectTestDelegate to
  72. // initialize NetworkConnect.
  73. network_config_helper_ = std::make_unique<
  74. chromeos::network_config::CrosNetworkConfigTestHelper>();
  75. NetworkHandler::Initialize();
  76. base::RunLoop().RunUntilIdle();
  77. // Creating a service here, since we would be testing that wifi,
  78. // networks which can be connected to are actually connected to. This
  79. // checks that NetworkConnect eventually connects us to the
  80. // network.
  81. wifi_service_path_ =
  82. network_state_helper()->ConfigureService(base::StringPrintf(
  83. R"({"GUID": "%s", "Type": "wifi",
  84. "State": "idle", "Strength": 100,
  85. "Connectable": true})",
  86. kWifi));
  87. network_connect_delegate_ = std::make_unique<NetworkConnectTestDelegate>();
  88. NetworkConnect::Initialize(network_connect_delegate_.get());
  89. AshTestBase::SetUp();
  90. feature_list_.InitAndEnableFeature(features::kQuickSettingsNetworkRevamp);
  91. network_detailed_view_controller_ =
  92. std::make_unique<NetworkDetailedViewController>(
  93. /*tray_controller=*/nullptr);
  94. }
  95. void TearDown() override {
  96. network_detailed_view_controller_.reset();
  97. AshTestBase::TearDown();
  98. NetworkConnect::Shutdown();
  99. NetworkHandler::Shutdown();
  100. network_connect_delegate_.reset();
  101. }
  102. void CheckRowClickedActionHistogramBuckets(NetworkRowClickedAction action,
  103. size_t count,
  104. size_t total_count) {
  105. histogram_tester_.ExpectBucketCount(
  106. "ChromeOS.SystemTray.Network.RowClickedAction", action, count);
  107. histogram_tester_.ExpectTotalCount(
  108. "ChromeOS.SystemTray.Network.RowClickedAction", total_count);
  109. }
  110. void CheckNetworkTypeToggledHistogramBuckets(const std::string& network_type,
  111. bool new_state,
  112. size_t count,
  113. size_t total_count) {
  114. histogram_tester_.ExpectBucketCount(
  115. base::StrCat(
  116. {"ChromeOS.SystemTray.Network.", network_type, ".Toggled"}),
  117. new_state, count);
  118. histogram_tester_.ExpectTotalCount(
  119. base::StrCat(
  120. {"ChromeOS.SystemTray.Network.", network_type, ".Toggled"}),
  121. total_count);
  122. }
  123. void SelectNetworkListItem(const NetworkStatePropertiesPtr& network) {
  124. (static_cast<NetworkDetailedView::Delegate*>(
  125. network_detailed_view_controller_.get()))
  126. ->OnNetworkListItemSelected(mojo::Clone(network));
  127. }
  128. NetworkStatePropertiesPtr CreateStandaloneNetworkProperties(
  129. const std::string& id,
  130. NetworkType type,
  131. ConnectionStateType connection_state) {
  132. return network_config_helper_->CreateStandaloneNetworkProperties(
  133. id, type, connection_state, kSignalStrength);
  134. }
  135. std::string GetWifiNetworkState() {
  136. return network_state_helper()->GetServiceStringProperty(
  137. wifi_service_path_, shill::kStateProperty);
  138. }
  139. void DisconnectWifiNetwork() {
  140. network_state_helper()->SetServiceProperty(
  141. wifi_service_path_, std::string(shill::kStateProperty),
  142. base::Value(shill::kStateIdle));
  143. base::RunLoop().RunUntilIdle();
  144. }
  145. void ToggleWifiState(bool new_state) {
  146. (static_cast<NetworkDetailedNetworkView::Delegate*>(
  147. network_detailed_view_controller_.get()))
  148. ->OnWifiToggleClicked(new_state);
  149. base::RunLoop().RunUntilIdle();
  150. }
  151. void ToggleMobileState(bool new_state) {
  152. (static_cast<NetworkDetailedNetworkView::Delegate*>(
  153. network_detailed_view_controller_.get()))
  154. ->OnMobileToggleClicked(new_state);
  155. base::RunLoop().RunUntilIdle();
  156. }
  157. NetworkStateHandler::TechnologyState GetTechnologyState(
  158. const NetworkTypePattern& network) {
  159. return network_state_handler()->GetTechnologyState(network);
  160. }
  161. void SetTetherTechnologyState(NetworkStateHandler::TechnologyState state) {
  162. network_state_handler()->SetTetherTechnologyState(state);
  163. base::RunLoop().RunUntilIdle();
  164. }
  165. void AddCellularDevice() {
  166. network_state_helper()->manager_test()->AddTechnology(shill::kTypeCellular,
  167. /*enabled=*/true);
  168. network_state_helper()->device_test()->AddDevice(
  169. kCellularDevicePath, shill::kTypeCellular, kCellular);
  170. // Wait for network state and device change events to be handled.
  171. base::RunLoop().RunUntilIdle();
  172. }
  173. void ClearDevices() {
  174. network_state_helper()->ClearDevices();
  175. base::RunLoop().RunUntilIdle();
  176. }
  177. void SetCellularSimLockStatus(const std::string& lock_type, bool sim_locked) {
  178. base::Value sim_lock_status(base::Value::Type::DICTIONARY);
  179. sim_lock_status.SetKey(shill::kSIMLockEnabledProperty,
  180. base::Value(sim_locked));
  181. sim_lock_status.SetKey(shill::kSIMLockTypeProperty, base::Value(lock_type));
  182. sim_lock_status.SetKey(shill::kSIMLockRetriesLeftProperty, base::Value(3));
  183. network_state_helper()->device_test()->SetDeviceProperty(
  184. kCellularDevicePath, shill::kSIMLockStatusProperty,
  185. std::move(sim_lock_status),
  186. /*notify_changed=*/true);
  187. base::RunLoop().RunUntilIdle();
  188. }
  189. // Adds a Tether network state, adds a Wifi network to be used as the Wifi
  190. // hotspot, and associates the two networks.
  191. void AddTetherDevice() {
  192. network_state_handler()->SetTetherTechnologyState(
  193. NetworkStateHandler::TechnologyState::TECHNOLOGY_ENABLED);
  194. network_state_handler()->AddTetherNetworkState(
  195. kTetherGuid, kTetherName, kTetherCarrier, /*battery_percentage=*/100,
  196. kSignalStrength, /*has_connected_to_host=*/false);
  197. network_state_helper()->ConfigureService(
  198. base::StringPrintf(kServicePatternTetherWiFi, kWifiServiceGuid));
  199. network_state_handler()->AssociateTetherNetworkStateWithWifiNetwork(
  200. kTetherGuid, kWifiServiceGuid);
  201. }
  202. void SetBluetoothAdapterState(BluetoothSystemState system_state) {
  203. bluetooth_config_test_helper()
  204. ->fake_adapter_state_controller()
  205. ->SetSystemState(system_state);
  206. base::RunLoop().RunUntilIdle();
  207. }
  208. BluetoothSystemState GetBluetoothAdapterState() {
  209. return bluetooth_config_test_helper()
  210. ->fake_adapter_state_controller()
  211. ->GetAdapterState();
  212. }
  213. private:
  214. NetworkStateHandler* network_state_handler() {
  215. return network_state_helper()->network_state_handler();
  216. }
  217. NetworkStateTestHelper* network_state_helper() {
  218. return &network_config_helper_->network_state_helper();
  219. }
  220. ScopedBluetoothConfigTestHelper* bluetooth_config_test_helper() {
  221. return ash_test_helper()->bluetooth_config_test_helper();
  222. }
  223. base::test::ScopedFeatureList feature_list_;
  224. std::unique_ptr<chromeos::network_config::CrosNetworkConfigTestHelper>
  225. network_config_helper_;
  226. std::unique_ptr<NetworkConnectTestDelegate> network_connect_delegate_;
  227. std::unique_ptr<NetworkDetailedViewController>
  228. network_detailed_view_controller_;
  229. std::string wifi_service_path_;
  230. base::HistogramTester histogram_tester_;
  231. };
  232. TEST_F(NetworkDetailedViewControllerTest,
  233. NetworkListItemSelectedWithLockedScreen) {
  234. base::UserActionTester user_action_tester;
  235. EXPECT_EQ(0, user_action_tester.GetActionCount(kNetworkConnectionDetails));
  236. EXPECT_EQ(0, user_action_tester.GetActionCount(kNetworkConnectConfigured));
  237. CheckRowClickedActionHistogramBuckets(
  238. NetworkRowClickedAction::kOpenNetworkSettingsPage,
  239. /*count=*/0u, /*total_count=*/0u);
  240. NetworkStatePropertiesPtr cellular_network =
  241. CreateStandaloneNetworkProperties(kCellular, NetworkType::kCellular,
  242. ConnectionStateType::kConnected);
  243. EXPECT_EQ(0, GetSystemTrayClient()->show_network_settings_count());
  244. // Set login status to locked.
  245. GetSessionControllerClient()->SetSessionState(
  246. session_manager::SessionState::LOCKED);
  247. SelectNetworkListItem(cellular_network);
  248. EXPECT_EQ(0, GetSystemTrayClient()->show_network_settings_count());
  249. EXPECT_EQ(0, GetSystemTrayClient()->show_sim_unlock_settings_count());
  250. CheckRowClickedActionHistogramBuckets(
  251. NetworkRowClickedAction::kOpenNetworkSettingsPage,
  252. /*count=*/0u, /*total_count=*/0u);
  253. // Show network details page for a connected cellular network.
  254. GetSessionControllerClient()->SetSessionState(
  255. session_manager::SessionState::ACTIVE);
  256. SelectNetworkListItem(cellular_network);
  257. EXPECT_EQ(1, GetSystemTrayClient()->show_network_settings_count());
  258. EXPECT_EQ(0, GetSystemTrayClient()->show_sim_unlock_settings_count());
  259. EXPECT_EQ(1, user_action_tester.GetActionCount(kNetworkConnectionDetails));
  260. EXPECT_EQ(0, user_action_tester.GetActionCount(kNetworkConnectConfigured));
  261. CheckRowClickedActionHistogramBuckets(
  262. NetworkRowClickedAction::kOpenNetworkSettingsPage,
  263. /*count=*/1u, /*total_count=*/1u);
  264. }
  265. TEST_F(NetworkDetailedViewControllerTest, EmptyNetworkListItemSelected) {
  266. base::UserActionTester user_action_tester;
  267. EXPECT_EQ(0, user_action_tester.GetActionCount(kNetworkConnectionDetails));
  268. EXPECT_EQ(0, user_action_tester.GetActionCount(kNetworkConnectConfigured));
  269. EXPECT_EQ(0, GetSystemTrayClient()->show_network_settings_count());
  270. EXPECT_EQ(0, GetSystemTrayClient()->show_sim_unlock_settings_count());
  271. CheckRowClickedActionHistogramBuckets(
  272. NetworkRowClickedAction::kOpenNetworkSettingsPage,
  273. /*count=*/0u, /*total_count=*/0u);
  274. SelectNetworkListItem(/*network=*/nullptr);
  275. EXPECT_EQ(1, GetSystemTrayClient()->show_network_settings_count());
  276. EXPECT_EQ(0, GetSystemTrayClient()->show_sim_unlock_settings_count());
  277. EXPECT_EQ(1, user_action_tester.GetActionCount(kNetworkConnectionDetails));
  278. EXPECT_EQ(0, user_action_tester.GetActionCount(kNetworkConnectConfigured));
  279. CheckRowClickedActionHistogramBuckets(
  280. NetworkRowClickedAction::kOpenNetworkSettingsPage,
  281. /*count=*/1u, /*total_count=*/1u);
  282. }
  283. TEST_F(NetworkDetailedViewControllerTest, CellularNetworkListItemSelected) {
  284. base::UserActionTester user_action_tester;
  285. EXPECT_EQ(0, user_action_tester.GetActionCount(kNetworkConnectionDetails));
  286. EXPECT_EQ(0, user_action_tester.GetActionCount(kNetworkConnectConfigured));
  287. EXPECT_EQ(0, GetSystemTrayClient()->show_network_settings_count());
  288. EXPECT_EQ(0, GetSystemTrayClient()->show_sim_unlock_settings_count());
  289. CheckRowClickedActionHistogramBuckets(
  290. NetworkRowClickedAction::kOpenNetworkSettingsPage,
  291. /*count=*/0u, /*total_count=*/0u);
  292. CheckRowClickedActionHistogramBuckets(
  293. NetworkRowClickedAction::kOpenSimUnlockDialog,
  294. /*count=*/0u, /*total_count=*/0u);
  295. NetworkStatePropertiesPtr cellular_network =
  296. CreateStandaloneNetworkProperties(kCellular, NetworkType::kCellular,
  297. ConnectionStateType::kConnected);
  298. // When cellular eSIM network is not activated open network details page.
  299. cellular_network->connection_state = ConnectionStateType::kNotConnected;
  300. cellular_network->type_state->get_cellular()->activation_state =
  301. ActivationStateType::kNotActivated;
  302. cellular_network->type_state->get_cellular()->eid = "eid";
  303. SelectNetworkListItem(cellular_network);
  304. EXPECT_EQ(1, GetSystemTrayClient()->show_network_settings_count());
  305. EXPECT_EQ(0, GetSystemTrayClient()->show_sim_unlock_settings_count());
  306. EXPECT_EQ(1, user_action_tester.GetActionCount(kNetworkConnectionDetails));
  307. EXPECT_EQ(0, user_action_tester.GetActionCount(kNetworkConnectConfigured));
  308. CheckRowClickedActionHistogramBuckets(
  309. NetworkRowClickedAction::kOpenNetworkSettingsPage,
  310. /*count=*/1u, /*total_count=*/1u);
  311. CheckRowClickedActionHistogramBuckets(
  312. NetworkRowClickedAction::kOpenSimUnlockDialog,
  313. /*count=*/0u, /*total_count=*/1u);
  314. // When cellular network is SIM locked, we show the SIM unlock settings page.
  315. cellular_network->type_state->get_cellular()->sim_locked = true;
  316. SelectNetworkListItem(cellular_network);
  317. EXPECT_EQ(1, GetSystemTrayClient()->show_network_settings_count());
  318. EXPECT_EQ(1, GetSystemTrayClient()->show_sim_unlock_settings_count());
  319. EXPECT_EQ(1, user_action_tester.GetActionCount(kNetworkConnectionDetails));
  320. EXPECT_EQ(0, user_action_tester.GetActionCount(kNetworkConnectConfigured));
  321. CheckRowClickedActionHistogramBuckets(
  322. NetworkRowClickedAction::kOpenNetworkSettingsPage,
  323. /*count=*/1u, /*total_count=*/2u);
  324. CheckRowClickedActionHistogramBuckets(
  325. NetworkRowClickedAction::kOpenSimUnlockDialog,
  326. /*count=*/1u, /*total_count=*/2u);
  327. }
  328. TEST_F(NetworkDetailedViewControllerTest, WifiNetworkListItemSelected) {
  329. base::UserActionTester user_action_tester;
  330. EXPECT_EQ(0, user_action_tester.GetActionCount(kNetworkConnectionDetails));
  331. EXPECT_EQ(0, user_action_tester.GetActionCount(kNetworkConnectConfigured));
  332. EXPECT_EQ(0, GetSystemTrayClient()->show_network_settings_count());
  333. EXPECT_EQ(0, GetSystemTrayClient()->show_sim_unlock_settings_count());
  334. CheckRowClickedActionHistogramBuckets(
  335. NetworkRowClickedAction::kOpenNetworkSettingsPage,
  336. /*count=*/0u, /*total_count=*/0u);
  337. CheckRowClickedActionHistogramBuckets(
  338. NetworkRowClickedAction::kConnectToNetwork,
  339. /*count=*/0u, /*total_count=*/0u);
  340. // Clicking on an already connected network opens settings page.
  341. // Since this network is already connected, selecting this network
  342. // in network list vew should result in no change in NetworkState of
  343. // the network service.
  344. NetworkStatePropertiesPtr wifi_network = CreateStandaloneNetworkProperties(
  345. kWifi, NetworkType::kWiFi, ConnectionStateType::kOnline);
  346. SelectNetworkListItem(wifi_network);
  347. EXPECT_EQ(1, GetSystemTrayClient()->show_network_settings_count());
  348. EXPECT_EQ(0, GetSystemTrayClient()->show_sim_unlock_settings_count());
  349. EXPECT_EQ(1, user_action_tester.GetActionCount(kNetworkConnectionDetails));
  350. EXPECT_EQ(0, user_action_tester.GetActionCount(kNetworkConnectConfigured));
  351. EXPECT_EQ(shill::kStateIdle, GetWifiNetworkState());
  352. CheckRowClickedActionHistogramBuckets(
  353. NetworkRowClickedAction::kOpenNetworkSettingsPage,
  354. /*count=*/1u, /*total_count=*/1u);
  355. CheckRowClickedActionHistogramBuckets(
  356. NetworkRowClickedAction::kConnectToNetwork,
  357. /*count=*/0u, /*total_count=*/1u);
  358. // Set to be connectable and make sure network is connected to.
  359. wifi_network->connection_state = ConnectionStateType::kNotConnected;
  360. wifi_network->connectable = true;
  361. SelectNetworkListItem(wifi_network);
  362. // Wait for Network to be connected to.
  363. base::RunLoop().RunUntilIdle();
  364. EXPECT_EQ(1, GetSystemTrayClient()->show_network_settings_count());
  365. EXPECT_EQ(0, GetSystemTrayClient()->show_sim_unlock_settings_count());
  366. EXPECT_EQ(1, user_action_tester.GetActionCount(kNetworkConnectionDetails));
  367. EXPECT_EQ(1, user_action_tester.GetActionCount(kNetworkConnectConfigured));
  368. EXPECT_EQ(shill::kStateOnline, GetWifiNetworkState());
  369. CheckRowClickedActionHistogramBuckets(
  370. NetworkRowClickedAction::kOpenNetworkSettingsPage,
  371. /*count=*/1u, /*total_count=*/2u);
  372. CheckRowClickedActionHistogramBuckets(
  373. NetworkRowClickedAction::kConnectToNetwork,
  374. /*count=*/1u, /*total_count=*/2u);
  375. // Reset network state to idle.
  376. DisconnectWifiNetwork();
  377. EXPECT_EQ(shill::kStateIdle, GetWifiNetworkState());
  378. // Network can be connected to since active user is primary and the
  379. // network is configurable.
  380. wifi_network->connection_state = ConnectionStateType::kNotConnected;
  381. wifi_network->connectable = false;
  382. SelectNetworkListItem(wifi_network);
  383. // Wait for network to be connected to.
  384. base::RunLoop().RunUntilIdle();
  385. EXPECT_EQ(1, GetSystemTrayClient()->show_network_settings_count());
  386. EXPECT_EQ(0, GetSystemTrayClient()->show_sim_unlock_settings_count());
  387. EXPECT_EQ(1, user_action_tester.GetActionCount(kNetworkConnectionDetails));
  388. EXPECT_EQ(2, user_action_tester.GetActionCount(kNetworkConnectConfigured));
  389. EXPECT_EQ(shill::kStateOnline, GetWifiNetworkState());
  390. CheckRowClickedActionHistogramBuckets(
  391. NetworkRowClickedAction::kOpenNetworkSettingsPage,
  392. /*count=*/1u, /*total_count=*/3u);
  393. CheckRowClickedActionHistogramBuckets(
  394. NetworkRowClickedAction::kConnectToNetwork,
  395. /*count=*/2u, /*total_count=*/3u);
  396. // Reset network to idle.
  397. DisconnectWifiNetwork();
  398. EXPECT_EQ(shill::kStateIdle, GetWifiNetworkState());
  399. // Login as secondary user, and make sure network is not connected to,
  400. // but settings page is opened.
  401. GetSessionControllerClient()->AddUserSession(kUser1Email);
  402. SimulateUserLogin(kUser1Email);
  403. GetSessionControllerClient()->SetSessionState(
  404. session_manager::SessionState::LOGIN_SECONDARY);
  405. base::RunLoop().RunUntilIdle();
  406. SelectNetworkListItem(wifi_network);
  407. EXPECT_EQ(2, GetSystemTrayClient()->show_network_settings_count());
  408. EXPECT_EQ(0, GetSystemTrayClient()->show_sim_unlock_settings_count());
  409. EXPECT_EQ(2, user_action_tester.GetActionCount(kNetworkConnectionDetails));
  410. EXPECT_EQ(2, user_action_tester.GetActionCount(kNetworkConnectConfigured));
  411. EXPECT_EQ(shill::kStateIdle, GetWifiNetworkState());
  412. CheckRowClickedActionHistogramBuckets(
  413. NetworkRowClickedAction::kOpenNetworkSettingsPage,
  414. /*count=*/2u, /*total_count=*/4u);
  415. CheckRowClickedActionHistogramBuckets(
  416. NetworkRowClickedAction::kConnectToNetwork,
  417. /*count=*/2u, /*total_count=*/4u);
  418. }
  419. TEST_F(NetworkDetailedViewControllerTest, WifiStateChange) {
  420. // By default ash test instantiates WiFi networks and enables them.
  421. EXPECT_EQ(NetworkStateHandler::TechnologyState::TECHNOLOGY_ENABLED,
  422. GetTechnologyState(NetworkTypePattern::WiFi()));
  423. CheckNetworkTypeToggledHistogramBuckets(
  424. /*network_type=*/kNetworkTechnologyWiFi,
  425. /*new_state=*/false, /*count=*/0u,
  426. /*total_count=*/0u);
  427. // Disable wifi.
  428. ToggleWifiState(/*new_state=*/false);
  429. CheckNetworkTypeToggledHistogramBuckets(
  430. /*network_type=*/kNetworkTechnologyWiFi,
  431. /*new_state=*/false, /*count=*/1u,
  432. /*total_count=*/1u);
  433. EXPECT_EQ(NetworkStateHandler::TechnologyState::TECHNOLOGY_AVAILABLE,
  434. GetTechnologyState(NetworkTypePattern::WiFi()));
  435. // Renable wifi.
  436. ToggleWifiState(/*new_state=*/true);
  437. CheckNetworkTypeToggledHistogramBuckets(
  438. /*network_type=*/kNetworkTechnologyWiFi,
  439. /*new_state=*/true, /*count=*/1u,
  440. /*total_count=*/2u);
  441. EXPECT_EQ(NetworkStateHandler::TechnologyState::TECHNOLOGY_ENABLED,
  442. GetTechnologyState(NetworkTypePattern::WiFi()));
  443. }
  444. TEST_F(NetworkDetailedViewControllerTest, MobileToggleClicked) {
  445. AddCellularDevice();
  446. CheckNetworkTypeToggledHistogramBuckets(
  447. /*network_type=*/kNetworkTechnologyMobile,
  448. /*new_state=*/false, /*count=*/0u,
  449. /*total_count=*/0u);
  450. EXPECT_EQ(NetworkStateHandler::TechnologyState::TECHNOLOGY_ENABLED,
  451. GetTechnologyState(NetworkTypePattern::Cellular()));
  452. ToggleMobileState(/*new_state=*/false);
  453. CheckNetworkTypeToggledHistogramBuckets(
  454. /*network_type=*/kNetworkTechnologyMobile,
  455. /*new_state=*/false, /*count=*/1u,
  456. /*total_count=*/1u);
  457. EXPECT_EQ(NetworkStateHandler::TechnologyState::TECHNOLOGY_AVAILABLE,
  458. GetTechnologyState(NetworkTypePattern::Cellular()));
  459. EXPECT_EQ(0, GetSystemTrayClient()->show_sim_unlock_settings_count());
  460. // When SIM is locked and new state is being toggled on show SIM unlock
  461. // dialog.
  462. SetCellularSimLockStatus(shill::kSIMLockPin, /*sim_locked=*/true);
  463. ToggleMobileState(/*new_state=*/true);
  464. EXPECT_EQ(1, GetSystemTrayClient()->show_sim_unlock_settings_count());
  465. EXPECT_EQ(NetworkStateHandler::TechnologyState::TECHNOLOGY_AVAILABLE,
  466. GetTechnologyState(NetworkTypePattern::Cellular()));
  467. CheckNetworkTypeToggledHistogramBuckets(
  468. /*network_type=*/kNetworkTechnologyMobile,
  469. /*new_state=*/true, /*count=*/1u,
  470. /*total_count=*/2u);
  471. // When Cellular and Tether are both available toggle should control cellular.
  472. AddTetherDevice();
  473. EXPECT_EQ(NetworkStateHandler::TechnologyState::TECHNOLOGY_ENABLED,
  474. GetTechnologyState(NetworkTypePattern::Tether()));
  475. // Set Tether to available and check toggle updates Cellular.
  476. SetTetherTechnologyState(
  477. NetworkStateHandler::TechnologyState::TECHNOLOGY_AVAILABLE);
  478. SetCellularSimLockStatus(/*lock_type=*/"", /*sim_locked=*/false);
  479. ToggleMobileState(/*new_state=*/true);
  480. EXPECT_EQ(1, GetSystemTrayClient()->show_sim_unlock_settings_count());
  481. EXPECT_EQ(NetworkStateHandler::TechnologyState::TECHNOLOGY_AVAILABLE,
  482. GetTechnologyState(NetworkTypePattern::Tether()));
  483. EXPECT_EQ(NetworkStateHandler::TechnologyState::TECHNOLOGY_ENABLED,
  484. GetTechnologyState(NetworkTypePattern::Cellular()));
  485. CheckNetworkTypeToggledHistogramBuckets(
  486. /*network_type=*/kNetworkTechnologyMobile,
  487. /*new_state=*/true, /*count=*/2u,
  488. /*total_count=*/3u);
  489. ClearDevices();
  490. AddTetherDevice();
  491. // Toggle now controls Tether since there are no Cellular devices.
  492. EXPECT_EQ(NetworkStateHandler::TechnologyState::TECHNOLOGY_ENABLED,
  493. GetTechnologyState(NetworkTypePattern::Tether()));
  494. ToggleMobileState(/*new_state=*/false);
  495. EXPECT_EQ(1, GetSystemTrayClient()->show_sim_unlock_settings_count());
  496. EXPECT_EQ(NetworkStateHandler::TechnologyState::TECHNOLOGY_AVAILABLE,
  497. GetTechnologyState(NetworkTypePattern::Tether()));
  498. CheckNetworkTypeToggledHistogramBuckets(
  499. /*network_type=*/kNetworkTechnologyMobile,
  500. /*new_state=*/false, /*count=*/2u,
  501. /*total_count=*/4u);
  502. // When Tether is uninitialized and Bluetooth is disabled, toggling Mobile on
  503. // should enable Bluetooth.
  504. SetTetherTechnologyState(
  505. NetworkStateHandler::TechnologyState::TECHNOLOGY_UNINITIALIZED);
  506. SetBluetoothAdapterState(BluetoothSystemState::kDisabled);
  507. ToggleMobileState(/*new_state=*/true);
  508. EXPECT_EQ(BluetoothSystemState::kEnabling, GetBluetoothAdapterState());
  509. EXPECT_EQ(1, GetSystemTrayClient()->show_sim_unlock_settings_count());
  510. EXPECT_EQ(NetworkStateHandler::TechnologyState::TECHNOLOGY_UNINITIALIZED,
  511. GetTechnologyState(NetworkTypePattern::Tether()));
  512. CheckNetworkTypeToggledHistogramBuckets(
  513. /*network_type=*/kNetworkTechnologyMobile,
  514. /*new_state=*/true, /*count=*/3u,
  515. /*total_count=*/5u);
  516. // Simulate Bluetooth adapter being enabled. Note that when testing Bluetooth
  517. // will be set to kEnabling and needs to be manually changed to kEnabled using
  518. // adapter state. Enabling Bluetooth will also change Tether state to
  519. // available.
  520. SetTetherTechnologyState(
  521. NetworkStateHandler::TechnologyState::TECHNOLOGY_AVAILABLE);
  522. SetBluetoothAdapterState(BluetoothSystemState::kEnabled);
  523. EXPECT_EQ(BluetoothSystemState::kEnabled, GetBluetoothAdapterState());
  524. EXPECT_EQ(NetworkStateHandler::TechnologyState::TECHNOLOGY_ENABLED,
  525. GetTechnologyState(NetworkTypePattern::Tether()));
  526. }
  527. } // namespace ash