Path: blob/trunk/java/test/org/openqa/selenium/CookieImplementationTest.java
1865 views
// Licensed to the Software Freedom Conservancy (SFC) under one1// or more contributor license agreements. See the NOTICE file2// distributed with this work for additional information3// regarding copyright ownership. The SFC licenses this file4// to you under the Apache License, Version 2.0 (the5// "License"); you may not use this file except in compliance6// with the License. You may obtain a copy of the License at7//8// http://www.apache.org/licenses/LICENSE-2.09//10// Unless required by applicable law or agreed to in writing,11// software distributed under the License is distributed on an12// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY13// KIND, either express or implied. See the License for the14// specific language governing permissions and limitations15// under the License.1617package org.openqa.selenium;1819import static org.assertj.core.api.Assertions.assertThat;20import static org.junit.jupiter.api.Assertions.assertThrows;21import static org.junit.jupiter.api.Assumptions.assumeTrue;22import static org.openqa.selenium.testing.drivers.Browser.ALL;23import static org.openqa.selenium.testing.drivers.Browser.CHROME;24import static org.openqa.selenium.testing.drivers.Browser.EDGE;25import static org.openqa.selenium.testing.drivers.Browser.FIREFOX;26import static org.openqa.selenium.testing.drivers.Browser.IE;27import static org.openqa.selenium.testing.drivers.Browser.SAFARI;2829import java.net.URI;30import java.util.Date;31import java.util.Random;32import java.util.Set;33import org.junit.jupiter.api.BeforeEach;34import org.junit.jupiter.api.Test;35import org.openqa.selenium.environment.DomainHelper;36import org.openqa.selenium.testing.Ignore;37import org.openqa.selenium.testing.JupiterTestBase;38import org.openqa.selenium.testing.NeedsSecureServer;39import org.openqa.selenium.testing.NotWorkingInRemoteBazelBuilds;40import org.openqa.selenium.testing.SwitchToTopAfterTest;4142@NeedsSecureServer43class CookieImplementationTest extends JupiterTestBase {4445private DomainHelper domainHelper;46private String cookiePage;47private static final Random random = new Random();4849@BeforeEach50public void setUp() {51domainHelper = new DomainHelper(appServer);52assumeTrue(domainHelper.checkIsOnValidHostname());53cookiePage = domainHelper.getUrlForFirstValidHostname("/common/cookie");5455deleteAllCookiesOnServerSide();5657// This page is the deepest page we go to in the cookie tests58// We go to it to ensure that cookies with /common/... paths are deleted59// Do not write test in this class which use pages other than under /common60// without ensuring that cookies are deleted on those pages as required61try {62driver.get(domainHelper.getUrlForFirstValidHostname("/common/animals"));63} catch (IllegalArgumentException e) {64// Ideally we would throw an IgnoredTestError or something here,65// but our test runner doesn't pay attention to those.66// Rely on the tests skipping themselves if they need to be on a useful page.67return;68}6970driver.manage().deleteAllCookies();71assertNoCookiesArePresent();72}7374@Test75public void testShouldGetCookieByName() {76String key = generateUniqueKey();77String value = "set";78assertCookieIsNotPresentWithName(key);7980addCookieOnServerSide(new Cookie(key, value));8182Cookie cookie = driver.manage().getCookieNamed(key);83assertThat(cookie.getValue()).isEqualTo(value);84}8586@Test87@NotWorkingInRemoteBazelBuilds(FIREFOX)88public void testShouldBeAbleToAddCookie() {89String key = generateUniqueKey();90String value = "foo";91Cookie cookie = new Cookie.Builder(key, value).domain(domainHelper.getHostName()).build();92assertCookieIsNotPresentWithName(key);9394driver.manage().addCookie(cookie);9596assertCookieHasValue(key, value);9798openAnotherPage();99assertCookieHasValue(key, value);100}101102@Test103public void testGetAllCookies() {104String key1 = generateUniqueKey();105String key2 = generateUniqueKey();106107assertCookieIsNotPresentWithName(key1);108assertCookieIsNotPresentWithName(key2);109110Set<Cookie> cookies = driver.manage().getCookies();111int countBefore = cookies.size();112113Cookie one = new Cookie.Builder(key1, "value").build();114Cookie two = new Cookie.Builder(key2, "value").build();115116driver.manage().addCookie(one);117driver.manage().addCookie(two);118119openAnotherPage();120cookies = driver.manage().getCookies();121assertThat(cookies.size()).isEqualTo(countBefore + 2);122123assertThat(cookies.contains(one)).isTrue();124assertThat(cookies.contains(two)).isTrue();125}126127@Test128public void testDeleteAllCookies() {129addCookieOnServerSide(new Cookie("foo", "set"));130assertSomeCookiesArePresent();131132driver.manage().deleteAllCookies();133134assertNoCookiesArePresent();135136openAnotherPage();137assertNoCookiesArePresent();138}139140@Test141public void testDeleteCookieWithName() {142String key1 = generateUniqueKey();143String key2 = generateUniqueKey();144145addCookieOnServerSide(new Cookie(key1, "set"));146addCookieOnServerSide(new Cookie(key2, "set"));147148assertCookieIsPresentWithName(key1);149assertCookieIsPresentWithName(key2);150151driver.manage().deleteCookieNamed(key1);152153assertCookieIsNotPresentWithName(key1);154assertCookieIsPresentWithName(key2);155156openAnotherPage();157assertCookieIsNotPresentWithName(key1);158assertCookieIsPresentWithName(key2);159}160161@Test162public void testShouldNotDeleteCookiesWithASimilarName() {163String cookieOneName = "fish";164Cookie cookie1 = new Cookie.Builder(cookieOneName, "cod").build();165Cookie cookie2 = new Cookie.Builder(cookieOneName + "x", "earth").build();166WebDriver.Options options = driver.manage();167assertCookieIsNotPresentWithName(cookie1.getName());168169options.addCookie(cookie1);170options.addCookie(cookie2);171172assertCookieIsPresentWithName(cookie1.getName());173174options.deleteCookieNamed(cookieOneName);175Set<Cookie> cookies = options.getCookies();176177assertThat(cookies).doesNotContain(cookie1);178assertThat(cookies).contains(cookie2);179}180181@Test182public void testAddCookiesWithDifferentPathsThatAreRelatedToOurs() {183driver.get(domainHelper.getUrlForFirstValidHostname("/common/animals"));184Cookie cookie1 = new Cookie.Builder("fish", "cod").path("/common/animals").build();185Cookie cookie2 = new Cookie.Builder("planet", "earth").path("/common/").build();186WebDriver.Options options = driver.manage();187options.addCookie(cookie1);188options.addCookie(cookie2);189190driver.get(domainHelper.getUrlForFirstValidHostname("/common/animals"));191192assertCookieIsPresentWithName(cookie1.getName());193assertCookieIsPresentWithName(cookie2.getName());194195driver.get(domainHelper.getUrlForFirstValidHostname("/common/simpleTest.html"));196assertCookieIsNotPresentWithName(cookie1.getName());197}198199@SwitchToTopAfterTest200@Test201@Ignore(SAFARI)202@NotWorkingInRemoteBazelBuilds(CHROME)203@NotWorkingInRemoteBazelBuilds(EDGE)204@NotWorkingInRemoteBazelBuilds(FIREFOX)205public void testGetCookiesInAFrame() {206driver.get(domainHelper.getUrlForFirstValidHostname("/common/animals"));207Cookie cookie1 = new Cookie.Builder("fish", "cod").path("/common/animals").build();208driver.manage().addCookie(cookie1);209210driver.get(domainHelper.getUrlForFirstValidHostname("frameWithAnimals.html"));211assertCookieIsNotPresentWithName(cookie1.getName());212213driver.switchTo().frame("iframe1");214assertCookieIsPresentWithName(cookie1.getName());215}216217@Test218public void testCannotGetCookiesWithPathDifferingOnlyInCase() {219String cookieName = "fish";220Cookie cookie = new Cookie.Builder(cookieName, "cod").path("/Common/animals").build();221driver.manage().addCookie(cookie);222223driver.get(domainHelper.getUrlForFirstValidHostname("/common/animals"));224assertThat(driver.manage().getCookieNamed(cookieName)).isNull();225}226227@Test228public void testShouldNotGetCookieOnDifferentDomain() {229assumeTrue(domainHelper.checkHasValidAlternateHostname());230231String cookieName = "fish";232driver.manage().addCookie(new Cookie.Builder(cookieName, "cod").build());233assertCookieIsPresentWithName(cookieName);234235driver.get(domainHelper.getUrlForSecondValidHostname("simpleTest.html"));236237assertCookieIsNotPresentWithName(cookieName);238}239240@Test241@NotWorkingInRemoteBazelBuilds(FIREFOX)242public void testShouldBeAbleToAddToADomainWhichIsRelatedToTheCurrentDomain() {243String cookieName = "name";244assertCookieIsNotPresentWithName(cookieName);245246String shorter = domainHelper.getHostName().replaceFirst(".*?\\.", ".");247Cookie cookie = new Cookie.Builder(cookieName, "value").domain(shorter).build();248driver.manage().addCookie(cookie);249250assertCookieIsPresentWithName(cookieName);251}252253@Test254@Ignore(ALL)255public void testsShouldNotGetCookiesRelatedToCurrentDomainWithoutLeadingPeriod() {256String cookieName = "name";257assertCookieIsNotPresentWithName(cookieName);258259String shorter = domainHelper.getHostName().replaceFirst(".*?\\.", "");260Cookie cookie = new Cookie.Builder(cookieName, "value").domain(shorter).build();261driver.manage().addCookie(cookie);262assertCookieIsNotPresentWithName(cookieName);263}264265@Test266@NotWorkingInRemoteBazelBuilds(FIREFOX)267void testShouldBeAbleToIncludeLeadingPeriodInDomainName() {268String cookieName = "name";269assertCookieIsNotPresentWithName(cookieName);270271String shorter = domainHelper.getHostName().replaceFirst(".*?\\.", ".");272Cookie cookie = new Cookie.Builder("name", "value").domain(shorter).build();273274driver.manage().addCookie(cookie);275276assertCookieIsPresentWithName(cookieName);277}278279@Test280@NotWorkingInRemoteBazelBuilds(FIREFOX)281public void testShouldBeAbleToSetDomainToTheCurrentDomain() throws Exception {282URI url = new URI(driver.getCurrentUrl());283String host = url.getHost() + ":" + url.getPort();284285Cookie cookie = new Cookie.Builder("fish", "cod").domain(host).build();286driver.manage().addCookie(cookie);287288driver.get(domainHelper.getUrlForFirstValidHostname("javascriptPage.html"));289Set<Cookie> cookies = driver.manage().getCookies();290assertThat(cookies).contains(cookie);291}292293@Test294@NotWorkingInRemoteBazelBuilds(CHROME)295@NotWorkingInRemoteBazelBuilds(EDGE)296@NotWorkingInRemoteBazelBuilds(FIREFOX)297public void testShouldWalkThePathToDeleteACookie() {298Cookie cookie1 = new Cookie.Builder("fish", "cod").build();299driver.manage().addCookie(cookie1);300301driver.get(domainHelper.getUrlForFirstValidHostname("child/childPage.html"));302Cookie cookie2 = new Cookie("rodent", "hamster", "/common/child");303driver.manage().addCookie(cookie2);304305driver.get(domainHelper.getUrlForFirstValidHostname("child/grandchild/grandchildPage.html"));306Cookie cookie3 = new Cookie("dog", "dalmatian", "/common/child/grandchild/");307driver.manage().addCookie(cookie3);308309driver.get(domainHelper.getUrlForFirstValidHostname("child/grandchild/grandchildPage.html"));310driver.manage().deleteCookieNamed("rodent");311312assertThat(driver.manage().getCookieNamed("rodent")).isNull();313314Set<Cookie> cookies = driver.manage().getCookies();315assertThat(cookies).hasSize(2);316assertThat(cookies).contains(cookie1);317assertThat(cookies).contains(cookie3);318319driver.manage().deleteAllCookies();320driver.get(domainHelper.getUrlForFirstValidHostname("child/grandchild/grandchildPage.html"));321assertNoCookiesArePresent();322}323324@Test325@NotWorkingInRemoteBazelBuilds(FIREFOX)326public void testShouldIgnoreThePortNumberOfTheHostWhenSettingTheCookie() throws Exception {327URI uri = new URI(driver.getCurrentUrl());328String host = String.format("%s:%d", uri.getHost(), uri.getPort());329330String cookieName = "name";331assertCookieIsNotPresentWithName(cookieName);332333Cookie cookie = new Cookie.Builder(cookieName, "value").domain(host).build();334driver.manage().addCookie(cookie);335336assertCookieIsPresentWithName(cookieName);337}338339@Test340@NotWorkingInRemoteBazelBuilds(CHROME)341@NotWorkingInRemoteBazelBuilds(EDGE)342@NotWorkingInRemoteBazelBuilds(FIREFOX)343public void testCookieEqualityAfterSetAndGet() {344driver.get(domainHelper.getUrlForFirstValidHostname("animals"));345346driver.manage().deleteAllCookies();347348Cookie addedCookie =349new Cookie.Builder("fish", "cod")350.path("/common/animals")351.expiresOn(someTimeInTheFuture())352.build();353driver.manage().addCookie(addedCookie);354355Set<Cookie> cookies = driver.manage().getCookies();356Cookie retrievedCookie = null;357for (Cookie temp : cookies) {358if (addedCookie.equals(temp)) {359retrievedCookie = temp;360break;361}362}363364assertThat(retrievedCookie).isNotNull();365// Cookie.equals only compares name, domain and path366assertThat(retrievedCookie).isEqualTo(addedCookie);367}368369@Test370public void testRetainsCookieExpiry() {371Cookie addedCookie =372new Cookie.Builder("fish", "cod")373.path("/common/animals")374.expiresOn(someTimeInTheFuture())375.build();376driver.manage().addCookie(addedCookie);377378Cookie retrieved = driver.manage().getCookieNamed("fish");379assertThat(retrieved).isNotNull();380assertThat(retrieved.getExpiry()).isEqualTo(addedCookie.getExpiry());381}382383@Test384@Ignore(IE)385@Ignore(SAFARI)386@NotWorkingInRemoteBazelBuilds(CHROME)387@NotWorkingInRemoteBazelBuilds(EDGE)388@NotWorkingInRemoteBazelBuilds(FIREFOX)389public void canHandleSecureCookie() {390driver.get(domainHelper.getSecureUrlForFirstValidHostname("animals"));391392Cookie addedCookie =393new Cookie.Builder("fish", "cod").path("/common/animals").isSecure(true).build();394driver.manage().addCookie(addedCookie);395396driver.navigate().refresh();397398Cookie retrieved = driver.manage().getCookieNamed("fish");399assertThat(retrieved).isNotNull();400}401402@Test403@Ignore(IE)404@Ignore(SAFARI)405@NotWorkingInRemoteBazelBuilds(CHROME)406@NotWorkingInRemoteBazelBuilds(EDGE)407@NotWorkingInRemoteBazelBuilds(FIREFOX)408public void testRetainsCookieSecure() {409driver.get(domainHelper.getSecureUrlForFirstValidHostname("animals"));410411Cookie addedCookie =412new Cookie.Builder("fish", "cod").path("/common/animals").isSecure(true).build();413driver.manage().addCookie(addedCookie);414415driver.navigate().refresh();416417Cookie retrieved = driver.manage().getCookieNamed("fish");418assertThat(retrieved).isNotNull();419assertThat(retrieved.isSecure()).isTrue();420}421422@Test423@Ignore(SAFARI)424@NotWorkingInRemoteBazelBuilds(CHROME)425@NotWorkingInRemoteBazelBuilds(EDGE)426@NotWorkingInRemoteBazelBuilds(FIREFOX)427public void canHandleHttpOnlyCookie() {428Cookie addedCookie =429new Cookie.Builder("fish", "cod").path("/common/animals").isHttpOnly(true).build();430431addCookieOnServerSide(addedCookie);432433driver.get(domainHelper.getUrlForFirstValidHostname("animals"));434Cookie retrieved = driver.manage().getCookieNamed("fish");435assertThat(retrieved).isNotNull();436}437438@Test439@Ignore(SAFARI)440@NotWorkingInRemoteBazelBuilds(CHROME)441@NotWorkingInRemoteBazelBuilds(EDGE)442@NotWorkingInRemoteBazelBuilds(FIREFOX)443public void testRetainsHttpOnlyFlag() {444Cookie addedCookie =445new Cookie.Builder("fish", "cod").path("/common/animals").isHttpOnly(true).build();446447addCookieOnServerSide(addedCookie);448449driver.get(domainHelper.getUrlForFirstValidHostname("animals"));450Cookie retrieved = driver.manage().getCookieNamed("fish");451assertThat(retrieved).isNotNull();452assertThat(retrieved.isHttpOnly()).isTrue();453}454455@Test456public void testSettingACookieThatExpiredInThePast() {457long expires = System.currentTimeMillis() - 1000;458Cookie cookie = new Cookie.Builder("expired", "yes").expiresOn(new Date(expires)).build();459driver.manage().addCookie(cookie);460461cookie = driver.manage().getCookieNamed("fish");462assertThat(cookie)463.as("Cookie expired before it was set, so nothing should be returned")464.isNull();465}466467@Test468public void testCanSetCookieWithoutOptionalFieldsSet() {469String key = generateUniqueKey();470String value = "foo";471Cookie cookie = new Cookie(key, value);472assertCookieIsNotPresentWithName(key);473474driver.manage().addCookie(cookie);475476assertCookieHasValue(key, value);477}478479@Test480public void testDeleteNotExistedCookie() {481String key = generateUniqueKey();482assertCookieIsNotPresentWithName(key);483484driver.manage().deleteCookieNamed(key);485}486487@Test488public void testDeleteEmptyNamedCookie() {489assertThrows(IllegalArgumentException.class, () -> driver.manage().deleteCookieNamed(""));490assertThrows(IllegalArgumentException.class, () -> driver.manage().deleteCookieNamed(" "));491}492493@Test494public void testGetEmptyNamedCookie() {495assertThrows(IllegalArgumentException.class, () -> driver.manage().getCookieNamed(""));496assertThrows(IllegalArgumentException.class, () -> driver.manage().getCookieNamed(" "));497}498499@Test500@Ignore(value = ALL, reason = "Non W3C conformant")501public void testShouldDeleteOneOfTheCookiesWithTheSameName() {502driver.get(domainHelper.getUrlForFirstValidHostname("/common/animals"));503Cookie cookie1 =504new Cookie.Builder("fish", "cod")505.domain(domainHelper.getHostName())506.path("/common/animals")507.build();508Cookie cookie2 =509new Cookie.Builder("fish", "tune")510.domain(domainHelper.getHostName())511.path("/common/")512.build();513WebDriver.Options options = driver.manage();514options.addCookie(cookie1);515options.addCookie(cookie2);516assertThat(driver.manage().getCookies()).hasSize(2);517518driver.manage().deleteCookie(cookie1);519520assertThat(driver.manage().getCookies()).hasSize(1);521Cookie retrieved = driver.manage().getCookieNamed("fish");522assertThat(retrieved).isEqualTo(cookie2);523}524525private String generateUniqueKey() {526return String.format("key_%d", random.nextInt());527}528529private void assertNoCookiesArePresent() {530assertThat(driver.manage().getCookies()).isEmpty();531String documentCookie = getDocumentCookieOrNull();532if (documentCookie != null) {533assertThat(documentCookie).isEmpty();534}535}536537private void assertSomeCookiesArePresent() {538assertThat(driver.manage().getCookies()).isNotEmpty();539String documentCookie = getDocumentCookieOrNull();540if (documentCookie != null) {541assertThat(documentCookie).as("Cookies were empty").isNotEqualTo("");542}543}544545private void assertCookieIsNotPresentWithName(final String key) {546assertThat(driver.manage().getCookieNamed(key)).as("Cookie with name " + key).isNull();547String documentCookie = getDocumentCookieOrNull();548if (documentCookie != null) {549assertThat(documentCookie).as("Cookie with name " + key).doesNotContain((key + "="));550}551}552553private void assertCookieIsPresentWithName(final String key) {554assertThat(driver.manage().getCookieNamed(key)).as("Cookie with name " + key).isNotNull();555String documentCookie = getDocumentCookieOrNull();556if (documentCookie != null) {557assertThat(documentCookie)558.as("Cookie was not present with name " + key + ", got: " + documentCookie)559.contains(key + "=");560}561}562563private void assertCookieHasValue(final String key, final String value) {564assertThat(driver.manage().getCookieNamed(key).getValue()).isEqualTo(value);565String documentCookie = getDocumentCookieOrNull();566if (documentCookie != null) {567assertThat(documentCookie)568.as("Cookie was present with name " + key)569.contains(key + "=" + value);570}571}572573private String getDocumentCookieOrNull() {574if (!(driver instanceof JavascriptExecutor)) {575return null;576}577try {578return (String) ((JavascriptExecutor) driver).executeScript("return document.cookie");579} catch (UnsupportedOperationException e) {580return null;581}582}583584private Date someTimeInTheFuture() {585return new Date(System.currentTimeMillis() + 100000);586}587588private void openAnotherPage() {589driver.get(domainHelper.getUrlForFirstValidHostname("simpleTest.html"));590}591592private void deleteAllCookiesOnServerSide() {593driver.get(cookiePage + "?action=deleteAll");594}595596private void addCookieOnServerSide(Cookie cookie) {597StringBuilder url = new StringBuilder(cookiePage);598url.append("?action=add");599url.append("&name=").append(cookie.getName());600url.append("&value=").append(cookie.getValue());601if (cookie.getDomain() != null) {602url.append("&domain=").append(cookie.getDomain());603}604if (cookie.getPath() != null) {605url.append("&path=").append(cookie.getPath());606}607if (cookie.getExpiry() != null) {608url.append("&expiry=").append(cookie.getExpiry().getTime());609}610if (cookie.isSecure()) {611url.append("&secure=").append(cookie.isSecure());612}613if (cookie.isHttpOnly()) {614url.append("&httpOnly=").append(cookie.isHttpOnly());615}616driver.get(url.toString());617}618619@Test620public void deleteAllCookies() {621assumeTrue(domainHelper.checkHasValidAlternateHostname());622623Cookie cookie1 = new Cookie.Builder("fish1", "cod").domain(appServer.getHostName()).build();624Cookie cookie2 =625new Cookie.Builder("fish2", "tune").domain(appServer.getAlternateHostName()).build();626627String url1 = domainHelper.getUrlForFirstValidHostname("/common");628String url2 = domainHelper.getUrlForSecondValidHostname("/common");629630WebDriver.Options options = driver.manage();631632options.addCookie(cookie1);633assertCookieIsPresentWithName(cookie1.getName());634635driver.get(url2);636options.addCookie(cookie2);637assertCookieIsNotPresentWithName(cookie1.getName());638assertCookieIsPresentWithName(cookie2.getName());639640driver.get(url1);641assertCookieIsPresentWithName(cookie1.getName());642assertCookieIsNotPresentWithName(cookie2.getName());643644options.deleteAllCookies();645assertCookieIsNotPresentWithName(cookie1.getName());646647driver.get(url2);648assertCookieIsPresentWithName(cookie2.getName());649}650}651652653