xref: /aosp_15_r20/external/cronet/net/base/isolation_info_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2020 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "net/base/isolation_info.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <iostream>
8*6777b538SAndroid Build Coastguard Worker #include <optional>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "base/strings/strcat.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/test/gtest_util.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/test/scoped_feature_list.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/unguessable_token.h"
14*6777b538SAndroid Build Coastguard Worker #include "isolation_info.h"
15*6777b538SAndroid Build Coastguard Worker #include "net/base/features.h"
16*6777b538SAndroid Build Coastguard Worker #include "net/base/network_anonymization_key.h"
17*6777b538SAndroid Build Coastguard Worker #include "net/base/network_isolation_key.h"
18*6777b538SAndroid Build Coastguard Worker #include "net/base/schemeful_site.h"
19*6777b538SAndroid Build Coastguard Worker #include "net/cookies/site_for_cookies.h"
20*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
21*6777b538SAndroid Build Coastguard Worker #include "url/gurl.h"
22*6777b538SAndroid Build Coastguard Worker #include "url/origin.h"
23*6777b538SAndroid Build Coastguard Worker #include "url/url_util.h"
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker namespace net {
26*6777b538SAndroid Build Coastguard Worker 
27*6777b538SAndroid Build Coastguard Worker namespace {
28*6777b538SAndroid Build Coastguard Worker 
29*6777b538SAndroid Build Coastguard Worker class IsolationInfoTest
30*6777b538SAndroid Build Coastguard Worker     : public testing::Test,
31*6777b538SAndroid Build Coastguard Worker       public testing::WithParamInterface<NetworkIsolationKey::Mode> {
32*6777b538SAndroid Build Coastguard Worker  public:
SetUp()33*6777b538SAndroid Build Coastguard Worker   void SetUp() override {
34*6777b538SAndroid Build Coastguard Worker     switch (GetParam()) {
35*6777b538SAndroid Build Coastguard Worker       case net::NetworkIsolationKey::Mode::kFrameSiteEnabled:
36*6777b538SAndroid Build Coastguard Worker         scoped_feature_list_.InitWithFeatures(
37*6777b538SAndroid Build Coastguard Worker             {},
38*6777b538SAndroid Build Coastguard Worker             {net::features::kEnableCrossSiteFlagNetworkIsolationKey,
39*6777b538SAndroid Build Coastguard Worker              net::features::kEnableFrameSiteSharedOpaqueNetworkIsolationKey});
40*6777b538SAndroid Build Coastguard Worker         break;
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker       case net::NetworkIsolationKey::Mode::kFrameSiteWithSharedOpaqueEnabled:
43*6777b538SAndroid Build Coastguard Worker         scoped_feature_list_.InitWithFeatures(
44*6777b538SAndroid Build Coastguard Worker             {net::features::kEnableFrameSiteSharedOpaqueNetworkIsolationKey},
45*6777b538SAndroid Build Coastguard Worker             {
46*6777b538SAndroid Build Coastguard Worker                 net::features::kEnableCrossSiteFlagNetworkIsolationKey,
47*6777b538SAndroid Build Coastguard Worker             });
48*6777b538SAndroid Build Coastguard Worker         break;
49*6777b538SAndroid Build Coastguard Worker 
50*6777b538SAndroid Build Coastguard Worker       case net::NetworkIsolationKey::Mode::kCrossSiteFlagEnabled:
51*6777b538SAndroid Build Coastguard Worker         scoped_feature_list_.InitWithFeatures(
52*6777b538SAndroid Build Coastguard Worker             {net::features::kEnableCrossSiteFlagNetworkIsolationKey},
53*6777b538SAndroid Build Coastguard Worker             {net::features::kEnableFrameSiteSharedOpaqueNetworkIsolationKey});
54*6777b538SAndroid Build Coastguard Worker         break;
55*6777b538SAndroid Build Coastguard Worker     }
56*6777b538SAndroid Build Coastguard Worker   }
57*6777b538SAndroid Build Coastguard Worker 
58*6777b538SAndroid Build Coastguard Worker   const url::Origin kOrigin1 = url::Origin::Create(GURL("https://a.foo.test"));
59*6777b538SAndroid Build Coastguard Worker   const url::Origin kSite1 = url::Origin::Create(GURL("https://foo.test"));
60*6777b538SAndroid Build Coastguard Worker   const url::Origin kOrigin2 = url::Origin::Create(GURL("https://b.bar.test"));
61*6777b538SAndroid Build Coastguard Worker   const url::Origin kSite2 = url::Origin::Create(GURL("https://bar.test"));
62*6777b538SAndroid Build Coastguard Worker   const url::Origin kOrigin3 = url::Origin::Create(GURL("https://c.baz.test"));
63*6777b538SAndroid Build Coastguard Worker   const url::Origin kOpaqueOrigin;
64*6777b538SAndroid Build Coastguard Worker 
65*6777b538SAndroid Build Coastguard Worker   const base::UnguessableToken kNonce1 = base::UnguessableToken::Create();
66*6777b538SAndroid Build Coastguard Worker   const base::UnguessableToken kNonce2 = base::UnguessableToken::Create();
67*6777b538SAndroid Build Coastguard Worker 
68*6777b538SAndroid Build Coastguard Worker  private:
69*6777b538SAndroid Build Coastguard Worker   base::test::ScopedFeatureList scoped_feature_list_;
70*6777b538SAndroid Build Coastguard Worker };
71*6777b538SAndroid Build Coastguard Worker 
72*6777b538SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
73*6777b538SAndroid Build Coastguard Worker     Tests,
74*6777b538SAndroid Build Coastguard Worker     IsolationInfoTest,
75*6777b538SAndroid Build Coastguard Worker     testing::ValuesIn(
76*6777b538SAndroid Build Coastguard Worker         {NetworkIsolationKey::Mode::kFrameSiteEnabled,
77*6777b538SAndroid Build Coastguard Worker          NetworkIsolationKey::Mode::kCrossSiteFlagEnabled,
78*6777b538SAndroid Build Coastguard Worker          NetworkIsolationKey::Mode::kFrameSiteWithSharedOpaqueEnabled}),
__anoncedceff10202(const testing::TestParamInfo<NetworkIsolationKey::Mode>& info) 79*6777b538SAndroid Build Coastguard Worker     [](const testing::TestParamInfo<NetworkIsolationKey::Mode>& info) {
80*6777b538SAndroid Build Coastguard Worker       switch (info.param) {
81*6777b538SAndroid Build Coastguard Worker         case NetworkIsolationKey::Mode::kFrameSiteEnabled:
82*6777b538SAndroid Build Coastguard Worker           return "FrameSiteEnabled";
83*6777b538SAndroid Build Coastguard Worker         case NetworkIsolationKey::Mode::kCrossSiteFlagEnabled:
84*6777b538SAndroid Build Coastguard Worker           return "CrossSiteFlagEnabled";
85*6777b538SAndroid Build Coastguard Worker         case NetworkIsolationKey::Mode::kFrameSiteWithSharedOpaqueEnabled:
86*6777b538SAndroid Build Coastguard Worker           return "FrameSiteSharedOpaqueEnabled";
87*6777b538SAndroid Build Coastguard Worker       }
88*6777b538SAndroid Build Coastguard Worker     });
89*6777b538SAndroid Build Coastguard Worker 
DuplicateAndCompare(const IsolationInfo & isolation_info)90*6777b538SAndroid Build Coastguard Worker void DuplicateAndCompare(const IsolationInfo& isolation_info) {
91*6777b538SAndroid Build Coastguard Worker   std::optional<IsolationInfo> duplicate_isolation_info =
92*6777b538SAndroid Build Coastguard Worker       IsolationInfo::CreateIfConsistent(
93*6777b538SAndroid Build Coastguard Worker           isolation_info.request_type(), isolation_info.top_frame_origin(),
94*6777b538SAndroid Build Coastguard Worker           isolation_info.frame_origin(), isolation_info.site_for_cookies(),
95*6777b538SAndroid Build Coastguard Worker           isolation_info.nonce());
96*6777b538SAndroid Build Coastguard Worker 
97*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(duplicate_isolation_info);
98*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.IsEqualForTesting(*duplicate_isolation_info));
99*6777b538SAndroid Build Coastguard Worker }
100*6777b538SAndroid Build Coastguard Worker 
TEST_P(IsolationInfoTest,DebugString)101*6777b538SAndroid Build Coastguard Worker TEST_P(IsolationInfoTest, DebugString) {
102*6777b538SAndroid Build Coastguard Worker   IsolationInfo isolation_info = IsolationInfo::Create(
103*6777b538SAndroid Build Coastguard Worker       IsolationInfo::RequestType::kMainFrame, kOrigin1, kOrigin2,
104*6777b538SAndroid Build Coastguard Worker       SiteForCookies::FromOrigin(kOrigin1), kNonce1);
105*6777b538SAndroid Build Coastguard Worker   std::vector<std::string> parts;
106*6777b538SAndroid Build Coastguard Worker   parts.push_back(
107*6777b538SAndroid Build Coastguard Worker       "request_type: kMainFrame; top_frame_origin: https://a.foo.test; ");
108*6777b538SAndroid Build Coastguard Worker   parts.push_back("frame_origin: https://b.bar.test; ");
109*6777b538SAndroid Build Coastguard Worker   parts.push_back("network_anonymization_key: ");
110*6777b538SAndroid Build Coastguard Worker   parts.push_back(isolation_info.network_anonymization_key().ToDebugString());
111*6777b538SAndroid Build Coastguard Worker   parts.push_back("; network_isolation_key: ");
112*6777b538SAndroid Build Coastguard Worker   parts.push_back(isolation_info.network_isolation_key().ToDebugString());
113*6777b538SAndroid Build Coastguard Worker   parts.push_back("; nonce: ");
114*6777b538SAndroid Build Coastguard Worker   parts.push_back(isolation_info.nonce().value().ToString());
115*6777b538SAndroid Build Coastguard Worker   parts.push_back(
116*6777b538SAndroid Build Coastguard Worker       "; site_for_cookies: SiteForCookies: {site=https://foo.test; "
117*6777b538SAndroid Build Coastguard Worker       "schemefully_same=true}");
118*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(isolation_info.DebugString(), base::StrCat(parts));
119*6777b538SAndroid Build Coastguard Worker }
120*6777b538SAndroid Build Coastguard Worker 
TEST_P(IsolationInfoTest,CreateNetworkAnonymizationKeyForIsolationInfo)121*6777b538SAndroid Build Coastguard Worker TEST_P(IsolationInfoTest, CreateNetworkAnonymizationKeyForIsolationInfo) {
122*6777b538SAndroid Build Coastguard Worker   IsolationInfo isolation_info = IsolationInfo::Create(
123*6777b538SAndroid Build Coastguard Worker       IsolationInfo::RequestType::kMainFrame, kOrigin1, kOrigin2,
124*6777b538SAndroid Build Coastguard Worker       SiteForCookies::FromOrigin(kOrigin1), kNonce1);
125*6777b538SAndroid Build Coastguard Worker   NetworkAnonymizationKey nak =
126*6777b538SAndroid Build Coastguard Worker       isolation_info.CreateNetworkAnonymizationKeyForIsolationInfo(
127*6777b538SAndroid Build Coastguard Worker           kOrigin1, kOrigin2, kNonce1);
128*6777b538SAndroid Build Coastguard Worker 
129*6777b538SAndroid Build Coastguard Worker   IsolationInfo same_site_isolation_info = IsolationInfo::Create(
130*6777b538SAndroid Build Coastguard Worker       IsolationInfo::RequestType::kMainFrame, kOrigin1, kOrigin1,
131*6777b538SAndroid Build Coastguard Worker       SiteForCookies::FromOrigin(kOrigin1), kNonce1);
132*6777b538SAndroid Build Coastguard Worker 
133*6777b538SAndroid Build Coastguard Worker   // Top frame should be populated regardless of scheme.
134*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nak.GetTopFrameSite(), SchemefulSite(kOrigin1));
135*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(isolation_info.top_frame_origin(), kOrigin1);
136*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(isolation_info.network_anonymization_key().GetTopFrameSite(),
137*6777b538SAndroid Build Coastguard Worker             SchemefulSite(kOrigin1));
138*6777b538SAndroid Build Coastguard Worker 
139*6777b538SAndroid Build Coastguard Worker   // Nonce should be empty regardless of scheme
140*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nak.GetNonce().value(), kNonce1);
141*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(isolation_info.network_anonymization_key().GetNonce().value(),
142*6777b538SAndroid Build Coastguard Worker             kNonce1);
143*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(isolation_info.nonce().value(), kNonce1);
144*6777b538SAndroid Build Coastguard Worker 
145*6777b538SAndroid Build Coastguard Worker   // Triple-keyed IsolationInfo + double-keyed + cross site bit
146*6777b538SAndroid Build Coastguard Worker   // NetworkAnonymizationKey case.
147*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(isolation_info.frame_origin(), kOrigin2);
148*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.network_anonymization_key().IsCrossSite());
149*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(
150*6777b538SAndroid Build Coastguard Worker       same_site_isolation_info.network_anonymization_key().IsSameSite());
151*6777b538SAndroid Build Coastguard Worker }
152*6777b538SAndroid Build Coastguard Worker 
153*6777b538SAndroid Build Coastguard Worker // A 2.5-keyed NAK created with two identical opaque origins should be
154*6777b538SAndroid Build Coastguard Worker // same-site.
TEST_P(IsolationInfoTest,CreateNetworkAnonymizationKeyForIsolationInfoOpaque)155*6777b538SAndroid Build Coastguard Worker TEST_P(IsolationInfoTest, CreateNetworkAnonymizationKeyForIsolationInfoOpaque) {
156*6777b538SAndroid Build Coastguard Worker   url::Origin opaque;
157*6777b538SAndroid Build Coastguard Worker   IsolationInfo isolation_info = IsolationInfo::Create(
158*6777b538SAndroid Build Coastguard Worker       IsolationInfo::RequestType::kMainFrame, opaque, opaque,
159*6777b538SAndroid Build Coastguard Worker       SiteForCookies::FromOrigin(opaque), kNonce1);
160*6777b538SAndroid Build Coastguard Worker   NetworkAnonymizationKey nak =
161*6777b538SAndroid Build Coastguard Worker       isolation_info.CreateNetworkAnonymizationKeyForIsolationInfo(
162*6777b538SAndroid Build Coastguard Worker           opaque, opaque, kNonce1);
163*6777b538SAndroid Build Coastguard Worker 
164*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(nak.IsSameSite());
165*6777b538SAndroid Build Coastguard Worker 
166*6777b538SAndroid Build Coastguard Worker   url::Origin opaque2;
167*6777b538SAndroid Build Coastguard Worker   nak = isolation_info.CreateNetworkAnonymizationKeyForIsolationInfo(
168*6777b538SAndroid Build Coastguard Worker       opaque, opaque2, kNonce1);
169*6777b538SAndroid Build Coastguard Worker 
170*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(nak.IsCrossSite());
171*6777b538SAndroid Build Coastguard Worker }
172*6777b538SAndroid Build Coastguard Worker 
TEST_P(IsolationInfoTest,RequestTypeMainFrame)173*6777b538SAndroid Build Coastguard Worker TEST_P(IsolationInfoTest, RequestTypeMainFrame) {
174*6777b538SAndroid Build Coastguard Worker   IsolationInfo isolation_info =
175*6777b538SAndroid Build Coastguard Worker       IsolationInfo::Create(IsolationInfo::RequestType::kMainFrame, kOrigin1,
176*6777b538SAndroid Build Coastguard Worker                             kOrigin1, SiteForCookies::FromOrigin(kOrigin1));
177*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(IsolationInfo::RequestType::kMainFrame,
178*6777b538SAndroid Build Coastguard Worker             isolation_info.request_type());
179*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
180*6777b538SAndroid Build Coastguard Worker 
181*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
182*6777b538SAndroid Build Coastguard Worker   switch (NetworkIsolationKey::GetMode()) {
183*6777b538SAndroid Build Coastguard Worker     case NetworkIsolationKey::Mode::kFrameSiteEnabled:
184*6777b538SAndroid Build Coastguard Worker     case NetworkIsolationKey::Mode::kFrameSiteWithSharedOpaqueEnabled:
185*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ("https://foo.test https://foo.test",
186*6777b538SAndroid Build Coastguard Worker                 isolation_info.network_isolation_key().ToCacheKeyString());
187*6777b538SAndroid Build Coastguard Worker       break;
188*6777b538SAndroid Build Coastguard Worker     case NetworkIsolationKey::Mode::kCrossSiteFlagEnabled:
189*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ("https://foo.test _0",
190*6777b538SAndroid Build Coastguard Worker                 isolation_info.network_isolation_key().ToCacheKeyString());
191*6777b538SAndroid Build Coastguard Worker       break;
192*6777b538SAndroid Build Coastguard Worker   }
193*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
194*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
195*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(
196*6777b538SAndroid Build Coastguard Worker       isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
197*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(isolation_info.nonce().has_value());
198*6777b538SAndroid Build Coastguard Worker 
199*6777b538SAndroid Build Coastguard Worker   DuplicateAndCompare(isolation_info);
200*6777b538SAndroid Build Coastguard Worker 
201*6777b538SAndroid Build Coastguard Worker   IsolationInfo redirected_isolation_info =
202*6777b538SAndroid Build Coastguard Worker       isolation_info.CreateForRedirect(kOrigin3);
203*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(IsolationInfo::RequestType::kMainFrame,
204*6777b538SAndroid Build Coastguard Worker             redirected_isolation_info.request_type());
205*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOrigin3, redirected_isolation_info.top_frame_origin());
206*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOrigin3, redirected_isolation_info.frame_origin());
207*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(
208*6777b538SAndroid Build Coastguard Worker       redirected_isolation_info.network_isolation_key().IsFullyPopulated());
209*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(redirected_isolation_info.network_isolation_key().IsTransient());
210*6777b538SAndroid Build Coastguard Worker   switch (NetworkIsolationKey::GetMode()) {
211*6777b538SAndroid Build Coastguard Worker     case NetworkIsolationKey::Mode::kFrameSiteEnabled:
212*6777b538SAndroid Build Coastguard Worker     case NetworkIsolationKey::Mode::kFrameSiteWithSharedOpaqueEnabled:
213*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ(
214*6777b538SAndroid Build Coastguard Worker           "https://baz.test https://baz.test",
215*6777b538SAndroid Build Coastguard Worker           redirected_isolation_info.network_isolation_key().ToCacheKeyString());
216*6777b538SAndroid Build Coastguard Worker       break;
217*6777b538SAndroid Build Coastguard Worker     case NetworkIsolationKey::Mode::kCrossSiteFlagEnabled:
218*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ(
219*6777b538SAndroid Build Coastguard Worker           "https://baz.test _0",
220*6777b538SAndroid Build Coastguard Worker           redirected_isolation_info.network_isolation_key().ToCacheKeyString());
221*6777b538SAndroid Build Coastguard Worker       break;
222*6777b538SAndroid Build Coastguard Worker   }
223*6777b538SAndroid Build Coastguard Worker 
224*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(redirected_isolation_info.site_for_cookies().IsFirstParty(
225*6777b538SAndroid Build Coastguard Worker       kOrigin3.GetURL()));
226*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(redirected_isolation_info.nonce().has_value());
227*6777b538SAndroid Build Coastguard Worker }
228*6777b538SAndroid Build Coastguard Worker 
TEST_P(IsolationInfoTest,RequestTypeSubFrame)229*6777b538SAndroid Build Coastguard Worker TEST_P(IsolationInfoTest, RequestTypeSubFrame) {
230*6777b538SAndroid Build Coastguard Worker   IsolationInfo isolation_info =
231*6777b538SAndroid Build Coastguard Worker       IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1,
232*6777b538SAndroid Build Coastguard Worker                             kOrigin2, SiteForCookies::FromOrigin(kOrigin1));
233*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(IsolationInfo::RequestType::kSubFrame,
234*6777b538SAndroid Build Coastguard Worker             isolation_info.request_type());
235*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
236*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOrigin2, isolation_info.frame_origin());
237*6777b538SAndroid Build Coastguard Worker   switch (NetworkIsolationKey::GetMode()) {
238*6777b538SAndroid Build Coastguard Worker     case NetworkIsolationKey::Mode::kFrameSiteEnabled:
239*6777b538SAndroid Build Coastguard Worker     case NetworkIsolationKey::Mode::kFrameSiteWithSharedOpaqueEnabled:
240*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ("https://foo.test https://bar.test",
241*6777b538SAndroid Build Coastguard Worker                 isolation_info.network_isolation_key().ToCacheKeyString());
242*6777b538SAndroid Build Coastguard Worker       break;
243*6777b538SAndroid Build Coastguard Worker     case NetworkIsolationKey::Mode::kCrossSiteFlagEnabled:
244*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ("https://foo.test _1",
245*6777b538SAndroid Build Coastguard Worker                 isolation_info.network_isolation_key().ToCacheKeyString());
246*6777b538SAndroid Build Coastguard Worker       break;
247*6777b538SAndroid Build Coastguard Worker   }
248*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
249*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
250*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(
251*6777b538SAndroid Build Coastguard Worker       isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
252*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(isolation_info.nonce().has_value());
253*6777b538SAndroid Build Coastguard Worker 
254*6777b538SAndroid Build Coastguard Worker   DuplicateAndCompare(isolation_info);
255*6777b538SAndroid Build Coastguard Worker 
256*6777b538SAndroid Build Coastguard Worker   IsolationInfo redirected_isolation_info =
257*6777b538SAndroid Build Coastguard Worker       isolation_info.CreateForRedirect(kOrigin3);
258*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(IsolationInfo::RequestType::kSubFrame,
259*6777b538SAndroid Build Coastguard Worker             redirected_isolation_info.request_type());
260*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOrigin1, redirected_isolation_info.top_frame_origin());
261*6777b538SAndroid Build Coastguard Worker 
262*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOrigin3, redirected_isolation_info.frame_origin());
263*6777b538SAndroid Build Coastguard Worker   switch (NetworkIsolationKey::GetMode()) {
264*6777b538SAndroid Build Coastguard Worker     case NetworkIsolationKey::Mode::kFrameSiteEnabled:
265*6777b538SAndroid Build Coastguard Worker     case NetworkIsolationKey::Mode::kFrameSiteWithSharedOpaqueEnabled:
266*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ(
267*6777b538SAndroid Build Coastguard Worker           "https://foo.test https://baz.test",
268*6777b538SAndroid Build Coastguard Worker           redirected_isolation_info.network_isolation_key().ToCacheKeyString());
269*6777b538SAndroid Build Coastguard Worker       break;
270*6777b538SAndroid Build Coastguard Worker     case NetworkIsolationKey::Mode::kCrossSiteFlagEnabled:
271*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ(
272*6777b538SAndroid Build Coastguard Worker           "https://foo.test _1",
273*6777b538SAndroid Build Coastguard Worker           redirected_isolation_info.network_isolation_key().ToCacheKeyString());
274*6777b538SAndroid Build Coastguard Worker       break;
275*6777b538SAndroid Build Coastguard Worker   }
276*6777b538SAndroid Build Coastguard Worker 
277*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(
278*6777b538SAndroid Build Coastguard Worker       redirected_isolation_info.network_isolation_key().IsFullyPopulated());
279*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(redirected_isolation_info.network_isolation_key().IsTransient());
280*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(redirected_isolation_info.site_for_cookies().IsFirstParty(
281*6777b538SAndroid Build Coastguard Worker       kOrigin1.GetURL()));
282*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(redirected_isolation_info.nonce().has_value());
283*6777b538SAndroid Build Coastguard Worker }
284*6777b538SAndroid Build Coastguard Worker 
TEST_P(IsolationInfoTest,RequestTypeMainFrameWithNonce)285*6777b538SAndroid Build Coastguard Worker TEST_P(IsolationInfoTest, RequestTypeMainFrameWithNonce) {
286*6777b538SAndroid Build Coastguard Worker   IsolationInfo isolation_info = IsolationInfo::Create(
287*6777b538SAndroid Build Coastguard Worker       IsolationInfo::RequestType::kMainFrame, kOrigin1, kOrigin1,
288*6777b538SAndroid Build Coastguard Worker       SiteForCookies::FromOrigin(kOrigin1), kNonce1);
289*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(IsolationInfo::RequestType::kMainFrame,
290*6777b538SAndroid Build Coastguard Worker             isolation_info.request_type());
291*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
292*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
293*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
294*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.network_isolation_key().IsTransient());
295*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::nullopt,
296*6777b538SAndroid Build Coastguard Worker             isolation_info.network_isolation_key().ToCacheKeyString());
297*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(
298*6777b538SAndroid Build Coastguard Worker       isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
299*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kNonce1, isolation_info.nonce().value());
300*6777b538SAndroid Build Coastguard Worker 
301*6777b538SAndroid Build Coastguard Worker   DuplicateAndCompare(isolation_info);
302*6777b538SAndroid Build Coastguard Worker 
303*6777b538SAndroid Build Coastguard Worker   IsolationInfo redirected_isolation_info =
304*6777b538SAndroid Build Coastguard Worker       isolation_info.CreateForRedirect(kOrigin3);
305*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(IsolationInfo::RequestType::kMainFrame,
306*6777b538SAndroid Build Coastguard Worker             redirected_isolation_info.request_type());
307*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOrigin3, redirected_isolation_info.top_frame_origin());
308*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOrigin3, redirected_isolation_info.frame_origin());
309*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(
310*6777b538SAndroid Build Coastguard Worker       redirected_isolation_info.network_isolation_key().IsFullyPopulated());
311*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(redirected_isolation_info.network_isolation_key().IsTransient());
312*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(
313*6777b538SAndroid Build Coastguard Worker       std::nullopt,
314*6777b538SAndroid Build Coastguard Worker       redirected_isolation_info.network_isolation_key().ToCacheKeyString());
315*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(redirected_isolation_info.site_for_cookies().IsFirstParty(
316*6777b538SAndroid Build Coastguard Worker       kOrigin3.GetURL()));
317*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kNonce1, redirected_isolation_info.nonce().value());
318*6777b538SAndroid Build Coastguard Worker }
319*6777b538SAndroid Build Coastguard Worker 
TEST_P(IsolationInfoTest,RequestTypeSubFrameWithNonce)320*6777b538SAndroid Build Coastguard Worker TEST_P(IsolationInfoTest, RequestTypeSubFrameWithNonce) {
321*6777b538SAndroid Build Coastguard Worker   IsolationInfo isolation_info = IsolationInfo::Create(
322*6777b538SAndroid Build Coastguard Worker       IsolationInfo::RequestType::kSubFrame, kOrigin1, kOrigin2,
323*6777b538SAndroid Build Coastguard Worker       SiteForCookies::FromOrigin(kOrigin1), kNonce1);
324*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(IsolationInfo::RequestType::kSubFrame,
325*6777b538SAndroid Build Coastguard Worker             isolation_info.request_type());
326*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
327*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOrigin2, isolation_info.frame_origin());
328*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
329*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.network_isolation_key().IsTransient());
330*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::nullopt,
331*6777b538SAndroid Build Coastguard Worker             isolation_info.network_isolation_key().ToCacheKeyString());
332*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(
333*6777b538SAndroid Build Coastguard Worker       isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
334*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kNonce1, isolation_info.nonce().value());
335*6777b538SAndroid Build Coastguard Worker 
336*6777b538SAndroid Build Coastguard Worker   DuplicateAndCompare(isolation_info);
337*6777b538SAndroid Build Coastguard Worker 
338*6777b538SAndroid Build Coastguard Worker   IsolationInfo redirected_isolation_info =
339*6777b538SAndroid Build Coastguard Worker       isolation_info.CreateForRedirect(kOrigin3);
340*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(IsolationInfo::RequestType::kSubFrame,
341*6777b538SAndroid Build Coastguard Worker             redirected_isolation_info.request_type());
342*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOrigin1, redirected_isolation_info.top_frame_origin());
343*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOrigin3, redirected_isolation_info.frame_origin());
344*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(
345*6777b538SAndroid Build Coastguard Worker       redirected_isolation_info.network_isolation_key().IsFullyPopulated());
346*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(redirected_isolation_info.network_isolation_key().IsTransient());
347*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(
348*6777b538SAndroid Build Coastguard Worker       std::nullopt,
349*6777b538SAndroid Build Coastguard Worker       redirected_isolation_info.network_isolation_key().ToCacheKeyString());
350*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(redirected_isolation_info.site_for_cookies().IsFirstParty(
351*6777b538SAndroid Build Coastguard Worker       kOrigin1.GetURL()));
352*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kNonce1, redirected_isolation_info.nonce().value());
353*6777b538SAndroid Build Coastguard Worker }
354*6777b538SAndroid Build Coastguard Worker 
TEST_P(IsolationInfoTest,RequestTypeOther)355*6777b538SAndroid Build Coastguard Worker TEST_P(IsolationInfoTest, RequestTypeOther) {
356*6777b538SAndroid Build Coastguard Worker   IsolationInfo isolation_info;
357*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
358*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(isolation_info.top_frame_origin());
359*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(isolation_info.frame_origin());
360*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.network_isolation_key().IsEmpty());
361*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
362*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(isolation_info.nonce());
363*6777b538SAndroid Build Coastguard Worker 
364*6777b538SAndroid Build Coastguard Worker   DuplicateAndCompare(isolation_info);
365*6777b538SAndroid Build Coastguard Worker 
366*6777b538SAndroid Build Coastguard Worker   IsolationInfo redirected_isolation_info =
367*6777b538SAndroid Build Coastguard Worker       isolation_info.CreateForRedirect(kOrigin3);
368*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.IsEqualForTesting(redirected_isolation_info));
369*6777b538SAndroid Build Coastguard Worker }
370*6777b538SAndroid Build Coastguard Worker 
TEST_P(IsolationInfoTest,RequestTypeOtherWithSiteForCookies)371*6777b538SAndroid Build Coastguard Worker TEST_P(IsolationInfoTest, RequestTypeOtherWithSiteForCookies) {
372*6777b538SAndroid Build Coastguard Worker   IsolationInfo isolation_info =
373*6777b538SAndroid Build Coastguard Worker       IsolationInfo::Create(IsolationInfo::RequestType::kOther, kOrigin1,
374*6777b538SAndroid Build Coastguard Worker                             kOrigin1, SiteForCookies::FromOrigin(kOrigin1));
375*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
376*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
377*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
378*6777b538SAndroid Build Coastguard Worker   switch (NetworkIsolationKey::GetMode()) {
379*6777b538SAndroid Build Coastguard Worker     case NetworkIsolationKey::Mode::kFrameSiteEnabled:
380*6777b538SAndroid Build Coastguard Worker     case NetworkIsolationKey::Mode::kFrameSiteWithSharedOpaqueEnabled:
381*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ("https://foo.test https://foo.test",
382*6777b538SAndroid Build Coastguard Worker                 isolation_info.network_isolation_key().ToCacheKeyString());
383*6777b538SAndroid Build Coastguard Worker       break;
384*6777b538SAndroid Build Coastguard Worker     case NetworkIsolationKey::Mode::kCrossSiteFlagEnabled:
385*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ("https://foo.test _0",
386*6777b538SAndroid Build Coastguard Worker                 isolation_info.network_isolation_key().ToCacheKeyString());
387*6777b538SAndroid Build Coastguard Worker       break;
388*6777b538SAndroid Build Coastguard Worker   }
389*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
390*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
391*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(
392*6777b538SAndroid Build Coastguard Worker       isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
393*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(isolation_info.nonce());
394*6777b538SAndroid Build Coastguard Worker 
395*6777b538SAndroid Build Coastguard Worker   DuplicateAndCompare(isolation_info);
396*6777b538SAndroid Build Coastguard Worker 
397*6777b538SAndroid Build Coastguard Worker   IsolationInfo redirected_isolation_info =
398*6777b538SAndroid Build Coastguard Worker       isolation_info.CreateForRedirect(kOrigin3);
399*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.IsEqualForTesting(redirected_isolation_info));
400*6777b538SAndroid Build Coastguard Worker }
401*6777b538SAndroid Build Coastguard Worker 
402*6777b538SAndroid Build Coastguard Worker // Test case of a subresource for cross-site subframe (which has an empty
403*6777b538SAndroid Build Coastguard Worker // site-for-cookies).
TEST_P(IsolationInfoTest,RequestTypeOtherWithEmptySiteForCookies)404*6777b538SAndroid Build Coastguard Worker TEST_P(IsolationInfoTest, RequestTypeOtherWithEmptySiteForCookies) {
405*6777b538SAndroid Build Coastguard Worker   IsolationInfo isolation_info = IsolationInfo::Create(
406*6777b538SAndroid Build Coastguard Worker       IsolationInfo::RequestType::kOther, kOrigin1, kOrigin2, SiteForCookies());
407*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
408*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
409*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOrigin2, isolation_info.frame_origin());
410*6777b538SAndroid Build Coastguard Worker   switch (NetworkIsolationKey::GetMode()) {
411*6777b538SAndroid Build Coastguard Worker     case NetworkIsolationKey::Mode::kFrameSiteEnabled:
412*6777b538SAndroid Build Coastguard Worker     case NetworkIsolationKey::Mode::kFrameSiteWithSharedOpaqueEnabled:
413*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ("https://foo.test https://bar.test",
414*6777b538SAndroid Build Coastguard Worker                 isolation_info.network_isolation_key().ToCacheKeyString());
415*6777b538SAndroid Build Coastguard Worker       break;
416*6777b538SAndroid Build Coastguard Worker     case NetworkIsolationKey::Mode::kCrossSiteFlagEnabled:
417*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ("https://foo.test _1",
418*6777b538SAndroid Build Coastguard Worker                 isolation_info.network_isolation_key().ToCacheKeyString());
419*6777b538SAndroid Build Coastguard Worker       break;
420*6777b538SAndroid Build Coastguard Worker   }
421*6777b538SAndroid Build Coastguard Worker 
422*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
423*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
424*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
425*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(isolation_info.nonce());
426*6777b538SAndroid Build Coastguard Worker 
427*6777b538SAndroid Build Coastguard Worker   DuplicateAndCompare(isolation_info);
428*6777b538SAndroid Build Coastguard Worker 
429*6777b538SAndroid Build Coastguard Worker   IsolationInfo redirected_isolation_info =
430*6777b538SAndroid Build Coastguard Worker       isolation_info.CreateForRedirect(kOrigin3);
431*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.IsEqualForTesting(redirected_isolation_info));
432*6777b538SAndroid Build Coastguard Worker }
433*6777b538SAndroid Build Coastguard Worker 
TEST_P(IsolationInfoTest,CreateTransient)434*6777b538SAndroid Build Coastguard Worker TEST_P(IsolationInfoTest, CreateTransient) {
435*6777b538SAndroid Build Coastguard Worker   IsolationInfo isolation_info = IsolationInfo::CreateTransient();
436*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
437*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.top_frame_origin()->opaque());
438*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.frame_origin()->opaque());
439*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
440*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.network_isolation_key().IsTransient());
441*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
442*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(isolation_info.nonce());
443*6777b538SAndroid Build Coastguard Worker 
444*6777b538SAndroid Build Coastguard Worker   DuplicateAndCompare(isolation_info);
445*6777b538SAndroid Build Coastguard Worker 
446*6777b538SAndroid Build Coastguard Worker   IsolationInfo redirected_isolation_info =
447*6777b538SAndroid Build Coastguard Worker       isolation_info.CreateForRedirect(kOrigin3);
448*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.IsEqualForTesting(redirected_isolation_info));
449*6777b538SAndroid Build Coastguard Worker }
450*6777b538SAndroid Build Coastguard Worker 
TEST_P(IsolationInfoTest,CreateTransientWithNonce)451*6777b538SAndroid Build Coastguard Worker TEST_P(IsolationInfoTest, CreateTransientWithNonce) {
452*6777b538SAndroid Build Coastguard Worker   IsolationInfo isolation_info =
453*6777b538SAndroid Build Coastguard Worker       IsolationInfo::CreateTransientWithNonce(kNonce1);
454*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
455*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.top_frame_origin()->opaque());
456*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.frame_origin()->opaque());
457*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
458*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.network_isolation_key().IsTransient());
459*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
460*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(isolation_info.nonce().has_value());
461*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(isolation_info.nonce().value(), kNonce1);
462*6777b538SAndroid Build Coastguard Worker 
463*6777b538SAndroid Build Coastguard Worker   DuplicateAndCompare(isolation_info);
464*6777b538SAndroid Build Coastguard Worker 
465*6777b538SAndroid Build Coastguard Worker   IsolationInfo redirected_isolation_info =
466*6777b538SAndroid Build Coastguard Worker       isolation_info.CreateForRedirect(kOrigin3);
467*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.IsEqualForTesting(redirected_isolation_info));
468*6777b538SAndroid Build Coastguard Worker 
469*6777b538SAndroid Build Coastguard Worker   IsolationInfo new_info_same_nonce =
470*6777b538SAndroid Build Coastguard Worker       IsolationInfo::CreateTransientWithNonce(kNonce1);
471*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(new_info_same_nonce.nonce().has_value());
472*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(new_info_same_nonce.nonce().value(), kNonce1);
473*6777b538SAndroid Build Coastguard Worker 
474*6777b538SAndroid Build Coastguard Worker   // The new NIK is distinct from the first one because it uses a new opaque
475*6777b538SAndroid Build Coastguard Worker   // origin, even if the nonce is the same.
476*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(isolation_info.network_isolation_key(),
477*6777b538SAndroid Build Coastguard Worker             new_info_same_nonce.network_isolation_key());
478*6777b538SAndroid Build Coastguard Worker }
479*6777b538SAndroid Build Coastguard Worker 
TEST_P(IsolationInfoTest,CreateForInternalRequest)480*6777b538SAndroid Build Coastguard Worker TEST_P(IsolationInfoTest, CreateForInternalRequest) {
481*6777b538SAndroid Build Coastguard Worker   IsolationInfo isolation_info =
482*6777b538SAndroid Build Coastguard Worker       IsolationInfo::CreateForInternalRequest(kOrigin1);
483*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
484*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
485*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
486*6777b538SAndroid Build Coastguard Worker   switch (NetworkIsolationKey::GetMode()) {
487*6777b538SAndroid Build Coastguard Worker     case NetworkIsolationKey::Mode::kFrameSiteEnabled:
488*6777b538SAndroid Build Coastguard Worker     case NetworkIsolationKey::Mode::kFrameSiteWithSharedOpaqueEnabled:
489*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ("https://foo.test https://foo.test",
490*6777b538SAndroid Build Coastguard Worker                 isolation_info.network_isolation_key().ToCacheKeyString());
491*6777b538SAndroid Build Coastguard Worker       break;
492*6777b538SAndroid Build Coastguard Worker     case NetworkIsolationKey::Mode::kCrossSiteFlagEnabled:
493*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ("https://foo.test _0",
494*6777b538SAndroid Build Coastguard Worker                 isolation_info.network_isolation_key().ToCacheKeyString());
495*6777b538SAndroid Build Coastguard Worker       break;
496*6777b538SAndroid Build Coastguard Worker   }
497*6777b538SAndroid Build Coastguard Worker 
498*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
499*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
500*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(
501*6777b538SAndroid Build Coastguard Worker       isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
502*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(isolation_info.nonce());
503*6777b538SAndroid Build Coastguard Worker 
504*6777b538SAndroid Build Coastguard Worker   DuplicateAndCompare(isolation_info);
505*6777b538SAndroid Build Coastguard Worker 
506*6777b538SAndroid Build Coastguard Worker   IsolationInfo redirected_isolation_info =
507*6777b538SAndroid Build Coastguard Worker       isolation_info.CreateForRedirect(kOrigin3);
508*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.IsEqualForTesting(redirected_isolation_info));
509*6777b538SAndroid Build Coastguard Worker }
510*6777b538SAndroid Build Coastguard Worker 
511*6777b538SAndroid Build Coastguard Worker // Test that in the UpdateNothing case, the SiteForCookies does not have to
512*6777b538SAndroid Build Coastguard Worker // match the frame origin, unlike in the HTTP/HTTPS case.
TEST_P(IsolationInfoTest,CustomSchemeRequestTypeOther)513*6777b538SAndroid Build Coastguard Worker TEST_P(IsolationInfoTest, CustomSchemeRequestTypeOther) {
514*6777b538SAndroid Build Coastguard Worker   // Have to register the scheme, or url::Origin::Create() will return an
515*6777b538SAndroid Build Coastguard Worker   // opaque origin.
516*6777b538SAndroid Build Coastguard Worker   url::ScopedSchemeRegistryForTests scoped_registry;
517*6777b538SAndroid Build Coastguard Worker   url::AddStandardScheme("foo", url::SCHEME_WITH_HOST);
518*6777b538SAndroid Build Coastguard Worker 
519*6777b538SAndroid Build Coastguard Worker   const GURL kCustomOriginUrl = GURL("foo://a.foo.com");
520*6777b538SAndroid Build Coastguard Worker   const url::Origin kCustomOrigin = url::Origin::Create(kCustomOriginUrl);
521*6777b538SAndroid Build Coastguard Worker 
522*6777b538SAndroid Build Coastguard Worker   IsolationInfo isolation_info = IsolationInfo::Create(
523*6777b538SAndroid Build Coastguard Worker       IsolationInfo::RequestType::kOther, kCustomOrigin, kOrigin1,
524*6777b538SAndroid Build Coastguard Worker       SiteForCookies::FromOrigin(kCustomOrigin));
525*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
526*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kCustomOrigin, isolation_info.top_frame_origin());
527*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
528*6777b538SAndroid Build Coastguard Worker   switch (NetworkIsolationKey::GetMode()) {
529*6777b538SAndroid Build Coastguard Worker     case NetworkIsolationKey::Mode::kFrameSiteEnabled:
530*6777b538SAndroid Build Coastguard Worker     case NetworkIsolationKey::Mode::kFrameSiteWithSharedOpaqueEnabled:
531*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ("foo://a.foo.com https://foo.test",
532*6777b538SAndroid Build Coastguard Worker                 isolation_info.network_isolation_key().ToCacheKeyString());
533*6777b538SAndroid Build Coastguard Worker       break;
534*6777b538SAndroid Build Coastguard Worker     case NetworkIsolationKey::Mode::kCrossSiteFlagEnabled:
535*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ("foo://a.foo.com _1",
536*6777b538SAndroid Build Coastguard Worker                 isolation_info.network_isolation_key().ToCacheKeyString());
537*6777b538SAndroid Build Coastguard Worker       break;
538*6777b538SAndroid Build Coastguard Worker   }
539*6777b538SAndroid Build Coastguard Worker 
540*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
541*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
542*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.site_for_cookies().IsFirstParty(kCustomOriginUrl));
543*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(isolation_info.nonce());
544*6777b538SAndroid Build Coastguard Worker 
545*6777b538SAndroid Build Coastguard Worker   DuplicateAndCompare(isolation_info);
546*6777b538SAndroid Build Coastguard Worker 
547*6777b538SAndroid Build Coastguard Worker   IsolationInfo redirected_isolation_info =
548*6777b538SAndroid Build Coastguard Worker       isolation_info.CreateForRedirect(kOrigin2);
549*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(isolation_info.IsEqualForTesting(redirected_isolation_info));
550*6777b538SAndroid Build Coastguard Worker }
551*6777b538SAndroid Build Coastguard Worker 
552*6777b538SAndroid Build Coastguard Worker // Success cases are covered by other tests, so only need a separate test to
553*6777b538SAndroid Build Coastguard Worker // cover the failure cases.
TEST_P(IsolationInfoTest,CreateIfConsistentFails)554*6777b538SAndroid Build Coastguard Worker TEST_P(IsolationInfoTest, CreateIfConsistentFails) {
555*6777b538SAndroid Build Coastguard Worker   // Main frames with inconsistent SiteForCookies.
556*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
557*6777b538SAndroid Build Coastguard Worker       IsolationInfo::RequestType::kMainFrame, kOrigin1, kOrigin1,
558*6777b538SAndroid Build Coastguard Worker       SiteForCookies::FromOrigin(kOrigin2)));
559*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
560*6777b538SAndroid Build Coastguard Worker       IsolationInfo::RequestType::kMainFrame, kOpaqueOrigin, kOpaqueOrigin,
561*6777b538SAndroid Build Coastguard Worker       SiteForCookies::FromOrigin(kOrigin1)));
562*6777b538SAndroid Build Coastguard Worker 
563*6777b538SAndroid Build Coastguard Worker   // Sub frame with inconsistent SiteForCookies.
564*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
565*6777b538SAndroid Build Coastguard Worker       IsolationInfo::RequestType::kSubFrame, kOrigin1, kOrigin2,
566*6777b538SAndroid Build Coastguard Worker       SiteForCookies::FromOrigin(kOrigin2)));
567*6777b538SAndroid Build Coastguard Worker 
568*6777b538SAndroid Build Coastguard Worker   // Sub resources with inconsistent SiteForCookies.
569*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
570*6777b538SAndroid Build Coastguard Worker       IsolationInfo::RequestType::kOther, kOrigin1, kOrigin2,
571*6777b538SAndroid Build Coastguard Worker       SiteForCookies::FromOrigin(kOrigin2)));
572*6777b538SAndroid Build Coastguard Worker 
573*6777b538SAndroid Build Coastguard Worker   // Correctly have empty/non-empty origins:
574*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(IsolationInfo::CreateIfConsistent(
575*6777b538SAndroid Build Coastguard Worker       IsolationInfo::RequestType::kOther, std::nullopt, std::nullopt,
576*6777b538SAndroid Build Coastguard Worker       SiteForCookies()));
577*6777b538SAndroid Build Coastguard Worker 
578*6777b538SAndroid Build Coastguard Worker   // Incorrectly have empty/non-empty origins:
579*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
580*6777b538SAndroid Build Coastguard Worker       IsolationInfo::RequestType::kOther, std::nullopt, kOrigin1,
581*6777b538SAndroid Build Coastguard Worker       SiteForCookies()));
582*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
583*6777b538SAndroid Build Coastguard Worker       IsolationInfo::RequestType::kSubFrame, std::nullopt, kOrigin2,
584*6777b538SAndroid Build Coastguard Worker       SiteForCookies()));
585*6777b538SAndroid Build Coastguard Worker 
586*6777b538SAndroid Build Coastguard Worker   // Empty frame origins are incorrect.
587*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
588*6777b538SAndroid Build Coastguard Worker       IsolationInfo::RequestType::kOther, kOrigin1, std::nullopt,
589*6777b538SAndroid Build Coastguard Worker       SiteForCookies()));
590*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
591*6777b538SAndroid Build Coastguard Worker       IsolationInfo::RequestType::kSubFrame, kOrigin1, std::nullopt,
592*6777b538SAndroid Build Coastguard Worker       SiteForCookies()));
593*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
594*6777b538SAndroid Build Coastguard Worker       IsolationInfo::RequestType::kMainFrame, kOrigin1, std::nullopt,
595*6777b538SAndroid Build Coastguard Worker       SiteForCookies::FromOrigin(kOrigin1)));
596*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
597*6777b538SAndroid Build Coastguard Worker       IsolationInfo::RequestType::kOther, kOrigin1, kOrigin2,
598*6777b538SAndroid Build Coastguard Worker       SiteForCookies::FromOrigin(kOrigin1)));
599*6777b538SAndroid Build Coastguard Worker 
600*6777b538SAndroid Build Coastguard Worker   // No origins with non-null SiteForCookies.
601*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
602*6777b538SAndroid Build Coastguard Worker       IsolationInfo::RequestType::kOther, std::nullopt, std::nullopt,
603*6777b538SAndroid Build Coastguard Worker       SiteForCookies::FromOrigin(kOrigin1)));
604*6777b538SAndroid Build Coastguard Worker 
605*6777b538SAndroid Build Coastguard Worker   // No origins with non-null nonce.
606*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
607*6777b538SAndroid Build Coastguard Worker       IsolationInfo::RequestType::kOther, std::nullopt, std::nullopt,
608*6777b538SAndroid Build Coastguard Worker       SiteForCookies(), kNonce1));
609*6777b538SAndroid Build Coastguard Worker }
610*6777b538SAndroid Build Coastguard Worker 
TEST_P(IsolationInfoTest,Serialization)611*6777b538SAndroid Build Coastguard Worker TEST_P(IsolationInfoTest, Serialization) {
612*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(IsolationInfo::Deserialize(""));
613*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(IsolationInfo::Deserialize("garbage"));
614*6777b538SAndroid Build Coastguard Worker 
615*6777b538SAndroid Build Coastguard Worker   const IsolationInfo kPositiveTestCases[] = {
616*6777b538SAndroid Build Coastguard Worker       IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1,
617*6777b538SAndroid Build Coastguard Worker                             kOrigin2, SiteForCookies::FromOrigin(kOrigin1)),
618*6777b538SAndroid Build Coastguard Worker       // Null party context
619*6777b538SAndroid Build Coastguard Worker       IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1,
620*6777b538SAndroid Build Coastguard Worker                             kOrigin2, SiteForCookies::FromOrigin(kOrigin1)),
621*6777b538SAndroid Build Coastguard Worker       // Empty party context
622*6777b538SAndroid Build Coastguard Worker       IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1,
623*6777b538SAndroid Build Coastguard Worker                             kOrigin2, SiteForCookies::FromOrigin(kOrigin1)),
624*6777b538SAndroid Build Coastguard Worker       // Multiple party context entries.
625*6777b538SAndroid Build Coastguard Worker       IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1,
626*6777b538SAndroid Build Coastguard Worker                             kOrigin2, SiteForCookies::FromOrigin(kOrigin1)),
627*6777b538SAndroid Build Coastguard Worker       // Without SiteForCookies
628*6777b538SAndroid Build Coastguard Worker       IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1,
629*6777b538SAndroid Build Coastguard Worker                             kOrigin2, SiteForCookies()),
630*6777b538SAndroid Build Coastguard Worker       // Request type kOther
631*6777b538SAndroid Build Coastguard Worker       IsolationInfo::Create(IsolationInfo::RequestType::kOther, kOrigin1,
632*6777b538SAndroid Build Coastguard Worker                             kOrigin1, SiteForCookies::FromOrigin(kOrigin1)),
633*6777b538SAndroid Build Coastguard Worker       // Request type kMainframe
634*6777b538SAndroid Build Coastguard Worker       IsolationInfo::Create(IsolationInfo::RequestType::kMainFrame, kOrigin1,
635*6777b538SAndroid Build Coastguard Worker                             kOrigin1, SiteForCookies::FromOrigin(kOrigin1)),
636*6777b538SAndroid Build Coastguard Worker   };
637*6777b538SAndroid Build Coastguard Worker   for (const auto& info : kPositiveTestCases) {
638*6777b538SAndroid Build Coastguard Worker     auto rt = IsolationInfo::Deserialize(info.Serialize());
639*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(rt);
640*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(rt->IsEqualForTesting(info));
641*6777b538SAndroid Build Coastguard Worker   }
642*6777b538SAndroid Build Coastguard Worker 
643*6777b538SAndroid Build Coastguard Worker   const IsolationInfo kNegativeTestCases[] = {
644*6777b538SAndroid Build Coastguard Worker       IsolationInfo::CreateTransient(),
645*6777b538SAndroid Build Coastguard Worker       // With nonce (i.e transient).
646*6777b538SAndroid Build Coastguard Worker       IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1,
647*6777b538SAndroid Build Coastguard Worker                             kOrigin2, SiteForCookies::FromOrigin(kOrigin1),
648*6777b538SAndroid Build Coastguard Worker                             kNonce1),
649*6777b538SAndroid Build Coastguard Worker   };
650*6777b538SAndroid Build Coastguard Worker   for (const auto& info : kNegativeTestCases) {
651*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(info.Serialize().empty());
652*6777b538SAndroid Build Coastguard Worker   }
653*6777b538SAndroid Build Coastguard Worker   const IsolationInfo kNegativeWhenTripleKeyEnabledTestCases[] = {
654*6777b538SAndroid Build Coastguard Worker       // With an opaque frame origin. When the NIK is triple-keyed, the opaque
655*6777b538SAndroid Build Coastguard Worker       // frame site will cause it to be considered transient and fail to
656*6777b538SAndroid Build Coastguard Worker       // serialize. When triple-keying is disabled, a boolean is used in place
657*6777b538SAndroid Build Coastguard Worker       // of the frame site, so the NIK won't be considered transient anymore.
658*6777b538SAndroid Build Coastguard Worker       // This will cause the IsolationInfo to be serialized, except that it
659*6777b538SAndroid Build Coastguard Worker       // doesn't serialize opaque origins with the nonce, so upon
660*6777b538SAndroid Build Coastguard Worker       // deserialization the recreated IsolationInfo will have a frame site
661*6777b538SAndroid Build Coastguard Worker       // with a different nonce (i.e. a different opaque origin).
662*6777b538SAndroid Build Coastguard Worker       IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1,
663*6777b538SAndroid Build Coastguard Worker                             url::Origin(),
664*6777b538SAndroid Build Coastguard Worker                             SiteForCookies::FromOrigin(kOrigin1)),
665*6777b538SAndroid Build Coastguard Worker   };
666*6777b538SAndroid Build Coastguard Worker   for (const auto& info : kNegativeWhenTripleKeyEnabledTestCases) {
667*6777b538SAndroid Build Coastguard Worker     switch (NetworkIsolationKey::GetMode()) {
668*6777b538SAndroid Build Coastguard Worker       case NetworkIsolationKey::Mode::kFrameSiteEnabled:
669*6777b538SAndroid Build Coastguard Worker         EXPECT_TRUE(info.Serialize().empty());
670*6777b538SAndroid Build Coastguard Worker         break;
671*6777b538SAndroid Build Coastguard Worker       case NetworkIsolationKey::Mode::kCrossSiteFlagEnabled:
672*6777b538SAndroid Build Coastguard Worker       case NetworkIsolationKey::Mode::kFrameSiteWithSharedOpaqueEnabled:
673*6777b538SAndroid Build Coastguard Worker         auto rt = IsolationInfo::Deserialize(info.Serialize());
674*6777b538SAndroid Build Coastguard Worker         ASSERT_TRUE(rt);
675*6777b538SAndroid Build Coastguard Worker         // See comment above for why this check fails.
676*6777b538SAndroid Build Coastguard Worker         EXPECT_FALSE(rt->IsEqualForTesting(info));
677*6777b538SAndroid Build Coastguard Worker         EXPECT_TRUE(rt->frame_origin()->opaque());
678*6777b538SAndroid Build Coastguard Worker         EXPECT_NE(rt->frame_origin(), info.frame_origin());
679*6777b538SAndroid Build Coastguard Worker         break;
680*6777b538SAndroid Build Coastguard Worker     }
681*6777b538SAndroid Build Coastguard Worker   }
682*6777b538SAndroid Build Coastguard Worker }
683*6777b538SAndroid Build Coastguard Worker 
684*6777b538SAndroid Build Coastguard Worker }  // namespace
685*6777b538SAndroid Build Coastguard Worker 
686*6777b538SAndroid Build Coastguard Worker }  // namespace net
687