blob: 90ee9cd46a70ef2f63e555f3d276d27da2ae0261 [file] [log] [blame]
// Copyright 2021 The Chromium 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 "chrome/browser/chromeos/policy/system_proxy_handler.h"
#include <memory>
#include <string>
#include <utility>
#include "base/callback_list.h"
#include "base/task/current_thread.h"
#include "base/test/task_environment.h"
#include "base/values.h"
#include "chrome/browser/ash/settings/device_settings_test_helper.h"
#include "chrome/browser/ash/settings/scoped_testing_cros_settings.h"
#include "chrome/browser/chromeos/net/system_proxy_manager.h"
#include "chrome/test/base/scoped_testing_local_state.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile.h"
#include "chromeos/dbus/system_proxy/system_proxy_client.h"
#include "chromeos/dbus/system_proxy/system_proxy_service.pb.h"
#include "chromeos/network/network_handler.h"
#include "chromeos/network/network_handler_test_helper.h"
#include "components/proxy_config/proxy_config_pref_names.h"
#include "components/proxy_config/proxy_prefs.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
using testing::_;
using testing::Invoke;
using testing::WithArg;
namespace {
constexpr char kPolicyUsername[] = "policy_username";
constexpr char kPolicyPassword[] = "policy_password";
constexpr char kProxyAuthUrl[] = "http://example.com:3128";
} // namespace
namespace policy {
// TODO(acostinas, https://crbug.com/1102351) Replace RunUntilIdle() in tests
// with RunLoop::Run() with explicit RunLoop::QuitClosure().
class SystemProxyHandlerTest : public testing::Test {
public:
SystemProxyHandlerTest() : local_state_(TestingBrowserProcess::GetGlobal()) {}
~SystemProxyHandlerTest() override = default;
// testing::Test
void SetUp() override {
testing::Test::SetUp();
network_handler_test_helper_ =
std::make_unique<chromeos::NetworkHandlerTestHelper>();
chromeos::SystemProxyClient::InitializeFake();
system_proxy_handler_ =
std::make_unique<SystemProxyHandler>(ash::CrosSettings::Get());
system_proxy_manager_ =
std::make_unique<chromeos::SystemProxyManager>(local_state_.Get());
profile_ = std::make_unique<TestingProfile>();
system_proxy_manager_->StartObservingPrimaryProfilePrefs(profile_.get());
system_proxy_handler_->SetSystemProxyManagerForTesting(
system_proxy_manager_.get());
chromeos::NetworkHandler::Get()->InitializePrefServices(
profile_->GetPrefs(), local_state_.Get());
}
void TearDown() override {
system_proxy_manager_->StopObservingPrimaryProfilePrefs();
system_proxy_manager_.reset();
chromeos::SystemProxyClient::Shutdown();
network_handler_test_helper_.reset();
}
protected:
void SetPolicy(bool system_proxy_enabled,
const std::string& system_services_username,
const std::string& system_services_password) {
base::DictionaryValue dict;
dict.SetKey("system_proxy_enabled", base::Value(system_proxy_enabled));
dict.SetKey("system_services_username",
base::Value(system_services_username));
dict.SetKey("system_services_password",
base::Value(system_services_password));
scoped_testing_cros_settings_.device_settings()->Set(
chromeos::kSystemProxySettings, dict);
task_environment_.RunUntilIdle();
}
void SetManagedProxy(Profile* profile) {
// Configure a proxy via user policy.
base::Value proxy_config(base::Value::Type::DICTIONARY);
proxy_config.SetKey("mode",
base::Value(ProxyPrefs::kFixedServersProxyModeName));
proxy_config.SetKey("server", base::Value(kProxyAuthUrl));
profile->GetPrefs()->Set(proxy_config::prefs::kProxy, proxy_config);
task_environment_.RunUntilIdle();
}
chromeos::SystemProxyClient::TestInterface* client_test_interface() {
return chromeos::SystemProxyClient::Get()->GetTestInterface();
}
content::BrowserTaskEnvironment task_environment_;
std::unique_ptr<chromeos::NetworkHandlerTestHelper>
network_handler_test_helper_;
ScopedTestingLocalState local_state_;
std::unique_ptr<TestingProfile> profile_;
chromeos::ScopedTestingCrosSettings scoped_testing_cros_settings_;
ash::ScopedDeviceSettingsTestHelper device_settings_test_helper_;
chromeos::ScopedStubInstallAttributes test_install_attributes_;
std::unique_ptr<SystemProxyHandler> system_proxy_handler_;
std::unique_ptr<chromeos::SystemProxyManager> system_proxy_manager_;
};
// Verifies that authentication details are forwarded to system-proxy according
// to the |kSystemProxySettings| policy.
TEST_F(SystemProxyHandlerTest, SetAuthenticationDetails) {
EXPECT_EQ(0, client_test_interface()->GetSetAuthenticationDetailsCallCount());
SetPolicy(true /* system_proxy_enabled */, "" /* system_services_username */,
"" /* system_services_password */);
EXPECT_EQ(1, client_test_interface()->GetSetAuthenticationDetailsCallCount());
SetPolicy(true /* system_proxy_enabled */, kPolicyUsername, kPolicyPassword);
EXPECT_EQ(2, client_test_interface()->GetSetAuthenticationDetailsCallCount());
system_proxy::SetAuthenticationDetailsRequest request =
client_test_interface()->GetLastAuthenticationDetailsRequest();
ASSERT_TRUE(request.has_credentials());
EXPECT_EQ("", request.credentials().username());
EXPECT_EQ("", request.credentials().password());
SetManagedProxy(profile_.get());
EXPECT_EQ(3, client_test_interface()->GetSetAuthenticationDetailsCallCount());
request = client_test_interface()->GetLastAuthenticationDetailsRequest();
ASSERT_TRUE(request.has_credentials());
EXPECT_EQ(kPolicyUsername, request.credentials().username());
EXPECT_EQ(kPolicyPassword, request.credentials().password());
}
// Verifies requests to shut down are sent to System-proxy according to the
// |kSystemProxySettings| policy.
TEST_F(SystemProxyHandlerTest, ShutDownDaemon) {
int expected_shutdown_calls = 0;
// Enable system-proxy.
SetPolicy(true /* system_proxy_enabled */, "" /* system_services_username */,
"" /* system_services_password */);
EXPECT_EQ(++expected_shutdown_calls,
client_test_interface()->GetShutDownCallCount());
// Disable system-proxy via policy and expect a shut-down request to be
// sent.
SetPolicy(false /* system_proxy_enabled */, "" /* system_services_username */,
"" /* system_services_password */);
EXPECT_EQ(++expected_shutdown_calls,
client_test_interface()->GetShutDownCallCount());
}
} // namespace policy