#include "net/device_bound_sessions/cookie_craving.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/test/scoped_feature_list.h"
#include "base/unguessable_token.h"
#include "net/base/features.h"
#include "net/cookies/canonical_cookie.h"
#include "net/cookies/cookie_access_params.h"
#include "net/cookies/cookie_constants.h"
#include "net/cookies/cookie_partition_key.h"
#include "net/device_bound_sessions/proto/storage.pb.h"
#include "net/test/test_with_task_environment.h"
#include "net/url_request/url_request_context_builder.h"
#include "net/url_request/url_request_test_util.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace net::device_bound_sessions {
constexpr char kUrlString[] = "https://www.example.test/foo";
constexpr char kName[] = "name";
const base::Time kCreationTime = base::Time::Now();
constexpr net::NetworkTrafficAnnotationTag kDummyAnnotation =
net::DefineNetworkTrafficAnnotation("dbsc_registration", "");
class CookieCravingTest : public TestWithTaskEnvironment {
protected:
CookieCravingTest()
: context_(CreateTestURLRequestContextBuilder()->Build()) {}
std::unique_ptr<URLRequestContext> context_;
};
CookieCraving CreateValidCookieCraving(
const GURL& url,
const std::string& name,
const std::string& attributes,
base::Time creation_time = kCreationTime) {
base::expected<CookieCraving, SessionError> maybe_cc =
CookieCraving::Create(url, name, attributes, creation_time);
EXPECT_TRUE(maybe_cc.has_value());
EXPECT_TRUE(maybe_cc->IsValid());
return std::move(*maybe_cc);
}
CanonicalCookie CreateCanonicalCookie(
const GURL& url,
const std::string& cookie_line,
base::Time creation_time = kCreationTime) {
std::unique_ptr<CanonicalCookie> canonical_cookie =
CanonicalCookie::CreateForTesting(url, cookie_line, creation_time,
std::nullopt);
EXPECT_TRUE(canonical_cookie);
EXPECT_TRUE(canonical_cookie->IsCanonical());
return *canonical_cookie;
}
TEST_F(CookieCravingTest, CreateBasic) {
CookieCraving cc = CreateValidCookieCraving(GURL(kUrlString), kName, "");
EXPECT_EQ(cc.Name(), kName);
EXPECT_EQ(cc.Domain(), "www.example.test");
EXPECT_EQ(cc.Path(), "/");
EXPECT_EQ(cc.CreationDate(), kCreationTime);
EXPECT_FALSE(cc.SecureAttribute());
EXPECT_FALSE(cc.IsHttpOnly());
EXPECT_EQ(cc.SameSite(), CookieSameSite::UNSPECIFIED);
EXPECT_EQ(cc.PartitionKey(), std::nullopt);
EXPECT_EQ(cc.SourceScheme(), CookieSourceScheme::kSecure);
EXPECT_EQ(cc.SourcePort(), 443);
cc = CreateValidCookieCraving(
GURL(kUrlString), kName,
"Secure; HttpOnly; Path=/foo; Domain=example.test; SameSite=Lax");
EXPECT_EQ(cc.Name(), kName);
EXPECT_EQ(cc.Domain(), ".example.test");
EXPECT_EQ(cc.Path(), "/foo");
EXPECT_EQ(cc.CreationDate(), kCreationTime);
EXPECT_TRUE(cc.SecureAttribute());
EXPECT_TRUE(cc.IsHttpOnly());
EXPECT_EQ(cc.SameSite(), CookieSameSite::LAX_MODE);
EXPECT_EQ(cc.PartitionKey(), std::nullopt);
EXPECT_EQ(cc.SourceScheme(), CookieSourceScheme::kSecure);
EXPECT_EQ(cc.SourcePort(), 443);
cc = CreateValidCookieCraving(
GURL(kUrlString), " name ",
" Secure;HttpOnly;Path = /foo; Domain= example.test; SameSite =Lax ");
EXPECT_EQ(cc.Name(), "name");
EXPECT_EQ(cc.Domain(), ".example.test");
EXPECT_EQ(cc.Path(), "/foo");
EXPECT_EQ(cc.CreationDate(), kCreationTime);
EXPECT_TRUE(cc.SecureAttribute());
EXPECT_TRUE(cc.IsHttpOnly());
EXPECT_EQ(cc.SameSite(), CookieSameSite::LAX_MODE);
EXPECT_EQ(cc.PartitionKey(), std::nullopt);
EXPECT_EQ(cc.SourceScheme(), CookieSourceScheme::kSecure);
EXPECT_EQ(cc.SourcePort(), 443);
}
TEST_F(CookieCravingTest, CreateWithPrefix) {
CookieCraving cc = CreateValidCookieCraving(GURL(kUrlString), "__Host-blah",
"Secure; Path=/");
EXPECT_EQ(cc.Domain(), "www.example.test");
EXPECT_EQ(cc.Path(), "/");
EXPECT_TRUE(cc.SecureAttribute());
cc = CreateValidCookieCraving(GURL(kUrlString), "__Secure-blah",
"Secure; Path=/foo; Domain=example.test");
EXPECT_TRUE(cc.SecureAttribute());
cc = CreateValidCookieCraving(GURL(kUrlString), "__http-blah",
"secure;Path=/;httpOnly");
}
TEST_F(CookieCravingTest, CreateStrange) {
const char* kStrangeNames[] = {
" name ",
"n a m e",
" n a m e ",
};
for (const char* name : kStrangeNames) {
SCOPED_TRACE(base::StringPrintf("name: %s", name));
CookieCraving cc = CreateValidCookieCraving(GURL(kUrlString), name, "");
EXPECT_EQ(cc.Name(), base::TrimWhitespaceASCII(name, base::TRIM_ALL));
}
const char* kStrangeAttributesLines[] = {
"SECURE; PATH=/; SAMESITE=LAX",
" Secure; Path=/; SameSite=Lax ",
"Secure;Path=/;SameSite=Lax",
"Domain=.example.test",
"Path=/different",
"Path=noslash",
"Secure=true; HttpOnly=yes; SameSite=absolutely",
"SameSite=SuperStrict",
};
for (const char* attributes : kStrangeAttributesLines) {
CreateValidCookieCraving(GURL(kUrlString), kName, attributes);
}
}
TEST_F(CookieCravingTest, CreateSecureFromInsecureUrl) {
CookieCraving cc =
CreateValidCookieCraving(GURL("http://insecure.test"), kName, "Secure");
EXPECT_TRUE(cc.SecureAttribute());
EXPECT_EQ(cc.SourceScheme(), CookieSourceScheme::kNonSecure);
}
TEST_F(CookieCravingTest, CreateFailParse) {
const struct {
const char* name;
const char* attributes;
SessionError::ErrorType expected_error;
} kParseFailInputs[] = {
{"", "", SessionError::kInvalidCredentialsCookie},
{"blah\nsomething", "Secure; Path=/",
SessionError::kInvalidCredentialsCookieName},
{"blah=something", "Secure; Path=/",
SessionError::kInvalidCredentialsCookieName},
{"blah;something", "Secure; Path=/",
SessionError::kInvalidCredentialsCookieName},
{"name", "Secure;\n Path=/",
SessionError::kInvalidCredentialsCookieParsing},
};
for (const auto& input : kParseFailInputs) {
SCOPED_TRACE(testing::Message()
<< "Name: " << input.name
<< ". Attributes: " << input.attributes << ".");
base::expected<CookieCraving, SessionError> cc = CookieCraving::Create(
GURL(kUrlString), input.name, input.attributes, kCreationTime);
EXPECT_FALSE(cc.has_value());
EXPECT_EQ(cc.error().type, input.expected_error);
}
}
TEST_F(CookieCravingTest, CreateFailInvalidParams) {
base::expected<CookieCraving, SessionError> cc =
CookieCraving::Create(GURL(kUrlString), kName, "", base::Time());
EXPECT_FALSE(cc.has_value());
EXPECT_EQ(cc.error().type,
SessionError::kInvalidCredentialsCookieCreationTime);
}
TEST_F(CookieCravingTest, CreateFailBadDomain) {
base::expected<CookieCraving, SessionError> cc = CookieCraving::Create(
GURL(kUrlString), kName, "Domain=other.test", kCreationTime);
EXPECT_FALSE(cc.has_value());
EXPECT_EQ(cc.error().type,
SessionError::kInvalidCredentialsCookieInvalidDomain);
cc = CookieCraving::Create(GURL(kUrlString), kName, "Domain=test",
kCreationTime);
EXPECT_FALSE(cc.has_value());
EXPECT_EQ(cc.error().type,
SessionError::kInvalidCredentialsCookieInvalidDomain);
cc = CookieCraving::Create(GURL("http://1.2.3.4"), kName, "Domain=2.3.4",
kCreationTime);
EXPECT_FALSE(cc.has_value());
EXPECT_EQ(cc.error().type,
SessionError::kInvalidCredentialsCookieInvalidDomain);
cc = CookieCraving::Create(GURL(kUrlString), "partitioned", "partitioned",
kCreationTime);
EXPECT_FALSE(cc.has_value());
EXPECT_EQ(cc.error().type,
SessionError::kInvalidCredentialsCookieUnpermittedAttribute);
}
TEST_F(CookieCravingTest, CreateFailInvalidPrefix) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
{features::kPrefixCookieHttp, features::kPrefixCookieHostHttp}, {});
base::expected<CookieCraving, SessionError> cc =
CookieCraving::Create(GURL("http://insecure.test"), "__Host-blah",
"Secure; Path=/", kCreationTime);
EXPECT_FALSE(cc.has_value());
EXPECT_EQ(cc.error().type, SessionError::kInvalidCredentialsCookiePrefix);
cc = CookieCraving::Create(GURL(kUrlString), "__Host-blah", "Path=/",
kCreationTime);
EXPECT_FALSE(cc.has_value());
EXPECT_EQ(cc.error().type, SessionError::kInvalidCredentialsCookiePrefix);
cc = CookieCraving::Create(GURL(kUrlString), "__Host-blah",
"Secure; Path=/; Domain=example.test",
kCreationTime);
EXPECT_FALSE(cc.has_value());
EXPECT_EQ(cc.error().type, SessionError::kInvalidCredentialsCookiePrefix);
cc = CookieCraving::Create(GURL(kUrlString), "__Host-blah",
"Secure; Path=/foo", kCreationTime);
EXPECT_FALSE(cc.has_value());
EXPECT_EQ(cc.error().type, SessionError::kInvalidCredentialsCookiePrefix);
cc = CookieCraving::Create(GURL(kUrlString), "__Secure-blah", "",
kCreationTime);
EXPECT_FALSE(cc.has_value());
EXPECT_EQ(cc.error().type, SessionError::kInvalidCredentialsCookiePrefix);
cc = CookieCraving::Create(GURL(kUrlString), "__host-blah", "Path=/",
kCreationTime);
EXPECT_FALSE(cc.has_value());
EXPECT_EQ(cc.error().type, SessionError::kInvalidCredentialsCookiePrefix);
cc = CookieCraving::Create(GURL(kUrlString), "__HOST-blah",
"Secure; Path=/; Domain=example.test",
kCreationTime);
EXPECT_FALSE(cc.has_value());
EXPECT_EQ(cc.error().type, SessionError::kInvalidCredentialsCookiePrefix);
cc = CookieCraving::Create(GURL(kUrlString), "__SeCuRe-blah", "",
kCreationTime);
EXPECT_FALSE(cc.has_value());
EXPECT_EQ(cc.error().type, SessionError::kInvalidCredentialsCookiePrefix);
cc = CookieCraving::Create(GURL(kUrlString), "__http-blah", "Path=/",
kCreationTime);
EXPECT_FALSE(cc.has_value());
EXPECT_EQ(cc.error().type, SessionError::kInvalidCredentialsCookiePrefix);
cc = CookieCraving::Create(GURL(kUrlString), "__http-blah", "secure;Path=/",
kCreationTime);
EXPECT_FALSE(cc.has_value());
EXPECT_EQ(cc.error().type, SessionError::kInvalidCredentialsCookiePrefix);
cc = CookieCraving::Create(GURL(kUrlString), "__host-http-blah", "Path=/",
kCreationTime);
EXPECT_FALSE(cc.has_value());
EXPECT_EQ(cc.error().type, SessionError::kInvalidCredentialsCookiePrefix);
cc = CookieCraving::Create(GURL(kUrlString), "__host-http-blah",
"secure;Path=/", kCreationTime);
EXPECT_FALSE(cc.has_value());
EXPECT_EQ(cc.error().type, SessionError::kInvalidCredentialsCookiePrefix);
cc = CookieCraving::Create(GURL(kUrlString), "__host-http-blah",
"secure;Path=/;httpOnly", kCreationTime);
EXPECT_FALSE(cc.has_value());
EXPECT_EQ(cc.error().type, SessionError::kInvalidCredentialsCookie);
cc = CookieCraving::Create(GURL(kUrlString), "__host-http-blah",
"secure;Path=/cookies/;httpOnly", kCreationTime);
EXPECT_FALSE(cc.has_value());
EXPECT_EQ(cc.error().type, SessionError::kInvalidCredentialsCookiePrefix);
cc = CookieCraving::Create(GURL(kUrlString), "__host-http-blah",
"secure;Path=/;httpOnly;Domain=example.test",
kCreationTime);
EXPECT_FALSE(cc.has_value());
EXPECT_EQ(cc.error().type, SessionError::kInvalidCredentialsCookiePrefix);
}
TEST_F(CookieCravingTest, IsNotValid) {
const struct {
const char* name;
const char* domain;
const char* path;
bool secure;
base::Time creation = kCreationTime;
} kTestCases[] = {
{" name", "www.example.test", "/", true},
{";", "www.example.test", "/", true},
{"=", "www.example.test", "/", true},
{"na\nme", "www.example.test", "/", true},
{"name", "", "/", true},
{"name", "ExAmPlE.test", "/", true},
{"name", "www.example.test", "", true},
{"name", "www.example.test", "noslash", true},
{"__Host-name", ".example.test", "/", true},
{"__Host-name", "www.example.test", "/", false},
{"__Host-name", "www.example.test", "/foo", false},
{"__Secure-name", "www.example.test", "/", false},
{"__HOST-name", ".example.test", "/", true},
{"__HoSt-name", "www.example.test", "/", false},
{"__host-name", "www.example.test", "/foo", false},
{"__secure-name", "www.example.test", "/", false},
{"name", "www.example.test", "/", true, base::Time()},
};
for (const auto& test_case : kTestCases) {
CookieCraving cc = CookieCraving::CreateUnsafeForTesting(
test_case.name, test_case.domain, test_case.path, test_case.creation,
test_case.secure,
false, CookieSameSite::LAX_MODE,
CookieSourceScheme::kSecure, 443);
SCOPED_TRACE(cc.DebugString());
EXPECT_FALSE(cc.IsValid());
}
}
TEST_F(CookieCravingTest, IsSatisfiedBy) {
CanonicalCookie canonical_cookie =
CreateCanonicalCookie(GURL(kUrlString), "name=somevalue");
CookieCraving cookie_craving =
CreateValidCookieCraving(GURL(kUrlString), "name", "");
EXPECT_TRUE(cookie_craving.IsSatisfiedBy(canonical_cookie));
canonical_cookie =
CreateCanonicalCookie(GURL(kUrlString),
"name=somevalue; Domain=example.test; Path=/; "
"Secure; HttpOnly; SameSite=Lax");
cookie_craving = CreateValidCookieCraving(
GURL(kUrlString), "name",
"Domain=example.test; Path=/; Secure; HttpOnly; SameSite=Lax");
EXPECT_TRUE(cookie_craving.IsSatisfiedBy(canonical_cookie));
canonical_cookie = CreateCanonicalCookie(
GURL(kUrlString), "name=somevalue; Domain=example.test");
cookie_craving = CreateValidCookieCraving(
GURL("https://subdomain.example.test"), "name", "Domain=example.test");
EXPECT_TRUE(cookie_craving.IsSatisfiedBy(canonical_cookie));
canonical_cookie = CreateCanonicalCookie(
GURL(kUrlString), "name=somevalue; Domain=example.test", kCreationTime);
cookie_craving =
CreateValidCookieCraving(GURL(kUrlString), "name", "Domain=example.test",
kCreationTime + base::Hours(1));
EXPECT_TRUE(cookie_craving.IsSatisfiedBy(canonical_cookie));
canonical_cookie = CreateCanonicalCookie(
GURL(kUrlString), "name=somevalue; Domain=example.test");
cookie_craving =
CreateValidCookieCraving(GURL("http://subdomain.example.test:8080"),
"name", "Domain=example.test");
EXPECT_TRUE(cookie_craving.IsSatisfiedBy(canonical_cookie));
}
TEST_F(CookieCravingTest, IsNotSatisfiedBy) {
CanonicalCookie canonical_cookie =
CreateCanonicalCookie(GURL(kUrlString), "realname=somevalue");
CookieCraving cookie_craving =
CreateValidCookieCraving(GURL(kUrlString), "fakename", "");
EXPECT_FALSE(cookie_craving.IsSatisfiedBy(canonical_cookie));
canonical_cookie = CreateCanonicalCookie(
GURL(kUrlString), "name=somevalue; Domain=example.test");
cookie_craving = CreateValidCookieCraving(GURL(kUrlString), "name",
"Domain=www.example.test");
EXPECT_FALSE(cookie_craving.IsSatisfiedBy(canonical_cookie));
canonical_cookie = CreateCanonicalCookie(GURL(kUrlString), "name=somevalue");
cookie_craving = CreateValidCookieCraving(GURL(kUrlString), "name",
"Domain=www.example.test");
EXPECT_FALSE(cookie_craving.IsSatisfiedBy(canonical_cookie));
canonical_cookie = CreateCanonicalCookie(
GURL(kUrlString), "name=somevalue; Domain=www.example.test");
cookie_craving = CreateValidCookieCraving(GURL(kUrlString), "name", "");
EXPECT_FALSE(cookie_craving.IsSatisfiedBy(canonical_cookie));
canonical_cookie = CreateCanonicalCookie(
GURL(kUrlString), "name=somevalue; Domain=example.test; Path=/");
cookie_craving = CreateValidCookieCraving(GURL(kUrlString), "name",
"Domain=example.test; Path=/foo");
EXPECT_FALSE(cookie_craving.IsSatisfiedBy(canonical_cookie));
canonical_cookie = CreateCanonicalCookie(
GURL(kUrlString), "name=somevalue; Secure; Domain=example.test; Path=/");
cookie_craving = CreateValidCookieCraving(GURL(kUrlString), "name",
"Domain=example.test; Path=/foo");
EXPECT_FALSE(cookie_craving.IsSatisfiedBy(canonical_cookie));
canonical_cookie = CreateCanonicalCookie(
GURL(kUrlString), "name=somevalue; Domain=example.test; Path=/");
cookie_craving = CreateValidCookieCraving(
GURL(kUrlString), "name", "Secure; Domain=example.test; Path=/foo");
EXPECT_FALSE(cookie_craving.IsSatisfiedBy(canonical_cookie));
canonical_cookie = CreateCanonicalCookie(
GURL(kUrlString),
"name=somevalue; HttpOnly; Domain=example.test; Path=/");
cookie_craving = CreateValidCookieCraving(GURL(kUrlString), "name",
"Domain=example.test; Path=/foo");
EXPECT_FALSE(cookie_craving.IsSatisfiedBy(canonical_cookie));
canonical_cookie = CreateCanonicalCookie(
GURL(kUrlString), "name=somevalue; Domain=example.test; Path=/");
cookie_craving = CreateValidCookieCraving(
GURL(kUrlString), "name", "HttpOnly; Domain=example.test; Path=/foo");
EXPECT_FALSE(cookie_craving.IsSatisfiedBy(canonical_cookie));
canonical_cookie =
CreateCanonicalCookie(GURL(kUrlString), "name=somevalue; SameSite=Lax");
cookie_craving =
CreateValidCookieCraving(GURL(kUrlString), "name", "SameSite=Strict");
EXPECT_FALSE(cookie_craving.IsSatisfiedBy(canonical_cookie));
canonical_cookie =
CreateCanonicalCookie(GURL(kUrlString), "name=somevalue; SameSite=Lax");
cookie_craving = CreateValidCookieCraving(GURL(kUrlString), "name", "");
EXPECT_FALSE(cookie_craving.IsSatisfiedBy(canonical_cookie));
}
TEST_F(CookieCravingTest, BasicCookieToFromProto) {
CookieCraving cc = CreateValidCookieCraving(GURL(kUrlString), kName, "");
proto::CookieCraving proto = cc.ToProto();
EXPECT_EQ(proto.name(), kName);
EXPECT_EQ(proto.domain(), "www.example.test");
EXPECT_EQ(proto.path(), "/");
EXPECT_EQ(proto.creation_time(),
kCreationTime.ToDeltaSinceWindowsEpoch().InMicroseconds());
EXPECT_FALSE(proto.secure());
EXPECT_FALSE(proto.httponly());
EXPECT_EQ(proto.same_site(),
proto::CookieSameSite::COOKIE_SAME_SITE_UNSPECIFIED);
EXPECT_EQ(proto.source_scheme(), proto::CookieSourceScheme::SECURE);
EXPECT_EQ(proto.source_port(), 443);
std::optional<CookieCraving> restored_cc =
CookieCraving::CreateFromProto(proto);
ASSERT_TRUE(restored_cc.has_value());
EXPECT_TRUE(restored_cc->IsEqualForTesting(cc));
cc = CreateValidCookieCraving(
GURL(kUrlString), kName,
"Secure; HttpOnly; Path=/foo; Domain=example.test; SameSite=Lax");
proto = cc.ToProto();
EXPECT_EQ(proto.name(), kName);
EXPECT_EQ(proto.domain(), ".example.test");
EXPECT_EQ(proto.path(), "/foo");
EXPECT_EQ(proto.creation_time(),
kCreationTime.ToDeltaSinceWindowsEpoch().InMicroseconds());
EXPECT_TRUE(proto.secure());
EXPECT_TRUE(proto.httponly());
EXPECT_EQ(proto.same_site(), proto::CookieSameSite::LAX_MODE);
EXPECT_EQ(proto.source_scheme(), proto::CookieSourceScheme::SECURE);
EXPECT_EQ(proto.source_port(), 443);
restored_cc = CookieCraving::CreateFromProto(proto);
ASSERT_TRUE(restored_cc.has_value());
EXPECT_TRUE(restored_cc->IsEqualForTesting(cc));
}
TEST_F(CookieCravingTest, FailCreateFromInvalidProto) {
proto::CookieCraving proto;
std::optional<CookieCraving> cc = CookieCraving::CreateFromProto(proto);
EXPECT_FALSE(cc.has_value());
cc = CreateValidCookieCraving(
GURL(kUrlString), kName,
"Secure; HttpOnly; Path=/foo; Domain=example.test; SameSite=Lax");
proto = cc->ToProto();
{
proto::CookieCraving p(proto);
p.clear_name();
std::optional<CookieCraving> c = CookieCraving::CreateFromProto(p);
EXPECT_FALSE(c.has_value());
}
{
proto::CookieCraving p(proto);
p.clear_domain();
std::optional<CookieCraving> c = CookieCraving::CreateFromProto(p);
EXPECT_FALSE(c.has_value());
}
{
proto::CookieCraving p(proto);
p.clear_path();
std::optional<CookieCraving> c = CookieCraving::CreateFromProto(p);
EXPECT_FALSE(c.has_value());
}
{
proto::CookieCraving p(proto);
p.clear_secure();
std::optional<CookieCraving> c = CookieCraving::CreateFromProto(p);
EXPECT_FALSE(c.has_value());
}
{
proto::CookieCraving p(proto);
p.clear_httponly();
std::optional<CookieCraving> c = CookieCraving::CreateFromProto(p);
EXPECT_FALSE(c.has_value());
}
{
proto::CookieCraving p(proto);
p.clear_source_port();
std::optional<CookieCraving> c = CookieCraving::CreateFromProto(p);
EXPECT_FALSE(c.has_value());
}
{
proto::CookieCraving p(proto);
p.clear_creation_time();
std::optional<CookieCraving> c = CookieCraving::CreateFromProto(p);
EXPECT_FALSE(c.has_value());
}
{
proto::CookieCraving p(proto);
p.clear_same_site();
std::optional<CookieCraving> c = CookieCraving::CreateFromProto(p);
EXPECT_FALSE(c.has_value());
}
{
proto::CookieCraving p(proto);
p.clear_source_scheme();
std::optional<CookieCraving> c = CookieCraving::CreateFromProto(p);
EXPECT_FALSE(c.has_value());
}
}
TEST_F(CookieCravingTest, ShouldIncludeCantCreateCanonicalCookie) {
CookieCraving cc_valid = CookieCraving::CreateUnsafeForTesting(
"name", "www.example.test", "/foo", kCreationTime,
true,
true, CookieSameSite::LAX_MODE,
CookieSourceScheme::kSecure, 443);
CookieCraving cc_invalid = CookieCraving::CreateUnsafeForTesting(
"", "www.example.test", "/foo", kCreationTime, true,
true, CookieSameSite::LAX_MODE,
CookieSourceScheme::kSecure, 443);
CookieOptions options;
options.set_same_site_cookie_context(
net::CookieOptions::SameSiteCookieContext::MakeInclusive());
options.set_include_httponly();
CookieAccessParams params{CookieAccessSemantics::NONLEGACY,
CookieScopeSemantics::UNKNOWN, false};
net::TestDelegate delegate;
std::unique_ptr<URLRequest> request = context_->CreateRequest(
GURL(kUrlString), IDLE, &delegate, kDummyAnnotation);
EXPECT_TRUE(cc_valid.ShouldIncludeForRequest(
request.get(), FirstPartySetMetadata(), options, params));
EXPECT_FALSE(cc_invalid.ShouldIncludeForRequest(
request.get(), FirstPartySetMetadata(), options, params));
}
}