#include "net/nqe/network_quality_estimator_util.h"
#include <memory>
#include <optional>
#include "base/test/scoped_feature_list.h"
#include "base/test/task_environment.h"
#include "build/build_config.h"
#include "net/base/features.h"
#include "net/base/host_port_pair.h"
#include "net/base/net_errors.h"
#include "net/base/network_isolation_key.h"
#include "net/base/schemeful_site.h"
#include "net/base/test_completion_callback.h"
#include "net/dns/context_host_resolver.h"
#include "net/dns/host_resolver.h"
#include "net/dns/mock_host_resolver.h"
#include "net/log/net_log.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
namespace net::nqe::internal {
namespace {
#if BUILDFLAG(IS_IOS)
#define MAYBE_ReservedHost DISABLED_ReservedHost
#else
#define MAYBE_ReservedHost ReservedHost
#endif
TEST(NetworkQualityEstimatorUtilTest, MAYBE_ReservedHost) {
base::test::TaskEnvironment task_environment;
MockCachingHostResolver mock_host_resolver;
mock_host_resolver.rules()->AddRule("example1.com", "127.0.0.3");
mock_host_resolver.rules()->AddRule("example2.com", "27.0.0.3");
EXPECT_EQ(0u, mock_host_resolver.num_resolve());
int rv = mock_host_resolver.LoadIntoCache(
url::SchemeHostPort("https", "example1.com", 443),
NetworkAnonymizationKey(), std::nullopt);
EXPECT_EQ(OK, rv);
rv = mock_host_resolver.LoadIntoCache(
url::SchemeHostPort("https", "example2.com", 443),
NetworkAnonymizationKey(), std::nullopt);
EXPECT_EQ(OK, rv);
EXPECT_EQ(2u, mock_host_resolver.num_non_local_resolves());
EXPECT_FALSE(IsPrivateHostForTesting(
&mock_host_resolver,
url::SchemeHostPort("http", "[2607:f8b0:4006:819::200e]", 80),
NetworkAnonymizationKey()));
EXPECT_TRUE(IsPrivateHostForTesting(
&mock_host_resolver, url::SchemeHostPort("https", "192.168.0.1", 443),
NetworkAnonymizationKey()));
EXPECT_FALSE(IsPrivateHostForTesting(
&mock_host_resolver, url::SchemeHostPort("https", "92.168.0.1", 443),
NetworkAnonymizationKey()));
EXPECT_TRUE(IsPrivateHostForTesting(
&mock_host_resolver, url::SchemeHostPort("https", "example1.com", 443),
NetworkAnonymizationKey()));
EXPECT_FALSE(IsPrivateHostForTesting(
&mock_host_resolver, url::SchemeHostPort("https", "example2.com", 443),
NetworkAnonymizationKey()));
EXPECT_EQ(2u, mock_host_resolver.num_non_local_resolves());
}
#if BUILDFLAG(IS_IOS)
#define MAYBE_ReservedHostUncached DISABLED_ReservedHostUncached
#else
#define MAYBE_ReservedHostUncached ReservedHostUncached
#endif
TEST(NetworkQualityEstimatorUtilTest, MAYBE_ReservedHostUncached) {
base::test::TaskEnvironment task_environment;
MockCachingHostResolver mock_host_resolver;
auto rules = base::MakeRefCounted<net::RuleBasedHostResolverProc>(nullptr);
mock_host_resolver.rules()->AddRule("example3.com", "127.0.0.3");
EXPECT_FALSE(IsPrivateHostForTesting(
&mock_host_resolver, url::SchemeHostPort("https", "example3.com", 443),
NetworkAnonymizationKey()));
EXPECT_EQ(0u, mock_host_resolver.num_non_local_resolves());
int rv = mock_host_resolver.LoadIntoCache(
url::SchemeHostPort("https", "example3.com", 443),
NetworkAnonymizationKey(), std::nullopt);
EXPECT_EQ(OK, rv);
EXPECT_EQ(1u, mock_host_resolver.num_non_local_resolves());
EXPECT_TRUE(IsPrivateHostForTesting(
&mock_host_resolver, url::SchemeHostPort("https", "example3.com", 443),
NetworkAnonymizationKey()));
EXPECT_EQ(1u, mock_host_resolver.num_non_local_resolves());
}
#if BUILDFLAG(IS_IOS) || BUILDFLAG(IS_ANDROID)
#define MAYBE_ReservedHostUncachedWithNetworkIsolationKey \
DISABLED_ReservedHostUncachedWithNetworkIsolationKey
#else
#define MAYBE_ReservedHostUncachedWithNetworkIsolationKey \
ReservedHostUncachedWithNetworkIsolationKey
#endif
TEST(NetworkQualityEstimatorUtilTest,
MAYBE_ReservedHostUncachedWithNetworkIsolationKey) {
const SchemefulSite kSite(GURL("https://foo.test/"));
const auto kNetworkAnonymizationKey =
NetworkAnonymizationKey::CreateSameSite(kSite);
base::test::ScopedFeatureList feature_list;
feature_list.InitAndEnableFeature(
features::kPartitionConnectionsByNetworkIsolationKey);
base::test::TaskEnvironment task_environment;
MockCachingHostResolver mock_host_resolver;
mock_host_resolver.rules()->AddRule("example3.com", "127.0.0.3");
EXPECT_FALSE(IsPrivateHostForTesting(
&mock_host_resolver, url::SchemeHostPort("https", "example3.com", 443),
kNetworkAnonymizationKey));
EXPECT_EQ(0u, mock_host_resolver.num_non_local_resolves());
int rv = mock_host_resolver.LoadIntoCache(
url::SchemeHostPort("https", "example3.com", 443),
kNetworkAnonymizationKey, std::nullopt);
EXPECT_EQ(OK, rv);
EXPECT_EQ(1u, mock_host_resolver.num_non_local_resolves());
EXPECT_TRUE(IsPrivateHostForTesting(
&mock_host_resolver, url::SchemeHostPort("https", "example3.com", 443),
kNetworkAnonymizationKey));
EXPECT_EQ(1u, mock_host_resolver.num_non_local_resolves());
EXPECT_FALSE(IsPrivateHostForTesting(
&mock_host_resolver, url::SchemeHostPort("https", "example3.com", 443),
NetworkAnonymizationKey()));
}
#if BUILDFLAG(IS_IOS)
#define MAYBE_Localhost DISABLED_Localhost
#else
#define MAYBE_Localhost Localhost
#endif
TEST(NetworkQualityEstimatorUtilTest, MAYBE_Localhost) {
base::test::TaskEnvironment task_environment;
std::unique_ptr<ContextHostResolver> resolver =
HostResolver::CreateStandaloneContextResolver(NetLog::Get());
auto rules = base::MakeRefCounted<net::RuleBasedHostResolverProc>(nullptr);
EXPECT_TRUE(IsPrivateHostForTesting(
resolver.get(), url::SchemeHostPort("https", "localhost", 443),
NetworkAnonymizationKey()));
EXPECT_TRUE(IsPrivateHostForTesting(
resolver.get(), url::SchemeHostPort("http", "127.0.0.1", 80),
NetworkAnonymizationKey()));
EXPECT_TRUE(IsPrivateHostForTesting(
resolver.get(), url::SchemeHostPort("http", "0.0.0.0", 80),
NetworkAnonymizationKey()));
EXPECT_TRUE(IsPrivateHostForTesting(resolver.get(),
url::SchemeHostPort("http", "[::1]", 80),
NetworkAnonymizationKey()));
EXPECT_FALSE(IsPrivateHostForTesting(
resolver.get(), url::SchemeHostPort("http", "google.com", 80),
NetworkAnonymizationKey()));
EXPECT_FALSE(IsPrivateHostForTesting(
resolver.get(), url::SchemeHostPort("https", "localhost6", 443),
NetworkAnonymizationKey()));
EXPECT_FALSE(IsPrivateHostForTesting(
resolver.get(),
url::SchemeHostPort("https", "localhost6.localdomain6", 443),
NetworkAnonymizationKey()));
}
}
}