blob: 9feedc9cd6fb88323869158e6b0e9aa74b3c644d [file] [log] [blame]
// Copyright 2021 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <gtest/gtest.h>
#include "minios/key_reader.h"
#include "minios/mock_draw_interface.h"
#include "minios/mock_network_manager.h"
#include "minios/mock_screen_controller.h"
#include "minios/screens/screen_network.h"
using ::testing::NiceMock;
namespace minios {
class ScreenNetworkTest : public ::testing::Test {
protected:
std::shared_ptr<NetworkManagerInterface> mock_network_manager_ =
std::make_shared<NiceMock<MockNetworkManager>>();
std::shared_ptr<DrawInterface> mock_draw_interface_ =
std::make_shared<NiceMock<MockDrawInterface>>();
NiceMock<MockScreenControllerInterface> mock_screen_controller_;
ScreenNetwork screen_network_{mock_draw_interface_, mock_network_manager_,
nullptr, &mock_screen_controller_};
};
TEST_F(ScreenNetworkTest, GetNetworks) {
screen_network_.OnGetNetworks(
{{.ssid = "test1"}, {.ssid = "test2"}, {.ssid = "test3"}}, nullptr);
// Network error.
brillo::ErrorPtr error_ptr =
brillo::Error::Create(FROM_HERE, "HTTP", "404", "Not found", nullptr);
// Reset and show error screen.
EXPECT_CALL(mock_screen_controller_, OnError(ScreenType::kNetworkError));
screen_network_.OnGetNetworks({}, error_ptr.get());
}
TEST_F(ScreenNetworkTest, GetNetworksWithEthernet) {
// Ethernet included in list of networks.
screen_network_.SetStateForTest(NetworkState::kDropdownOpen);
screen_network_.OnGetNetworks({{.ssid = "test1", .strength = 0},
{.ssid = "test2", .strength = 10},
{.ssid = kShillEthernetLabel, .strength = 2},
{.ssid = "test3", .strength = 7}},
nullptr);
// Ethernet should be the first one regardless of strength, pressing it should
// skip password and connection screens.
screen_network_.SetIndexForTest(0);
EXPECT_CALL(mock_screen_controller_, OnForward(testing::_));
screen_network_.OnKeyPress(kKeyEnter);
}
TEST_F(ScreenNetworkTest, GetNetworksRefresh) {
screen_network_.SetStateForTest(NetworkState::kDropdownOpen);
// Menu count is updated amd drop down screen is refreshed.
screen_network_.OnGetNetworks(
{{.ssid = "test1"}, {.ssid = "test2"}, {.ssid = "test3"}}, nullptr);
// Update button when "refreshing" to the expanded dropdown screen.
EXPECT_EQ(screen_network_.GetButtonCountForTest(), 4);
}
TEST_F(ScreenNetworkTest, EnterOnDropDown) {
// If dropdown has not been selected yet, the focus is on the normal buttons.
screen_network_.OnKeyPress(kKeyDown);
EXPECT_CALL(mock_screen_controller_, OnBackward(testing::_));
screen_network_.OnKeyPress(kKeyEnter);
// Set networks.
screen_network_.OnGetNetworks(
{{.ssid = "test1"}, {.ssid = "test2"}, {.ssid = "test3"}}, nullptr);
// Select dropdown.
screen_network_.OnKeyPress(kKeyUp);
screen_network_.OnKeyPress(kKeyEnter);
screen_network_.SetStateForTest(NetworkState::kDropdownOpen);
// Pick second network.
screen_network_.OnKeyPress(kKeyDown);
screen_network_.OnKeyPress(kKeyEnter);
EXPECT_EQ(screen_network_.GetIndexForTest(), 1);
}
TEST_F(ScreenNetworkTest, NetworkNoPassword) {
// Set networks.
screen_network_.OnGetNetworks({{.ssid = "test1", .security = "none"}},
nullptr);
screen_network_.SetStateForTest(NetworkState::kDropdownOpen);
screen_network_.SetIndexForTest(0);
// Pick first network
screen_network_.OnKeyPress(kKeyEnter);
// Should skip password screen and wait for connection.
EXPECT_EQ(screen_network_.GetStateForTest(),
NetworkState::kWaitForConnection);
}
TEST_F(ScreenNetworkTest, OnConnectError) {
std::string chosen_network = "test-ssid";
// Network error, show corresponding screen.
brillo::ErrorPtr error_ptr =
brillo::Error::Create(FROM_HERE, "HTTP", "404", "Not found", nullptr);
EXPECT_CALL(mock_screen_controller_, OnError(ScreenType::kConnectionError));
screen_network_.OnConnect(chosen_network, error_ptr.get());
}
TEST_F(ScreenNetworkTest, OnPasswordError) {
std::string chosen_network = "test-ssid";
// Network error, show corresponding screen.
brillo::ErrorPtr error_ptr = brillo::Error::Create(
FROM_HERE, "Password", "org.chromium.flimflam.Error.InvalidPassphrase",
"Invalid passphrase", nullptr);
EXPECT_CALL(mock_screen_controller_, OnError(ScreenType::kPasswordError));
screen_network_.OnConnect(chosen_network, error_ptr.get());
}
} // namespace minios