Path: blob/trunk/java/test/org/openqa/selenium/CookieImplementationTest.java
4018 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.assertj.core.api.Assertions.assertThatThrownBy;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);109110int countBefore = driver.manage().getCookies().size();111112Cookie one = new Cookie.Builder(key1, "value").build();113Cookie two = new Cookie.Builder(key2, "value").build();114115driver.manage().addCookie(one);116driver.manage().addCookie(two);117118openAnotherPage();119Set<Cookie> cookies = driver.manage().getCookies();120assertThat(cookies).hasSize(countBefore + 2);121122assertThat(cookies).contains(one, two);123}124125@Test126public void testDeleteAllCookies() {127addCookieOnServerSide(new Cookie("foo", "set"));128assertSomeCookiesArePresent();129130driver.manage().deleteAllCookies();131132assertNoCookiesArePresent();133134openAnotherPage();135assertNoCookiesArePresent();136}137138@Test139public void testDeleteCookieWithName() {140String key1 = generateUniqueKey();141String key2 = generateUniqueKey();142143addCookieOnServerSide(new Cookie(key1, "set"));144addCookieOnServerSide(new Cookie(key2, "set"));145146assertCookieIsPresentWithName(key1);147assertCookieIsPresentWithName(key2);148149driver.manage().deleteCookieNamed(key1);150151assertCookieIsNotPresentWithName(key1);152assertCookieIsPresentWithName(key2);153154openAnotherPage();155assertCookieIsNotPresentWithName(key1);156assertCookieIsPresentWithName(key2);157}158159@Test160public void testShouldNotDeleteCookiesWithASimilarName() {161String cookieOneName = "fish";162Cookie cookie1 = new Cookie.Builder(cookieOneName, "cod").build();163Cookie cookie2 = new Cookie.Builder(cookieOneName + "x", "earth").build();164WebDriver.Options options = driver.manage();165assertCookieIsNotPresentWithName(cookie1.getName());166167options.addCookie(cookie1);168options.addCookie(cookie2);169170assertCookieIsPresentWithName(cookie1.getName());171172options.deleteCookieNamed(cookieOneName);173Set<Cookie> cookies = options.getCookies();174175assertThat(cookies).doesNotContain(cookie1);176assertThat(cookies).contains(cookie2);177}178179@Test180public void testAddCookiesWithDifferentPathsThatAreRelatedToOurs() {181driver.get(domainHelper.getUrlForFirstValidHostname("/common/animals"));182Cookie cookie1 = new Cookie.Builder("fish", "cod").path("/common/animals").build();183Cookie cookie2 = new Cookie.Builder("planet", "earth").path("/common/").build();184WebDriver.Options options = driver.manage();185options.addCookie(cookie1);186options.addCookie(cookie2);187188driver.get(domainHelper.getUrlForFirstValidHostname("/common/animals"));189190assertCookieIsPresentWithName(cookie1.getName());191assertCookieIsPresentWithName(cookie2.getName());192193driver.get(domainHelper.getUrlForFirstValidHostname("/common/simpleTest.html"));194assertCookieIsNotPresentWithName(cookie1.getName());195}196197@SwitchToTopAfterTest198@Test199@Ignore(SAFARI)200@NotWorkingInRemoteBazelBuilds(CHROME)201@NotWorkingInRemoteBazelBuilds(EDGE)202@NotWorkingInRemoteBazelBuilds(FIREFOX)203public void testGetCookiesInAFrame() {204driver.get(domainHelper.getUrlForFirstValidHostname("/common/animals"));205Cookie cookie1 = new Cookie.Builder("fish", "cod").path("/common/animals").build();206driver.manage().addCookie(cookie1);207208driver.get(domainHelper.getUrlForFirstValidHostname("frameWithAnimals.html"));209assertCookieIsNotPresentWithName(cookie1.getName());210211driver.switchTo().frame("iframe1");212assertCookieIsPresentWithName(cookie1.getName());213}214215@Test216public void testCannotGetCookiesWithPathDifferingOnlyInCase() {217String cookieName = "fish";218Cookie cookie = new Cookie.Builder(cookieName, "cod").path("/Common/animals").build();219driver.manage().addCookie(cookie);220221driver.get(domainHelper.getUrlForFirstValidHostname("/common/animals"));222assertThat(driver.manage().getCookieNamed(cookieName)).isNull();223}224225@Test226public void testShouldNotGetCookieOnDifferentDomain() {227assumeTrue(domainHelper.checkHasValidAlternateHostname());228229String cookieName = "fish";230driver.manage().addCookie(new Cookie.Builder(cookieName, "cod").build());231assertCookieIsPresentWithName(cookieName);232233driver.get(domainHelper.getUrlForSecondValidHostname("simpleTest.html"));234235assertCookieIsNotPresentWithName(cookieName);236}237238@Test239@NotWorkingInRemoteBazelBuilds(FIREFOX)240public void testShouldBeAbleToAddToADomainWhichIsRelatedToTheCurrentDomain() {241String cookieName = "name";242assertCookieIsNotPresentWithName(cookieName);243244String shorter = domainHelper.getHostName().replaceFirst(".*?\\.", ".");245Cookie cookie = new Cookie.Builder(cookieName, "value").domain(shorter).build();246driver.manage().addCookie(cookie);247248assertCookieIsPresentWithName(cookieName);249}250251@Test252@Ignore(ALL)253public void testsShouldNotGetCookiesRelatedToCurrentDomainWithoutLeadingPeriod() {254String cookieName = "name";255assertCookieIsNotPresentWithName(cookieName);256257String shorter = domainHelper.getHostName().replaceFirst(".*?\\.", "");258Cookie cookie = new Cookie.Builder(cookieName, "value").domain(shorter).build();259driver.manage().addCookie(cookie);260assertCookieIsNotPresentWithName(cookieName);261}262263@Test264@NotWorkingInRemoteBazelBuilds(FIREFOX)265void testShouldBeAbleToIncludeLeadingPeriodInDomainName() {266String cookieName = "name";267assertCookieIsNotPresentWithName(cookieName);268269String shorter = domainHelper.getHostName().replaceFirst(".*?\\.", ".");270Cookie cookie = new Cookie.Builder("name", "value").domain(shorter).build();271272driver.manage().addCookie(cookie);273274assertCookieIsPresentWithName(cookieName);275}276277@Test278@NotWorkingInRemoteBazelBuilds(FIREFOX)279public void testShouldBeAbleToSetDomainToTheCurrentDomain() throws Exception {280URI url = new URI(driver.getCurrentUrl());281String host = url.getHost() + ":" + url.getPort();282283Cookie cookie = new Cookie.Builder("fish", "cod").domain(host).build();284driver.manage().addCookie(cookie);285286driver.get(domainHelper.getUrlForFirstValidHostname("javascriptPage.html"));287Set<Cookie> cookies = driver.manage().getCookies();288assertThat(cookies).contains(cookie);289}290291@Test292@NotWorkingInRemoteBazelBuilds(CHROME)293@NotWorkingInRemoteBazelBuilds(EDGE)294@NotWorkingInRemoteBazelBuilds(FIREFOX)295public void testShouldWalkThePathToDeleteACookie() {296Cookie cookie1 = new Cookie.Builder("fish", "cod").build();297driver.manage().addCookie(cookie1);298299driver.get(domainHelper.getUrlForFirstValidHostname("child/childPage.html"));300Cookie cookie2 = new Cookie("rodent", "hamster", "/common/child");301driver.manage().addCookie(cookie2);302303driver.get(domainHelper.getUrlForFirstValidHostname("child/grandchild/grandchildPage.html"));304Cookie cookie3 = new Cookie("dog", "dalmatian", "/common/child/grandchild/");305driver.manage().addCookie(cookie3);306307driver.get(domainHelper.getUrlForFirstValidHostname("child/grandchild/grandchildPage.html"));308driver.manage().deleteCookieNamed("rodent");309310assertThat(driver.manage().getCookieNamed("rodent")).isNull();311312Set<Cookie> cookies = driver.manage().getCookies();313assertThat(cookies).containsExactlyInAnyOrder(cookie1, cookie3);314315driver.manage().deleteAllCookies();316driver.get(domainHelper.getUrlForFirstValidHostname("child/grandchild/grandchildPage.html"));317assertNoCookiesArePresent();318}319320@Test321@NotWorkingInRemoteBazelBuilds(FIREFOX)322public void testShouldIgnoreThePortNumberOfTheHostWhenSettingTheCookie() throws Exception {323URI uri = new URI(driver.getCurrentUrl());324String host = String.format("%s:%d", uri.getHost(), uri.getPort());325326String cookieName = "name";327assertCookieIsNotPresentWithName(cookieName);328329Cookie cookie = new Cookie.Builder(cookieName, "value").domain(host).build();330driver.manage().addCookie(cookie);331332assertCookieIsPresentWithName(cookieName);333}334335@Test336@NotWorkingInRemoteBazelBuilds(CHROME)337@NotWorkingInRemoteBazelBuilds(EDGE)338@NotWorkingInRemoteBazelBuilds(FIREFOX)339public void testCookieEqualityAfterSetAndGet() {340driver.get(domainHelper.getUrlForFirstValidHostname("animals"));341342driver.manage().deleteAllCookies();343344Cookie addedCookie =345new Cookie.Builder("fish", "cod")346.path("/common/animals")347.expiresOn(someTimeInTheFuture())348.build();349driver.manage().addCookie(addedCookie);350351Set<Cookie> cookies = driver.manage().getCookies();352Cookie retrievedCookie = null;353for (Cookie temp : cookies) {354if (addedCookie.equals(temp)) {355retrievedCookie = temp;356break;357}358}359360assertThat(retrievedCookie).isNotNull();361// Cookie.equals only compares name, domain and path362assertThat(retrievedCookie).isEqualTo(addedCookie);363}364365@Test366public void testRetainsCookieExpiry() {367Cookie addedCookie =368new Cookie.Builder("fish", "cod")369.path("/common/animals")370.expiresOn(someTimeInTheFuture())371.build();372driver.manage().addCookie(addedCookie);373374Cookie retrieved = driver.manage().getCookieNamed("fish");375assertThat(retrieved).isNotNull();376assertThat(retrieved.getExpiry()).isEqualTo(addedCookie.getExpiry());377}378379@Test380@Ignore(IE)381@Ignore(SAFARI)382@NotWorkingInRemoteBazelBuilds(CHROME)383@NotWorkingInRemoteBazelBuilds(EDGE)384@NotWorkingInRemoteBazelBuilds(FIREFOX)385public void canHandleSecureCookie() {386driver.get(domainHelper.getSecureUrlForFirstValidHostname("animals"));387388Cookie addedCookie =389new Cookie.Builder("fish", "cod").path("/common/animals").isSecure(true).build();390driver.manage().addCookie(addedCookie);391392driver.navigate().refresh();393394Cookie retrieved = driver.manage().getCookieNamed("fish");395assertThat(retrieved).isNotNull();396}397398@Test399@Ignore(IE)400@Ignore(SAFARI)401@NotWorkingInRemoteBazelBuilds(CHROME)402@NotWorkingInRemoteBazelBuilds(EDGE)403@NotWorkingInRemoteBazelBuilds(FIREFOX)404public void testRetainsCookieSecure() {405driver.get(domainHelper.getSecureUrlForFirstValidHostname("animals"));406407Cookie addedCookie =408new Cookie.Builder("fish", "cod").path("/common/animals").isSecure(true).build();409driver.manage().addCookie(addedCookie);410411driver.navigate().refresh();412413Cookie retrieved = driver.manage().getCookieNamed("fish");414assertThat(retrieved).isNotNull();415assertThat(retrieved.isSecure()).isTrue();416}417418@Test419@Ignore(SAFARI)420@NotWorkingInRemoteBazelBuilds(CHROME)421@NotWorkingInRemoteBazelBuilds(EDGE)422@NotWorkingInRemoteBazelBuilds(FIREFOX)423public void canHandleHttpOnlyCookie() {424Cookie addedCookie =425new Cookie.Builder("fish", "cod").path("/common/animals").isHttpOnly(true).build();426427addCookieOnServerSide(addedCookie);428429driver.get(domainHelper.getUrlForFirstValidHostname("animals"));430Cookie retrieved = driver.manage().getCookieNamed("fish");431assertThat(retrieved).isNotNull();432}433434@Test435@Ignore(SAFARI)436@NotWorkingInRemoteBazelBuilds(CHROME)437@NotWorkingInRemoteBazelBuilds(EDGE)438@NotWorkingInRemoteBazelBuilds(FIREFOX)439public void testRetainsHttpOnlyFlag() {440Cookie addedCookie =441new Cookie.Builder("fish", "cod").path("/common/animals").isHttpOnly(true).build();442443addCookieOnServerSide(addedCookie);444445driver.get(domainHelper.getUrlForFirstValidHostname("animals"));446Cookie retrieved = driver.manage().getCookieNamed("fish");447assertThat(retrieved).isNotNull();448assertThat(retrieved.isHttpOnly()).isTrue();449}450451@Test452public void testSettingACookieThatExpiredInThePast() {453long expires = System.currentTimeMillis() - 1000;454Cookie cookie = new Cookie.Builder("expired", "yes").expiresOn(new Date(expires)).build();455driver.manage().addCookie(cookie);456457cookie = driver.manage().getCookieNamed("fish");458assertThat(cookie)459.as("Cookie expired before it was set, so nothing should be returned")460.isNull();461}462463@Test464public void testCanSetCookieWithoutOptionalFieldsSet() {465String key = generateUniqueKey();466String value = "foo";467Cookie cookie = new Cookie(key, value);468assertCookieIsNotPresentWithName(key);469470driver.manage().addCookie(cookie);471472assertCookieHasValue(key, value);473}474475@Test476public void testDeleteNotExistedCookie() {477String key = generateUniqueKey();478assertCookieIsNotPresentWithName(key);479480driver.manage().deleteCookieNamed(key);481}482483@Test484public void testDeleteEmptyNamedCookie() {485assertThatThrownBy(() -> driver.manage().deleteCookieNamed(""))486.isInstanceOf(IllegalArgumentException.class)487.hasMessage("Cookie name cannot be empty");488assertThatThrownBy(() -> driver.manage().deleteCookieNamed(" "))489.isInstanceOf(IllegalArgumentException.class)490.hasMessage("Cookie name cannot be empty");491}492493@Test494public void testGetEmptyNamedCookie() {495assertThatThrownBy(() -> driver.manage().getCookieNamed(""))496.isInstanceOf(IllegalArgumentException.class)497.hasMessage("Cookie name cannot be empty");498assertThatThrownBy(() -> driver.manage().getCookieNamed(" "))499.isInstanceOf(IllegalArgumentException.class)500.hasMessage("Cookie name cannot be empty");501}502503@Test504@Ignore(value = ALL, reason = "Non W3C conformant")505public void testShouldDeleteOneOfTheCookiesWithTheSameName() {506driver.get(domainHelper.getUrlForFirstValidHostname("/common/animals"));507Cookie cookie1 =508new Cookie.Builder("fish", "cod")509.domain(domainHelper.getHostName())510.path("/common/animals")511.build();512Cookie cookie2 =513new Cookie.Builder("fish", "tune")514.domain(domainHelper.getHostName())515.path("/common/")516.build();517WebDriver.Options options = driver.manage();518options.addCookie(cookie1);519options.addCookie(cookie2);520assertThat(driver.manage().getCookies()).hasSize(2);521522driver.manage().deleteCookie(cookie1);523524assertThat(driver.manage().getCookies()).hasSize(1);525Cookie retrieved = driver.manage().getCookieNamed("fish");526assertThat(retrieved).isEqualTo(cookie2);527}528529private String generateUniqueKey() {530return String.format("key_%d", random.nextInt());531}532533private void assertNoCookiesArePresent() {534assertThat(driver.manage().getCookies()).isEmpty();535String documentCookie = getDocumentCookieOrNull();536if (documentCookie != null) {537assertThat(documentCookie).isEmpty();538}539}540541private void assertSomeCookiesArePresent() {542assertThat(driver.manage().getCookies()).isNotEmpty();543String documentCookie = getDocumentCookieOrNull();544if (documentCookie != null) {545assertThat(documentCookie).as("Cookies were empty").isNotEqualTo("");546}547}548549private void assertCookieIsNotPresentWithName(final String key) {550assertThat(driver.manage().getCookieNamed(key)).as("Cookie with name " + key).isNull();551String documentCookie = getDocumentCookieOrNull();552if (documentCookie != null) {553assertThat(documentCookie).as("Cookie with name " + key).doesNotContain((key + "="));554}555}556557private void assertCookieIsPresentWithName(final String key) {558assertThat(driver.manage().getCookieNamed(key)).as("Cookie with name " + key).isNotNull();559String documentCookie = getDocumentCookieOrNull();560if (documentCookie != null) {561assertThat(documentCookie)562.as(() -> "Cookie was not present with name " + key + ", got: " + documentCookie)563.contains(key + "=");564}565}566567private void assertCookieHasValue(final String key, final String value) {568assertThat(driver.manage().getCookieNamed(key).getValue()).isEqualTo(value);569String documentCookie = getDocumentCookieOrNull();570if (documentCookie != null) {571assertThat(documentCookie)572.as("Cookie was present with name " + key)573.contains(key + "=" + value);574}575}576577private String getDocumentCookieOrNull() {578if (!(driver instanceof JavascriptExecutor)) {579return null;580}581try {582return (String) ((JavascriptExecutor) driver).executeScript("return document.cookie");583} catch (UnsupportedOperationException e) {584return null;585}586}587588private Date someTimeInTheFuture() {589return new Date(System.currentTimeMillis() + 100000);590}591592private void openAnotherPage() {593driver.get(domainHelper.getUrlForFirstValidHostname("simpleTest.html"));594}595596private void deleteAllCookiesOnServerSide() {597driver.get(cookiePage + "?action=deleteAll");598}599600private void addCookieOnServerSide(Cookie cookie) {601StringBuilder url = new StringBuilder(cookiePage);602url.append("?action=add");603url.append("&name=").append(cookie.getName());604url.append("&value=").append(cookie.getValue());605if (cookie.getDomain() != null) {606url.append("&domain=").append(cookie.getDomain());607}608if (cookie.getPath() != null) {609url.append("&path=").append(cookie.getPath());610}611if (cookie.getExpiry() != null) {612url.append("&expiry=").append(cookie.getExpiry().getTime());613}614if (cookie.isSecure()) {615url.append("&secure=").append(cookie.isSecure());616}617if (cookie.isHttpOnly()) {618url.append("&httpOnly=").append(cookie.isHttpOnly());619}620driver.get(url.toString());621}622623@Test624public void deleteAllCookies() {625assumeTrue(domainHelper.checkHasValidAlternateHostname());626627Cookie cookie1 = new Cookie.Builder("fish1", "cod").domain(appServer.getHostName()).build();628Cookie cookie2 =629new Cookie.Builder("fish2", "tune").domain(appServer.getAlternateHostName()).build();630631String url1 = domainHelper.getUrlForFirstValidHostname("/common");632String url2 = domainHelper.getUrlForSecondValidHostname("/common");633634WebDriver.Options options = driver.manage();635636options.addCookie(cookie1);637assertCookieIsPresentWithName(cookie1.getName());638639driver.get(url2);640options.addCookie(cookie2);641assertCookieIsNotPresentWithName(cookie1.getName());642assertCookieIsPresentWithName(cookie2.getName());643644driver.get(url1);645assertCookieIsPresentWithName(cookie1.getName());646assertCookieIsNotPresentWithName(cookie2.getName());647648options.deleteAllCookies();649assertCookieIsNotPresentWithName(cookie1.getName());650651driver.get(url2);652assertCookieIsPresentWithName(cookie2.getName());653}654}655656657