From c3b88552528e15adac683a0d3c0890b43995ac5e Mon Sep 17 00:00:00 2001 From: leeguooooo Date: Wed, 10 Jun 2026 16:22:07 +0900 Subject: [PATCH] test(e2e): de-flake cross-domain state save (drop httpbin.org) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit e2e_save_state_cross_domain navigated to httpbin.org as "domain A", which is an unreliable external service — when it was slow/unreachable in CI the page didn't load on that origin, so its localStorage origin was missing from the saved state and the test failed intermittently. Cookies/localStorage are set client-side via CDP, so the page just needs to load reliably: use example.org (IANA-reserved, like example.com) instead. Match full hostnames so the two example.* origins don't alias. Verified locally: passes deterministically. --- cli/src/native/e2e_tests.rs | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/cli/src/native/e2e_tests.rs b/cli/src/native/e2e_tests.rs index 76a36e4..0424920 100644 --- a/cli/src/native/e2e_tests.rs +++ b/cli/src/native/e2e_tests.rs @@ -2252,9 +2252,13 @@ async fn e2e_save_state_cross_domain() { .await; assert_success(&resp); - // Navigate to domain A and set cookie + localStorage + // Navigate to domain A and set cookie + localStorage. Use example.org (a + // stable IANA-reserved domain, like example.com below) rather than an + // external service such as httpbin.org — cookie/localStorage are set + // client-side via CDP, so the only requirement is that the page loads + // reliably. A flaky external domain made this test intermittently fail in CI. let resp = execute_command( - &json!({ "id": "2", "action": "navigate", "url": "https://httpbin.org/html" }), + &json!({ "id": "2", "action": "navigate", "url": "https://example.org/" }), &mut state, ) .await; @@ -2263,7 +2267,7 @@ async fn e2e_save_state_cross_domain() { let resp = execute_command( &json!({ "id": "3", "action": "cookies_set", - "name": "domainA_cookie", "value": "from_httpbin" + "name": "domainA_cookie", "value": "from_example_org" }), &mut state, ) @@ -2330,7 +2334,7 @@ async fn e2e_save_state_cross_domain() { let has_domain_b = cookies.iter().any(|c| c["name"] == "domainB_cookie"); assert!( has_domain_a, - "Should include cross-domain cookie from httpbin.org: {:?}", + "Should include cross-domain cookie from example.org: {:?}", cookies ); assert!( @@ -2341,21 +2345,26 @@ async fn e2e_save_state_cross_domain() { // Verify BOTH origins' localStorage are present let origins = state_data["origins"].as_array().unwrap(); + // Match full hostnames so the two example.* origins don't alias each other. let has_origin_a = origins.iter().any(|o| { - o["origin"].as_str().is_some_and(|s| s.contains("httpbin")) + o["origin"] + .as_str() + .is_some_and(|s| s.contains("example.org")) && o["localStorage"] .as_array() .is_some_and(|ls| ls.iter().any(|e| e["name"] == "domainA_key")) }); let has_origin_b = origins.iter().any(|o| { - o["origin"].as_str().is_some_and(|s| s.contains("example")) + o["origin"] + .as_str() + .is_some_and(|s| s.contains("example.com")) && o["localStorage"] .as_array() .is_some_and(|ls| ls.iter().any(|e| e["name"] == "domainB_key")) }); assert!( has_origin_a, - "Should include localStorage from httpbin.org origin: {:?}", + "Should include localStorage from example.org origin: {:?}", origins ); assert!(