1import pytest 2 3from datetime import datetime, timedelta 4 5 6from tests.support.asserts import assert_error, assert_success 7from tests.support.helpers import clear_all_cookies 8 9 10def get_named_cookie(session, name): 11 return session.transport.send( 12 "GET", "session/{session_id}/cookie/{name}".format( 13 session_id=session.session_id, 14 name=name)) 15 16 17def test_no_top_browsing_context(session, closed_window): 18 response = get_named_cookie(session, "foo") 19 assert_error(response, "no such window") 20 21 22def test_no_browsing_context(session, closed_frame): 23 response = get_named_cookie(session, "foo") 24 assert_error(response, "no such window") 25 26 27def test_get_named_session_cookie(session, url): 28 session.url = url("/common/blank.html") 29 clear_all_cookies(session) 30 session.execute_script("document.cookie = 'foo=bar'") 31 32 result = get_named_cookie(session, "foo") 33 cookie = assert_success(result) 34 assert isinstance(cookie, dict) 35 36 # table for cookie conversion 37 # https://w3c.github.io/webdriver/#dfn-table-for-cookie-conversion 38 assert "name" in cookie 39 assert isinstance(cookie["name"], str) 40 assert "value" in cookie 41 assert isinstance(cookie["value"], str) 42 assert "path" in cookie 43 assert isinstance(cookie["path"], str) 44 assert "domain" in cookie 45 assert isinstance(cookie["domain"], str) 46 assert "secure" in cookie 47 assert isinstance(cookie["secure"], bool) 48 assert "httpOnly" in cookie 49 assert isinstance(cookie["httpOnly"], bool) 50 if "expiry" in cookie: 51 assert cookie.get("expiry") is None 52 assert "sameSite" in cookie 53 assert isinstance(cookie["sameSite"], str) 54 55 assert cookie["name"] == "foo" 56 assert cookie["value"] == "bar" 57 58 59def test_get_named_cookie(session, url): 60 session.url = url("/common/blank.html") 61 clear_all_cookies(session) 62 63 # same formatting as Date.toUTCString() in javascript 64 utc_string_format = "%a, %d %b %Y %H:%M:%S" 65 a_day_from_now = (datetime.utcnow() + timedelta(days=1)).strftime(utc_string_format) 66 session.execute_script("document.cookie = 'foo=bar;expires=%s'" % a_day_from_now) 67 68 result = get_named_cookie(session, "foo") 69 cookie = assert_success(result) 70 assert isinstance(cookie, dict) 71 72 assert "name" in cookie 73 assert isinstance(cookie["name"], str) 74 assert "value" in cookie 75 assert isinstance(cookie["value"], str) 76 assert "expiry" in cookie 77 assert isinstance(cookie["expiry"], int) 78 assert "sameSite" in cookie 79 assert isinstance(cookie["sameSite"], str) 80 81 assert cookie["name"] == "foo" 82 assert cookie["value"] == "bar" 83 # convert from seconds since epoch 84 assert datetime.utcfromtimestamp( 85 cookie["expiry"]).strftime(utc_string_format) == a_day_from_now 86 87 88def test_duplicated_cookie(session, url, server_config, inline): 89 new_cookie = { 90 "name": "hello", 91 "value": "world", 92 "domain": server_config["browser_host"], 93 "path": "/", 94 "http_only": False, 95 "secure": False 96 } 97 98 session.url = url("/common/blank.html") 99 clear_all_cookies(session) 100 101 session.set_cookie(**new_cookie) 102 session.url = inline(""" 103 <script> 104 document.cookie = '{name}=newworld; domain={domain}; path=/'; 105 </script>""".format( 106 name=new_cookie["name"], 107 domain=server_config["browser_host"])) 108 109 result = get_named_cookie(session, new_cookie["name"]) 110 cookie = assert_success(result) 111 assert isinstance(cookie, dict) 112 113 assert "name" in cookie 114 assert isinstance(cookie["name"], str) 115 assert "value" in cookie 116 assert isinstance(cookie["value"], str) 117 assert "sameSite" in cookie 118 assert isinstance(cookie["sameSite"], str) 119 120 assert cookie["name"] == new_cookie["name"] 121 assert cookie["value"] == "newworld" 122 123 124@pytest.mark.parametrize("same_site", ["None", "Lax", "Strict"]) 125@pytest.mark.capabilities({"acceptInsecureCerts": True}) 126def test_get_cookie_with_same_site_flag(session, url, same_site): 127 session.url = url("/common/blank.html", protocol="https") 128 clear_all_cookies(session) 129 130 session.execute_script("document.cookie = 'foo=bar;Secure;SameSite=%s'" % same_site) 131 132 result = get_named_cookie(session, "foo") 133 cookie = assert_success(result) 134 assert isinstance(cookie, dict) 135 136 assert "name" in cookie 137 assert isinstance(cookie["name"], str) 138 assert "value" in cookie 139 assert isinstance(cookie["value"], str) 140 assert "sameSite" in cookie 141 assert isinstance(cookie["sameSite"], str) 142 143 assert cookie["name"] == "foo" 144 assert cookie["value"] == "bar" 145 assert cookie["sameSite"] == same_site 146