diff --git a/modules/src/main/java/org/archive/modules/fetcher/BdbCookieStore.java b/modules/src/main/java/org/archive/modules/fetcher/BdbCookieStore.java index 13efc983..6a342149 100644 --- a/modules/src/main/java/org/archive/modules/fetcher/BdbCookieStore.java +++ b/modules/src/main/java/org/archive/modules/fetcher/BdbCookieStore.java @@ -136,28 +136,30 @@ public class BdbCookieStore extends AbstractCookieStore implements } public void addCookie(Cookie cookie) { - - if (isCookieCountMaxedForDomain(cookie.getDomain())) { - logger.log( - Level.FINEST, - "Maximum number of cookies reached for domain " - + cookie.getDomain() + ". Will not add new cookie " - + cookie.getName() + " with value " - + cookie.getValue()); - return; - } - - byte[] key; - try { - key = sortableKey(cookie).getBytes("UTF-8"); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); // impossible - } + synchronized (cookies) { + if (isCookieCountMaxedForDomain(cookie.getDomain())) { + logger.log( + Level.FINEST, + "Maximum number of cookies reached for domain " + + cookie.getDomain() + + ". Will not add new cookie " + + cookie.getName() + " with value " + + cookie.getValue()); + return; + } - if (!cookie.isExpired(new Date())) { - cookies.put(key, cookie); - } else { - cookies.remove(key); + byte[] key; + try { + key = sortableKey(cookie).getBytes("UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); // impossible + } + + if (!cookie.isExpired(new Date())) { + cookies.put(key, cookie); + } else { + cookies.remove(key); + } } } diff --git a/modules/src/test/java/org/archive/modules/fetcher/CookieStoreTest.java b/modules/src/test/java/org/archive/modules/fetcher/CookieStoreTest.java index 3b8f5226..716f1cf8 100644 --- a/modules/src/test/java/org/archive/modules/fetcher/CookieStoreTest.java +++ b/modules/src/test/java/org/archive/modules/fetcher/CookieStoreTest.java @@ -24,8 +24,10 @@ import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.Date; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Random; import java.util.UUID; import java.util.logging.Logger; @@ -332,9 +334,21 @@ public class CookieStoreTest extends TmpDirTestCase { threads[i].join(); } - List bdbCookieList = bdbCookieStore().getCookies(); - assertTrue(bdbCookieList.size() > 3000); - assertCookieListsEquivalent(bdbCookieList, basicCookieStore().getCookies()); + ArrayList bdbCookieArrayList = new ArrayList(bdbCookieStore().getCookies()); + + Map domainCounts = new HashMap(); + for (Cookie cookie : bdbCookieArrayList) { + if (domainCounts.get(cookie.getDomain()) == null) { + domainCounts.put(cookie.getDomain(), 1); + } + else { + domainCounts.put(cookie.getDomain(), domainCounts.get(cookie.getDomain()) + 1); + } + } + + for (String domain: domainCounts.keySet()) { + assertTrue(domainCounts.get(domain) <= BdbCookieStore.MAX_COOKIES_FOR_DOMAIN); + } } protected void assertCookieStoreCountEquals(BdbCookieStore bdb, int count) {