[wdspec] Add tests for navigation id in BiDi network event tests

Depends on D181131

Differential Revision: https://phabricator.services.mozilla.com/D183771

bugzilla-url: https://bugzilla.mozilla.org/show_bug.cgi?id=1805405
gecko-commit: 4a5366c3dbf3a3ec10483c00ca12af72c2888c5f
gecko-reviewers: webdriver-reviewers, jgraham
diff --git a/webdriver/tests/bidi/network/__init__.py b/webdriver/tests/bidi/network/__init__.py
index 62dd554..19a4a69 100644
--- a/webdriver/tests/bidi/network/__init__.py
+++ b/webdriver/tests/bidi/network/__init__.py
@@ -101,6 +101,7 @@
 def assert_base_parameters(
     event,
     context=None,
+    navigation=None,
     redirect_count=None,
     expected_request=None,
 ):
@@ -118,6 +119,9 @@
     if context is not None:
         assert event["context"] == context
 
+    if navigation is not None:
+        assert event["navigation"] == navigation
+
     if redirect_count is not None:
         assert event["redirectCount"] == redirect_count
 
@@ -129,6 +133,7 @@
 def assert_before_request_sent_event(
     event,
     context=None,
+    navigation=None,
     redirect_count=None,
     expected_request=None,
 ):
@@ -140,6 +145,7 @@
     assert_base_parameters(
         event,
         context=context,
+        navigation=navigation,
         redirect_count=redirect_count,
         expected_request=expected_request,
     )
@@ -181,6 +187,7 @@
 def assert_response_event(
     event,
     context=None,
+    navigation=None,
     redirect_count=None,
     expected_request=None,
     expected_response=None,
@@ -194,6 +201,7 @@
     assert_base_parameters(
         event,
         context=context,
+        navigation=navigation,
         redirect_count=redirect_count,
         expected_request=expected_request,
     )
diff --git a/webdriver/tests/bidi/network/before_request_sent/before_request_sent.py b/webdriver/tests/bidi/network/before_request_sent/before_request_sent.py
index 5e7cfc6..04e70bf 100644
--- a/webdriver/tests/bidi/network/before_request_sent/before_request_sent.py
+++ b/webdriver/tests/bidi/network/before_request_sent/before_request_sent.py
@@ -62,7 +62,7 @@
 
 @pytest.mark.asyncio
 async def test_load_page_twice(
-    bidi_session, top_context, wait_for_event, url, fetch, setup_network_test
+    bidi_session, top_context, wait_for_event, url, setup_network_test
 ):
     html_url = url(PAGE_EMPTY_HTML)
 
@@ -86,6 +86,45 @@
     )
 
 
+@pytest.mark.asyncio
+async def test_navigation_id(
+    bidi_session, top_context, wait_for_event, url, fetch, setup_network_test
+):
+    html_url = url(PAGE_EMPTY_HTML)
+
+    network_events = await setup_network_test(events=["network.beforeRequestSent"])
+    events = network_events["network.beforeRequestSent"]
+
+    on_before_request_sent = wait_for_event("network.beforeRequestSent")
+    result = await bidi_session.browsing_context.navigate(
+        context=top_context["context"],
+        url=html_url,
+        wait="complete",
+    )
+    await on_before_request_sent
+
+    assert len(events) == 1
+    expected_request = {"method": "GET", "url": html_url}
+    assert_before_request_sent_event(
+        events[0], expected_request=expected_request, navigation=result["navigation"]
+    )
+    assert events[0]["navigation"] is not None
+
+    text_url = url(PAGE_EMPTY_TEXT)
+    on_before_request_sent = wait_for_event("network.beforeRequestSent")
+    await fetch(text_url, method="GET")
+    await on_before_request_sent
+
+    assert len(events) == 2
+    expected_request = {"method": "GET", "url": text_url}
+    assert_before_request_sent_event(
+        events[1],
+        expected_request=expected_request,
+    )
+    # Check that requests not related to a navigation have no navigation id.
+    assert events[1]["navigation"] is None
+
+
 @pytest.mark.parametrize(
     "method",
     [
@@ -248,7 +287,7 @@
     network_events = await setup_network_test(events=["network.beforeRequestSent"])
     events = network_events["network.beforeRequestSent"]
 
-    await bidi_session.browsing_context.navigate(
+    result = await bidi_session.browsing_context.navigate(
         context=top_context["context"],
         url=http_equiv_url,
         wait="complete",
@@ -265,6 +304,7 @@
         events[0],
         expected_request=expected_request,
         redirect_count=0,
+        navigation=result["navigation"],
     )
     # http-equiv redirect should not be considered as a redirect: redirect_count
     # should be 0.
@@ -277,3 +317,46 @@
 
     # Check that the http-equiv redirect request has a different requestId
     assert events[0]["request"]["request"] != events[1]["request"]["request"]
+
+    # Check that the http-equiv redirect request also has a navigation id set,
+    # but different from the original request.
+    assert events[1]["navigation"] is not None
+    assert events[1]["navigation"] != events[0]["navigation"]
+
+
+@pytest.mark.asyncio
+async def test_redirect_navigation(
+    bidi_session, top_context, wait_for_event, url, setup_network_test
+):
+    html_url = url(PAGE_EMPTY_HTML)
+    redirect_url = url(
+        f"/webdriver/tests/support/http_handlers/redirect.py?location={html_url}"
+    )
+
+    network_events = await setup_network_test(events=["network.beforeRequestSent"])
+    events = network_events["network.beforeRequestSent"]
+
+    result = await bidi_session.browsing_context.navigate(
+        context=top_context["context"],
+        url=redirect_url,
+        wait="complete",
+    )
+
+    assert len(events) == 2
+    expected_request = {"method": "GET", "url": redirect_url}
+    assert_before_request_sent_event(
+        events[0],
+        expected_request=expected_request,
+        navigation=result["navigation"],
+        redirect_count=0,
+    )
+    expected_request = {"method": "GET", "url": html_url}
+    assert_before_request_sent_event(
+        events[1],
+        expected_request=expected_request,
+        navigation=result["navigation"],
+        redirect_count=1,
+    )
+
+    # Check that both requests share the same requestId
+    assert events[0]["request"]["request"] == events[1]["request"]["request"]
diff --git a/webdriver/tests/bidi/network/combined/network_events.py b/webdriver/tests/bidi/network/combined/network_events.py
index f4af23b..9eb79dd 100644
--- a/webdriver/tests/bidi/network/combined/network_events.py
+++ b/webdriver/tests/bidi/network/combined/network_events.py
@@ -12,6 +12,53 @@
 
 
 @pytest.mark.asyncio
+async def test_same_navigation_id(
+    bidi_session, top_context, wait_for_event, url, setup_network_test
+):
+    network_events = await setup_network_test(
+        events=[
+            "network.beforeRequestSent",
+            "network.responseStarted",
+            "network.responseCompleted",
+        ],
+        contexts=[top_context["context"]],
+    )
+
+    html_url = url(PAGE_EMPTY_HTML)
+    on_response_completed = wait_for_event("network.responseCompleted")
+    result = await bidi_session.browsing_context.navigate(
+        context=top_context["context"],
+        url=html_url,
+        wait="complete",
+    )
+    await on_response_completed
+
+    assert len(network_events["network.beforeRequestSent"]) == 1
+    assert len(network_events["network.responseStarted"]) == 1
+    assert len(network_events["network.responseCompleted"]) == 1
+    expected_request = {"method": "GET", "url": html_url}
+    expected_response = {"url": html_url}
+    assert_before_request_sent_event(
+        network_events["network.beforeRequestSent"][0],
+        expected_request=expected_request,
+        context=top_context["context"],
+        navigation=result["navigation"],
+    )
+    assert_response_event(
+        network_events["network.responseStarted"][0],
+        expected_response=expected_response,
+        context=top_context["context"],
+        navigation=result["navigation"],
+    )
+    assert_response_event(
+        network_events["network.responseCompleted"][0],
+        expected_response=expected_response,
+        context=top_context["context"],
+        navigation=result["navigation"],
+    )
+
+
+@pytest.mark.asyncio
 async def test_same_request_id(wait_for_event, url, setup_network_test, fetch):
     network_events = await setup_network_test(
         events=[
diff --git a/webdriver/tests/bidi/network/response_completed/response_completed.py b/webdriver/tests/bidi/network/response_completed/response_completed.py
index 09769fc..fcd5c47 100644
--- a/webdriver/tests/bidi/network/response_completed/response_completed.py
+++ b/webdriver/tests/bidi/network/response_completed/response_completed.py
@@ -97,7 +97,7 @@
     events = network_events[RESPONSE_COMPLETED_EVENT]
 
     on_response_completed = wait_for_event(RESPONSE_COMPLETED_EVENT)
-    await bidi_session.browsing_context.navigate(
+    result = await bidi_session.browsing_context.navigate(
         context=top_context["context"],
         url=html_url,
         wait="complete",
@@ -118,6 +118,7 @@
         events[0],
         expected_request=expected_request,
         expected_response=expected_response,
+        navigation=result["navigation"],
         redirect_count=0,
     )
 
@@ -159,9 +160,7 @@
 
 
 @pytest.mark.asyncio
-async def test_response_headers(
-    wait_for_event, url, fetch, setup_network_test
-):
+async def test_response_headers(wait_for_event, url, fetch, setup_network_test):
     headers_url = url(
         "/webdriver/tests/support/http_handlers/headers.py?header=foo:bar&header=baz:biz"
     )
@@ -207,7 +206,7 @@
 )
 @pytest.mark.asyncio
 async def test_response_mime_type_file(
-     url, wait_for_event, fetch, setup_network_test, page_url, mime_type
+    url, wait_for_event, fetch, setup_network_test, page_url, mime_type
 ):
     network_events = await setup_network_test(events=[RESPONSE_COMPLETED_EVENT])
     events = network_events[RESPONSE_COMPLETED_EVENT]
@@ -285,7 +284,7 @@
         protocol=protocol,
         parameters=parameters,
     )
-    await bidi_session.browsing_context.navigate(
+    first_navigate = await bidi_session.browsing_context.navigate(
         context=new_tab["context"],
         url=initial_url,
         wait="complete",
@@ -296,7 +295,7 @@
     redirect_url = url(
         f"/webdriver/tests/support/http_handlers/redirect.py?location={quote(initial_url)}"
     )
-    await bidi_session.browsing_context.navigate(
+    second_navigate = await bidi_session.browsing_context.navigate(
         context=new_tab["context"],
         url=redirect_url,
         wait="complete",
@@ -311,15 +310,24 @@
 
     expected_request = {"method": "GET", "url": initial_url}
     assert_response_event(
-        events[0], expected_request=expected_request, redirect_count=0
+        events[0],
+        expected_request=expected_request,
+        redirect_count=0,
+        navigation=first_navigate["navigation"],
     )
     expected_request = {"method": "GET", "url": redirect_url}
     assert_response_event(
-        events[1], expected_request=expected_request, redirect_count=0
+        events[1],
+        expected_request=expected_request,
+        redirect_count=0,
+        navigation=second_navigate["navigation"],
     )
     expected_request = {"method": "GET", "url": initial_url}
     assert_response_event(
-        events[2], expected_request=expected_request, redirect_count=1
+        events[2],
+        expected_request=expected_request,
+        redirect_count=1,
+        navigation=second_navigate["navigation"],
     )
 
     # Check that the last 2 requests share the same request id
diff --git a/webdriver/tests/bidi/network/response_started/response_started.py b/webdriver/tests/bidi/network/response_started/response_started.py
index b7b918b..d3a84fd 100644
--- a/webdriver/tests/bidi/network/response_started/response_started.py
+++ b/webdriver/tests/bidi/network/response_started/response_started.py
@@ -79,7 +79,7 @@
     events = network_events[RESPONSE_STARTED_EVENT]
 
     on_response_started = wait_for_event(RESPONSE_STARTED_EVENT)
-    await bidi_session.browsing_context.navigate(
+    result = await bidi_session.browsing_context.navigate(
         context=top_context["context"],
         url=html_url,
         wait="complete",
@@ -100,6 +100,7 @@
         events[0],
         expected_request=expected_request,
         expected_response=expected_response,
+        navigation=result["navigation"],
         redirect_count=0,
     )