From b0b1a9801e3a3ceaf4f1ce36ac36dd4a317654a0 Mon Sep 17 00:00:00 2001 From: Valery Yatsynovich Date: Thu, 30 Mar 2023 16:55:11 +0300 Subject: [PATCH] [plugin-web-app] Fix NPE on adding browser cookie without expiry date to HTTP context (#3783) --- .../vividus/ui/web/action/CookieManager.java | 4 ++- .../ui/web/action/CookieManagerTests.java | 34 +++++++++++++------ 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/vividus-plugin-web-app/src/main/java/org/vividus/ui/web/action/CookieManager.java b/vividus-plugin-web-app/src/main/java/org/vividus/ui/web/action/CookieManager.java index 35ab29b0a4..8e55c4507c 100644 --- a/vividus-plugin-web-app/src/main/java/org/vividus/ui/web/action/CookieManager.java +++ b/vividus-plugin-web-app/src/main/java/org/vividus/ui/web/action/CookieManager.java @@ -17,6 +17,8 @@ package org.vividus.ui.web.action; import java.net.URI; +import java.util.Date; +import java.util.Optional; import java.util.Set; import javax.inject.Inject; @@ -98,7 +100,7 @@ private static org.apache.hc.client5.http.cookie.Cookie createHttpClientCookie(C BasicClientCookie httpClientCookie = new BasicClientCookie(seleniumCookie.getName(), seleniumCookie.getValue()); httpClientCookie.setDomain(seleniumCookie.getDomain()); httpClientCookie.setPath(seleniumCookie.getPath()); - httpClientCookie.setExpiryDate(seleniumCookie.getExpiry().toInstant()); + Optional.ofNullable(seleniumCookie.getExpiry()).map(Date::toInstant).ifPresent(httpClientCookie::setExpiryDate); httpClientCookie.setSecure(seleniumCookie.isSecure()); httpClientCookie.setAttribute(org.apache.hc.client5.http.cookie.Cookie.DOMAIN_ATTR, seleniumCookie.getDomain()); httpClientCookie.setAttribute(org.apache.hc.client5.http.cookie.Cookie.PATH_ATTR, seleniumCookie.getPath()); diff --git a/vividus-plugin-web-app/src/test/java/org/vividus/ui/web/action/CookieManagerTests.java b/vividus-plugin-web-app/src/test/java/org/vividus/ui/web/action/CookieManagerTests.java index 2bbe5a416a..20afc93a1d 100644 --- a/vividus-plugin-web-app/src/test/java/org/vividus/ui/web/action/CookieManagerTests.java +++ b/vividus-plugin-web-app/src/test/java/org/vividus/ui/web/action/CookieManagerTests.java @@ -24,10 +24,13 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import java.util.Calendar; +import java.time.ZonedDateTime; +import java.time.temporal.ChronoUnit; import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.Set; +import java.util.stream.Stream; import org.apache.hc.client5.http.cookie.CookieStore; import org.apache.hc.client5.http.impl.cookie.BasicClientCookie; @@ -35,6 +38,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.MethodSource; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.InjectMocks; @@ -99,7 +103,7 @@ void shouldDeleteCookie() void shouldGetCookie() { configureMockedWebDriver(); - Cookie seleniumCookie = createSeleniumCookie(); + Cookie seleniumCookie = createSeleniumCookie(null); when(options.getCookieNamed(COOKIE_NAME)).thenReturn(seleniumCookie); assertEquals(seleniumCookie, cookieManager.getCookie(COOKIE_NAME)); } @@ -108,15 +112,24 @@ void shouldGetCookie() void shouldGetCookies() { configureMockedWebDriver(); - Set expectedCookies = mockGetCookies(createSeleniumCookie()); + Set expectedCookies = mockGetCookies(createSeleniumCookie(null)); assertEquals(expectedCookies, cookieManager.getCookies()); } - @Test - void shouldGetCookiesAsHttpCookieStore() + public static Stream expiryDates() + { + return Stream.of( + Date.from(ZonedDateTime.now().plusDays(1).toInstant()), + null + ); + } + + @MethodSource("expiryDates") + @ParameterizedTest + void shouldGetCookiesAsHttpCookieStore(Date expiryDate) { configureMockedWebDriver(); - Cookie seleniumCookie = createSeleniumCookie(); + Cookie seleniumCookie = createSeleniumCookie(expiryDate); mockGetCookies(seleniumCookie); CookieStore cookieStore = cookieManager.getCookiesAsHttpCookieStore(); List resultCookies = cookieStore.getCookies(); @@ -126,7 +139,8 @@ void shouldGetCookiesAsHttpCookieStore() BasicClientCookie clientCookie = (BasicClientCookie) httpCookie; assertAll( () -> assertEquals(seleniumCookie.getDomain(), clientCookie.getDomain()), - () -> assertEquals(seleniumCookie.getExpiry().toInstant(), clientCookie.getExpiryInstant()), + () -> assertEquals(expiryDate != null ? expiryDate.toInstant().truncatedTo(ChronoUnit.SECONDS) : null, + clientCookie.getExpiryInstant()), () -> assertEquals(seleniumCookie.getName(), clientCookie.getName()), () -> assertEquals(seleniumCookie.getPath(), clientCookie.getPath()), () -> assertEquals(seleniumCookie.getValue(), clientCookie.getValue()), @@ -145,11 +159,9 @@ private void configureMockedWebDriver() when(webDriver.manage()).thenReturn(options); } - private Cookie createSeleniumCookie() + private Cookie createSeleniumCookie(Date expiry) { - Calendar calendar = Calendar.getInstance(); - calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + 1); - return new Cookie(COOKIE_NAME, COOKIE_VALUE, DOMAIN, "cookiePath", calendar.getTime(), true); + return new Cookie(COOKIE_NAME, COOKIE_VALUE, DOMAIN, "cookiePath", expiry, true); } private Set mockGetCookies(Cookie cookie)