network_list_network_item_view_unittest.cc 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662
  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_list_network_item_view.h"
  5. #include <memory>
  6. #include "ash/constants/ash_features.h"
  7. #include "ash/public/cpp/login_types.h"
  8. #include "ash/resources/vector_icons/vector_icons.h"
  9. #include "ash/session/session_controller_impl.h"
  10. #include "ash/shell.h"
  11. #include "ash/strings/grit/ash_strings.h"
  12. #include "ash/style/ash_color_provider.h"
  13. #include "ash/system/network/fake_network_detailed_network_view.h"
  14. #include "ash/system/network/network_icon.h"
  15. #include "ash/system/network/network_info.h"
  16. #include "ash/test/ash_test_base.h"
  17. #include "base/i18n/number_formatting.h"
  18. #include "base/test/scoped_feature_list.h"
  19. #include "chromeos/services/network_config/public/cpp/cros_network_config_test_helper.h"
  20. #include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h"
  21. #include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
  22. #include "ui/base/l10n/l10n_util.h"
  23. #include "ui/gfx/image/image_unittest_util.h"
  24. #include "ui/gfx/paint_vector_icon.h"
  25. #include "ui/gfx/vector_icon_types.h"
  26. #include "ui/views/accessibility/view_accessibility.h"
  27. #include "ui/views/controls/image_view.h"
  28. #include "ui/views/view.h"
  29. #include "ui/views/view_utils.h"
  30. namespace ash {
  31. namespace {
  32. using chromeos::network_config::CrosNetworkConfigTestHelper;
  33. using chromeos::network_config::mojom::ActivationStateType;
  34. using chromeos::network_config::mojom::ConnectionStateType;
  35. using chromeos::network_config::mojom::NetworkStatePropertiesPtr;
  36. using chromeos::network_config::mojom::NetworkType;
  37. using chromeos::network_config::mojom::OncSource;
  38. using chromeos::network_config::mojom::SecurityType;
  39. const std::string kWiFiName = "WiFi";
  40. const std::string kCellularName = "cellular";
  41. const std::string kTetherName = "tether";
  42. const std::string kEid = "sim_eid";
  43. const std::string kEthernetName = "ethernet";
  44. const char kEthernetDeviceName[] = "ethernet_device";
  45. const char kEthernetDevicePath[] = "/device/ethernet_device";
  46. const char kWiFiDeviceName[] = "wifi_device";
  47. const char kWiFiDevicePath[] = "/device/wifi_device";
  48. const char kCellularDeviceName[] = "cellular_device";
  49. const char kCellularDevicePath[] = "/device/cellular_device";
  50. int kSignalStrength = 50;
  51. } // namespace
  52. class NetworkListNetworkItemViewTest : public AshTestBase {
  53. public:
  54. void SetUp() override {
  55. AshTestBase::SetUp();
  56. feature_list_.InitAndEnableFeature(features::kQuickSettingsNetworkRevamp);
  57. SetUpDefaultNetworkDevices();
  58. fake_network_detailed_network_view_ =
  59. std::make_unique<FakeNetworkDetailedNetworkView>(
  60. /*delegate=*/nullptr);
  61. std::unique_ptr<NetworkListNetworkItemView> network_list_network_item_view =
  62. std::make_unique<NetworkListNetworkItemView>(
  63. fake_network_detailed_network_view_.get());
  64. widget_ = CreateFramelessTestWidget();
  65. widget_->SetFullscreen(true);
  66. NetworkStatePropertiesPtr wifi_network = CreateStandaloneNetworkProperties(
  67. kWiFiName, NetworkType::kWiFi, ConnectionStateType::kNotConnected);
  68. network_list_network_item_view_ =
  69. widget_->SetContentsView(std::move(network_list_network_item_view));
  70. network_list_network_item_view_->UpdateViewForNetwork(wifi_network);
  71. }
  72. void TearDown() override {
  73. widget_.reset();
  74. AshTestBase::TearDown();
  75. }
  76. std::vector<ConnectionStateType> GetConnectionStateTypes() {
  77. return {ConnectionStateType::kConnected, ConnectionStateType::kConnecting,
  78. ConnectionStateType::kNotConnected, ConnectionStateType::kOnline,
  79. ConnectionStateType::kPortal};
  80. }
  81. std::vector<OncSource> GetPolicies() {
  82. return {OncSource::kDevicePolicy, OncSource::kNone};
  83. }
  84. const NetworkListItemView* LastClickedNetworkListItem() {
  85. return fake_network_detailed_network_view_
  86. ->last_clicked_network_list_item();
  87. }
  88. NetworkStatePropertiesPtr CreateStandaloneNetworkProperties(
  89. const std::string& id,
  90. NetworkType type,
  91. ConnectionStateType connection_state) {
  92. return network_config_helper_.CreateStandaloneNetworkProperties(
  93. id, type, connection_state, kSignalStrength);
  94. }
  95. void UpdateViewForNetwork(NetworkStatePropertiesPtr& network) {
  96. network_list_network_item_view()->UpdateViewForNetwork(network);
  97. }
  98. void AssertA11yDescription(NetworkStatePropertiesPtr& network_properties,
  99. const std::u16string& description) {
  100. ui::AXNodeData node_data;
  101. UpdateViewForNetwork(network_properties);
  102. network_list_network_item_view()
  103. ->GetViewAccessibility()
  104. .GetAccessibleNodeData(&node_data);
  105. std::string a11ydescription =
  106. node_data.GetStringAttribute(ax::mojom::StringAttribute::kDescription);
  107. EXPECT_EQ(base::UTF8ToUTF16(a11ydescription), description);
  108. }
  109. NetworkListNetworkItemView* network_list_network_item_view() {
  110. return network_list_network_item_view_;
  111. }
  112. private:
  113. void SetUpDefaultNetworkDevices() {
  114. network_state_helper()->ClearDevices();
  115. network_state_helper()->AddDevice(kCellularDevicePath, shill::kTypeCellular,
  116. kCellularDeviceName);
  117. network_state_helper()->AddDevice(kEthernetDevicePath, shill::kTypeEthernet,
  118. kEthernetDeviceName);
  119. network_state_helper()->AddDevice(kWiFiDevicePath, shill::kTypeWifi,
  120. kWiFiDeviceName);
  121. }
  122. NetworkStateTestHelper* network_state_helper() {
  123. return &network_config_helper_.network_state_helper();
  124. }
  125. base::test::ScopedFeatureList feature_list_;
  126. std::unique_ptr<views::Widget> widget_;
  127. std::unique_ptr<FakeNetworkDetailedNetworkView>
  128. fake_network_detailed_network_view_;
  129. CrosNetworkConfigTestHelper network_config_helper_;
  130. NetworkListNetworkItemView* network_list_network_item_view_;
  131. };
  132. TEST_F(NetworkListNetworkItemViewTest, HasCorrectLabel) {
  133. ASSERT_TRUE(network_list_network_item_view()->text_label());
  134. EXPECT_EQ(base::UTF8ToUTF16(kWiFiName),
  135. network_list_network_item_view()->text_label()->GetText());
  136. const std::string kNewWifiName = "New wifi";
  137. NetworkStatePropertiesPtr wifi_network = CreateStandaloneNetworkProperties(
  138. kNewWifiName, NetworkType::kWiFi, ConnectionStateType::kNotConnected);
  139. UpdateViewForNetwork(wifi_network);
  140. EXPECT_EQ(base::UTF8ToUTF16(kNewWifiName),
  141. network_list_network_item_view()->text_label()->GetText());
  142. NetworkStatePropertiesPtr cellular_network =
  143. CreateStandaloneNetworkProperties(kCellularName, NetworkType::kCellular,
  144. ConnectionStateType::kConnected);
  145. cellular_network->type_state->get_cellular()->activation_state =
  146. ActivationStateType::kActivating;
  147. UpdateViewForNetwork(cellular_network);
  148. EXPECT_EQ(
  149. l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_NETWORK_LIST_ACTIVATING,
  150. base::UTF8ToUTF16(kCellularName)),
  151. network_list_network_item_view()->text_label()->GetText());
  152. }
  153. TEST_F(NetworkListNetworkItemViewTest, HasCorrectNonCellularSublabel) {
  154. EXPECT_FALSE(network_list_network_item_view()->sub_text_label());
  155. NetworkStatePropertiesPtr wifi_network = CreateStandaloneNetworkProperties(
  156. kWiFiName, NetworkType::kWiFi, ConnectionStateType::kConnected);
  157. UpdateViewForNetwork(wifi_network);
  158. EXPECT_TRUE(network_list_network_item_view()->sub_text_label());
  159. EXPECT_EQ(
  160. l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_NETWORK_STATUS_CONNECTED),
  161. network_list_network_item_view()->sub_text_label()->GetText());
  162. wifi_network->connection_state = ConnectionStateType::kConnecting;
  163. UpdateViewForNetwork(wifi_network);
  164. EXPECT_EQ(
  165. l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_NETWORK_STATUS_CONNECTING),
  166. network_list_network_item_view()->sub_text_label()->GetText());
  167. }
  168. TEST_F(NetworkListNetworkItemViewTest, HasCorrectCellularSublabel) {
  169. EXPECT_FALSE(network_list_network_item_view()->sub_text_label());
  170. // Label for pSIM networks that are connected but not yet activated.
  171. NetworkStatePropertiesPtr cellular_network =
  172. CreateStandaloneNetworkProperties(kCellularName, NetworkType::kCellular,
  173. ConnectionStateType::kConnected);
  174. cellular_network->type_state->get_cellular()->activation_state =
  175. ActivationStateType::kNotActivated;
  176. UpdateViewForNetwork(cellular_network);
  177. EXPECT_EQ(l10n_util::GetStringUTF16(
  178. IDS_ASH_STATUS_TRAY_NETWORK_STATUS_CLICK_TO_ACTIVATE),
  179. network_list_network_item_view()->sub_text_label()->GetText());
  180. // Label for unactivated eSIM networks.
  181. cellular_network->type_state->get_cellular()->eid = kEid;
  182. UpdateViewForNetwork(cellular_network);
  183. EXPECT_EQ(l10n_util::GetStringUTF16(
  184. IDS_ASH_STATUS_TRAY_NETWORK_UNAVAILABLE_SIM_NETWORK),
  185. network_list_network_item_view()->sub_text_label()->GetText());
  186. // label for connected unlocked cellular network.
  187. cellular_network->type_state->get_cellular()->activation_state =
  188. ActivationStateType::kActivated;
  189. cellular_network->type_state->get_cellular()->sim_locked = false;
  190. UpdateViewForNetwork(cellular_network);
  191. EXPECT_EQ(
  192. l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_NETWORK_STATUS_CONNECTED),
  193. network_list_network_item_view()->sub_text_label()->GetText());
  194. // label for connecting unlocked cellular network.
  195. cellular_network->connection_state = ConnectionStateType::kConnecting;
  196. UpdateViewForNetwork(cellular_network);
  197. EXPECT_EQ(
  198. l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_NETWORK_STATUS_CONNECTING),
  199. network_list_network_item_view()->sub_text_label()->GetText());
  200. // label for unconnected unlocked cellular network.
  201. cellular_network->connection_state = ConnectionStateType::kNotConnected;
  202. UpdateViewForNetwork(cellular_network);
  203. EXPECT_FALSE(network_list_network_item_view()->sub_text_label());
  204. // label for locked cellular network.
  205. cellular_network->type_state->get_cellular()->sim_locked = true;
  206. cellular_network->connection_state = ConnectionStateType::kConnected;
  207. UpdateViewForNetwork(cellular_network);
  208. EXPECT_EQ(l10n_util::GetStringUTF16(
  209. IDS_ASH_STATUS_TRAY_NETWORK_STATUS_CLICK_TO_UNLOCK),
  210. network_list_network_item_view()->sub_text_label()->GetText());
  211. // label for locked cellular network when user is not logged in.
  212. GetSessionControllerClient()->Reset();
  213. base::RunLoop().RunUntilIdle();
  214. UpdateViewForNetwork(cellular_network);
  215. EXPECT_EQ(l10n_util::GetStringUTF16(
  216. IDS_ASH_STATUS_TRAY_NETWORK_STATUS_SIGN_IN_TO_UNLOCK),
  217. network_list_network_item_view()->sub_text_label()->GetText());
  218. }
  219. TEST_F(NetworkListNetworkItemViewTest, NotifiesListenerWhenClicked) {
  220. EXPECT_FALSE(LastClickedNetworkListItem());
  221. LeftClickOn(network_list_network_item_view());
  222. EXPECT_EQ(LastClickedNetworkListItem(), network_list_network_item_view());
  223. }
  224. TEST_F(NetworkListNetworkItemViewTest, HasEnterpriseIconWhenBlockedByPolicy) {
  225. EXPECT_FALSE(network_list_network_item_view()->right_view());
  226. NetworkStatePropertiesPtr wifi_network = CreateStandaloneNetworkProperties(
  227. kWiFiName, NetworkType::kWiFi, ConnectionStateType::kConnected);
  228. wifi_network->source = OncSource::kDevicePolicy;
  229. wifi_network->prohibited_by_policy = true;
  230. UpdateViewForNetwork(wifi_network);
  231. ASSERT_TRUE(network_list_network_item_view()->right_view());
  232. EXPECT_TRUE(network_list_network_item_view()->right_view()->GetVisible());
  233. ASSERT_TRUE(views::IsViewClass<views::ImageView>(
  234. network_list_network_item_view()->right_view()));
  235. const gfx::Image expected_image(CreateVectorIcon(
  236. kSystemMenuBusinessIcon,
  237. AshColorProvider::Get()->GetContentLayerColor(
  238. AshColorProvider::ContentLayerType::kIconColorPrimary)));
  239. const gfx::Image actual_image(
  240. static_cast<views::ImageView*>(
  241. network_list_network_item_view()->right_view())
  242. ->GetImage());
  243. EXPECT_TRUE(gfx::test::AreImagesEqual(expected_image, actual_image));
  244. EXPECT_EQ(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_NETWORK_PROHIBITED),
  245. network_list_network_item_view()->text_label()->GetTooltipText());
  246. wifi_network->source = OncSource::kNone;
  247. UpdateViewForNetwork(wifi_network);
  248. ASSERT_FALSE(network_list_network_item_view()->right_view());
  249. }
  250. TEST_F(NetworkListNetworkItemViewTest, HasPoweredIcon) {
  251. EXPECT_FALSE(network_list_network_item_view()->right_view());
  252. int battery_percentage = 50;
  253. NetworkStatePropertiesPtr tether_network = CreateStandaloneNetworkProperties(
  254. kTetherName, NetworkType::kTether, ConnectionStateType::kConnected);
  255. tether_network->type_state->get_tether()->battery_percentage =
  256. battery_percentage;
  257. UpdateViewForNetwork(tether_network);
  258. ASSERT_TRUE(network_list_network_item_view()->right_view());
  259. EXPECT_TRUE(network_list_network_item_view()->right_view()->GetVisible());
  260. ASSERT_TRUE(views::IsViewClass<views::ImageView>(
  261. network_list_network_item_view()->right_view()));
  262. EXPECT_EQ(base::FormatPercent(battery_percentage),
  263. static_cast<views::ImageView*>(
  264. network_list_network_item_view()->right_view())
  265. ->GetTooltipText());
  266. }
  267. TEST_F(NetworkListNetworkItemViewTest, HasExpectedA11yText) {
  268. NetworkStatePropertiesPtr wifi_network = CreateStandaloneNetworkProperties(
  269. kWiFiName, NetworkType::kWiFi, ConnectionStateType::kConnected);
  270. wifi_network->connection_state = ConnectionStateType::kConnected;
  271. UpdateViewForNetwork(wifi_network);
  272. EXPECT_EQ(
  273. l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_NETWORK_A11Y_LABEL_OPEN,
  274. base::UTF8ToUTF16(kWiFiName)),
  275. network_list_network_item_view()->GetAccessibleName());
  276. // Network can be connected to.
  277. wifi_network->connectable = true;
  278. wifi_network->connection_state = ConnectionStateType::kNotConnected;
  279. UpdateViewForNetwork(wifi_network);
  280. EXPECT_EQ(
  281. l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_NETWORK_A11Y_LABEL_CONNECT,
  282. base::UTF8ToUTF16(kWiFiName)),
  283. network_list_network_item_view()->GetAccessibleName());
  284. // Activate cellular network A11Y label is shown when a pSIM network is
  285. // connected but not yet activated.
  286. NetworkStatePropertiesPtr cellular_network =
  287. CreateStandaloneNetworkProperties(kCellularName, NetworkType::kCellular,
  288. ConnectionStateType::kConnected);
  289. cellular_network->connectable = true;
  290. cellular_network->connection_state = ConnectionStateType::kConnected;
  291. cellular_network->type_state->get_cellular()->activation_state =
  292. ActivationStateType::kNotActivated;
  293. UpdateViewForNetwork(cellular_network);
  294. EXPECT_EQ(l10n_util::GetStringFUTF16(
  295. IDS_ASH_STATUS_TRAY_NETWORK_A11Y_LABEL_ACTIVATE,
  296. base::UTF8ToUTF16(kCellularName)),
  297. network_list_network_item_view()->GetAccessibleName());
  298. // Contact carrier A11Y label is shown when a eSIM network is connected but
  299. // not yet activated.
  300. cellular_network->type_state->get_cellular()->eid = kEid;
  301. UpdateViewForNetwork(cellular_network);
  302. EXPECT_EQ(l10n_util::GetStringFUTF16(
  303. IDS_ASH_STATUS_TRAY_NETWORK_A11Y_UNAVAILABLE_SIM_NETWORK,
  304. base::UTF8ToUTF16(kCellularName)),
  305. network_list_network_item_view()->GetAccessibleName());
  306. }
  307. TEST_F(NetworkListNetworkItemViewTest, HasExpectedDescriptionForEthernet) {
  308. NetworkStatePropertiesPtr ethernet_network =
  309. CreateStandaloneNetworkProperties(kEthernetName, NetworkType::kEthernet,
  310. ConnectionStateType::kConnected);
  311. std::u16string connection_status;
  312. for (const auto& connection : GetConnectionStateTypes()) {
  313. ethernet_network->connection_state = connection;
  314. for (const auto& policy : GetPolicies()) {
  315. ethernet_network->source = OncSource::kNone;
  316. switch (connection) {
  317. case ConnectionStateType::kConnected:
  318. case ConnectionStateType::kPortal:
  319. case ConnectionStateType::kOnline: {
  320. connection_status = l10n_util::GetStringUTF16(
  321. IDS_ASH_STATUS_TRAY_NETWORK_STATUS_CONNECTED);
  322. AssertA11yDescription(ethernet_network, connection_status);
  323. ethernet_network->source = policy;
  324. if (policy == OncSource::kDevicePolicy) {
  325. AssertA11yDescription(
  326. ethernet_network,
  327. l10n_util::GetStringFUTF16(
  328. IDS_ASH_STATUS_TRAY_ETHERNET_A11Y_DESC_MANAGED_WITH_CONNECTION_STATUS,
  329. connection_status));
  330. }
  331. break;
  332. }
  333. case ConnectionStateType::kConnecting: {
  334. connection_status = l10n_util::GetStringUTF16(
  335. IDS_ASH_STATUS_TRAY_NETWORK_STATUS_CONNECTING);
  336. AssertA11yDescription(ethernet_network, connection_status);
  337. ethernet_network->source = policy;
  338. if (policy == OncSource::kDevicePolicy) {
  339. AssertA11yDescription(
  340. ethernet_network,
  341. l10n_util::GetStringFUTF16(
  342. IDS_ASH_STATUS_TRAY_ETHERNET_A11Y_DESC_MANAGED_WITH_CONNECTION_STATUS,
  343. connection_status));
  344. }
  345. break;
  346. }
  347. case ConnectionStateType::kNotConnected:
  348. AssertA11yDescription(
  349. ethernet_network,
  350. l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ETHERNET));
  351. ethernet_network->source = policy;
  352. if (policy == OncSource::kDevicePolicy) {
  353. AssertA11yDescription(
  354. ethernet_network,
  355. l10n_util::GetStringUTF16(
  356. IDS_ASH_STATUS_TRAY_ETHERNET_A11Y_DESC_MANAGED));
  357. }
  358. }
  359. }
  360. }
  361. }
  362. TEST_F(NetworkListNetworkItemViewTest, HasExpectedDescriptionForTether) {
  363. int battery_percentage = 50;
  364. std::u16string connection_status;
  365. NetworkStatePropertiesPtr tether_network = CreateStandaloneNetworkProperties(
  366. kTetherName, NetworkType::kTether, ConnectionStateType::kConnected);
  367. tether_network->type_state->get_tether()->battery_percentage =
  368. battery_percentage;
  369. for (const auto& connection : GetConnectionStateTypes()) {
  370. tether_network->connection_state = connection;
  371. switch (connection) {
  372. case ConnectionStateType::kConnected:
  373. case ConnectionStateType::kPortal:
  374. case ConnectionStateType::kOnline: {
  375. connection_status = l10n_util::GetStringUTF16(
  376. IDS_ASH_STATUS_TRAY_NETWORK_STATUS_CONNECTED);
  377. AssertA11yDescription(
  378. tether_network,
  379. l10n_util::GetStringFUTF16(
  380. IDS_ASH_STATUS_TRAY_TETHER_NETWORK_A11Y_DESC_WITH_CONNECTION_STATUS,
  381. connection_status, base::FormatPercent(kSignalStrength),
  382. base::FormatPercent(battery_percentage)));
  383. break;
  384. }
  385. case ConnectionStateType::kConnecting: {
  386. connection_status = l10n_util::GetStringUTF16(
  387. IDS_ASH_STATUS_TRAY_NETWORK_STATUS_CONNECTING);
  388. AssertA11yDescription(
  389. tether_network,
  390. l10n_util::GetStringFUTF16(
  391. IDS_ASH_STATUS_TRAY_TETHER_NETWORK_A11Y_DESC_WITH_CONNECTION_STATUS,
  392. connection_status, base::FormatPercent(kSignalStrength),
  393. base::FormatPercent(battery_percentage)));
  394. break;
  395. }
  396. case ConnectionStateType::kNotConnected:
  397. AssertA11yDescription(tether_network,
  398. l10n_util::GetStringFUTF16(
  399. IDS_ASH_STATUS_TRAY_TETHER_NETWORK_A11Y_DESC,
  400. base::FormatPercent(kSignalStrength),
  401. base::FormatPercent(battery_percentage)));
  402. }
  403. }
  404. }
  405. TEST_F(NetworkListNetworkItemViewTest, HasExpectedDescriptionForCellular) {
  406. NetworkStatePropertiesPtr cellular_network =
  407. CreateStandaloneNetworkProperties(kCellularName, NetworkType::kCellular,
  408. ConnectionStateType::kConnected);
  409. // Cellular is not activated
  410. cellular_network->type_state->get_cellular()->activation_state =
  411. ActivationStateType::kNotActivated;
  412. AssertA11yDescription(
  413. cellular_network,
  414. l10n_util::GetStringUTF16(
  415. IDS_ASH_STATUS_TRAY_NETWORK_STATUS_CLICK_TO_ACTIVATE));
  416. // Cellular is not activated and is an eSIM network.
  417. cellular_network->type_state->get_cellular()->eid = kEid;
  418. AssertA11yDescription(
  419. cellular_network,
  420. l10n_util::GetStringUTF16(
  421. IDS_ASH_STATUS_TRAY_NETWORK_UNAVAILABLE_SIM_NETWORK));
  422. // eSIM is locked.
  423. cellular_network->type_state->get_cellular()->activation_state =
  424. ActivationStateType::kActivated;
  425. cellular_network->type_state->get_cellular()->sim_locked = true;
  426. cellular_network->connection_state = ConnectionStateType::kConnected;
  427. AssertA11yDescription(
  428. cellular_network,
  429. l10n_util::GetStringUTF16(
  430. IDS_ASH_STATUS_TRAY_NETWORK_STATUS_CLICK_TO_UNLOCK));
  431. // User is not signed in.
  432. GetSessionControllerClient()->Reset();
  433. AssertA11yDescription(
  434. cellular_network,
  435. l10n_util::GetStringUTF16(
  436. IDS_ASH_STATUS_TRAY_NETWORK_STATUS_SIGN_IN_TO_UNLOCK));
  437. cellular_network->type_state->get_cellular()->sim_locked = false;
  438. std::u16string connection_status;
  439. for (const auto& connection : GetConnectionStateTypes()) {
  440. cellular_network->connection_state = connection;
  441. for (const auto& policy : GetPolicies()) {
  442. cellular_network->source = policy;
  443. switch (connection) {
  444. case ConnectionStateType::kConnected:
  445. case ConnectionStateType::kPortal:
  446. case ConnectionStateType::kOnline: {
  447. connection_status = l10n_util::GetStringUTF16(
  448. IDS_ASH_STATUS_TRAY_NETWORK_STATUS_CONNECTED);
  449. if (policy == OncSource::kDevicePolicy) {
  450. AssertA11yDescription(
  451. cellular_network,
  452. l10n_util::GetStringFUTF16(
  453. IDS_ASH_STATUS_TRAY_CELLULAR_NETWORK_A11Y_DESC_MANAGED_WITH_CONNECTION_STATUS,
  454. connection_status, base::FormatPercent(kSignalStrength)));
  455. } else {
  456. AssertA11yDescription(
  457. cellular_network,
  458. l10n_util::GetStringFUTF16(
  459. IDS_ASH_STATUS_TRAY_CELLULAR_NETWORK_A11Y_DESC_WITH_CONNECTION_STATUS,
  460. connection_status, base::FormatPercent(kSignalStrength)));
  461. }
  462. break;
  463. }
  464. case ConnectionStateType::kConnecting: {
  465. connection_status = l10n_util::GetStringUTF16(
  466. IDS_ASH_STATUS_TRAY_NETWORK_STATUS_CONNECTING);
  467. if (policy == OncSource::kDevicePolicy) {
  468. AssertA11yDescription(
  469. cellular_network,
  470. l10n_util::GetStringFUTF16(
  471. IDS_ASH_STATUS_TRAY_CELLULAR_NETWORK_A11Y_DESC_MANAGED_WITH_CONNECTION_STATUS,
  472. connection_status, base::FormatPercent(kSignalStrength)));
  473. } else {
  474. AssertA11yDescription(
  475. cellular_network,
  476. l10n_util::GetStringFUTF16(
  477. IDS_ASH_STATUS_TRAY_CELLULAR_NETWORK_A11Y_DESC_WITH_CONNECTION_STATUS,
  478. connection_status, base::FormatPercent(kSignalStrength)));
  479. }
  480. break;
  481. }
  482. case ConnectionStateType::kNotConnected:
  483. if (policy == OncSource::kDevicePolicy) {
  484. AssertA11yDescription(
  485. cellular_network,
  486. l10n_util::GetStringFUTF16(
  487. IDS_ASH_STATUS_TRAY_CELLULAR_NETWORK_A11Y_DESC_MANAGED,
  488. base::FormatPercent(kSignalStrength)));
  489. } else {
  490. AssertA11yDescription(
  491. cellular_network,
  492. l10n_util::GetStringFUTF16(
  493. IDS_ASH_STATUS_TRAY_CELLULAR_NETWORK_A11Y_DESC,
  494. base::FormatPercent(kSignalStrength)));
  495. }
  496. }
  497. }
  498. }
  499. }
  500. TEST_F(NetworkListNetworkItemViewTest, HasExpectedDescriptionForWiFi) {
  501. SecurityType security_types[2] = {SecurityType::kNone, SecurityType::kWepPsk};
  502. NetworkStatePropertiesPtr wifi_network = CreateStandaloneNetworkProperties(
  503. kWiFiName, NetworkType::kWiFi, ConnectionStateType::kConnected);
  504. for (const auto& security : security_types) {
  505. wifi_network->type_state->get_wifi()->security = security;
  506. const std::u16string security_label = l10n_util::GetStringUTF16(
  507. security == SecurityType::kWepPsk
  508. ? IDS_ASH_STATUS_TRAY_NETWORK_STATUS_SECURED
  509. : IDS_ASH_STATUS_TRAY_NETWORK_STATUS_UNSECURED);
  510. for (const auto& connection : GetConnectionStateTypes()) {
  511. wifi_network->connection_state = connection;
  512. std::u16string connection_status;
  513. for (const auto& policy : GetPolicies()) {
  514. wifi_network->source = policy;
  515. switch (connection) {
  516. case ConnectionStateType::kConnected:
  517. case ConnectionStateType::kPortal:
  518. case ConnectionStateType::kOnline: {
  519. connection_status = l10n_util::GetStringUTF16(
  520. IDS_ASH_STATUS_TRAY_NETWORK_STATUS_CONNECTED);
  521. if (policy == OncSource::kDevicePolicy) {
  522. AssertA11yDescription(
  523. wifi_network,
  524. l10n_util::GetStringFUTF16(
  525. IDS_ASH_STATUS_TRAY_WIFI_NETWORK_A11Y_DESC_MANAGED_WITH_CONNECTION_STATUS,
  526. security_label, connection_status,
  527. base::FormatPercent(kSignalStrength)));
  528. } else {
  529. AssertA11yDescription(
  530. wifi_network,
  531. l10n_util::GetStringFUTF16(
  532. IDS_ASH_STATUS_TRAY_WIFI_NETWORK_A11Y_DESC_WITH_CONNECTION_STATUS,
  533. security_label, connection_status,
  534. base::FormatPercent(kSignalStrength)));
  535. }
  536. break;
  537. }
  538. case ConnectionStateType::kConnecting: {
  539. connection_status = l10n_util::GetStringUTF16(
  540. IDS_ASH_STATUS_TRAY_NETWORK_STATUS_CONNECTING);
  541. if (policy == OncSource::kDevicePolicy) {
  542. AssertA11yDescription(
  543. wifi_network,
  544. l10n_util::GetStringFUTF16(
  545. IDS_ASH_STATUS_TRAY_WIFI_NETWORK_A11Y_DESC_MANAGED_WITH_CONNECTION_STATUS,
  546. security_label, connection_status,
  547. base::FormatPercent(kSignalStrength)));
  548. } else {
  549. AssertA11yDescription(
  550. wifi_network,
  551. l10n_util::GetStringFUTF16(
  552. IDS_ASH_STATUS_TRAY_WIFI_NETWORK_A11Y_DESC_WITH_CONNECTION_STATUS,
  553. security_label, connection_status,
  554. base::FormatPercent(kSignalStrength)));
  555. }
  556. break;
  557. }
  558. case ConnectionStateType::kNotConnected:
  559. if (policy == OncSource::kDevicePolicy) {
  560. AssertA11yDescription(
  561. wifi_network,
  562. l10n_util::GetStringFUTF16(
  563. IDS_ASH_STATUS_TRAY_WIFI_NETWORK_A11Y_DESC_MANAGED,
  564. security_label, base::FormatPercent(kSignalStrength)));
  565. } else {
  566. AssertA11yDescription(
  567. wifi_network,
  568. l10n_util::GetStringFUTF16(
  569. IDS_ASH_STATUS_TRAY_WIFI_NETWORK_A11Y_DESC,
  570. security_label, base::FormatPercent(kSignalStrength)));
  571. }
  572. }
  573. }
  574. }
  575. }
  576. }
  577. } // namespace ash