blob: 2254b2da6d4f94b02395c9967a69bee488fbb151 [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/test/supervised_user/embedded_test_server_setup_mixin.h"
#include <string>
#include <vector>
#include "base/containers/span.h"
#include "base/logging.h"
#include "base/ranges/algorithm.h"
#include "base/strings/strcat.h"
#include "base/strings/string_piece.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
#include "chrome/test/base/mixin_based_in_process_browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "net/dns/mock_host_resolver.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "services/network/public/cpp/network_switches.h"
namespace supervised_user {
namespace {
std::string CreateResolverRule(base::StringPiece host,
base::StringPiece target) {
return base::StrCat({"MAP ", host, " ", target});
}
std::vector<std::string> SplitHostList(base::StringPiece host_list) {
return base::SplitString(host_list, ",", base::TRIM_WHITESPACE,
base::SPLIT_WANT_NONEMPTY);
}
} // namespace
EmbeddedTestServerSetupMixin::EmbeddedTestServerSetupMixin(
InProcessBrowserTestMixinHost& host,
InProcessBrowserTest* test_base,
raw_ptr<net::EmbeddedTestServer> server,
const Options& options)
: InProcessBrowserTestMixin(&host),
test_base_(test_base),
embedded_test_server_(server),
resolver_rules_map_host_list_(
SplitHostList(options.resolver_rules_map_host_list)) {
CHECK(server) << "This mixin requires an embedded test server";
}
EmbeddedTestServerSetupMixin::~EmbeddedTestServerSetupMixin() = default;
void EmbeddedTestServerSetupMixin::SetUp() {
CHECK(embedded_test_server_->InitializeAndListen());
}
void EmbeddedTestServerSetupMixin::SetUpCommandLine(
base::CommandLine* command_line) {
CHECK(embedded_test_server_->Started());
std::string target = embedded_test_server_->host_port_pair().ToString();
std::vector<std::string> resolver_rules(resolver_rules_map_host_list_.size());
base::ranges::transform(resolver_rules_map_host_list_, resolver_rules.begin(),
[&](const std::string& host) -> std::string {
return CreateResolverRule(host, target);
});
command_line->AppendSwitchASCII(
network::switches::kHostResolverRules,
base::JoinString(base::span<std::string>(resolver_rules), ", "));
LOG(INFO) << "Embedded test server is listening on " << target << ".";
LOG(INFO) << "Following hosts will be mapped to it: ";
for (const std::string& host_pattern : resolver_rules_map_host_list_) {
LOG(INFO) << "\t" << host_pattern;
}
}
void EmbeddedTestServerSetupMixin::SetUpOnMainThread() {
embedded_test_server_->StartAcceptingConnections();
}
void EmbeddedTestServerSetupMixin::TearDownOnMainThread() {
CHECK(embedded_test_server_->ShutdownAndWaitUntilComplete());
}
} // namespace supervised_user